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 | |
download | cbb-gcc-4.6.4-upstream.tar.bz2 cbb-gcc-4.6.4-upstream.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')
5626 files changed, 154745 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/20090107-1.C b/gcc/testsuite/g++.dg/20090107-1.C new file mode 100644 index 000000000..ff586e817 --- /dev/null +++ b/gcc/testsuite/g++.dg/20090107-1.C @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target lto } */ +/* { dg-options "-flto -Wuninitialized -O1" } */ + +template <typename T> struct Q1 { typedef int x; }; +template <typename T> struct Q2 { + typename Q1<T>::x f() { + int k; + return k; /* { dg-warning "'k' is used uninitialized in this function" } */ + } +}; +int foo() { return Q2<int>().f(); } diff --git a/gcc/testsuite/g++.dg/20090121-1.C b/gcc/testsuite/g++.dg/20090121-1.C new file mode 100644 index 000000000..ddfa3ad05 --- /dev/null +++ b/gcc/testsuite/g++.dg/20090121-1.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// { dg-require-effective-target lto } +// { dg-options "-flto -Wuninitialized -O2" } +class A +{ +private: + int y; + +public: + A () { int x; y = x + 1; } /* { dg-warning "'x' is used uninitialized in this function" } */ + int get_y () { return y; } +}; + +int foo() +{ + A a; + return a.get_y (); +} + diff --git a/gcc/testsuite/g++.dg/README b/gcc/testsuite/g++.dg/README new file mode 100644 index 000000000..fe308a542 --- /dev/null +++ b/gcc/testsuite/g++.dg/README @@ -0,0 +1,40 @@ +Subdirectories: + +abi Tests for ABI compatibility -- mangling, object layout, etc. +bprob Tests for functionality of profile-directed block ordering. +charset Tests for input character set translation. +compat Tests for binary compatibility (consistency, not ABI conformance). +conversion Tests for correct type conversions. +cpp Tests for the preprocessor. +debug Tests for debugging options. +eh Tests for exception handling. +expr Tests for expressions. +ext Tests for GNU language extensions. +gcov Tests for GCOV (code coverage) support. +inherit Tests for inheritance -- virtual functions, multiple inheritance, etc. +init Tests for initialization semantics, constructors/destructors, etc. +lookup Tests for lookup semantics, namespaces, using, etc. +lto Tests for Link Time Optimization. +opt Tests for fixes of bugs with particular optimizations. +overload Tests for overload resolution and conversions. +parse Tests for parsing. +pch Tests for precompiled headers. +plugin Tests for plugin support. +rtti Tests for run-time type identification (typeid, dynamic_cast, etc.) +template Tests for templates. +tc1 Tests for Technical Corrigendum 1 conformance. +tls Tests for support of thread-local data. +tree-ssa Tests for Tree SSA optimizations. +warn Tests for compiler warnings. + +other Tests that don't fit into one of the other categories. + +special Tests that need custom expect code to run them; see special/ecos.exp + for an example. + + +Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. 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 } } diff --git a/gcc/testsuite/g++.dg/bprob/bprob.exp b/gcc/testsuite/g++.dg/bprob/bprob.exp new file mode 100644 index 000000000..8a46cf7be --- /dev/null +++ b/gcc/testsuite/g++.dg/bprob/bprob.exp @@ -0,0 +1,65 @@ +# Copyright (C) 2001, 2002, 2004, 2007, 2008 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. +# +# Test the functionality of programs compiled with profile-directed block +# ordering using -fprofile-arcs followed by -fbranch-probabilities. + +load_lib target-supports.exp + +# Some targets don't have any implementation of __bb_init_func or are +# missing other needed machinery. +if { ![check_profiling_available "-fprofile-arcs"] } { + return +} + +# The procedures in profopt.exp need these parameters. +set tool g++ +set prof_ext "gcda" + +if $tracelevel then { + strace $tracelevel +} + +# Override the list defined in profopt.exp. +set PROFOPT_OPTIONS [list \ + { -g } \ + { -O0 } \ + { -O1 } \ + { -O2 } \ + { -O3 } \ + { -O3 -g } \ + { -Os } ] + +if $tracelevel then { + strace $tracelevel +} + +# Load support procs. +load_lib profopt.exp + +set profile_options "-fprofile-arcs" +set feedback_options "-fprofile-use" + +# Main loop. +foreach profile_option $profile_options feedback_option $feedback_options { + foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.C]] { + # If we're only testing specific files and this isn't one of them, skip it. + if ![runtest_file_p $runtests $src] then { + continue + } + profopt-execute $src + } +} diff --git a/gcc/testsuite/g++.dg/bprob/g++-bprob-1.C b/gcc/testsuite/g++.dg/bprob/g++-bprob-1.C new file mode 100644 index 000000000..b1a1de77e --- /dev/null +++ b/gcc/testsuite/g++.dg/bprob/g++-bprob-1.C @@ -0,0 +1,234 @@ +/* Check that various C constructs (in C++) don't cause problems for + * profile-directed block ordering. + + Most of this test is the same as bprob-1.c and gcov-4.c in + gcc.misc-tests. The "count" comments are left in to make comparisons + easier; they are ignored for this test. */ + +extern "C" void abort (void); + +/* Check for loops. */ + +int for_val1; +int for_val2; +int for_temp; + +int +test_for1 (int n) +{ + int i; + for_temp = 1; /* count(3) */ + for (i = 0; i < n; i++) + for_temp++; /* count(9) */ + return for_temp; /* count(3) */ +} + +int +test_for2 (int m, int n, int o) +{ + int i, j, k; + for_temp = 1; /* count(6) */ + for (i = 0; i < n; i++) + for (j = 0; j < m; j++) + for (k = 0; k < o; k++) + for_temp++; /* count(81) */ + return for_temp; /* count(6) */ +} + +int +call_for () +{ + for_val1 += test_for1 (0); + for_val1 += test_for1 (2); + for_val1 += test_for1 (7); + + for_val2 += test_for2 (0, 0, 0); + for_val2 += test_for2 (1, 0, 0); + for_val2 += test_for2 (1, 3, 0); + for_val2 += test_for2 (1, 3, 1); + for_val2 += test_for2 (3, 1, 5); + for_val2 += test_for2 (3, 7, 3); +} + +/* Check the use of goto. */ + +int goto_val; + +int +test_goto1 (int f) +{ + if (f) /* count(2) */ + goto lab1; /* count(1) */ + return 1; /* count(1) */ +lab1: + return 2; /* count(1) */ +} + +int +test_goto2 (int f) +{ + int i; + for (i = 0; i < 10; i++) /* count(15) */ + if (i == f) goto lab2; /* count(14) */ + return 4; /* count(1) */ +lab2: + return 8; /* count(1) */ +} + +void +call_goto () +{ + goto_val += test_goto1 (0); + goto_val += test_goto1 (1); + goto_val += test_goto2 (3); + goto_val += test_goto2 (30); +} + +/* Check nested if-then-else statements. */ + +int ifelse_val1; +int ifelse_val2; +int ifelse_val3; + +int +test_ifelse1 (int i, int j) +{ + int result = 0; + if (i) /* count(5) */ + if (j) /* count(3) */ + result = 4; /* count(3) */ + else + result = 1024; + else + if (j) /* count(2) */ + result = 1; /* count(1) */ + else + result = 2; /* count(1) */ + if (i > j) /* count(5) */ + result *= 2; /* count(1) */ + if (i > 10) /* count(5) */ + if (j > 10) /* count(1) */ + result *= 4; /* count(1) */ + return result; /* count(5) */ +} + +int +test_ifelse2 (int i) +{ + int result = 0; + if (!i) /* count(6) */ + result = 1; /* count(1) */ + if (i == 1) /* count(6) */ + result = 1024; + if (i == 2) /* count(6) */ + result = 2; /* count(3) */ + if (i == 3) /* count(6) */ + return 8; /* count(2) */ + if (i == 4) /* count(4) */ + return 2048; + return result; /* count(4) */ +} + +int +test_ifelse3 (int i, int j) +{ + int result = 1; + if (i > 10 && j > i && j < 20) /* count(11) */ + result = 16; /* count(1) */ + if (i > 20) /* count(11) */ + if (j > i) /* count(5) */ + if (j < 30) /* count(2) */ + result = 32; /* count(1) */ + if (i == 3 || j == 47 || i == j) /* count(11) */ + result = 64; /* count(3) */ + return result; /* count(11) */ +} + +void +call_ifelse () +{ + ifelse_val1 += test_ifelse1 (0, 2); + ifelse_val1 += test_ifelse1 (0, 0); + ifelse_val1 += test_ifelse1 (1, 2); + ifelse_val1 += test_ifelse1 (10, 2); + ifelse_val1 += test_ifelse1 (11, 11); + + ifelse_val2 += test_ifelse2 (0); + ifelse_val2 += test_ifelse2 (2); + ifelse_val2 += test_ifelse2 (2); + ifelse_val2 += test_ifelse2 (2); + ifelse_val2 += test_ifelse2 (3); + ifelse_val2 += test_ifelse2 (3); + + ifelse_val3 += test_ifelse3 (11, 19); + ifelse_val3 += test_ifelse3 (25, 27); + ifelse_val3 += test_ifelse3 (11, 22); + ifelse_val3 += test_ifelse3 (11, 10); + ifelse_val3 += test_ifelse3 (21, 32); + ifelse_val3 += test_ifelse3 (21, 20); + ifelse_val3 += test_ifelse3 (1, 2); + ifelse_val3 += test_ifelse3 (32, 31); + ifelse_val3 += test_ifelse3 (3, 0); + ifelse_val3 += test_ifelse3 (0, 47); /* count(1) */ + ifelse_val3 += test_ifelse3 (65, 65); /* count(1) */ +} + +/* Check switch statements. */ + +int switch_val, switch_m; + +int +test_switch (int i, int j) +{ + int result = 0; /* count(5) */ + + switch (i) /* count(5) */ + { + case 1: + result = 2; /* count(1) */ + break; + case 2: + result = 1024; + break; + case 3: + case 4: + if (j == 2) /* count(3) */ + return 4; /* count(1) */ + result = 8; /* count(2) */ + break; + default: + result = 32; /* count(1) */ + switch_m++; /* count(1) */ + break; + } + return result; /* count(4) */ +} + +void +call_switch () +{ + switch_val += test_switch (1, 0); + switch_val += test_switch (3, 0); + switch_val += test_switch (3, 2); + switch_val += test_switch (4, 0); + switch_val += test_switch (16, 0); + switch_val += switch_m; +} + +int +main() +{ + call_for (); + call_goto (); + call_ifelse (); + call_switch (); + if ((for_val1 != 12) + || (for_val2 != 87) + || (goto_val != 15) + || (ifelse_val1 != 31) + || (ifelse_val2 != 23) + || (ifelse_val3 != 246) + || (switch_val != 55)) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/bprob/g++-bprob-2.C b/gcc/testsuite/g++.dg/bprob/g++-bprob-2.C new file mode 100644 index 000000000..23577d47e --- /dev/null +++ b/gcc/testsuite/g++.dg/bprob/g++-bprob-2.C @@ -0,0 +1,15 @@ +namespace { + +int calc(int j) +{ + if (j==0) return 0; + return calc(j-1)*j % 17; +} + +} + +int main(void) +{ + return calc(25); +} + diff --git a/gcc/testsuite/g++.dg/cdce3.C b/gcc/testsuite/g++.dg/cdce3.C new file mode 100644 index 000000000..e6ca58c46 --- /dev/null +++ b/gcc/testsuite/g++.dg/cdce3.C @@ -0,0 +1,236 @@ +/* { dg-do run } */ +/* { dg-require-effective-target c99_runtime } */ +/* { dg-skip-if "exp2* missing despite C99 runtime" { alpha*-dec-osf5* } } */ +/* { dg-options "-O2 -fmath-errno -fdump-tree-cdce-details -DGNU_EXTENSION -DLARGE_LONG_DOUBLE -lm" { target { pow10 && large_long_double } } } */ +/* { dg-options "-O2 -fmath-errno -fdump-tree-cdce-details -DLARGE_LONG_DOUBLE -lm" { target { {! pow10 } && large_long_double } } } */ +/* { dg-options "-O2 -fmath-errno -fdump-tree-cdce-details -DGNU_EXTENSION -lm" { target { pow10 && {! large_long_double } } } } */ +/* { dg-options "-O2 -fmath-errno -fdump-tree-cdce-details -lm" { target { {! pow10 } && {! large_long_double } } } } */ +/* { dg-add-options ieee } */ +/* { dg-final { scan-tree-dump "cdce3.C:93: note: function call is shrink-wrapped into error conditions\." "cdce" { target { pow10 } } } } */ +/* { dg-final { scan-tree-dump "cdce3.C:94: note: function call is shrink-wrapped into error conditions\." "cdce" { target { pow10 } } } } */ +/* { dg-final { scan-tree-dump "cdce3.C:96: note: function call is shrink-wrapped into error conditions\." "cdce" } } */ +/* { dg-final { scan-tree-dump "cdce3.C:97: note: function call is shrink-wrapped into error conditions\." "cdce" } } */ +/* { dg-final { scan-tree-dump "cdce3.C:98: note: function call is shrink-wrapped into error conditions\." "cdce" } } */ +/* { dg-final { scan-tree-dump "cdce3.C:99: note: function call is shrink-wrapped into error conditions\." "cdce" } } */ +/* { dg-final { scan-tree-dump "cdce3.C:100: note: function call is shrink-wrapped into error conditions\." "cdce" } } */ +/* { dg-final { scan-tree-dump "cdce3.C:101: note: function call is shrink-wrapped into error conditions\." "cdce" } } */ +/* { dg-final { scan-tree-dump "cdce3.C:102: note: function call is shrink-wrapped into error conditions\." "cdce" } } */ +/* { dg-final { scan-tree-dump "cdce3.C:103: note: function call is shrink-wrapped into error conditions\." "cdce" } } */ +/* { dg-final { scan-tree-dump "cdce3.C:104: note: function call is shrink-wrapped into error conditions\." "cdce" } } */ +/* { dg-final { scan-tree-dump "cdce3.C:105: note: function call is shrink-wrapped into error conditions\." "cdce" } } */ +/* { dg-final { scan-tree-dump "cdce3.C:106: note: function call is shrink-wrapped into error conditions\." "cdce" } } */ +/* { dg-final { scan-tree-dump "cdce3.C:107: note: function call is shrink-wrapped into error conditions\." "cdce" } } */ +/* { dg-final { scan-tree-dump "cdce3.C:108: note: function call is shrink-wrapped into error conditions\." "cdce" } } */ +/* { dg-final { scan-tree-dump "cdce3.C:109: note: function call is shrink-wrapped into error conditions\." "cdce" } } */ +/* { dg-final { cleanup-tree-dump "cdce" } } */ +#include <stdlib.h> +#include <math.h> +#ifdef DEBUG +#include <stdio.h> +#endif +#include <errno.h> +typedef void (*FP) (int xp); +#define NI __attribute__((noinline)) + +#if defined(LARGE_LONG_DOUBLE) +typedef long double ldouble; +ldouble result; + +#define DEF_MATH_FUNC(prefix, name) NI void prefix##name##f (int x) \ +{ \ + float yy = name##f ((float) x); \ + STORE_RESULT; \ +} \ +NI void prefix##name (int x) \ +{ \ + double yy = name ((double)x); \ + STORE_RESULT; \ +} \ +NI void prefix##name##l (int x) \ +{ \ + ldouble yy = name##l ((ldouble)x); \ + STORE_RESULT; \ +} +#else +double result; + +#define DEF_MATH_FUNC(prefix, name) NI void prefix##name##f (int x) \ +{ \ + float yy = name##f ((float) x); \ + STORE_RESULT; \ +} \ +NI void prefix##name (int x) \ +{ \ + double yy = name ((double)x); \ + STORE_RESULT; \ +} +#endif + +#undef STORE_RESULT +#define STORE_RESULT result = yy +#if defined(GNU_EXTENSION) +DEF_MATH_FUNC (m,pow10) +DEF_MATH_FUNC (m,exp10) +#endif +DEF_MATH_FUNC (m,exp2) +DEF_MATH_FUNC (m,exp) +DEF_MATH_FUNC (m,expm1) +DEF_MATH_FUNC (m,cosh) +DEF_MATH_FUNC (m,sinh) +DEF_MATH_FUNC (m,acos) +DEF_MATH_FUNC (m,asin) +DEF_MATH_FUNC (m,acosh) +DEF_MATH_FUNC (m,atanh) +DEF_MATH_FUNC (m,log) +DEF_MATH_FUNC (m,log2) +DEF_MATH_FUNC (m,log10) +DEF_MATH_FUNC (m,log1p) +DEF_MATH_FUNC (m,sqrt) + +#undef STORE_RESULT +#define STORE_RESULT +#if defined(GNU_EXTENSION) +DEF_MATH_FUNC (o,pow10) +DEF_MATH_FUNC (o,exp10) +#endif +DEF_MATH_FUNC (o,exp2) +DEF_MATH_FUNC (o,exp) +DEF_MATH_FUNC (o,expm1) +DEF_MATH_FUNC (o,cosh) +DEF_MATH_FUNC (o,sinh) +DEF_MATH_FUNC (o,acos) +DEF_MATH_FUNC (o,asin) +DEF_MATH_FUNC (o,acosh) +DEF_MATH_FUNC (o,atanh) +DEF_MATH_FUNC (o,log) +DEF_MATH_FUNC (o,log2) +DEF_MATH_FUNC (o,log10) +DEF_MATH_FUNC (o,log1p) +DEF_MATH_FUNC (o,sqrt) + +#if defined(LARGE_LONG_DOUBLE) +#define INIT_MATH_FUNC(prefix, name, lb, ub) { prefix##name##f, #name "f", 0, 0, lb, ub }, \ +{ prefix##name, #name, 0, 0, lb, ub }, \ +{ prefix##name##l, #name "l" , 0, 0, lb, ub }, +#else +#define INIT_MATH_FUNC(prefix, name, lb, ub) { prefix##name##f, #name "f", 0, 0, lb, ub }, \ +{ prefix##name, #name, 0, 0, lb, ub }, +#endif + +struct MathFuncInfo +{ + FP math_func; + const char* name; + int lb; + int ub; + bool has_lb; + bool has_ub; +} math_func_arr[] = { +#if defined(GNU_EXTENSION) + INIT_MATH_FUNC (m,pow10, false, true) + INIT_MATH_FUNC (m,exp10, false, true) +#endif + INIT_MATH_FUNC (m,exp2, false, true) + INIT_MATH_FUNC (m,expm1, false, true) + INIT_MATH_FUNC (m,exp, false, true) + INIT_MATH_FUNC (m,cosh, true, true) + INIT_MATH_FUNC (m,sinh, true, true) + INIT_MATH_FUNC (m,acos, true, true) + INIT_MATH_FUNC (m,asin, true, true) + INIT_MATH_FUNC (m,acosh, true, false) + INIT_MATH_FUNC (m,atanh, true, true) + INIT_MATH_FUNC (m,log10, true, false) + INIT_MATH_FUNC (m,log, true, false) + INIT_MATH_FUNC (m,log2, true, false) + INIT_MATH_FUNC (m,log1p, true, false) + INIT_MATH_FUNC (m,sqrt, true, false) + { 0, 0, 0, 0, 0, 0} }; + +MathFuncInfo opt_math_func_arr[] = +{ +#if defined(GNU_EXTENSION) + INIT_MATH_FUNC (o,pow10, false, true) + INIT_MATH_FUNC (o,exp10, false, true) +#endif + INIT_MATH_FUNC (o,exp2, false, true) + INIT_MATH_FUNC (o,expm1, false, true) + INIT_MATH_FUNC (o,exp, false, true) + INIT_MATH_FUNC (o,cosh, true, true) + INIT_MATH_FUNC (o,sinh, true, true) + INIT_MATH_FUNC (o,acos, true, true) + INIT_MATH_FUNC (o,asin, true, true) + INIT_MATH_FUNC (o,acosh, true, false) + INIT_MATH_FUNC (o,atanh, true, true) + INIT_MATH_FUNC (o,log10, true, false) + INIT_MATH_FUNC (o,log, true, false) + INIT_MATH_FUNC (o,log2, true, false) + INIT_MATH_FUNC (o,log1p, true, false) + INIT_MATH_FUNC (o,sqrt, true, false) + { 0, 0, 0, 0, 0, 0} }; + +int test (MathFuncInfo* math_func_infos) +{ + int i = 0; + int te = 0; + + for (i = 0; math_func_infos[i].math_func; i++) + { + MathFuncInfo& info = math_func_infos[i]; + int j; + if (info.has_lb) + { + for (j = 0; j > -500000; j--) + { + + errno = 0; + info.math_func (j); + if (errno != 0) + { + te++; + info.lb = j ; + break; + } + } + } + if (info.has_ub) + { + for (j = 0; j < 500000; j++) + { + errno = 0; + info.math_func (j); + if (errno != 0) + { + te++; + info.ub = j ; + break; + } + } + } + } + return te; +} + +int main() +{ + int te1, te2; + + te1 = test (&math_func_arr[0]); + te2 = test (&opt_math_func_arr[0]); + + // Now examine the result + int i = 0; + int errcnt = 0; + for (i = 0; math_func_arr[i].math_func; i++) + { + MathFuncInfo& info = math_func_arr[i]; + MathFuncInfo& opt_info = opt_math_func_arr[i]; +#ifdef DEBUG + fprintf (stderr," %s: lb = %d, ub = %d: lb_opt = %d, ub_opt = %d\n", + info.name, info.lb, info.ub, opt_info.lb, opt_info.ub); +#endif + if (info.lb != opt_info.lb) errcnt ++; + if (info.ub != opt_info.ub) errcnt ++; + } + if (errcnt) abort(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/charset/asm1.c b/gcc/testsuite/g++.dg/charset/asm1.c new file mode 100644 index 000000000..7076d1285 --- /dev/null +++ b/gcc/testsuite/g++.dg/charset/asm1.c @@ -0,0 +1,14 @@ +/* { dg-do compile { target *-*-* } } + { dg-require-iconv "IBM1047" } + { dg-final { scan-assembler ".ascii bar" } } + { dg-final { scan-assembler ".ascii foo" } } + */ +extern int x, y; + +asm (".ascii bar"); + +int foo (void) +{ + __asm__ (".ascii foo"); + return 0; +} diff --git a/gcc/testsuite/g++.dg/charset/asm2.c b/gcc/testsuite/g++.dg/charset/asm2.c new file mode 100644 index 000000000..7fb1959d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/charset/asm2.c @@ -0,0 +1,33 @@ +/* Test for complex asm statements. Make sure it compiles + then test for some of the asm statements not being translated. */ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } + { dg-require-iconv "IBM1047" } + { dg-final { scan-assembler "std" } } + { dg-final { scan-assembler "cld" } } + { dg-final { scan-assembler "rep" } } + { dg-final { scan-assembler "movsb" } } */ +#define size_t int +void * +memmove (void *__dest, __const void *__src, size_t __n) +{ + register unsigned long int __d0, __d1, __d2; + if (__dest < __src) + __asm__ __volatile__ + ("cld\n\t" + "rep\n\t" + "movsb" + : "=&c" (__d0), "=&S" (__d1), "=&D" (__d2) + : "0" (__n), "1" (__src), "2" (__dest) + : "memory"); + else + __asm__ __volatile__ + ("std\n\t" + "rep\n\t" + "movsb\n\t" + "cld" + : "=&c" (__d0), "=&S" (__d1), "=&D" (__d2) + : "0" (__n), "1" (__n - 1 + (const char *) __src), + "2" (__n - 1 + (char *) __dest) + : "memory"); + return __dest; +} diff --git a/gcc/testsuite/g++.dg/charset/asm3.c b/gcc/testsuite/g++.dg/charset/asm3.c new file mode 100644 index 000000000..59c8d59ff --- /dev/null +++ b/gcc/testsuite/g++.dg/charset/asm3.c @@ -0,0 +1,10 @@ +/* Simple asm test. */ +/* { dg-do compile } + { dg-require-iconv "IBM1047" } + { dg-final { scan-assembler "foo" } } */ +extern int bar; + +int main (void) +{ + asm ("foo %0" : "=r" (bar)); +} diff --git a/gcc/testsuite/g++.dg/charset/asm4.c b/gcc/testsuite/g++.dg/charset/asm4.c new file mode 100644 index 000000000..a4bb01401 --- /dev/null +++ b/gcc/testsuite/g++.dg/charset/asm4.c @@ -0,0 +1,8 @@ +/* Test for string translation. */ +/* { dg-do compile } + { dg-require-iconv "IBM1047" } + { dg-final { scan-assembler-not "translate" } } */ +void foo (void) +{ + asm ("xx" : : "r"("translate") : "cc"); +} diff --git a/gcc/testsuite/g++.dg/charset/asm5.c b/gcc/testsuite/g++.dg/charset/asm5.c new file mode 100644 index 000000000..ae2ec485d --- /dev/null +++ b/gcc/testsuite/g++.dg/charset/asm5.c @@ -0,0 +1,13 @@ +/* Test for string translation. */ +/* { dg-do compile } + { dg-require-iconv "IBM1047" } + { dg-final { scan-assembler "foo" } } */ +int main() +{ + unsigned long int *ptr; + ptr = ((unsigned long int *) + ( { void *stack_ptr; + __asm__ __volatile__ ( "foo %0" : "=r" (stack_ptr) ); + (stack_ptr); } ) ); + return 0; +} diff --git a/gcc/testsuite/g++.dg/charset/attribute1.c b/gcc/testsuite/g++.dg/charset/attribute1.c new file mode 100644 index 000000000..799630030 --- /dev/null +++ b/gcc/testsuite/g++.dg/charset/attribute1.c @@ -0,0 +1,10 @@ +/* Test for attribute non-translation. */ +/* { dg-do compile } + { dg-require-iconv "IBM1047" } + { dg-final { scan-assembler "foo" } } */ +int walrus __attribute__ ((section (".foo"))); + +int main (void) +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/charset/attribute2.c b/gcc/testsuite/g++.dg/charset/attribute2.c new file mode 100644 index 000000000..a67b7ac87 --- /dev/null +++ b/gcc/testsuite/g++.dg/charset/attribute2.c @@ -0,0 +1,8 @@ +/* Test to make sure that invalid attributes aren't translated. + If error recovery is ever testable then "foobar" should be + translated. */ +/* { dg-do compile } + { dg-require-iconv "IBM1047" } +*/ +int foo __attribute__ ((walrus)); /* { dg-warning "walrus" "ignored" } */ +char x[] = "foobar"; diff --git a/gcc/testsuite/g++.dg/charset/charset.exp b/gcc/testsuite/g++.dg/charset/charset.exp new file mode 100644 index 000000000..7d409d336 --- /dev/null +++ b/gcc/testsuite/g++.dg/charset/charset.exp @@ -0,0 +1,44 @@ +# Copyright (C) 2004, 2007 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# GCC testsuite that uses the 'dg.exp' driver. + +# There's a bunch of headers we need. +if [is_remote host] { + foreach header [glob -nocomplain $srcdir/$subdir/*.{h,def} ] { + remote_download host $header + } +} + +# Load support procs. +load_lib g++-dg.exp +load_lib target-supports.exp + +# If a testcase doesn't have special options, use these. +global DEFAULT_CHARSETCFLAGS +if ![info exists DEFAULT_CHARSETCFLAGS] then { + set DEFAULT_CHARSETCFLAGS "-fexec-charset=IBM1047" +} + +# Initialize `dg'. +dg-init + +# Main loop. +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.{c,cc,S} ]] \ + "" $DEFAULT_CHARSETCFLAGS + +# All done. +dg-finish diff --git a/gcc/testsuite/g++.dg/charset/extern1.cc b/gcc/testsuite/g++.dg/charset/extern1.cc new file mode 100644 index 000000000..09284ad1e --- /dev/null +++ b/gcc/testsuite/g++.dg/charset/extern1.cc @@ -0,0 +1,15 @@ +/* Test extern statments not being translated. */ +/* { dg-do compile } + { dg-require-iconv "IBM1047" } +*/ + +extern "C" { + + +int testbug (void) { + + return 0; + +} + +} //extern block diff --git a/gcc/testsuite/g++.dg/charset/extern2.cc b/gcc/testsuite/g++.dg/charset/extern2.cc new file mode 100644 index 000000000..9a0c85039 --- /dev/null +++ b/gcc/testsuite/g++.dg/charset/extern2.cc @@ -0,0 +1,5 @@ +/* Check that we push the declaration and then continue translation. */ +/* { dg-do compile } + { dg-require-iconv "IBM1047" } + { dg-final { scan-assembler-not "foobar" } } */ +extern "C" { const char* foo = "foobar"; } diff --git a/gcc/testsuite/g++.dg/charset/extern3.cc b/gcc/testsuite/g++.dg/charset/extern3.cc new file mode 100644 index 000000000..05a0c3e42 --- /dev/null +++ b/gcc/testsuite/g++.dg/charset/extern3.cc @@ -0,0 +1,11 @@ +/* { dg-do compile } + { dg-require-iconv "IBM1047" } + { dg-final { scan-assembler-not "abcdefghijklmnopqrstuvwxyz" } } */ + +extern char *bar; + +extern void foo (void) +{ + char str[]="abcdefghijklmnopqrstuvwxyz"; + bar = str; +} diff --git a/gcc/testsuite/g++.dg/charset/function.cc b/gcc/testsuite/g++.dg/charset/function.cc new file mode 100644 index 000000000..5aba6511b --- /dev/null +++ b/gcc/testsuite/g++.dg/charset/function.cc @@ -0,0 +1,10 @@ +/* { dg-do compile } + { dg-require-iconv "IBM1047" } + { dg-final { scan-assembler-not "\"foobar\"" } } */ + +const char *str; + +void foobar (void) +{ + str = __FUNCTION__; +} diff --git a/gcc/testsuite/g++.dg/charset/string.c b/gcc/testsuite/g++.dg/charset/string.c new file mode 100644 index 000000000..a09d39a20 --- /dev/null +++ b/gcc/testsuite/g++.dg/charset/string.c @@ -0,0 +1,5 @@ +/* Simple character translation test. */ +/* { dg-do compile } + { dg-require-iconv "IBM1047" } + { dg-final { scan-assembler-not "string foobar" } } */ +const char* foo = "string foobar"; diff --git a/gcc/testsuite/g++.dg/compat/abi/bitfield1.h b/gcc/testsuite/g++.dg/compat/abi/bitfield1.h new file mode 100644 index 000000000..09d64162f --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/bitfield1.h @@ -0,0 +1,10 @@ +typedef int Int; +typedef signed int SInt; +typedef unsigned int UInt; + +struct A +{ + SInt bitS : 1; // signed + UInt bitU : 1; // unsigned + Int bit : 1; // signedness by -f{signed,unsigned}-bitfields +}; diff --git a/gcc/testsuite/g++.dg/compat/abi/bitfield1_main.C b/gcc/testsuite/g++.dg/compat/abi/bitfield1_main.C new file mode 100644 index 000000000..ce9aa1f09 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/bitfield1_main.C @@ -0,0 +1,13 @@ +// { dg-options "-w -ansi -pedantic-errors -funsigned-bitfields" } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Dec 2001 <nathan@codesourcery.com> +// Split into pieces for binary compatibility testing October 2002 + +extern void bitfield1_x (void); + +int +main () +{ + bitfield1_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/abi/bitfield1_x.C b/gcc/testsuite/g++.dg/compat/abi/bitfield1_x.C new file mode 100644 index 000000000..727632af8 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/bitfield1_x.C @@ -0,0 +1,16 @@ +// { dg-options "-w -ansi -pedantic-errors -funsigned-bitfields" } + +#include "bitfield1.h" + +extern void bitfield1_y (A& a); + +void bitfield1_x () +{ + A a; + + a.bitS = 1; + a.bitU = 1; + a.bit = 1; + + bitfield1_y (a); +} diff --git a/gcc/testsuite/g++.dg/compat/abi/bitfield1_y.C b/gcc/testsuite/g++.dg/compat/abi/bitfield1_y.C new file mode 100644 index 000000000..282776718 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/bitfield1_y.C @@ -0,0 +1,15 @@ +// { dg-options "-w -ansi -pedantic-errors -funsigned-bitfields" } + +extern "C" void abort (void); + +#include "bitfield1.h" + +void bitfield1_y (A& a) +{ + if (a.bitS != -1) + abort (); + if (a.bitU != 1) + abort (); + if (a.bit != 1) + abort (); +} diff --git a/gcc/testsuite/g++.dg/compat/abi/bitfield2.h b/gcc/testsuite/g++.dg/compat/abi/bitfield2.h new file mode 100644 index 000000000..09d64162f --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/bitfield2.h @@ -0,0 +1,10 @@ +typedef int Int; +typedef signed int SInt; +typedef unsigned int UInt; + +struct A +{ + SInt bitS : 1; // signed + UInt bitU : 1; // unsigned + Int bit : 1; // signedness by -f{signed,unsigned}-bitfields +}; diff --git a/gcc/testsuite/g++.dg/compat/abi/bitfield2_main.C b/gcc/testsuite/g++.dg/compat/abi/bitfield2_main.C new file mode 100644 index 000000000..4169843f9 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/bitfield2_main.C @@ -0,0 +1,13 @@ +// { dg-options "-w -ansi -pedantic-errors -fsigned-bitfields" } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Dec 2001 <nathan@codesourcery.com> +// Split into pieces for binary compatibility testing October 2002 + +extern void bitfield1_x (void); + +int +main () +{ + bitfield1_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/abi/bitfield2_x.C b/gcc/testsuite/g++.dg/compat/abi/bitfield2_x.C new file mode 100644 index 000000000..080d21b41 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/bitfield2_x.C @@ -0,0 +1,16 @@ +// { dg-options "-w -ansi -pedantic-errors -fsigned-bitfields" } + +#include "bitfield1.h" + +extern void bitfield1_y (A& a); + +void bitfield1_x () +{ + A a; + + a.bitS = 1; + a.bitU = 1; + a.bit = 1; + + bitfield1_y (a); +} diff --git a/gcc/testsuite/g++.dg/compat/abi/bitfield2_y.C b/gcc/testsuite/g++.dg/compat/abi/bitfield2_y.C new file mode 100644 index 000000000..d27578328 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/bitfield2_y.C @@ -0,0 +1,15 @@ +// { dg-options "-w -ansi -pedantic-errors -fsigned-bitfields" } + +extern "C" void abort (void); + +#include "bitfield1.h" + +void bitfield1_y (A& a) +{ + if (a.bitS != -1) + abort (); + if (a.bitU != 1) + abort (); + if (a.bit != -1) + abort (); +} diff --git a/gcc/testsuite/g++.dg/compat/abi/pr38736_main.C b/gcc/testsuite/g++.dg/compat/abi/pr38736_main.C new file mode 100644 index 000000000..b9f6ac898 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/pr38736_main.C @@ -0,0 +1,18 @@ +/* PR target/38736 */ +/* { dg-skip-if "attribute ((aligned))" { ! { i?86-*-* x86_64-*-* } } } */ +/* { dg-require-effective-target avx } */ + +/* Test compatibility of attribute ((aligned)) with and without -mavx. */ + +extern int aligned_x (void); +extern int aligned_y_avx (void); +extern "C" void abort (void); + +int +main () +{ + if (aligned_x () != aligned_y_avx ()) + abort (); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/compat/abi/pr38736_x.C b/gcc/testsuite/g++.dg/compat/abi/pr38736_x.C new file mode 100644 index 000000000..aeab257aa --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/pr38736_x.C @@ -0,0 +1,15 @@ +/* PR target/38736 */ +/* { dg-options "-O2" } */ + +struct alignment_test_struct +{ + char space[4] __attribute__((__aligned__)); +}; + +extern int aligned_x (void); + +int +aligned_x (void) +{ + return __alignof__(struct alignment_test_struct); +} diff --git a/gcc/testsuite/g++.dg/compat/abi/pr38736_y.C b/gcc/testsuite/g++.dg/compat/abi/pr38736_y.C new file mode 100644 index 000000000..bade1b292 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/pr38736_y.C @@ -0,0 +1,6 @@ +/* PR target/38736 */ +/* { dg-options "-O2 -mavx" } */ + +#define aligned_x aligned_y_avx + +#include "pr38736_x.C" diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-10.h b/gcc/testsuite/g++.dg/compat/abi/vbase8-10.h new file mode 100644 index 000000000..aee0b6b49 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-10.h @@ -0,0 +1,54 @@ +class C0 +{ public: int i0; }; +class C1 + : public C0 +{ public: int i1; }; +class C2 + : public C1 + , virtual public C0 +{ public: int i2; }; +class C3 + : public C1 + , public C2 + , virtual public C0 +{ public: int i3; }; +class C4 + : virtual public C1 + , virtual public C0 + , virtual public C3 + , public C2 +{ public: int i4; }; +class C5 + : public C3 + , virtual public C0 + , virtual public C2 +{ public: int i5; }; +class C6 + : public C1 + , public C2 + , virtual public C5 + , virtual public C3 + , virtual public C0 +{ public: int i6; }; +class C7 + : public C1 + , virtual public C5 + , virtual public C4 + , virtual public C2 + , virtual public C0 + , virtual public C6 +{ public: int i7; }; +class C8 + : virtual public C4 + , public C3 + , public C0 + , virtual public C7 + , virtual public C6 +{ public: int i8; }; +class C9 + : virtual public C0 + , public C4 + , public C8 + , public C1 + , public C6 +{ public: int i9; }; diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-10_main.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-10_main.C new file mode 100644 index 000000000..606c0fe2f --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-10_main.C @@ -0,0 +1,16 @@ +// { dg-options -w } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Jul 2001 <nathan@codesourcery.com> +// Split into pieces for binary compatibility testing October 2002 + +// Origin stefan@space.twc.de +// Bug 3145 case 10. Horribly complicated class hierarchy + +extern void vbase8_10_x (void); + +int +main () +{ + vbase8_10_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-10_x.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-10_x.C new file mode 100644 index 000000000..c56d080eb --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-10_x.C @@ -0,0 +1,51 @@ +// { dg-options -w } + +#include "vbase8-10.h" + +extern void check_C0 (C0&, int); +extern void check_C1 (C1&, int); +extern void check_C2 (C2&, int); +extern void check_C3 (C3&, int); +extern void check_C4 (C4&, int); +extern void check_C5 (C5&, int); +extern void check_C6 (C6&, int); +extern void check_C7 (C7&, int); +extern void check_C8 (C8&, int); +extern void check_C9 (C9&, int); + +void +vbase8_10_x (void) +{ + C0 c0; + C1 c1; + C2 c2; + C3 c3; + C4 c4; + C5 c5; + C6 c6; + C7 c7; + C8 c8; + C9 c9; + + c0.i0 = 0; + c1.i1 = 101; + c2.i2 = 202; + c3.i3 = 303; + c4.i4 = 404; + c5.i5 = 505; + c6.i6 = 606; + c7.i7 = 707; + c8.i8 = 808; + c9.i9 = 909; + + check_C0 (c0, 0); + check_C1 (c1, 101); + check_C2 (c2, 202); + check_C3 (c3, 303); + check_C4 (c4, 404); + check_C5 (c5, 505); + check_C6 (c6, 606); + check_C7 (c7, 707); + check_C8 (c8, 808); + check_C9 (c9, 909); +} diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-10_y.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-10_y.C new file mode 100644 index 000000000..5364ed6b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-10_y.C @@ -0,0 +1,65 @@ +// { dg-options -w } + +extern "C" void abort (void); + +#include "vbase8-10.h" + +void check_C0 (C0 &x, int i) +{ + if (x.i0 != i) + abort (); +} + +void check_C1 (C1 &x, int i) +{ + if (x.i1 != i) + abort (); +} + +void check_C2 (C2 &x, int i) +{ + if (x.i2 != i) + abort (); +} + +void check_C3 (C3 &x, int i) +{ + if (x.i3 != i) + abort (); +} + +void check_C4 (C4 &x, int i) +{ + if (x.i4 != i) + abort (); +} + +void check_C5 (C5 &x, int i) +{ + if (x.i5 != i) + abort (); +} + +void check_C6 (C6 &x, int i) +{ + if (x.i6 != i) + abort (); +} + +void check_C7 (C7 &x, int i) +{ + if (x.i7 != i) + abort (); +} + +void check_C8 (C8 &x, int i) +{ + if (x.i8 != i) + abort (); +} + +void check_C9 (C9 &x, int i) +{ + if (x.i9 != i) + abort (); +} diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-21.h b/gcc/testsuite/g++.dg/compat/abi/vbase8-21.h new file mode 100644 index 000000000..cd510e2ce --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-21.h @@ -0,0 +1,54 @@ +class C0 +{ public: int i0; }; +class C1 + : virtual public C0 +{ public: int i1; }; +class C2 + : virtual public C1 + , virtual public C0 +{ public: int i2; }; +class C3 + : virtual public C2 + , virtual public C1 +{ public: int i3; }; +class C4 + : virtual public C2 + , public C0 + , public C1 +{ public: int i4; }; +class C5 + : virtual public C0 + , public C2 + , virtual public C1 + , virtual public C3 + , virtual public C4 +{ public: int i5; }; +class C6 + : virtual public C1 + , virtual public C3 + , public C0 + , public C2 + , virtual public C4 +{ public: int i6; }; +class C7 + : virtual public C5 + , public C2 + , public C6 + , virtual public C0 + , public C3 +{ public: int i7; }; +class C8 + : virtual public C5 + , public C7 + , virtual public C0 + , virtual public C2 + , virtual public C6 +{ public: int i8; }; +class C9 + : virtual public C2 + , virtual public C4 + , public C1 + , virtual public C0 + , public C7 + , public C5 +{ public: int i9; }; diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-21_main.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-21_main.C new file mode 100644 index 000000000..16a0a3cd3 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-21_main.C @@ -0,0 +1,16 @@ +// { dg-options -w } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Jul 2001 <nathan@codesourcery.com> +// Split into pieces for binary compatibility testing October 2002 + +// Origin stefan@space.twc.de +// Bug 3145 case 10. Horribly complicated class hierarchy + +extern void vbase8_21_x (void); + +int +main () +{ + vbase8_21_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-21_x.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-21_x.C new file mode 100644 index 000000000..818eade03 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-21_x.C @@ -0,0 +1,51 @@ +// { dg-options -w } + +#include "vbase8-21.h" + +extern void check_C0 (C0&, int); +extern void check_C1 (C1&, int); +extern void check_C2 (C2&, int); +extern void check_C3 (C3&, int); +extern void check_C4 (C4&, int); +extern void check_C5 (C5&, int); +extern void check_C6 (C6&, int); +extern void check_C7 (C7&, int); +extern void check_C8 (C8&, int); +extern void check_C9 (C9&, int); + +void +vbase8_21_x (void) +{ + C0 c0; + C1 c1; + C2 c2; + C3 c3; + C4 c4; + C5 c5; + C6 c6; + C7 c7; + C8 c8; + C9 c9; + + c0.i0 = 0; + c1.i1 = 101; + c2.i2 = 202; + c3.i3 = 303; + c4.i4 = 404; + c5.i5 = 505; + c6.i6 = 606; + c7.i7 = 707; + c8.i8 = 808; + c9.i9 = 909; + + check_C0 (c0, 0); + check_C1 (c1, 101); + check_C2 (c2, 202); + check_C3 (c3, 303); + check_C4 (c4, 404); + check_C5 (c5, 505); + check_C6 (c6, 606); + check_C7 (c7, 707); + check_C8 (c8, 808); + check_C9 (c9, 909); +} diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-21_y.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-21_y.C new file mode 100644 index 000000000..512613935 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-21_y.C @@ -0,0 +1,65 @@ +// { dg-options -w } + +extern "C" void abort (void); + +#include "vbase8-21.h" + +void check_C0 (C0 &x, int i) +{ + if (x.i0 != i) + abort (); +} + +void check_C1 (C1 &x, int i) +{ + if (x.i1 != i) + abort (); +} + +void check_C2 (C2 &x, int i) +{ + if (x.i2 != i) + abort (); +} + +void check_C3 (C3 &x, int i) +{ + if (x.i3 != i) + abort (); +} + +void check_C4 (C4 &x, int i) +{ + if (x.i4 != i) + abort (); +} + +void check_C5 (C5 &x, int i) +{ + if (x.i5 != i) + abort (); +} + +void check_C6 (C6 &x, int i) +{ + if (x.i6 != i) + abort (); +} + +void check_C7 (C7 &x, int i) +{ + if (x.i7 != i) + abort (); +} + +void check_C8 (C8 &x, int i) +{ + if (x.i8 != i) + abort (); +} + +void check_C9 (C9 &x, int i) +{ + if (x.i9 != i) + abort (); +} diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-22.h b/gcc/testsuite/g++.dg/compat/abi/vbase8-22.h new file mode 100644 index 000000000..e19e93eae --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-22.h @@ -0,0 +1,59 @@ +class C0 +{ public: int i0; }; +class C1 + : public C0 +{ public: int i1; }; +class C2 + : public C1 + , virtual public C0 +{ public: int i2; }; +class C3 + : virtual public C0 + , virtual public C2 + , virtual public C1 +{ public: int i3; }; +class C4 + : virtual public C2 + , public C1 + , virtual public C3 + , public C0 +{ public: int i4; }; +class C5 + : virtual public C0 + , virtual public C4 + , public C1 + , virtual public C2 + , virtual public C3 +{ public: int i5; }; +class C6 + : public C0 + , virtual public C1 + , public C5 + , public C2 + , virtual public C3 + , virtual public C4 +{ public: int i6; }; +class C7 + : virtual public C1 + , public C5 + , virtual public C6 + , virtual public C4 + , virtual public C3 + , virtual public C0 +{ public: int i7; }; +class C8 + : virtual public C6 + , virtual public C1 + , virtual public C2 + , public C3 + , virtual public C4 +{ public: int i8; }; +class C9 + : public C4 + , virtual public C2 + , virtual public C8 + , public C3 + , public C1 + , public C6 + , public C5 +{ public: int i9; }; diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-22_main.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-22_main.C new file mode 100644 index 000000000..6455a2efc --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-22_main.C @@ -0,0 +1,16 @@ +// { dg-options -w } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 20 Nov 2001 <nathan@codesourcery.com> +// Split into pieces for binary compatibility testing October 2002 + +// Origin stefan@space.twc.de +// Bug 3145 case 22. Horribly complicated class hierarchy + +extern void vbase8_22_x (void); + +int +main () +{ + vbase8_22_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-22_x.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-22_x.C new file mode 100644 index 000000000..49f021adf --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-22_x.C @@ -0,0 +1,51 @@ +// { dg-options -w } + +#include "vbase8-22.h" + +extern void check_C0 (C0&, int); +extern void check_C1 (C1&, int); +extern void check_C2 (C2&, int); +extern void check_C3 (C3&, int); +extern void check_C4 (C4&, int); +extern void check_C5 (C5&, int); +extern void check_C6 (C6&, int); +extern void check_C7 (C7&, int); +extern void check_C8 (C8&, int); +extern void check_C9 (C9&, int); + +void +vbase8_22_x (void) +{ + C0 c0; + C1 c1; + C2 c2; + C3 c3; + C4 c4; + C5 c5; + C6 c6; + C7 c7; + C8 c8; + C9 c9; + + c0.i0 = 0; + c1.i1 = 101; + c2.i2 = 202; + c3.i3 = 303; + c4.i4 = 404; + c5.i5 = 505; + c6.i6 = 606; + c7.i7 = 707; + c8.i8 = 808; + c9.i9 = 909; + + check_C0 (c0, 0); + check_C1 (c1, 101); + check_C2 (c2, 202); + check_C3 (c3, 303); + check_C4 (c4, 404); + check_C5 (c5, 505); + check_C6 (c6, 606); + check_C7 (c7, 707); + check_C8 (c8, 808); + check_C9 (c9, 909); +} diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-22_y.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-22_y.C new file mode 100644 index 000000000..49ab04a87 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-22_y.C @@ -0,0 +1,65 @@ +// { dg-options -w } + +extern "C" void abort (void); + +#include "vbase8-22.h" + +void check_C0 (C0 &x, int i) +{ + if (x.i0 != i) + abort (); +} + +void check_C1 (C1 &x, int i) +{ + if (x.i1 != i) + abort (); +} + +void check_C2 (C2 &x, int i) +{ + if (x.i2 != i) + abort (); +} + +void check_C3 (C3 &x, int i) +{ + if (x.i3 != i) + abort (); +} + +void check_C4 (C4 &x, int i) +{ + if (x.i4 != i) + abort (); +} + +void check_C5 (C5 &x, int i) +{ + if (x.i5 != i) + abort (); +} + +void check_C6 (C6 &x, int i) +{ + if (x.i6 != i) + abort (); +} + +void check_C7 (C7 &x, int i) +{ + if (x.i7 != i) + abort (); +} + +void check_C8 (C8 &x, int i) +{ + if (x.i8 != i) + abort (); +} + +void check_C9 (C9 &x, int i) +{ + if (x.i9 != i) + abort (); +} diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-4.h b/gcc/testsuite/g++.dg/compat/abi/vbase8-4.h new file mode 100644 index 000000000..b183fbe4f --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-4.h @@ -0,0 +1,57 @@ +class C0 +{ public: int i0; }; +class C1 + : virtual public C0 +{ public: int i1; }; +class C2 + : public C0 + , public C1 +{ public: int i2; }; +class C3 + : virtual public C0 + , public C1 + , public C2 +{ public: int i3; }; +class C4 + : public C2 + , public C3 + , virtual public C1 + , virtual public C0 +{ public: int i4; }; +class C5 + : virtual public C2 + , public C1 + , public C0 +{ public: int i5; }; +class C6 + : virtual public C0 + , virtual public C5 + , public C1 + , public C3 + , public C4 +{ public: int i6; }; +class C7 + : public C6 + , virtual public C0 + , public C1 + , public C2 + , virtual public C4 +{ public: int i7; }; +class C8 + : public C2 + , virtual public C6 + , virtual public C7 + , public C5 + , public C3 + , virtual public C4 +{ public: int i8; }; +class C9 + : public C5 + , virtual public C3 + , virtual public C8 + , public C0 + , public C2 + , public C7 + , public C6 + , public C4 +{ public: int i9; }; diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-4_main.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-4_main.C new file mode 100644 index 000000000..f5e5e3824 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-4_main.C @@ -0,0 +1,16 @@ +// { dg-options -w } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 20 Nov 2001 <nathan@codesourcery.com> +// Split into pieces for binary compatibility testing October 2002 + +// Origin stefan@space.twc.de +// Bug 3145 case 4. Horribly complicated class hierarchy + +extern void vbase8_4_x (void); + +int +main () +{ + vbase8_4_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-4_x.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-4_x.C new file mode 100644 index 000000000..db60cc6ee --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-4_x.C @@ -0,0 +1,51 @@ +// { dg-options -w } + +#include "vbase8-4.h" + +extern void check_C0 (C0&, int); +extern void check_C1 (C1&, int); +extern void check_C2 (C2&, int); +extern void check_C3 (C3&, int); +extern void check_C4 (C4&, int); +extern void check_C5 (C5&, int); +extern void check_C6 (C6&, int); +extern void check_C7 (C7&, int); +extern void check_C8 (C8&, int); +extern void check_C9 (C9&, int); + +void +vbase8_4_x (void) +{ + C0 c0; + C1 c1; + C2 c2; + C3 c3; + C4 c4; + C5 c5; + C6 c6; + C7 c7; + C8 c8; + C9 c9; + + c0.i0 = 0; + c1.i1 = 101; + c2.i2 = 202; + c3.i3 = 303; + c4.i4 = 404; + c5.i5 = 505; + c6.i6 = 606; + c7.i7 = 707; + c8.i8 = 808; + c9.i9 = 909; + + check_C0 (c0, 0); + check_C1 (c1, 101); + check_C2 (c2, 202); + check_C3 (c3, 303); + check_C4 (c4, 404); + check_C5 (c5, 505); + check_C6 (c6, 606); + check_C7 (c7, 707); + check_C8 (c8, 808); + check_C9 (c9, 909); +} diff --git a/gcc/testsuite/g++.dg/compat/abi/vbase8-4_y.C b/gcc/testsuite/g++.dg/compat/abi/vbase8-4_y.C new file mode 100644 index 000000000..24d5046c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/abi/vbase8-4_y.C @@ -0,0 +1,65 @@ +// { dg-options -w } + +extern "C" void abort (void); + +#include "vbase8-4.h" + +void check_C0 (C0 &x, int i) +{ + if (x.i0 != i) + abort (); +} + +void check_C1 (C1 &x, int i) +{ + if (x.i1 != i) + abort (); +} + +void check_C2 (C2 &x, int i) +{ + if (x.i2 != i) + abort (); +} + +void check_C3 (C3 &x, int i) +{ + if (x.i3 != i) + abort (); +} + +void check_C4 (C4 &x, int i) +{ + if (x.i4 != i) + abort (); +} + +void check_C5 (C5 &x, int i) +{ + if (x.i5 != i) + abort (); +} + +void check_C6 (C6 &x, int i) +{ + if (x.i6 != i) + abort (); +} + +void check_C7 (C7 &x, int i) +{ + if (x.i7 != i) + abort (); +} + +void check_C8 (C8 &x, int i) +{ + if (x.i8 != i) + abort (); +} + +void check_C9 (C9 &x, int i) +{ + if (x.i9 != i) + abort (); +} diff --git a/gcc/testsuite/g++.dg/compat/break/README b/gcc/testsuite/g++.dg/compat/break/README new file mode 100644 index 000000000..0b8ea0247 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/README @@ -0,0 +1,18 @@ +Tests in this directory are for functionality that has changed in GCC +from one release to another or that is not ABI-compliant and may change +in a future release. + +Each test header for changed behavior should indicate the version in +which the behavior changed, in order to help users of these tests to +determine whether a test failure is expected or not. + +Every test in this directory that covers behavior that is not +ABI-compliant should also be covered by a test for -Wabi to ensure that +there is a warning for the construct. + + +Copyright (C) 2002 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. diff --git a/gcc/testsuite/g++.dg/compat/break/bitfield5.h b/gcc/testsuite/g++.dg/compat/break/bitfield5.h new file mode 100644 index 000000000..6f7f012cc --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/bitfield5.h @@ -0,0 +1,11 @@ +struct A { + virtual void f(); + int f1 : 1; +}; + +struct B : public A { + int f2 : 1; + int : 0; + int f3 : 4; + int f4 : 3; +}; diff --git a/gcc/testsuite/g++.dg/compat/break/bitfield5_main.C b/gcc/testsuite/g++.dg/compat/break/bitfield5_main.C new file mode 100644 index 000000000..415a8846c --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/bitfield5_main.C @@ -0,0 +1,14 @@ +// The offset of `B::f2' is not ABI-compliant and may change in a future +// version of GCC. +// g++.dg/abi/bitfield5.C tests this with -Wabi. +// Split into pieces for binary compatibility testing October 2002 + +#include "bitfield5.h" + +extern void bitfield5_x (void); + +int +main () +{ + bitfield5_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/break/bitfield5_x.C b/gcc/testsuite/g++.dg/compat/break/bitfield5_x.C new file mode 100644 index 000000000..9be937234 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/bitfield5_x.C @@ -0,0 +1,13 @@ +#include "bitfield5.h" + +extern void bitfield5_y (B&); + +void bitfield5_x () +{ + B b; + + b.f3 = 7; + b.f4 = 3; + + bitfield5_y (b); +} diff --git a/gcc/testsuite/g++.dg/compat/break/bitfield5_y.C b/gcc/testsuite/g++.dg/compat/break/bitfield5_y.C new file mode 100644 index 000000000..6ee4dd008 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/bitfield5_y.C @@ -0,0 +1,13 @@ +extern "C" void abort (void); + +#include "bitfield5.h" + +void A::f () {} + +void bitfield5_y (B& b) +{ + if (b.f3 != 7) + abort (); + if (b.f4 != 3) + abort (); +} diff --git a/gcc/testsuite/g++.dg/compat/break/bitfield7.h b/gcc/testsuite/g++.dg/compat/break/bitfield7.h new file mode 100644 index 000000000..2060bf747 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/bitfield7.h @@ -0,0 +1,3 @@ +union U { + int i: 4096; +}; diff --git a/gcc/testsuite/g++.dg/compat/break/bitfield7_main.C b/gcc/testsuite/g++.dg/compat/break/bitfield7_main.C new file mode 100644 index 000000000..57bb96101 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/bitfield7_main.C @@ -0,0 +1,16 @@ +// { dg-options "-w" } + +// The size assigned to `U' may not be ABI-compliant and may change in a +// future version of GCC. +// g++.dg/abi/bitfield7.C tests this with -Wabi. +// Split into pieces for binary compatibility testing October 2002 + +#include "bitfield7.h" + +extern void bitfield7_x (void); + +int +main () +{ + bitfield7_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/break/bitfield7_x.C b/gcc/testsuite/g++.dg/compat/break/bitfield7_x.C new file mode 100644 index 000000000..9b2a622a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/bitfield7_x.C @@ -0,0 +1,15 @@ +// { dg-options "-w" } + +#include "bitfield7.h" + +extern void bitfield7_y (U*); + +void bitfield7_x () +{ + U u[2]; + + u[0].i = 7; + u[1].i = 8; + + bitfield7_y (u); +} diff --git a/gcc/testsuite/g++.dg/compat/break/bitfield7_y.C b/gcc/testsuite/g++.dg/compat/break/bitfield7_y.C new file mode 100644 index 000000000..afa5446ae --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/bitfield7_y.C @@ -0,0 +1,13 @@ +// { dg-options "-w" } + +extern "C" void abort (void); + +#include "bitfield7.h" + +void bitfield7_y (U* u) +{ + if (u[0].i != 7) + abort (); + if (u[1].i != 8) + abort (); +} diff --git a/gcc/testsuite/g++.dg/compat/break/empty6.h b/gcc/testsuite/g++.dg/compat/break/empty6.h new file mode 100644 index 000000000..47a0da8b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/empty6.h @@ -0,0 +1,7 @@ +struct A {}; + +struct B { + A a; + virtual void f () {} + int i; +}; diff --git a/gcc/testsuite/g++.dg/compat/break/empty6_main.C b/gcc/testsuite/g++.dg/compat/break/empty6_main.C new file mode 100644 index 000000000..bf6d98241 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/empty6_main.C @@ -0,0 +1,14 @@ +// `B::a' contains empty classes which may cause base classes to be +// placed at different locations in a future version of GCC. +// g++.dg/abi/empty6.C tests this with -Wabi. +// Split into pieces for binary compatibility testing October 2002 + +#include "empty6.h" + +extern void empty6_x (void); + +int +main () +{ + empty6_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/break/empty6_x.C b/gcc/testsuite/g++.dg/compat/break/empty6_x.C new file mode 100644 index 000000000..f7e25e9ab --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/empty6_x.C @@ -0,0 +1,12 @@ +#include "empty6.h" + +extern void empty6_y (B&); + +void empty6_x () +{ + B b; + + b.i = 7; + + empty6_y (b); +} diff --git a/gcc/testsuite/g++.dg/compat/break/empty6_y.C b/gcc/testsuite/g++.dg/compat/break/empty6_y.C new file mode 100644 index 000000000..cb3d45c9e --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/empty6_y.C @@ -0,0 +1,9 @@ +extern "C" void abort (void); + +#include "empty6.h" + +void empty6_y (B& b) +{ + if (b.i != 7) + abort (); +} diff --git a/gcc/testsuite/g++.dg/compat/break/vbase10.h b/gcc/testsuite/g++.dg/compat/break/vbase10.h new file mode 100644 index 000000000..f418d1e56 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/vbase10.h @@ -0,0 +1,12 @@ +struct A { + virtual void f(); + char c1; +}; + +struct B { + B(); + char c2; +}; + +struct C : public A, public virtual B { +}; diff --git a/gcc/testsuite/g++.dg/compat/break/vbase10_main.C b/gcc/testsuite/g++.dg/compat/break/vbase10_main.C new file mode 100644 index 000000000..a082b5dbf --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/vbase10_main.C @@ -0,0 +1,14 @@ +// The offset of virtual base `B' is not ABI-compliant and may change in +// a future version of GCC. +// g++.dg/abi/vbase10.C tests this with -Wabi. +// Split into pieces for binary compatibility testing October 2002 + +#include "vbase10.h" + +extern void vbase10_x (void); + +int +main () +{ + vbase10_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/break/vbase10_x.C b/gcc/testsuite/g++.dg/compat/break/vbase10_x.C new file mode 100644 index 000000000..6d51d3c72 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/vbase10_x.C @@ -0,0 +1,13 @@ +#include "vbase10.h" + +extern void vbase10_y (C&); + +void vbase10_x () +{ + C c; + + c.c1 = 1; + c.c2 = 2; + + vbase10_y (c); +} diff --git a/gcc/testsuite/g++.dg/compat/break/vbase10_y.C b/gcc/testsuite/g++.dg/compat/break/vbase10_y.C new file mode 100644 index 000000000..70ce0075e --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/vbase10_y.C @@ -0,0 +1,14 @@ +extern "C" void abort (void); + +#include "vbase10.h" + +void A::f () {} +B::B() {} + +void vbase10_y (C& c) +{ + if (c.c1 != 1) + abort (); + if (c.c2 != 2) + abort (); +} diff --git a/gcc/testsuite/g++.dg/compat/break/vbase11.h b/gcc/testsuite/g++.dg/compat/break/vbase11.h new file mode 100644 index 000000000..a298f7644 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/vbase11.h @@ -0,0 +1,12 @@ +struct base +{ + short b; + virtual int foo(); +}; + +struct derived: virtual base +{ + int d; + virtual int foo(); + virtual int bar(); +}; diff --git a/gcc/testsuite/g++.dg/compat/break/vbase11_main.C b/gcc/testsuite/g++.dg/compat/break/vbase11_main.C new file mode 100644 index 000000000..2ac599449 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/vbase11_main.C @@ -0,0 +1,13 @@ +// Test case from PR 7470, which was fixed in GCC 3.2 and breaks binary +// compatibility with earlier releases. +// Split into pieces for binary compatibility testing October 2002 + +#include "vbase11.h" + +extern void vbase11_x (void); + +int +main () +{ + vbase11_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/break/vbase11_x.C b/gcc/testsuite/g++.dg/compat/break/vbase11_x.C new file mode 100644 index 000000000..4b2398ae1 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/vbase11_x.C @@ -0,0 +1,14 @@ +#include "vbase11.h" + +extern void vbase11_y (derived&); + +int base::foo() { return 1; } +int derived::foo() { return 2; } +int derived::bar() { return 3; } + +void vbase11_x () +{ + derived d; + + vbase11_y (d); +} diff --git a/gcc/testsuite/g++.dg/compat/break/vbase11_y.C b/gcc/testsuite/g++.dg/compat/break/vbase11_y.C new file mode 100644 index 000000000..01ca62b87 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/break/vbase11_y.C @@ -0,0 +1,11 @@ +extern "C" void abort (void); + +#include "vbase11.h" + +void vbase11_y (derived& d) +{ + if (d.foo() != 2) + abort (); + if (d.bar() != 3) + abort (); +} diff --git a/gcc/testsuite/g++.dg/compat/compat.exp b/gcc/testsuite/g++.dg/compat/compat.exp new file mode 100644 index 000000000..7fb16fed9 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/compat.exp @@ -0,0 +1,129 @@ +# Copyright (C) 2002, 2004, 2007 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. +# +# This file was written by Janis Johnson, <janis187@us.ibm.com> + + +# Test interoperability of two compilers that follow the same ABI. +# +# Break simple tests into two pieces and see that they work when linked +# together. If an alternate compiler is specified then the two main +# pieces of each test are compiled with different compilers. The +# alternate compiler must be installed, and is specified by defining +# ALT_CXX_UNDER_TEST in the environment. + +if $tracelevel then { + strace $tracelevel +} + +global GXX_UNDER_TEST +global ld_library_path + +# Load procedures from common libraries. +load_lib standard.exp +load_lib g++.exp +load_lib target-libpath.exp + +# +# compat-use-alt-compiler -- make the alternate compiler the default +# +proc compat-use-alt-compiler { } { + global GXX_UNDER_TEST ALT_CXX_UNDER_TEST + global CXXFLAGS + global ALWAYS_CXXFLAGS + global ld_library_path alt_ld_library_path + global same_alt + + # We don't need to do this if the alternate compiler is actually + # the same as the compiler under test. + if { $same_alt == 0 } then { + set GXX_UNDER_TEST $ALT_CXX_UNDER_TEST + set CXXFLAGS "" + set ALWAYS_CXXFLAGS "" + set ld_library_path $alt_ld_library_path + set_ld_library_path_env_vars + } +} + +# +# compat-use-tst-compiler -- make compiler under test the default +# +proc compat-use-tst-compiler { } { + global GXX_UNDER_TEST save_gxx_under_test + global CXXFLAGS save_cxxflags + global ALWAYS_CXXFLAGS save_always_cxxflags + global ld_library_path save_ld_library_path + global same_alt + + # We don't need to do this if the alternate compiler is actually + # the same as the compiler under test. + + if { $same_alt == 0 } then { + set GXX_UNDER_TEST $save_gxx_under_test + set CXXFLAGS $save_cxxflags + set ALWAYS_CXXFLAGS $save_always_cxxflags + set ld_library_path $save_ld_library_path + set_ld_library_path_env_vars + } +} + +# Load the language-independent compabibility support procedures. +# This must be done after the compat-use-*-compiler definitions. +load_lib compat.exp + +g++_init + +# Save variables for the C++ compiler under test, which each test will +# change a couple of times. This must be done after calling g++-init. +set save_gxx_under_test $GXX_UNDER_TEST +set save_cxxflags $CXXFLAGS +set save_always_cxxflags $ALWAYS_CXXFLAGS +set save_ld_library_path $ld_library_path + +# Define an identifier for use with this suite to avoid name conflicts +# with other compat tests running at the same time. +set sid "cp_compat" + +# Find out whether there is an alternate compiler to test. If the +# variable is defined but is set to "same", that means we use the same +# compiler twice, which is meaningful if the two parts of COMPAT_OPTIONS +# are different. +set use_alt 0 +set same_alt 0 +set alt_ld_library_path "." +if [info exists ALT_CXX_UNDER_TEST] then { + set use_alt 1 + if [string match "same" $ALT_CXX_UNDER_TEST] then { + set same_alt 1 + } else { + if [info exists ALT_LD_LIBRARY_PATH] then { + append alt_ld_library_path ":${ALT_LD_LIBRARY_PATH}" + } + } +} + +# Main loop. +foreach src [lsort [find $srcdir/$subdir *_main.C]] { + # If we're only testing specific files and this isn't one of them, skip it. + if ![runtest_file_p $runtests $src] then { + continue + } + + compat-execute $src $sid $use_alt +} + +# Restore the original compiler under test. +compat-use-tst-compiler diff --git a/gcc/testsuite/g++.dg/compat/decimal/compat-common.h b/gcc/testsuite/g++.dg/compat/decimal/compat-common.h new file mode 100644 index 000000000..43c22d722 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/compat-common.h @@ -0,0 +1,55 @@ +/* Several of the binary compatibility tests use these macros to + allow debugging the test or tracking down a failure by getting an + indication of whether each individual check passed or failed. + When DBG is defined, each check is shown by a dot (pass) or 'F' + (fail) rather than aborting as soon as a failure is detected. */ + +#ifdef DBG +#include <stdio.h> +#define DEBUG_INIT setbuf (stdout, NULL); +#define DEBUG_FPUTS(x) fputs (x, stdout); +#define DEBUG_DOT putc ('.', stdout); +#define DEBUG_NL putc ('\n', stdout); +#define DEBUG_FAIL putc ('F', stdout); fails++; +#define DEBUG_CHECK { DEBUG_FAIL } else { DEBUG_DOT } +#define DEBUG_FINI if (fails) DEBUG_FPUTS ("failed\n") \ + else DEBUG_FPUTS ("passed\n") +#else +#define DEBUG_INIT +#define DEBUG_FPUTS(x) +#define DEBUG_DOT +#define DEBUG_NL +#define DEBUG_FAIL abort (); +#define DEBUG_CHECK abort (); +#define DEBUG_FINI +#endif + +#ifdef SKIP_COMPLEX +#ifndef SKIP_COMPLEX_INT +#define SKIP_COMPLEX_INT +#endif +#endif + +#ifndef SKIP_COMPLEX +#ifdef __GNUC__ +#define CINT(x, y) (x + y * __extension__ 1i) +#define CDBL(x, y) (x + y * __extension__ 1i) +#else +#ifdef __SUNPRO_C +/* ??? Complex support without <complex.h>. */ +#else +#include <complex.h> +#endif +#ifndef SKIP_COMPLEX_INT +#define CINT(x, y) ((_Complex int) (x + y * _Complex_I)) +#endif +#define CDBL(x, y) (x + y * _Complex_I) +#endif +#endif + +#ifdef __cplusplus +extern "C" void abort (void); +#else +extern void abort (void); +#endif +extern int fails; diff --git a/gcc/testsuite/g++.dg/compat/decimal/decimal-dummy.h b/gcc/testsuite/g++.dg/compat/decimal/decimal-dummy.h new file mode 100644 index 000000000..ec347f9b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/decimal-dummy.h @@ -0,0 +1,67 @@ +namespace std { +namespace decimal { + + class decimal32 + { + public: + typedef float __dec32 __attribute__((mode(SD))); + decimal32 () : __val(0.e-101DF) {} + decimal32 (__dec32 x) : __val(x) {} + __dec32 __val; + }; + + class decimal64 + { + public: + typedef float __dec64 __attribute__((mode(DD))); + decimal64 () : __val(0.e-398dd) {} + decimal64 (__dec64 x) : __val(x) {} + __dec64 __val; + }; + + class decimal128 + { + public: + typedef float __dec128 __attribute__((mode(TD))); + decimal128 () : __val(0.e-6176DL) {} + decimal128 (__dec128 x) : __val(x) {} + __dec128 __val; + }; + + inline decimal32 operator+ (decimal32 lhs, decimal32 rhs) + { + decimal32 tmp; + tmp.__val = lhs.__val + rhs.__val; + return tmp; + } + + inline decimal64 operator+ (decimal64 lhs, decimal64 rhs) + { + decimal64 tmp; + tmp.__val = lhs.__val + rhs.__val; + return tmp; + } + + inline decimal128 operator+ (decimal128 lhs, decimal128 rhs) + { + decimal128 tmp; + tmp.__val = lhs.__val + rhs.__val; + return tmp; + } + + inline bool operator!= (decimal32 lhs, decimal32 rhs) + { + return lhs.__val != rhs.__val; + } + + inline bool operator!= (decimal64 lhs, decimal64 rhs) + { + return lhs.__val != rhs.__val; + } + + inline bool operator!= (decimal128 lhs, decimal128 rhs) + { + return lhs.__val != rhs.__val; + } +} +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass-1_main.C b/gcc/testsuite/g++.dg/compat/decimal/pass-1_main.C new file mode 100644 index 000000000..963dc3bbf --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass-1_main.C @@ -0,0 +1,13 @@ +/* { dg-require-effective-target dfp } */ + +/* Test passing decimal scalars by value. */ + +extern void pass_1_x (void); +int fails; + +int +main () +{ + pass_1_x (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass-1_x.C b/gcc/testsuite/g++.dg/compat/decimal/pass-1_x.C new file mode 100644 index 000000000..265a1317b --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass-1_x.C @@ -0,0 +1,30 @@ +typedef float dec32 __attribute__((mode(SD))); +typedef float dec64 __attribute__((mode(DD))); +typedef float dec128 __attribute__((mode(TD))); + +#include "pass_x.h" + +void +pass_1_x (void) +{ +DEBUG_INIT + +#define T(NAME) testit##NAME (); + +#ifndef SKIP_DECIMAL32 +T(d32) +#endif +#ifndef SKIP_DECIMAL64 +T(d64) +#endif +#ifndef SKIP_DECIMAL128 +T(d128) +#endif + +DEBUG_FINI + +if (fails != 0) + abort (); + +#undef T +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass-1_y.C b/gcc/testsuite/g++.dg/compat/decimal/pass-1_y.C new file mode 100644 index 000000000..5da7f87d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass-1_y.C @@ -0,0 +1,5 @@ +typedef float dec32 __attribute__((mode(SD))); +typedef float dec64 __attribute__((mode(DD))); +typedef float dec128 __attribute__((mode(TD))); + +#include "pass_y.h" diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass-2_main.C b/gcc/testsuite/g++.dg/compat/decimal/pass-2_main.C new file mode 100644 index 000000000..533e4b276 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass-2_main.C @@ -0,0 +1,13 @@ +/* { dg-require-effective-target dfp } */ + +/* Test passing decimal classes by value. */ + +extern void pass_2_x (void); +int fails; + +int +main () +{ + pass_2_x (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass-2_x.C b/gcc/testsuite/g++.dg/compat/decimal/pass-2_x.C new file mode 100644 index 000000000..8a67bda0e --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass-2_x.C @@ -0,0 +1,32 @@ +#include "decimal-dummy.h" + +#define dec32 std::decimal::decimal32 +#define dec64 std::decimal::decimal64 +#define dec128 std::decimal::decimal128 + +#include "pass_x.h" + +void +pass_2_x (void) +{ +DEBUG_INIT + +#define T(NAME) testit##NAME (); + +#ifndef SKIP_DECIMAL32 +T(d32) +#endif +#ifndef SKIP_DECIMAL64 +T(d64) +#endif +#ifndef SKIP_DECIMAL128 +T(d128) +#endif + +DEBUG_FINI + +if (fails != 0) + abort (); + +#undef T +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass-2_y.C b/gcc/testsuite/g++.dg/compat/decimal/pass-2_y.C new file mode 100644 index 000000000..97471457d --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass-2_y.C @@ -0,0 +1,7 @@ +#include "decimal-dummy.h" + +#define dec32 std::decimal::decimal32 +#define dec64 std::decimal::decimal64 +#define dec128 std::decimal::decimal128 + +#include "pass_y.h" diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass-3_main.C b/gcc/testsuite/g++.dg/compat/decimal/pass-3_main.C new file mode 100644 index 000000000..de09992c2 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass-3_main.C @@ -0,0 +1,13 @@ +/* { dg-require-effective-target dfp } */ + +/* Test passing decimal scalars and classes by value. */ + +extern void pass_3_x (void); +int fails; + +int +main () +{ + pass_3_x (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass-3_x.C b/gcc/testsuite/g++.dg/compat/decimal/pass-3_x.C new file mode 100644 index 000000000..17e4d1c8b --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass-3_x.C @@ -0,0 +1,30 @@ +typedef float dec32 __attribute__((mode(SD))); +typedef float dec64 __attribute__((mode(DD))); +typedef float dec128 __attribute__((mode(TD))); + +#include "pass_x.h" + +void +pass_3_x (void) +{ +DEBUG_INIT + +#define T(NAME) testit##NAME (); + +#ifndef SKIP_DECIMAL32 +T(d32) +#endif +#ifndef SKIP_DECIMAL64 +T(d64) +#endif +#ifndef SKIP_DECIMAL128 +T(d128) +#endif + +DEBUG_FINI + +if (fails != 0) + abort (); + +#undef T +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass-3_y.C b/gcc/testsuite/g++.dg/compat/decimal/pass-3_y.C new file mode 100644 index 000000000..97471457d --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass-3_y.C @@ -0,0 +1,7 @@ +#include "decimal-dummy.h" + +#define dec32 std::decimal::decimal32 +#define dec64 std::decimal::decimal64 +#define dec128 std::decimal::decimal128 + +#include "pass_y.h" diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass-4_main.C b/gcc/testsuite/g++.dg/compat/decimal/pass-4_main.C new file mode 100644 index 000000000..d5a0a47d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass-4_main.C @@ -0,0 +1,13 @@ +/* { dg-require-effective-target dfp } */ + +/* Test passing decimal classes and scalars by value. */ + +extern void pass_4_x (void); +int fails; + +int +main () +{ + pass_4_x (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass-4_x.C b/gcc/testsuite/g++.dg/compat/decimal/pass-4_x.C new file mode 100644 index 000000000..b0483ac27 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass-4_x.C @@ -0,0 +1,32 @@ +#include "decimal-dummy.h" + +#define dec32 std::decimal::decimal32 +#define dec64 std::decimal::decimal64 +#define dec128 std::decimal::decimal128 + +#include "pass_x.h" + +void +pass_4_x (void) +{ +DEBUG_INIT + +#define T(NAME) testit##NAME (); + +#ifndef SKIP_DECIMAL32 +T(d32) +#endif +#ifndef SKIP_DECIMAL64 +T(d64) +#endif +#ifndef SKIP_DECIMAL128 +T(d128) +#endif + +DEBUG_FINI + +if (fails != 0) + abort (); + +#undef T +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass-4_y.C b/gcc/testsuite/g++.dg/compat/decimal/pass-4_y.C new file mode 100644 index 000000000..5da7f87d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass-4_y.C @@ -0,0 +1,5 @@ +typedef float dec32 __attribute__((mode(SD))); +typedef float dec64 __attribute__((mode(DD))); +typedef float dec128 __attribute__((mode(TD))); + +#include "pass_y.h" diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass-5_main.C b/gcc/testsuite/g++.dg/compat/decimal/pass-5_main.C new file mode 100644 index 000000000..9b25a49c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass-5_main.C @@ -0,0 +1,13 @@ +/* { dg-require-effective-target dfp } */ + +/* Test passing decimal scalars and typedef'd classes by value. */ + +extern void pass_5_x (void); +int fails; + +int +main () +{ + pass_5_x (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass-5_x.C b/gcc/testsuite/g++.dg/compat/decimal/pass-5_x.C new file mode 100644 index 000000000..11c4d96c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass-5_x.C @@ -0,0 +1,30 @@ +typedef float dec32 __attribute__((mode(SD))); +typedef float dec64 __attribute__((mode(DD))); +typedef float dec128 __attribute__((mode(TD))); + +#include "pass_x.h" + +void +pass_5_x (void) +{ +DEBUG_INIT + +#define T(NAME) testit##NAME (); + +#ifndef SKIP_DECIMAL32 +T(d32) +#endif +#ifndef SKIP_DECIMAL64 +T(d64) +#endif +#ifndef SKIP_DECIMAL128 +T(d128) +#endif + +DEBUG_FINI + +if (fails != 0) + abort (); + +#undef T +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass-5_y.C b/gcc/testsuite/g++.dg/compat/decimal/pass-5_y.C new file mode 100644 index 000000000..5a2c1fba0 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass-5_y.C @@ -0,0 +1,7 @@ +#include "decimal-dummy.h" + +typedef std::decimal::decimal32 dec32; +typedef std::decimal::decimal64 dec64; +typedef std::decimal::decimal128 dec128; + +#include "pass_y.h" diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass-6_main.C b/gcc/testsuite/g++.dg/compat/decimal/pass-6_main.C new file mode 100644 index 000000000..1b686a21d --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass-6_main.C @@ -0,0 +1,13 @@ +/* { dg-require-effective-target dfp } */ + +/* Test passing typedef'd decimal classes and scalars by value. */ + +extern void pass_6_x (void); +int fails; + +int +main () +{ + pass_6_x (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass-6_x.C b/gcc/testsuite/g++.dg/compat/decimal/pass-6_x.C new file mode 100644 index 000000000..e59ca7f72 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass-6_x.C @@ -0,0 +1,32 @@ +#include "decimal-dummy.h" + +typedef std::decimal::decimal32 dec32; +typedef std::decimal::decimal64 dec64; +typedef std::decimal::decimal128 dec128; + +#include "pass_x.h" + +void +pass_6_x (void) +{ +DEBUG_INIT + +#define T(NAME) testit##NAME (); + +#ifndef SKIP_DECIMAL32 +T(d32) +#endif +#ifndef SKIP_DECIMAL64 +T(d64) +#endif +#ifndef SKIP_DECIMAL128 +T(d128) +#endif + +DEBUG_FINI + +if (fails != 0) + abort (); + +#undef T +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass-6_y.C b/gcc/testsuite/g++.dg/compat/decimal/pass-6_y.C new file mode 100644 index 000000000..5da7f87d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass-6_y.C @@ -0,0 +1,5 @@ +typedef float dec32 __attribute__((mode(SD))); +typedef float dec64 __attribute__((mode(DD))); +typedef float dec128 __attribute__((mode(TD))); + +#include "pass_y.h" diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass_x.h b/gcc/testsuite/g++.dg/compat/decimal/pass_x.h new file mode 100644 index 000000000..5b25dc9bf --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass_x.h @@ -0,0 +1,151 @@ +#include "compat-common.h" + +#define T(NAME, TYPE, INITVAL) \ +TYPE g01##NAME, g02##NAME, g03##NAME, g04##NAME; \ +TYPE g05##NAME, g06##NAME, g07##NAME, g08##NAME; \ +TYPE g09##NAME, g10##NAME, g11##NAME, g12##NAME; \ +TYPE g13##NAME, g14##NAME, g15##NAME, g16##NAME; \ + \ +extern void init##NAME (TYPE *p, TYPE v); \ +extern void checkg##NAME (void); \ +extern void \ +test##NAME (TYPE x01, TYPE x02, TYPE x03, TYPE x04, \ + TYPE x05, TYPE x06, TYPE x07, TYPE x08, \ + TYPE x09, TYPE x10, TYPE x11, TYPE x12, \ + TYPE x13, TYPE x14, TYPE x15, TYPE x16); \ +extern void testva##NAME (int n, ...); \ + \ +extern void \ +check##NAME (TYPE x, TYPE v) \ +{ \ + if (x != v + INITVAL) \ + DEBUG_CHECK \ +} \ + \ +extern void \ +test2_##NAME (TYPE x01, TYPE x02, TYPE x03, TYPE x04, \ + TYPE x05, TYPE x06, TYPE x07, TYPE x08) \ +{ \ + test##NAME (x01, g02##NAME, x02, g04##NAME, \ + x03, g06##NAME, x04, g08##NAME, \ + x05, g10##NAME, x06, g12##NAME, \ + x07, g14##NAME, x08, g16##NAME); \ +} \ + \ +extern void \ +testit##NAME (void) \ +{ \ + DEBUG_FPUTS (#NAME) \ + DEBUG_FPUTS (" init: ") \ + init##NAME (&g01##NAME, 1); \ + init##NAME (&g02##NAME, 2); \ + init##NAME (&g03##NAME, 3); \ + init##NAME (&g04##NAME, 4); \ + init##NAME (&g05##NAME, 5); \ + init##NAME (&g06##NAME, 6); \ + init##NAME (&g07##NAME, 7); \ + init##NAME (&g08##NAME, 8); \ + init##NAME (&g09##NAME, 9); \ + init##NAME (&g10##NAME, 10); \ + init##NAME (&g11##NAME, 11); \ + init##NAME (&g12##NAME, 12); \ + init##NAME (&g13##NAME, 13); \ + init##NAME (&g14##NAME, 14); \ + init##NAME (&g15##NAME, 15); \ + init##NAME (&g16##NAME, 16); \ + checkg##NAME (); \ + DEBUG_NL \ + DEBUG_FPUTS (#NAME) \ + DEBUG_FPUTS (" test: ") \ + test##NAME (g01##NAME, g02##NAME, g03##NAME, g04##NAME, \ + g05##NAME, g06##NAME, g07##NAME, g08##NAME, \ + g09##NAME, g10##NAME, g11##NAME, g12##NAME, \ + g13##NAME, g14##NAME, g15##NAME, g16##NAME); \ + DEBUG_NL \ + DEBUG_FPUTS (#NAME) \ + DEBUG_FPUTS (" testva: ") \ + DEBUG_NL \ + testva##NAME (1, \ + g01##NAME); \ + DEBUG_NL \ + testva##NAME (2, \ + g01##NAME, g02##NAME); \ + DEBUG_NL \ + testva##NAME (3, \ + g01##NAME, g02##NAME, g03##NAME); \ + DEBUG_NL \ + testva##NAME (4, \ + g01##NAME, g02##NAME, g03##NAME, g04##NAME); \ + DEBUG_NL \ + testva##NAME (5, \ + g01##NAME, g02##NAME, g03##NAME, g04##NAME, \ + g05##NAME); \ + DEBUG_NL \ + testva##NAME (6, \ + g01##NAME, g02##NAME, g03##NAME, g04##NAME, \ + g05##NAME, g06##NAME); \ + DEBUG_NL \ + testva##NAME (7, \ + g01##NAME, g02##NAME, g03##NAME, g04##NAME, \ + g05##NAME, g06##NAME, g07##NAME); \ + DEBUG_NL \ + testva##NAME (8, \ + g01##NAME, g02##NAME, g03##NAME, g04##NAME, \ + g05##NAME, g06##NAME, g07##NAME, g08##NAME); \ + DEBUG_NL \ + testva##NAME (9, \ + g01##NAME, g02##NAME, g03##NAME, g04##NAME, \ + g05##NAME, g06##NAME, g07##NAME, g08##NAME, \ + g09##NAME); \ + DEBUG_NL \ + testva##NAME (10, \ + g01##NAME, g02##NAME, g03##NAME, g04##NAME, \ + g05##NAME, g06##NAME, g07##NAME, g08##NAME, \ + g09##NAME, g10##NAME); \ + DEBUG_NL \ + testva##NAME (11, \ + g01##NAME, g02##NAME, g03##NAME, g04##NAME, \ + g05##NAME, g06##NAME, g07##NAME, g08##NAME, \ + g09##NAME, g10##NAME, g11##NAME); \ + DEBUG_NL \ + testva##NAME (12, \ + g01##NAME, g02##NAME, g03##NAME, g04##NAME, \ + g05##NAME, g06##NAME, g07##NAME, g08##NAME, \ + g09##NAME, g10##NAME, g11##NAME, g12##NAME); \ + DEBUG_NL \ + testva##NAME (13, \ + g01##NAME, g02##NAME, g03##NAME, g04##NAME, \ + g05##NAME, g06##NAME, g07##NAME, g08##NAME, \ + g09##NAME, g10##NAME, g11##NAME, g12##NAME, \ + g13##NAME); \ + DEBUG_NL \ + testva##NAME (14, \ + g01##NAME, g02##NAME, g03##NAME, g04##NAME, \ + g05##NAME, g06##NAME, g07##NAME, g08##NAME, \ + g09##NAME, g10##NAME, g11##NAME, g12##NAME, \ + g13##NAME, g14##NAME); \ + DEBUG_NL \ + testva##NAME (15, \ + g01##NAME, g02##NAME, g03##NAME, g04##NAME, \ + g05##NAME, g06##NAME, g07##NAME, g08##NAME, \ + g09##NAME, g10##NAME, g11##NAME, g12##NAME, \ + g13##NAME, g14##NAME, g15##NAME); \ + DEBUG_NL \ + testva##NAME (16, \ + g01##NAME, g02##NAME, g03##NAME, g04##NAME, \ + g05##NAME, g06##NAME, g07##NAME, g08##NAME, \ + g09##NAME, g10##NAME, g11##NAME, g12##NAME, \ + g13##NAME, g14##NAME, g15##NAME, g16##NAME); \ + DEBUG_NL \ + DEBUG_FPUTS (#NAME) \ + DEBUG_FPUTS (" test2: ") \ + test2_##NAME (g01##NAME, g03##NAME, g05##NAME, g07##NAME, \ + g09##NAME, g11##NAME, g13##NAME, g15##NAME); \ + DEBUG_NL \ +} + +T(d32, dec32, (dec32)1.5DF) +T(d64, dec64, (dec64)2.5DD) +T(d128, dec128, (dec128)3.5DL) + +#undef T diff --git a/gcc/testsuite/g++.dg/compat/decimal/pass_y.h b/gcc/testsuite/g++.dg/compat/decimal/pass_y.h new file mode 100644 index 000000000..f835b1983 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/pass_y.h @@ -0,0 +1,89 @@ +#include <stdarg.h> + +#include "compat-common.h" + +#ifdef SKIP_VA +const int test_va = 0; +#else +const int test_va = 1; +#endif + +#define T(NAME, TYPE, INITVAL) \ +extern TYPE g01##NAME, g02##NAME, g03##NAME, g04##NAME; \ +extern TYPE g05##NAME, g06##NAME, g07##NAME, g08##NAME; \ +extern TYPE g09##NAME, g10##NAME, g11##NAME, g12##NAME; \ +extern TYPE g13##NAME, g14##NAME, g15##NAME, g16##NAME; \ + \ +extern void check##NAME (TYPE x, TYPE v); \ + \ +extern void \ +init##NAME (TYPE *p, TYPE v) \ +{ \ + *p = v + INITVAL; \ +} \ + \ +extern void \ +checkg##NAME (void) \ +{ \ + check##NAME (g01##NAME, 1); \ + check##NAME (g02##NAME, 2); \ + check##NAME (g03##NAME, 3); \ + check##NAME (g04##NAME, 4); \ + check##NAME (g05##NAME, 5); \ + check##NAME (g06##NAME, 6); \ + check##NAME (g07##NAME, 7); \ + check##NAME (g08##NAME, 8); \ + check##NAME (g09##NAME, 9); \ + check##NAME (g10##NAME, 10); \ + check##NAME (g11##NAME, 11); \ + check##NAME (g12##NAME, 12); \ + check##NAME (g13##NAME, 13); \ + check##NAME (g14##NAME, 14); \ + check##NAME (g15##NAME, 15); \ + check##NAME (g16##NAME, 16); \ +} \ + \ +extern void \ +test##NAME (TYPE x01, TYPE x02, TYPE x03, TYPE x04, \ + TYPE x05, TYPE x06, TYPE x07, TYPE x08, \ + TYPE x09, TYPE x10, TYPE x11, TYPE x12, \ + TYPE x13, TYPE x14, TYPE x15, TYPE x16) \ +{ \ + check##NAME (x01, 1); \ + check##NAME (x02, 2); \ + check##NAME (x03, 3); \ + check##NAME (x04, 4); \ + check##NAME (x05, 5); \ + check##NAME (x06, 6); \ + check##NAME (x07, 7); \ + check##NAME (x08, 8); \ + check##NAME (x09, 9); \ + check##NAME (x10, 10); \ + check##NAME (x11, 11); \ + check##NAME (x12, 12); \ + check##NAME (x13, 13); \ + check##NAME (x14, 14); \ + check##NAME (x15, 15); \ + check##NAME (x16, 16); \ +} \ + \ +extern void \ +testva##NAME (int n, ...) \ +{ \ + int i; \ + va_list ap; \ + if (test_va) \ + { \ + va_start (ap, n); \ + for (i = 0; i < n; i++) \ + { \ + TYPE t = va_arg (ap, TYPE); \ + check##NAME (t, i+1); \ + } \ + va_end (ap); \ + } \ +} + +T(d32, dec32, (dec32)1.5DF) +T(d64, dec64, (dec64)2.5DD) +T(d128, dec128, (dec128)3.5DL) diff --git a/gcc/testsuite/g++.dg/compat/decimal/return-1_main.C b/gcc/testsuite/g++.dg/compat/decimal/return-1_main.C new file mode 100644 index 000000000..c663bb01c --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return-1_main.C @@ -0,0 +1,13 @@ +/* { dg-require-effective-target dfp } */ + +/* Test function return values for decimal float scalars. */ + +extern void return_1_x (void); +int fails; + +int +main () +{ + return_1_x (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/return-1_x.C b/gcc/testsuite/g++.dg/compat/decimal/return-1_x.C new file mode 100644 index 000000000..e391bd1f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return-1_x.C @@ -0,0 +1,24 @@ +typedef float dec32 __attribute__((mode(SD))); +typedef float dec64 __attribute__((mode(DD))); +typedef float dec128 __attribute__((mode(TD))); + +#include "return_x.h" + +void +return_1_x (void) +{ +DEBUG_INIT + +#define T(NAME) testit##NAME (); + +T(d32) +T(d64) +T(d128) + +DEBUG_FINI + +if (fails != 0) + abort (); + +#undef T +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/return-1_y.C b/gcc/testsuite/g++.dg/compat/decimal/return-1_y.C new file mode 100644 index 000000000..0b4d4bf38 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return-1_y.C @@ -0,0 +1,5 @@ +typedef float dec32 __attribute__((mode(SD))); +typedef float dec64 __attribute__((mode(DD))); +typedef float dec128 __attribute__((mode(TD))); + +#include "return_y.h" diff --git a/gcc/testsuite/g++.dg/compat/decimal/return-2_main.C b/gcc/testsuite/g++.dg/compat/decimal/return-2_main.C new file mode 100644 index 000000000..afa27f269 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return-2_main.C @@ -0,0 +1,13 @@ +/* { dg-require-effective-target dfp } */ + +/* Test function return values for decimal classes. */ + +extern void return_2_x (void); +int fails; + +int +main () +{ + return_2_x (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/return-2_x.C b/gcc/testsuite/g++.dg/compat/decimal/return-2_x.C new file mode 100644 index 000000000..d96c01479 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return-2_x.C @@ -0,0 +1,26 @@ +#include "decimal-dummy.h" + +#define dec32 std::decimal::decimal32 +#define dec64 std::decimal::decimal64 +#define dec128 std::decimal::decimal128 + +#include "return_x.h" + +void +return_2_x (void) +{ +DEBUG_INIT + +#define T(NAME) testit##NAME (); + +T(d32) +T(d64) +T(d128) + +DEBUG_FINI + +if (fails != 0) + abort (); + +#undef T +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/return-2_y.C b/gcc/testsuite/g++.dg/compat/decimal/return-2_y.C new file mode 100644 index 000000000..c68088b30 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return-2_y.C @@ -0,0 +1,7 @@ +#include "decimal-dummy.h" + +#define dec32 std::decimal::decimal32 +#define dec64 std::decimal::decimal64 +#define dec128 std::decimal::decimal128 + +#include "return_y.h" diff --git a/gcc/testsuite/g++.dg/compat/decimal/return-3_main.C b/gcc/testsuite/g++.dg/compat/decimal/return-3_main.C new file mode 100644 index 000000000..468f3fc0c --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return-3_main.C @@ -0,0 +1,13 @@ +/* { dg-require-effective-target dfp } */ + +/* Test function return values for decimal float scalars and classes. */ + +extern void return_3_x (void); +int fails; + +int +main () +{ + return_3_x (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/return-3_x.C b/gcc/testsuite/g++.dg/compat/decimal/return-3_x.C new file mode 100644 index 000000000..52e599c76 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return-3_x.C @@ -0,0 +1,24 @@ +typedef float dec32 __attribute__((mode(SD))); +typedef float dec64 __attribute__((mode(DD))); +typedef float dec128 __attribute__((mode(TD))); + +#include "return_x.h" + +void +return_3_x (void) +{ +DEBUG_INIT + +#define T(NAME) testit##NAME (); + +T(d32) +T(d64) +T(d128) + +DEBUG_FINI + +if (fails != 0) + abort (); + +#undef T +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/return-3_y.C b/gcc/testsuite/g++.dg/compat/decimal/return-3_y.C new file mode 100644 index 000000000..c68088b30 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return-3_y.C @@ -0,0 +1,7 @@ +#include "decimal-dummy.h" + +#define dec32 std::decimal::decimal32 +#define dec64 std::decimal::decimal64 +#define dec128 std::decimal::decimal128 + +#include "return_y.h" diff --git a/gcc/testsuite/g++.dg/compat/decimal/return-4_main.C b/gcc/testsuite/g++.dg/compat/decimal/return-4_main.C new file mode 100644 index 000000000..365d8becd --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return-4_main.C @@ -0,0 +1,13 @@ +/* { dg-require-effective-target dfp } */ + +/* Test function return values for decimal float classes and scalars. */ + +extern void return_4_x (void); +int fails; + +int +main () +{ + return_4_x (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/return-4_x.C b/gcc/testsuite/g++.dg/compat/decimal/return-4_x.C new file mode 100644 index 000000000..b9d28fa5b --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return-4_x.C @@ -0,0 +1,26 @@ +#include "decimal-dummy.h" + +#define dec32 std::decimal::decimal32 +#define dec64 std::decimal::decimal64 +#define dec128 std::decimal::decimal128 + +#include "return_x.h" + +void +return_4_x (void) +{ +DEBUG_INIT + +#define T(NAME) testit##NAME (); + +T(d32) +T(d64) +T(d128) + +DEBUG_FINI + +if (fails != 0) + abort (); + +#undef T +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/return-4_y.C b/gcc/testsuite/g++.dg/compat/decimal/return-4_y.C new file mode 100644 index 000000000..0b4d4bf38 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return-4_y.C @@ -0,0 +1,5 @@ +typedef float dec32 __attribute__((mode(SD))); +typedef float dec64 __attribute__((mode(DD))); +typedef float dec128 __attribute__((mode(TD))); + +#include "return_y.h" diff --git a/gcc/testsuite/g++.dg/compat/decimal/return-5_main.C b/gcc/testsuite/g++.dg/compat/decimal/return-5_main.C new file mode 100644 index 000000000..2c3348327 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return-5_main.C @@ -0,0 +1,14 @@ +/* { dg-require-effective-target dfp } */ + +/* Test function return values for decimal float scalars and typedef'd + classes. */ + +extern void return_5_x (void); +int fails; + +int +main () +{ + return_5_x (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/return-5_x.C b/gcc/testsuite/g++.dg/compat/decimal/return-5_x.C new file mode 100644 index 000000000..a2bb6173b --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return-5_x.C @@ -0,0 +1,24 @@ +typedef float dec32 __attribute__((mode(SD))); +typedef float dec64 __attribute__((mode(DD))); +typedef float dec128 __attribute__((mode(TD))); + +#include "return_x.h" + +void +return_5_x (void) +{ +DEBUG_INIT + +#define T(NAME) testit##NAME (); + +T(d32) +T(d64) +T(d128) + +DEBUG_FINI + +if (fails != 0) + abort (); + +#undef T +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/return-5_y.C b/gcc/testsuite/g++.dg/compat/decimal/return-5_y.C new file mode 100644 index 000000000..0f780167a --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return-5_y.C @@ -0,0 +1,7 @@ +#include "decimal-dummy.h" + +typedef std::decimal::decimal32 dec32; +typedef std::decimal::decimal64 dec64; +typedef std::decimal::decimal128 dec128; + +#include "return_y.h" diff --git a/gcc/testsuite/g++.dg/compat/decimal/return-6_main.C b/gcc/testsuite/g++.dg/compat/decimal/return-6_main.C new file mode 100644 index 000000000..94526bdcb --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return-6_main.C @@ -0,0 +1,14 @@ +/* { dg-require-effective-target dfp } */ + +/* Test function return values for typedef'd decimal float classes + and scalars. */ + +extern void return_6_x (void); +int fails; + +int +main () +{ + return_6_x (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/return-6_x.C b/gcc/testsuite/g++.dg/compat/decimal/return-6_x.C new file mode 100644 index 000000000..e0a487dbe --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return-6_x.C @@ -0,0 +1,26 @@ +#include "decimal-dummy.h" + +typedef std::decimal::decimal32 dec32; +typedef std::decimal::decimal64 dec64; +typedef std::decimal::decimal128 dec128; + +#include "return_x.h" + +void +return_6_x (void) +{ +DEBUG_INIT + +#define T(NAME) testit##NAME (); + +T(d32) +T(d64) +T(d128) + +DEBUG_FINI + +if (fails != 0) + abort (); + +#undef T +} diff --git a/gcc/testsuite/g++.dg/compat/decimal/return-6_y.C b/gcc/testsuite/g++.dg/compat/decimal/return-6_y.C new file mode 100644 index 000000000..0b4d4bf38 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return-6_y.C @@ -0,0 +1,5 @@ +typedef float dec32 __attribute__((mode(SD))); +typedef float dec64 __attribute__((mode(DD))); +typedef float dec128 __attribute__((mode(TD))); + +#include "return_y.h" diff --git a/gcc/testsuite/g++.dg/compat/decimal/return_x.h b/gcc/testsuite/g++.dg/compat/decimal/return_x.h new file mode 100644 index 000000000..401adfb5c --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return_x.h @@ -0,0 +1,90 @@ +#include "compat-common.h" + +#ifdef SKIP_VA +const int test_va = 0; +#else +const int test_va = 1; +#endif + +#define T(NAME, TYPE, INITVAL) \ +TYPE g01##NAME, g02##NAME, g03##NAME, g04##NAME; \ +TYPE g05##NAME, g06##NAME, g07##NAME, g08##NAME; \ +TYPE g09##NAME, g10##NAME, g11##NAME, g12##NAME; \ +TYPE g13##NAME, g14##NAME, g15##NAME, g16##NAME; \ + \ +extern void init##NAME (TYPE *p, TYPE v); \ +extern void checkg##NAME (void); \ +extern TYPE test0##NAME (void); \ +extern TYPE test1##NAME (TYPE); \ +extern TYPE testva##NAME (int n, ...); \ + \ +extern void \ +check##NAME (TYPE x, TYPE v) \ +{ \ + if (x != v) \ + DEBUG_CHECK \ +} \ + \ +extern void \ +testit##NAME (void) \ +{ \ + TYPE rslt; \ + DEBUG_FPUTS (#NAME) \ + DEBUG_FPUTS (" init: ") \ + init##NAME (&g01##NAME, 1); \ + init##NAME (&g02##NAME, 2); \ + init##NAME (&g03##NAME, 3); \ + init##NAME (&g04##NAME, 4); \ + init##NAME (&g05##NAME, 5); \ + init##NAME (&g06##NAME, 6); \ + init##NAME (&g07##NAME, 7); \ + init##NAME (&g08##NAME, 8); \ + init##NAME (&g09##NAME, 9); \ + init##NAME (&g10##NAME, 10); \ + init##NAME (&g11##NAME, 11); \ + init##NAME (&g12##NAME, 12); \ + init##NAME (&g13##NAME, 13); \ + init##NAME (&g14##NAME, 14); \ + init##NAME (&g15##NAME, 15); \ + init##NAME (&g16##NAME, 16); \ + checkg##NAME (); \ + DEBUG_NL \ + DEBUG_FPUTS (#NAME) \ + DEBUG_FPUTS (" test0: ") \ + rslt = test0##NAME (); \ + check##NAME (rslt, g01##NAME); \ + DEBUG_NL \ + DEBUG_FPUTS (#NAME) \ + DEBUG_FPUTS (" test1: ") \ + rslt = test1##NAME (g01##NAME); \ + check##NAME (rslt, g01##NAME); \ + if (test_va) \ + { \ + DEBUG_NL \ + DEBUG_FPUTS (#NAME) \ + DEBUG_FPUTS (" testva: ") \ + rslt = testva##NAME (1, g01##NAME); \ + check##NAME (rslt, g01##NAME); \ + rslt = testva##NAME (5, g01##NAME, g02##NAME, g03##NAME, \ + g04##NAME, g05##NAME); \ + check##NAME (rslt, g05##NAME); \ + rslt = testva##NAME (9, g01##NAME, g02##NAME, g03##NAME, \ + g04##NAME, g05##NAME, g06##NAME, \ + g07##NAME, g08##NAME, g09##NAME); \ + check##NAME (rslt, g09##NAME); \ + rslt = testva##NAME (16, g01##NAME, g02##NAME, g03##NAME, \ + g04##NAME, g05##NAME, g06##NAME, \ + g07##NAME, g08##NAME, g09##NAME, \ + g10##NAME, g11##NAME, g12##NAME, \ + g13##NAME, g14##NAME, g15##NAME, \ + g16##NAME); \ + check##NAME (rslt, g16##NAME); \ + } \ + DEBUG_NL \ +} + +T(d32, dec32, (dec32)1.5DF); +T(d64, dec64, (dec64)2.5DD); +T(d128, dec128, (dec128)3.5DL); + +#undef T diff --git a/gcc/testsuite/g++.dg/compat/decimal/return_y.h b/gcc/testsuite/g++.dg/compat/decimal/return_y.h new file mode 100644 index 000000000..285526e2e --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/decimal/return_y.h @@ -0,0 +1,67 @@ +#include <stdarg.h> + +#include "compat-common.h" + +#define T(NAME, TYPE, INITVAL) \ +extern TYPE g01##NAME, g02##NAME, g03##NAME, g04##NAME; \ +extern TYPE g05##NAME, g06##NAME, g07##NAME, g08##NAME; \ +extern TYPE g09##NAME, g10##NAME, g11##NAME, g12##NAME; \ +extern TYPE g13##NAME, g14##NAME, g15##NAME, g16##NAME; \ + \ +extern void check##NAME (TYPE x, TYPE v); \ + \ +extern void \ +init##NAME (TYPE *p, TYPE v) \ +{ \ + *p = v + INITVAL; \ +} \ + \ +extern void \ +checkg##NAME (void) \ +{ \ + check##NAME (g01##NAME, 1+INITVAL); \ + check##NAME (g02##NAME, 2+INITVAL); \ + check##NAME (g03##NAME, 3+INITVAL); \ + check##NAME (g04##NAME, 4+INITVAL); \ + check##NAME (g05##NAME, 5+INITVAL); \ + check##NAME (g06##NAME, 6+INITVAL); \ + check##NAME (g07##NAME, 7+INITVAL); \ + check##NAME (g08##NAME, 8+INITVAL); \ + check##NAME (g09##NAME, 9+INITVAL); \ + check##NAME (g10##NAME, 10+INITVAL); \ + check##NAME (g11##NAME, 11+INITVAL); \ + check##NAME (g12##NAME, 12+INITVAL); \ + check##NAME (g13##NAME, 13+INITVAL); \ + check##NAME (g14##NAME, 14+INITVAL); \ + check##NAME (g15##NAME, 15+INITVAL); \ + check##NAME (g16##NAME, 16+INITVAL); \ +} \ + \ +extern TYPE \ +test0##NAME (void) \ +{ \ + return g01##NAME; \ +} \ + \ +extern TYPE \ +test1##NAME (TYPE x01) \ +{ \ + return x01; \ +} \ + \ +extern TYPE \ +testva##NAME (int n, ...) \ +{ \ + int i; \ + TYPE rslt; \ + va_list ap; \ + va_start (ap, n); \ + for (i = 0; i < n; i++) \ + rslt = va_arg (ap, TYPE); \ + va_end (ap); \ + return rslt; \ +} + +T(d32, dec32, (dec32)1.5) +T(d64, dec64, (dec64)2.5) +T(d128, dec128, (dec128)3.5) diff --git a/gcc/testsuite/g++.dg/compat/eh/ctor1.h b/gcc/testsuite/g++.dg/compat/eh/ctor1.h new file mode 100644 index 000000000..e83476f2d --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/ctor1.h @@ -0,0 +1,10 @@ +struct Foo +{ + ~Foo (); +}; + +struct Bar +{ + ~Bar (); + Foo f; +}; diff --git a/gcc/testsuite/g++.dg/compat/eh/ctor1_main.C b/gcc/testsuite/g++.dg/compat/eh/ctor1_main.C new file mode 100644 index 000000000..a188b46da --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/ctor1_main.C @@ -0,0 +1,13 @@ +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Dec 2001 <nathan@nathan@codesourcery.com> +// PR 411 + +// Split into pieces for binary compatibility testing October 2002 + +extern void ctor1_x (void); + +int +main () +{ + ctor1_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/eh/ctor1_x.C b/gcc/testsuite/g++.dg/compat/eh/ctor1_x.C new file mode 100644 index 000000000..d74a52087 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/ctor1_x.C @@ -0,0 +1,22 @@ +extern "C" void abort (void); +extern "C" void exit (int); + +#include "ctor1.h" + +bool was_f_in_Bar_destroyed=false; + +void ctor1_x () +{ + try + { + Bar f; + } + catch(int i) + { + if(was_f_in_Bar_destroyed) + { + exit (0); + } + } + abort (); +} diff --git a/gcc/testsuite/g++.dg/compat/eh/ctor1_y.C b/gcc/testsuite/g++.dg/compat/eh/ctor1_y.C new file mode 100644 index 000000000..260ab1c34 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/ctor1_y.C @@ -0,0 +1,13 @@ +extern bool was_f_in_Bar_destroyed; + +#include "ctor1.h" + +Foo::~Foo() +{ + was_f_in_Bar_destroyed=true; +} + +Bar::~Bar() +{ + throw 1; +} diff --git a/gcc/testsuite/g++.dg/compat/eh/ctor2.h b/gcc/testsuite/g++.dg/compat/eh/ctor2.h new file mode 100644 index 000000000..c6b9f40f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/ctor2.h @@ -0,0 +1,22 @@ +struct VBase +{ + virtual void f () {} + VBase(); + ~VBase(); +}; + +struct StreamBase +{ + virtual ~StreamBase() {} +}; + +struct Stream : public virtual VBase, public StreamBase +{ + Stream(); + virtual ~Stream() {} +}; + +struct DerivedStream : public Stream +{ + DerivedStream(); +}; diff --git a/gcc/testsuite/g++.dg/compat/eh/ctor2_main.C b/gcc/testsuite/g++.dg/compat/eh/ctor2_main.C new file mode 100644 index 000000000..58836e26e --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/ctor2_main.C @@ -0,0 +1,12 @@ +// PR c++/4460 +// Test that the cleanup for fully-constructed subobjects when a +// constructor throws gets the right address for a virtual base. + +// Split into pieces for binary compatibility testing October 2002 + +extern void ctor2_x (void); + +int main () +{ + ctor2_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/eh/ctor2_x.C b/gcc/testsuite/g++.dg/compat/eh/ctor2_x.C new file mode 100644 index 000000000..3fa1a53ac --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/ctor2_x.C @@ -0,0 +1,19 @@ +extern "C" void exit (int); +extern "C" void abort (void); + +#include "ctor2.h" + +int r; + +void ctor2_x () { + + try + { + DerivedStream str; + } + catch (...) { } + + if (r != 0) + abort (); + exit (0); +} diff --git a/gcc/testsuite/g++.dg/compat/eh/ctor2_y.C b/gcc/testsuite/g++.dg/compat/eh/ctor2_y.C new file mode 100644 index 000000000..00ba92000 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/ctor2_y.C @@ -0,0 +1,20 @@ +extern int r; +void *p; + +#include "ctor2.h" + +VBase::VBase () +{ + p = this; +} + +VBase::~VBase () +{ + if (p != this) r = 1; +} + +Stream::Stream () {} +DerivedStream::DerivedStream () +{ + throw 1; +} diff --git a/gcc/testsuite/g++.dg/compat/eh/dtor1.h b/gcc/testsuite/g++.dg/compat/eh/dtor1.h new file mode 100644 index 000000000..0dfa793e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/dtor1.h @@ -0,0 +1,7 @@ +struct A { + ~A(); +}; + +struct B: public A { + ~B(); +}; diff --git a/gcc/testsuite/g++.dg/compat/eh/dtor1_main.C b/gcc/testsuite/g++.dg/compat/eh/dtor1_main.C new file mode 100644 index 000000000..962fa6427 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/dtor1_main.C @@ -0,0 +1,14 @@ +// PR c++/411 + +// Test that a fully-constructed base is destroyed before transferring +// control to the handler of a function-try-block. + +// Split into pieces for binary compatibility testing October 2002 + +extern void dtor1_x (void); + +int +main () +{ + dtor1_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/eh/dtor1_x.C b/gcc/testsuite/g++.dg/compat/eh/dtor1_x.C new file mode 100644 index 000000000..f7f4cc8a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/dtor1_x.C @@ -0,0 +1,14 @@ +extern "C" void exit (int); +extern "C" void abort (void); + +#include "dtor1.h" + +int r; + +void dtor1_x () +{ + { B b; } + if (r != 0) + abort (); + exit (0); +} diff --git a/gcc/testsuite/g++.dg/compat/eh/dtor1_y.C b/gcc/testsuite/g++.dg/compat/eh/dtor1_y.C new file mode 100644 index 000000000..a1ec41a27 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/dtor1_y.C @@ -0,0 +1,18 @@ +extern int r; +int ad; + +#include "dtor1.h" + +A::~A () { ++ad; } + +B::~B () +try + { + throw 1; + } +catch (...) + { + if (!ad) + r = 1; + return; + } diff --git a/gcc/testsuite/g++.dg/compat/eh/filter1.h b/gcc/testsuite/g++.dg/compat/eh/filter1.h new file mode 100644 index 000000000..1f5f0c936 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/filter1.h @@ -0,0 +1,5 @@ +struct a +{ + a(); + ~a(); +}; diff --git a/gcc/testsuite/g++.dg/compat/eh/filter1_main.C b/gcc/testsuite/g++.dg/compat/eh/filter1_main.C new file mode 100644 index 000000000..2a8fca42c --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/filter1_main.C @@ -0,0 +1,11 @@ +// Test that cleanups get run when a catch filter fails to match. + +// Split into pieces for binary compatibility testing October 2002 + +extern void filter1_x (void); + +int +main () +{ + filter1_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/eh/filter1_x.C b/gcc/testsuite/g++.dg/compat/eh/filter1_x.C new file mode 100644 index 000000000..b3789aa15 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/filter1_x.C @@ -0,0 +1,21 @@ +#include "filter1.h" + +extern "C" void exit (int); +extern "C" void abort (void); +extern void ex_test (void); + +void +filter1_x () +{ + try + { + ex_test (); + } + catch (...) + { + } + abort (); +} + +a::a() { } +a::~a() { exit (0); } diff --git a/gcc/testsuite/g++.dg/compat/eh/filter1_y.C b/gcc/testsuite/g++.dg/compat/eh/filter1_y.C new file mode 100644 index 000000000..48de0877d --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/filter1_y.C @@ -0,0 +1,17 @@ +#include "filter1.h" + +struct e1 {}; +struct e2 {}; + +void +ex_test () +{ + a aa; + try + { + throw e1 (); + } + catch (e2 &) + { + } +} diff --git a/gcc/testsuite/g++.dg/compat/eh/filter2_main.C b/gcc/testsuite/g++.dg/compat/eh/filter2_main.C new file mode 100644 index 000000000..866199c6b --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/filter2_main.C @@ -0,0 +1,12 @@ +// Test that terminate gets run when a catch filter fails to match while +// running destructors. Original bug depended on a::~a being inlined. + +// Split into pieces for binary compatibility testing October 2002 + +extern void filter2_x (void); + +int +main () +{ + filter2_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/eh/filter2_x.C b/gcc/testsuite/g++.dg/compat/eh/filter2_x.C new file mode 100644 index 000000000..287ffc7bd --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/filter2_x.C @@ -0,0 +1,22 @@ +#include <exception> +#include <cstdlib> + +extern "C" void abort (void); + +extern void my_terminate (void); +extern void ex_test (void); + +void +filter2_x () +{ + std::set_terminate (my_terminate); + + try + { + ex_test (); + } + catch (...) + { + } + abort (); +} diff --git a/gcc/testsuite/g++.dg/compat/eh/filter2_y.C b/gcc/testsuite/g++.dg/compat/eh/filter2_y.C new file mode 100644 index 000000000..87c6fea10 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/filter2_y.C @@ -0,0 +1,39 @@ +#include <exception> +#include <cstdlib> + +struct e1 {}; +struct e2 {}; + +struct a +{ + a () { } + + ~a () + { + try + { + throw e1(); + } + catch (e2 &) + { + } + } +}; + +void +ex_test () +{ + a aa; + try + { + throw e1 (); + } + catch (e2 &) + { + } +} + +void my_terminate () +{ + std::exit (0); +} diff --git a/gcc/testsuite/g++.dg/compat/eh/new1_main.C b/gcc/testsuite/g++.dg/compat/eh/new1_main.C new file mode 100644 index 000000000..ee4cad8e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/new1_main.C @@ -0,0 +1,13 @@ +// PR c++/5757 +// Test that when a constructor throws in a new-expression, we pass the +// right pointer to operator delete. + +// Split into pieces for binary compatibility testing October 2002 + +extern void new1_x (void); + +int +main () +{ + new1_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/eh/new1_x.C b/gcc/testsuite/g++.dg/compat/eh/new1_x.C new file mode 100644 index 000000000..121287170 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/new1_x.C @@ -0,0 +1,29 @@ +#include <new> +#include <cstddef> + +extern "C" void exit (int); +extern "C" void abort (void); + +extern void * operator new[] (std::size_t s) throw (std::bad_alloc); +extern void operator delete[] (void *p) throw (); + +struct A +{ + A() { throw 1; } + ~A() {} +}; + +int ret = 1; + +void +new1_x () +{ + try + { + A *p = new A[4]; + } + catch (...) {} + if (ret != 0) + abort (); + exit (0); +} diff --git a/gcc/testsuite/g++.dg/compat/eh/new1_y.C b/gcc/testsuite/g++.dg/compat/eh/new1_y.C new file mode 100644 index 000000000..fbe0e2145 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/new1_y.C @@ -0,0 +1,19 @@ +#include <new> +#include <cstddef> + +extern int ret; + +void *ptr; +void * operator new[] (std::size_t s) throw (std::bad_alloc) +{ + ptr = operator new (s); + return ptr; +} + +void operator delete[] (void *p) throw () +{ + if (p == ptr) + ret = 0; + operator delete (p); +} + diff --git a/gcc/testsuite/g++.dg/compat/eh/nrv1.h b/gcc/testsuite/g++.dg/compat/eh/nrv1.h new file mode 100644 index 000000000..853ea3914 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/nrv1.h @@ -0,0 +1,5 @@ +struct A +{ + A(); + ~A(); +}; diff --git a/gcc/testsuite/g++.dg/compat/eh/nrv1_main.C b/gcc/testsuite/g++.dg/compat/eh/nrv1_main.C new file mode 100644 index 000000000..3b76b5c88 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/nrv1_main.C @@ -0,0 +1,12 @@ +// PR c++/5636 +// Bug: the named return value optimization interfered with EH cleanups. + +// Split into pieces for binary compatibility testing October 2002 + +extern void nrv1_x (void); + +int +main () +{ + nrv1_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/eh/nrv1_x.C b/gcc/testsuite/g++.dg/compat/eh/nrv1_x.C new file mode 100644 index 000000000..0647de889 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/nrv1_x.C @@ -0,0 +1,21 @@ +extern "C" void exit (int); +extern "C" void abort (void); + +#include "nrv1.h" + +extern A f (void); + +int c, d; + +void nrv1_x () +{ + try + { A a = f(); } + catch (...) { } + if (d < c) + abort (); + exit (0); +} + +A::A() { ++c; } +A::~A() { ++d; } diff --git a/gcc/testsuite/g++.dg/compat/eh/nrv1_y.C b/gcc/testsuite/g++.dg/compat/eh/nrv1_y.C new file mode 100644 index 000000000..5a43af7c2 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/nrv1_y.C @@ -0,0 +1,8 @@ +#include "nrv1.h" + +A f() +{ + A nrv; + throw 42; + return nrv; +} diff --git a/gcc/testsuite/g++.dg/compat/eh/spec3.h b/gcc/testsuite/g++.dg/compat/eh/spec3.h new file mode 100644 index 000000000..a042c1004 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/spec3.h @@ -0,0 +1,8 @@ +class Base {}; + +struct A : virtual public Base +{ + A(); +}; + +struct B {}; diff --git a/gcc/testsuite/g++.dg/compat/eh/spec3_main.C b/gcc/testsuite/g++.dg/compat/eh/spec3_main.C new file mode 100644 index 000000000..3f0e919b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/spec3_main.C @@ -0,0 +1,12 @@ +// PR c++/4381 +// Test that exception-specs work properly for classes with virtual bases. + +// Split into pieces for binary compatibility testing October 2002 + +extern void spec3_x (void); + +int +main () +{ + spec3_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/eh/spec3_x.C b/gcc/testsuite/g++.dg/compat/eh/spec3_x.C new file mode 100644 index 000000000..b8e5fbeaa --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/spec3_x.C @@ -0,0 +1,9 @@ +#include "spec3.h" + +extern void func () throw (B,A); + +void spec3_x (void) +{ + try { func(); } + catch (A& a) { } +} diff --git a/gcc/testsuite/g++.dg/compat/eh/spec3_y.C b/gcc/testsuite/g++.dg/compat/eh/spec3_y.C new file mode 100644 index 000000000..fef6b368c --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/spec3_y.C @@ -0,0 +1,8 @@ +#include "spec3.h" + +A::A() {} + +void func() throw (B,A) +{ + throw A(); +} diff --git a/gcc/testsuite/g++.dg/compat/eh/template1.h b/gcc/testsuite/g++.dg/compat/eh/template1.h new file mode 100644 index 000000000..93999a11d --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/template1.h @@ -0,0 +1,15 @@ +class A {}; + +template <class T> +struct B +{ + typedef A E; +}; + +template <class T> +struct C +{ + typedef B<T> D; + typedef typename D::E E; + void f() throw(E); +}; diff --git a/gcc/testsuite/g++.dg/compat/eh/template1_main.C b/gcc/testsuite/g++.dg/compat/eh/template1_main.C new file mode 100644 index 000000000..2d169808c --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/template1_main.C @@ -0,0 +1,12 @@ +// Test whether exception specifier dependent on template parameter +// is accepted during template decl processing. + +// Split into pieces for binary compatibility testing October 2002 + +extern void template1_x (void); + +int +main () +{ + template1_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/eh/template1_x.C b/gcc/testsuite/g++.dg/compat/eh/template1_x.C new file mode 100644 index 000000000..5a18be789 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/template1_x.C @@ -0,0 +1,21 @@ +extern "C" void exit (int); +extern "C" void abort (void); + +#include "template1.h" + +void template1_x () +{ + int caught = 0; + try + { + C<int> x; + x.f(); + } + catch (A) + { + ++caught; + } + if (caught != 1) + abort (); + exit (0); +} diff --git a/gcc/testsuite/g++.dg/compat/eh/template1_y.C b/gcc/testsuite/g++.dg/compat/eh/template1_y.C new file mode 100644 index 000000000..19425375c --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/template1_y.C @@ -0,0 +1,8 @@ +#include "template1.h" + +template<class T> void C<T>::f (void) throw (E) +{ + throw E(); +} + +template class C<int>; diff --git a/gcc/testsuite/g++.dg/compat/eh/unexpected1_main.C b/gcc/testsuite/g++.dg/compat/eh/unexpected1_main.C new file mode 100644 index 000000000..1658db77e --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/unexpected1_main.C @@ -0,0 +1,12 @@ +// PR 3719 +// Test that an unexpected handler can rethrow to categorize. + +// Split into pieces for binary compatibility testing October 2002 + +extern void unexpected1_x (); + +int +main () +{ + unexpected1_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/eh/unexpected1_x.C b/gcc/testsuite/g++.dg/compat/eh/unexpected1_x.C new file mode 100644 index 000000000..61361a68d --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/unexpected1_x.C @@ -0,0 +1,26 @@ +#include <exception> + +struct One { }; +struct Two { }; + +extern "C" void abort (); +extern void doit (void) throw (Two); +extern void handle_unexpected (void); + +void +unexpected1_x () +{ + std::set_unexpected (handle_unexpected); + + try + { + doit (); + } + catch (Two &) + { + } + catch (...) + { + abort (); + } +} diff --git a/gcc/testsuite/g++.dg/compat/eh/unexpected1_y.C b/gcc/testsuite/g++.dg/compat/eh/unexpected1_y.C new file mode 100644 index 000000000..0c42c4579 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/eh/unexpected1_y.C @@ -0,0 +1,21 @@ +struct One { }; +struct Two { }; + +void +handle_unexpected () +{ + try + { + throw; + } + catch (One &) + { + throw Two (); + } +} + +void +doit () throw (Two) +{ + throw One (); +} diff --git a/gcc/testsuite/g++.dg/compat/init/array5_main.C b/gcc/testsuite/g++.dg/compat/init/array5_main.C new file mode 100644 index 000000000..96b2cc4b1 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/init/array5_main.C @@ -0,0 +1,14 @@ +// Copyright (C) 2002 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// Split into pieces for binary compatibility testing October 2002 + +// Incorrect construction and destruction of multi-dimensional +// array of class. + +extern void array5_x (void); + +int +main () +{ + array5_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/init/array5_x.C b/gcc/testsuite/g++.dg/compat/init/array5_x.C new file mode 100644 index 000000000..dc138772c --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/init/array5_x.C @@ -0,0 +1,33 @@ +extern "C" void abort (void); + +extern int count; +extern int num; + +struct A +{ + A(); + ~A(); +}; + +struct Array +{ + A array[2][2][2]; +}; + +void +array5_x () +{ + for (num = 0; num <= 8; ++num) + { + count = 0; + try + { + Array A; + } + catch (...) + { + } + if (count != 0) + abort(); + } +} diff --git a/gcc/testsuite/g++.dg/compat/init/array5_y.C b/gcc/testsuite/g++.dg/compat/init/array5_y.C new file mode 100644 index 000000000..64b295ed5 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/init/array5_y.C @@ -0,0 +1,20 @@ +int count; +int num; + +struct A +{ + A(); + ~A(); +}; + +A::A() +{ + if (count == num) + throw ""; + count++; +} + +A::~A() +{ + count--; +} diff --git a/gcc/testsuite/g++.dg/compat/init/byval1.h b/gcc/testsuite/g++.dg/compat/init/byval1.h new file mode 100644 index 000000000..2876b76ed --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/init/byval1.h @@ -0,0 +1,6 @@ +struct C +{ + int m; + C(); + ~C(); +}; diff --git a/gcc/testsuite/g++.dg/compat/init/byval1_main.C b/gcc/testsuite/g++.dg/compat/init/byval1_main.C new file mode 100644 index 000000000..acefaab14 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/init/byval1_main.C @@ -0,0 +1,12 @@ +// PR c++/3948 +// Test that the destructor call for a value parameter gets the +// right address. +// Split into pieces for binary compatibility testing October 2002 + +extern void byval1_x (void); + +int +main () +{ + byval1_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/init/byval1_x.C b/gcc/testsuite/g++.dg/compat/init/byval1_x.C new file mode 100644 index 000000000..248dbe763 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/init/byval1_x.C @@ -0,0 +1,15 @@ +#include "byval1.h" + +extern "C" void abort (void); +extern void Foo (C c); +extern int r; + +void +byval1_x () +{ + C c; + + Foo (c); + if (r != 0) + abort (); +} diff --git a/gcc/testsuite/g++.dg/compat/init/byval1_y.C b/gcc/testsuite/g++.dg/compat/init/byval1_y.C new file mode 100644 index 000000000..6e217e84e --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/init/byval1_y.C @@ -0,0 +1,14 @@ +#include "byval1.h" + +void *p[2]; + +int i; +int r; + +C::C() { p[i++] = this; } +C::~C() { if (p[--i] != this) r = 1; } + +void Foo (C c) +{ + p[i++] = &c; +} diff --git a/gcc/testsuite/g++.dg/compat/init/dtor1.h b/gcc/testsuite/g++.dg/compat/init/dtor1.h new file mode 100644 index 000000000..77e21c12e --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/init/dtor1.h @@ -0,0 +1,30 @@ +struct B +{ + int x; + B (int); + ~B (); +}; + +struct C1 : public B { + C1 (int); +}; + +struct C2 : public B { + C2 (int); +}; + +struct D : public B { + D (int); +}; + +struct E : public B { + E (int); +}; + +struct A + : public C1, C2, virtual public D, virtual public E +{ + A (); + B x1; + B x2; +}; diff --git a/gcc/testsuite/g++.dg/compat/init/dtor1_main.C b/gcc/testsuite/g++.dg/compat/init/dtor1_main.C new file mode 100644 index 000000000..788687840 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/init/dtor1_main.C @@ -0,0 +1,9 @@ +// Split into pieces for binary compatibility testing October 2002 + +extern void dtor1_x (void); + +int +main () +{ + dtor1_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/init/dtor1_x.C b/gcc/testsuite/g++.dg/compat/init/dtor1_x.C new file mode 100644 index 000000000..8a4727cfb --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/init/dtor1_x.C @@ -0,0 +1,7 @@ +#include "dtor1.h" + +void +dtor1_x (void) +{ + A a; +} diff --git a/gcc/testsuite/g++.dg/compat/init/dtor1_y.C b/gcc/testsuite/g++.dg/compat/init/dtor1_y.C new file mode 100644 index 000000000..27610fc1e --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/init/dtor1_y.C @@ -0,0 +1,18 @@ +#include "dtor1.h" + +extern "C" void abort (); + +int d = 5; + +B::B (int i) : x (i) { } +B::~B () { if (d-- != x) abort (); } + +C1::C1 (int i) : B (i) {} + +C2::C2 (int i) : B (i) {} + +D::D (int i) : B (i) {} + +E::E (int i) : B (i) {} + +A::A () : D (0), E (1), C1 (2), C2 (3), x1(4), x2(5) {} diff --git a/gcc/testsuite/g++.dg/compat/init/elide1.h b/gcc/testsuite/g++.dg/compat/init/elide1.h new file mode 100644 index 000000000..481e7308b --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/init/elide1.h @@ -0,0 +1,5 @@ +struct A { + A (); + A (const A&); + ~A (); +}; diff --git a/gcc/testsuite/g++.dg/compat/init/elide1_main.C b/gcc/testsuite/g++.dg/compat/init/elide1_main.C new file mode 100644 index 000000000..c08d02fff --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/init/elide1_main.C @@ -0,0 +1,25 @@ +// Test that the destructor for a temporary passed by value isn't run +// until end of full-expression, as per [class.copy]: + +// Whenever a temporary class object is copied using a copy constructor, +// and this object and the copy have the same cv-unqualified type, an +// implementation is permitted to treat the original and the copy as two +// different ways of referring to the same object and not perform a copy +// at all, even if the class copy constructor or destructor have side +// effects.... In these cases, the +// object is destroyed at the later of times when the original and the +// copy would have been destroyed without the optimization. + +// Here, the temporary would be destroyed later than the parm, so either we +// must suppress the optimization in this case or destroy value parms in the +// caller. + +// Split into pieces for binary compatibility testing October 2002 + +extern void elide1_x (void); + +int +main () +{ + elide1_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/init/elide1_x.C b/gcc/testsuite/g++.dg/compat/init/elide1_x.C new file mode 100644 index 000000000..dbc287e4e --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/init/elide1_x.C @@ -0,0 +1,15 @@ +#include "elide1.h" + +extern "C" void abort (void); +extern void f (A); +extern int d; + +void +elide1_x (void) +{ + int r; + f (A ()), r = d; + + if (r >= d || !d) + abort (); +} diff --git a/gcc/testsuite/g++.dg/compat/init/elide1_y.C b/gcc/testsuite/g++.dg/compat/init/elide1_y.C new file mode 100644 index 000000000..e767d0808 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/init/elide1_y.C @@ -0,0 +1,9 @@ +#include "elide1.h" + +int d; + +A::A () { } +A::A (const A&) { } +A::~A() { ++d; } + +void f (A a) { } diff --git a/gcc/testsuite/g++.dg/compat/init/init-ref2_main.C b/gcc/testsuite/g++.dg/compat/init/init-ref2_main.C new file mode 100644 index 000000000..73782829e --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/init/init-ref2_main.C @@ -0,0 +1,11 @@ +// Submitted by Jason Merrill <jason_merrill@redhat.com> +// Test for proper handling of local static references. +// Split into pieces for binary compatibility testing October 2002 + +extern void init_ref2_x (void); + +int +main () +{ + init_ref2_x (); +} diff --git a/gcc/testsuite/g++.dg/compat/init/init-ref2_x.C b/gcc/testsuite/g++.dg/compat/init/init-ref2_x.C new file mode 100644 index 000000000..7fbec89b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/init/init-ref2_x.C @@ -0,0 +1,22 @@ +extern "C" void abort (void); +extern void g (void); +extern void h (void); + +int r; +int c; +int f () +{ + // Test that we only initialize i once. + if (++c > 1) + ++r; + return 42; +} + +void +init_ref2_x (void) +{ + g (); + h (); + if (r != 0) + abort (); +} diff --git a/gcc/testsuite/g++.dg/compat/init/init-ref2_y.C b/gcc/testsuite/g++.dg/compat/init/init-ref2_y.C new file mode 100644 index 000000000..23e66b2f9 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/init/init-ref2_y.C @@ -0,0 +1,24 @@ +extern int f (void); +extern int r; + +const int *p; + +void g () +{ + static const int &i = f(); + + // Test that i points to the same place in both calls. + if (p && p != &i) + ++r; + // Test that if so, it points to static data. + if (i != 42) + ++r; + + p = &i; +} + +void h () +{ + int arr[] = { 1, 1, 1, 1, 1, 1, 1 }; + g (); +} diff --git a/gcc/testsuite/g++.dg/compat/struct-layout-1.exp b/gcc/testsuite/g++.dg/compat/struct-layout-1.exp new file mode 100644 index 000000000..7fa89470e --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/struct-layout-1.exp @@ -0,0 +1,167 @@ +# Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. +# +# This file was written by Jakub Jelinek, <jakub@redhat.com> +# Based on compat.exp writte by Janis Johnson, <janis187@us.ibm.com> + + +# Test interoperability of two compilers that follow the same ABI. +# +# Break simple tests into two pieces and see that they work when linked +# together. If an alternate compiler is specified then the two main +# pieces of each test are compiled with different compilers. The +# alternate compiler must be installed, and is specified by defining +# ALT_CXX_UNDER_TEST in the environment. +# +# struct-layout-1 are generated structure layout interoperability tests, +# so a generator first needs to be compiled on host, run there and the +# generated tests then compiled on build and executed on target. + +if $tracelevel then { + strace $tracelevel +} + +global GXX_UNDER_TEST +global ld_library_path + +# Load procedures from common libraries. +load_lib standard.exp +load_lib g++.exp +load_lib target-libpath.exp + +# +# compat-use-alt-compiler -- make the alternate compiler the default +# +proc compat-use-alt-compiler { } { + global GXX_UNDER_TEST ALT_CXX_UNDER_TEST + global CXXFLAGS + global ALWAYS_CXXFLAGS + global ld_library_path alt_ld_library_path + global same_alt + + # We don't need to do this if the alternate compiler is actually + # the same as the compiler under test. + if { $same_alt == 0 } then { + set GXX_UNDER_TEST $ALT_CXX_UNDER_TEST + set CXXFLAGS "" + set ALWAYS_CXXFLAGS "" + set ld_library_path $alt_ld_library_path + set_ld_library_path_env_vars + } +} + +# +# compat-use-tst-compiler -- make compiler under test the default +# +proc compat-use-tst-compiler { } { + global GXX_UNDER_TEST save_gxx_under_test + global CXXFLAGS save_cxxflags + global ALWAYS_CXXFLAGS save_always_cxxflags + global ld_library_path save_ld_library_path + global same_alt + + # We don't need to do this if the alternate compiler is actually + # the same as the compiler under test. + + if { $same_alt == 0 } then { + set GXX_UNDER_TEST $save_gxx_under_test + set CXXFLAGS $save_cxxflags + set ALWAYS_CXXFLAGS $save_always_cxxflags + set ld_library_path $save_ld_library_path + set_ld_library_path_env_vars + } +} + +# Load the language-independent compabibility support procedures. +# This must be done after the compat-use-*-compiler definitions. +load_lib compat.exp + +g++_init + +# Save variables for the C++ compiler under test, which each test will +# change a couple of times. This must be done after calling g++-init. +set save_gxx_under_test $GXX_UNDER_TEST +set save_cxxflags $CXXFLAGS +set save_always_cxxflags $ALWAYS_CXXFLAGS +set save_ld_library_path $ld_library_path + +# Define an identifier for use with this suite to avoid name conflicts +# with other compat tests running at the same time. +set sid "cp_compat" + +# Find out whether there is an alternate compiler to test. If the +# variable is defined but is set to "same", that means we use the same +# compiler twice, which is meaningful if the two parts of COMPAT_OPTIONS +# are different. +set use_alt 0 +set same_alt 0 +set alt_ld_library_path "." +if [info exists ALT_CXX_UNDER_TEST] then { + set use_alt 1 + if [string match "same" $ALT_CXX_UNDER_TEST] then { + set same_alt 1 + } else { + if [info exists ALT_LD_LIBRARY_PATH] then { + append alt_ld_library_path ":${ALT_LD_LIBRARY_PATH}" + } + } +} + +set tstobjdir "$tmpdir/g++.dg-struct-layout-1" +set generator "$tmpdir/g++.dg-struct-layout-1_generate.exe" + +set generator_src "$srcdir/$subdir/struct-layout-1_generate.c" +set generator_src "$generator_src $srcdir/$subdir/../../gcc.dg/compat/generate-random.c" +set generator_src "$generator_src $srcdir/$subdir/../../gcc.dg/compat/generate-random_r.c" +set generator_cmd "-o $generator $generator_src" + +# Temporarily switch to the environment of the host compiler. +restore_ld_library_path_env_vars +set status [remote_exec build "$HOSTCC $HOSTCFLAGS $generator_cmd"] +set status [lindex $status 0] +set_ld_library_path_env_vars +if { $status == 0 } then { + file delete -force $tstobjdir + file mkdir $tstobjdir + set generator_args "-s $srcdir/$subdir -d $tstobjdir" + if [info exists env(RUN_ALL_COMPAT_TESTS) ] then { + set generator_args "$generator_args -n 15000" + } + if [check_effective_target_short_enums] then { + set generator_args "-e $generator_args" + } + set status [remote_exec host "$generator $generator_args"] + set status [lindex $status 0] + if { $status == 0 } then { + foreach src [lsort [find $tstobjdir *_main.C]] { + # If we're only testing specific files and this isn't one + # of them, skip it. + if ![runtest_file_p $runtests $src] then { + continue + } + + compat-execute $src $sid $use_alt + } + } else { + warning "Could not execute g++.dg/compat/struct-layout-1 generator" + } +} else { + warning "Could not compile g++.dg/compat/struct-layout-1 generator" +} + +# Restore the original compiler under test. +compat-use-tst-compiler diff --git a/gcc/testsuite/g++.dg/compat/struct-layout-1.h b/gcc/testsuite/g++.dg/compat/struct-layout-1.h new file mode 100644 index 000000000..2b93a72c4 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/struct-layout-1.h @@ -0,0 +1,502 @@ +#include <limits.h> +#include <stdarg.h> +#include <stdbool.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include "../../gcc.dg/compat/compat-common.h" + +#ifndef SKIP_ATTRIBUTE +# include "../../gcc.dg/compat/vector-defs.h" +#else +typedef int qi; +typedef int hi; +typedef int si; +typedef int di; +typedef float sf; +typedef float df; +typedef int v8qi; +typedef int v16qi; +typedef int v2hi; +typedef int v4hi; +typedef int v8hi; +typedef int v2si; +typedef int v4si; +typedef int v1di; +typedef int v2di; +typedef int v2sf; +typedef int v4sf; +typedef int v16sf; +typedef int v2df; +typedef int u8qi; +typedef int u16qi; +typedef int u2hi; +typedef int u4hi; +typedef int u8hi; +typedef int u2si; +typedef int u4si; +typedef int u1di; +typedef int u2di; +typedef int u2sf; +typedef int u4sf; +typedef int u16sf; +typedef int u2df; +#endif +#if (defined __i386__ || defined __x86_64__) && !defined SKIP_ATTRIBUTE +# ifdef __MMX__ +typedef int __m64 __attribute__ ((__vector_size__ (8))); +# else +typedef int __m64; +# endif +# ifdef __SSE__ +typedef float __m128 __attribute__ ((__vector_size__ (16))); +# else +typedef int __m128; +# endif +#else +typedef int __m64; +typedef int __m128; +#endif +#if defined (__uClinux__) +/* The maximum achievable alignment on uClinux is usually 16 bytes. */ +#define v16sf v4sf +#define u16sf u4sf +#endif + +#define FLDS_MAX 32 +extern struct Info +{ + int nfields, nbitfields; + void *sp, *a0p, *a3p; + void *flds[FLDS_MAX]; + size_t sz, sizes[FLDS_MAX]; + size_t als, ala0, ala3, aligns[FLDS_MAX]; +} info; + +extern int intarray[256]; +extern int fn0 (void), fn1 (void), fn2 (void), fn3 (void), fn4 (void); +extern int fn5 (void), fn6 (void), fn7 (void), fn8 (void), fn9 (void); + +#ifdef DBG +#define FAIL(n, m) printf ("fail %d.%d\n", n, m), ++fails +#else +#define FAIL(n, m) ++fails +#endif + +#ifdef SKIP_ATTRIBUTE +# define __attribute__(x) +#endif +#define atal __attribute__((aligned)) +#define atpa __attribute__((packed)) +#define atalpa __attribute__((aligned, packed)) +#define atpaal __attribute__((packed, aligned)) +#define atal1 __attribute__((aligned (1))) +#define atal2 __attribute__((aligned (2))) +#define atal4 __attribute__((aligned (4))) +#define atal8 __attribute__((aligned (8))) +#define atal16 __attribute__((aligned (16))) +#define atal1pa __attribute__((aligned (1), packed)) +#define atal2pa __attribute__((aligned (2), packed)) +#define atal4pa __attribute__((aligned (4), packed)) +#define atal8pa __attribute__((aligned (8), packed)) +#define atal16pa __attribute__((aligned (16), packed)) +#define atpaal1 __attribute__((packed, aligned (1))) +#define atpaal2 __attribute__((packed, aligned (2))) +#define atpaal4 __attribute__((packed, aligned (4))) +#define atpaal8 __attribute__((packed, aligned (8))) +#define atpaal16 __attribute__((packed, aligned (16))) + +#if UCHAR_MAX == 255 && USHORT_MAX == 65535 && UINT_MAX == 4294967295U \ + && ULLONG_MAX == 18446744073709551615ULL +/* For ILP32 and LP64 targets, assume float is at least 32-bit + and double plus long double at least 64-bit. */ +# define atalx1 atal1 +# define atalx2 atal2 +# define atalx4 atal4 +# define atalx8 atal8 +# define atalx16 atal16 +# define atalx1pa atal1pa +# define atalx2pa atal2pa +# define atalx4pa atal4pa +# define atalx8pa atal8pa +# define atalx16pa atal16pa +# define atpaalx1 atpaal1 +# define atpaalx2 atpaal2 +# define atpaalx4 atpaal4 +# define atpaalx8 atpaal8 +# define atpaalx16 atpaal16 +# if ULONG_MAX > 4294967295UL +# define ataly8 atal8 +# define ataly8pa atal8pa +# define atpaaly8 atpaal8 +# define ataly16 atal16 +# define ataly16pa atal16pa +# define atpaaly16 atpaal16 +# else +# define ataly8 +# define ataly8pa +# define atpaaly8 +# define ataly16 +# define ataly16pa +# define atpaaly16 +# endif +#else +# define atalx1 +# define atalx2 +# define atalx4 +# define atalx8 +# define atalx16 +# define atalx1pa +# define atalx2pa +# define atalx4pa +# define atalx8pa +# define atalx16pa +# define atpaalx1 +# define atpaalx2 +# define atpaalx4 +# define atpaalx8 +# define atpaalx16 +# define ataly8 +# define ataly8pa +# define atpaaly8 +# define ataly16 +# define ataly16pa +# define atpaaly16 +#endif + +#define atQI __attribute__((mode (QI))) +#define atHI __attribute__((mode (HI))) +#define atSI __attribute__((mode (SI))) +#define atDI __attribute__((mode (DI))) + +enum E0 { e0_0 }; +enum E1 { e1_0, e1_1 }; +enum E2 { e2_m3 = -3, e2_m2, e2_m1, e2_0, e2_1, e2_2, e2_3 }; +enum E3 { e3_m127 = -127, e3_m126, e3_m125, e3_0 = 0, e3_125 = 125, e3_126, e3_127 }; +enum E4 { e4_0, e4_1, e4_2, e4_3, e4_253 = 253, e4_254, e4_255 }; +enum E5 { e5_m32767 = -32767, e5_m32766, e5_m32765, e5_0 = 0, e5_32765 = 32765, e5_32766, e5_32767 }; +enum E6 { e6_0, e6_1, e6_2, e6_3, e6_65533 = 65533, e6_65534, e6_65535 }; +enum E7 { e7_m2147483647 = -2147483647, e7_m2147483646, e7_m2147483645, + e7_0, e7_2147483645 = 2147483645, e7_2147483646, e7_2147483647 }; +enum E8 { e8_0, e8_1, e8_2, e8_3, e8_4294967293 = 4294967293U, e8_4294967294, e8_4294967295 }; +enum E9 { e9_m1099511627775 = -1099511627775LL, e9_m1099511627774, e9_m1099511627773, + e9_0, e9_1099511627773 = 1099511627773LL, e9_1099511627774, e9_1099511627775 }; + +typedef char Tchar; +typedef signed char Tschar; +typedef unsigned char Tuchar; +typedef short int Tshort; +typedef unsigned short int Tushort; +typedef int Tint; +typedef unsigned int Tuint; +typedef long int Tlong; +typedef unsigned long int Tulong; +typedef long long int Tllong; +typedef unsigned long long int Tullong; +typedef float Tfloat; +typedef double Tdouble; +typedef long double Tldouble; +typedef _Complex float Tcfloat; +typedef _Complex double Tcdouble; +typedef _Complex long double Tcldouble; +typedef bool Tbool; +typedef enum E0 TE0; +typedef enum E1 TE1; +typedef enum E2 TE2; +typedef enum E3 TE3; +typedef enum E4 TE4; +typedef enum E5 TE5; +typedef enum E6 TE6; +typedef enum E7 TE7; +typedef enum E8 TE8; +typedef enum E9 TE9; +typedef void *Tptr; +typedef char *Tcptr; +typedef int *Tiptr; +typedef char Talchar atal; +typedef signed char Talschar atal; +typedef unsigned char Taluchar atal; +typedef short int Talshort atal; +typedef unsigned short int Talushort atal; +typedef int Talint atal; +typedef unsigned int Taluint atal; +typedef long int Tallong atal; +typedef unsigned long int Talulong atal; +typedef long long int Talllong atal; +typedef unsigned long long int Talullong atal; +typedef float Talfloat atal; +typedef double Taldouble atal; +typedef long double Talldouble atal; +typedef _Complex float Talcfloat atal; +typedef _Complex double Talcdouble atal; +typedef _Complex long double Talcldouble atal; +typedef bool Talbool atal; +typedef enum E0 TalE0 atal; +typedef enum E1 TalE1 atal; +typedef enum E2 TalE2 atal; +typedef enum E3 TalE3 atal; +typedef enum E4 TalE4 atal; +typedef enum E5 TalE5 atal; +typedef enum E6 TalE6 atal; +typedef enum E7 TalE7 atal; +typedef enum E8 TalE8 atal; +typedef enum E9 TalE9 atal; +typedef void *Talptr atal; +typedef char *Talcptr atal; +typedef int *Taliptr atal; +typedef char Tal1char atal1; +typedef signed char Tal1schar atal1; +typedef unsigned char Tal1uchar atal1; +typedef short int Tal1short atal1; +typedef unsigned short int Tal1ushort atal1; +typedef int Tal1int atal1; +typedef unsigned int Tal1uint atal1; +typedef long int Tal1long atal1; +typedef unsigned long int Tal1ulong atal1; +typedef long long int Tal1llong atal1; +typedef unsigned long long int Tal1ullong atal1; +typedef float Tal1float atal1; +typedef double Tal1double atal1; +typedef long double Tal1ldouble atal1; +typedef _Complex float Tal1cfloat atal1; +typedef _Complex double Tal1cdouble atal1; +typedef _Complex long double Tal1cldouble atal1; +typedef bool Tal1bool atal1; +typedef enum E0 Tal1E0 atal1; +typedef enum E1 Tal1E1 atal1; +typedef enum E2 Tal1E2 atal1; +typedef enum E3 Tal1E3 atal1; +typedef enum E4 Tal1E4 atal1; +typedef enum E5 Tal1E5 atal1; +typedef enum E6 Tal1E6 atal1; +typedef enum E7 Tal1E7 atal1; +typedef enum E8 Tal1E8 atal1; +typedef enum E9 Tal1E9 atal1; +typedef void *Tal1ptr atal1; +typedef char *Tal1cptr atal1; +typedef int *Tal1iptr atal1; +typedef char Tal2char atal2; +typedef signed char Tal2schar atal2; +typedef unsigned char Tal2uchar atal2; +typedef short int Tal2short atal2; +typedef unsigned short int Tal2ushort atal2; +typedef int Tal2int atal2; +typedef unsigned int Tal2uint atal2; +typedef long int Tal2long atal2; +typedef unsigned long int Tal2ulong atal2; +typedef long long int Tal2llong atal2; +typedef unsigned long long int Tal2ullong atal2; +typedef float Tal2float atal2; +typedef double Tal2double atal2; +typedef long double Tal2ldouble atal2; +typedef _Complex float Tal2cfloat atal2; +typedef _Complex double Tal2cdouble atal2; +typedef _Complex long double Tal2cldouble atal2; +typedef bool Tal2bool atal2; +typedef enum E0 Tal2E0 atal2; +typedef enum E1 Tal2E1 atal2; +typedef enum E2 Tal2E2 atal2; +typedef enum E3 Tal2E3 atal2; +typedef enum E4 Tal2E4 atal2; +typedef enum E5 Tal2E5 atal2; +typedef enum E6 Tal2E6 atal2; +typedef enum E7 Tal2E7 atal2; +typedef enum E8 Tal2E8 atal2; +typedef enum E9 Tal2E9 atal2; +typedef void *Tal2ptr atal2; +typedef char *Tal2cptr atal2; +typedef int *Tal2iptr atal2; +typedef char Tal4char atal4; +typedef signed char Tal4schar atal4; +typedef unsigned char Tal4uchar atal4; +typedef short int Tal4short atal4; +typedef unsigned short int Tal4ushort atal4; +typedef int Tal4int atal4; +typedef unsigned int Tal4uint atal4; +typedef long int Tal4long atal4; +typedef unsigned long int Tal4ulong atal4; +typedef long long int Tal4llong atal4; +typedef unsigned long long int Tal4ullong atal4; +typedef float Tal4float atal4; +typedef double Tal4double atal4; +typedef long double Tal4ldouble atal4; +typedef _Complex float Tal4cfloat atal4; +typedef _Complex double Tal4cdouble atal4; +typedef _Complex long double Tal4cldouble atal4; +typedef bool Tal4bool atal4; +typedef enum E0 Tal4E0 atal4; +typedef enum E1 Tal4E1 atal4; +typedef enum E2 Tal4E2 atal4; +typedef enum E3 Tal4E3 atal4; +typedef enum E4 Tal4E4 atal4; +typedef enum E5 Tal4E5 atal4; +typedef enum E6 Tal4E6 atal4; +typedef enum E7 Tal4E7 atal4; +typedef enum E8 Tal4E8 atal4; +typedef enum E9 Tal4E9 atal4; +typedef void *Tal4ptr atal4; +typedef char *Tal4cptr atal4; +typedef int *Tal4iptr atal4; +typedef char Tal8char atal8; +typedef signed char Tal8schar atal8; +typedef unsigned char Tal8uchar atal8; +typedef short int Tal8short atal8; +typedef unsigned short int Tal8ushort atal8; +typedef int Tal8int atal8; +typedef unsigned int Tal8uint atal8; +typedef long int Tal8long atal8; +typedef unsigned long int Tal8ulong atal8; +typedef long long int Tal8llong atal8; +typedef unsigned long long int Tal8ullong atal8; +typedef float Tal8float atal8; +typedef double Tal8double atal8; +typedef long double Tal8ldouble atal8; +typedef _Complex float Tal8cfloat atal8; +typedef _Complex double Tal8cdouble atal8; +typedef _Complex long double Tal8cldouble atal8; +typedef bool Tal8bool atal8; +typedef enum E0 Tal8E0 atal8; +typedef enum E1 Tal8E1 atal8; +typedef enum E2 Tal8E2 atal8; +typedef enum E3 Tal8E3 atal8; +typedef enum E4 Tal8E4 atal8; +typedef enum E5 Tal8E5 atal8; +typedef enum E6 Tal8E6 atal8; +typedef enum E7 Tal8E7 atal8; +typedef enum E8 Tal8E8 atal8; +typedef enum E9 Tal8E9 atal8; +typedef void *Tal8ptr atal8; +typedef char *Tal8cptr atal8; +typedef int *Tal8iptr atal8; +typedef char Tal16char atal16; +typedef signed char Tal16schar atal16; +typedef unsigned char Tal16uchar atal16; +typedef short int Tal16short atal16; +typedef unsigned short int Tal16ushort atal16; +typedef int Tal16int atal16; +typedef unsigned int Tal16uint atal16; +typedef long int Tal16long atal16; +typedef unsigned long int Tal16ulong atal16; +typedef long long int Tal16llong atal16; +typedef unsigned long long int Tal16ullong atal16; +typedef float Tal16float atal16; +typedef double Tal16double atal16; +typedef long double Tal16ldouble atal16; +typedef _Complex float Tal16cfloat atal16; +typedef _Complex double Tal16cdouble atal16; +typedef _Complex long double Tal16cldouble atal16; +typedef bool Tal16bool atal16; +typedef enum E0 Tal16E0 atal16; +typedef enum E1 Tal16E1 atal16; +typedef enum E2 Tal16E2 atal16; +typedef enum E3 Tal16E3 atal16; +typedef enum E4 Tal16E4 atal16; +typedef enum E5 Tal16E5 atal16; +typedef enum E6 Tal16E6 atal16; +typedef enum E7 Tal16E7 atal16; +typedef enum E8 Tal16E8 atal16; +typedef enum E9 Tal16E9 atal16; +typedef void *Tal16ptr atal16; +typedef char *Tal16cptr atal16; +typedef int *Tal16iptr atal16; +typedef char Talx1char atalx1; +typedef signed char Talx1schar atalx1; +typedef unsigned char Talx1uchar atalx1; +typedef short int Talx1short atalx1; +typedef unsigned short int Talx1ushort atalx1; +typedef int Talx1int atalx1; +typedef unsigned int Talx1uint atalx1; +typedef long int Talx1long atalx1; +typedef unsigned long int Talx1ulong atalx1; +typedef long long int Talx1llong atalx1; +typedef unsigned long long int Talx1ullong atalx1; +typedef float Talx1float atalx1; +typedef double Talx1double atalx1; +typedef long double Talx1ldouble atalx1; +typedef _Complex float Talx1cfloat atalx1; +typedef _Complex double Talx1cdouble atalx1; +typedef _Complex long double Talx1cldouble atalx1; +typedef bool Talx1bool atalx1; +typedef enum E0 Talx1E0 atalx1; +typedef enum E1 Talx1E1 atalx1; +typedef enum E2 Talx1E2 atalx1; +typedef enum E3 Talx1E3 atalx1; +typedef enum E4 Talx1E4 atalx1; +typedef enum E5 Talx1E5 atalx1; +typedef enum E6 Talx1E6 atalx1; +typedef enum E7 Talx1E7 atalx1; +typedef enum E8 Talx1E8 atalx1; +typedef enum E9 Talx1E9 atalx1; +typedef void *Talx1ptr atalx1; +typedef char *Talx1cptr atalx1; +typedef int *Talx1iptr atalx1; +typedef short int Talx2short atalx2; +typedef unsigned short int Talx2ushort atalx2; +typedef int Talx2int atalx2; +typedef unsigned int Talx2uint atalx2; +typedef long int Talx2long atalx2; +typedef unsigned long int Talx2ulong atalx2; +typedef long long int Talx2llong atalx2; +typedef unsigned long long int Talx2ullong atalx2; +typedef float Talx2float atalx2; +typedef double Talx2double atalx2; +typedef long double Talx2ldouble atalx2; +typedef _Complex float Talx2cfloat atalx2; +typedef _Complex double Talx2cdouble atalx2; +typedef _Complex long double Talx2cldouble atalx2; +typedef enum E0 Talx2E0 atalx2; +typedef enum E1 Talx2E1 atalx2; +typedef enum E2 Talx2E2 atalx2; +typedef enum E3 Talx2E3 atalx2; +typedef enum E4 Talx2E4 atalx2; +typedef enum E5 Talx2E5 atalx2; +typedef enum E6 Talx2E6 atalx2; +typedef enum E7 Talx2E7 atalx2; +typedef enum E8 Talx2E8 atalx2; +typedef enum E9 Talx2E9 atalx2; +typedef void *Talx2ptr atalx2; +typedef char *Talx2cptr atalx2; +typedef int *Talx2iptr atalx2; +typedef int Talx4int atalx4; +typedef unsigned int Talx4uint atalx4; +typedef long int Talx4long atalx4; +typedef unsigned long int Talx4ulong atalx4; +typedef long long int Talx4llong atalx4; +typedef unsigned long long int Talx4ullong atalx4; +typedef float Talx4float atalx4; +typedef double Talx4double atalx4; +typedef long double Talx4ldouble atalx4; +typedef _Complex float Talx4cfloat atalx4; +typedef _Complex double Talx4cdouble atalx4; +typedef _Complex long double Talx4cldouble atalx4; +typedef enum E0 Talx4E0 atalx4; +typedef enum E1 Talx4E1 atalx4; +typedef enum E2 Talx4E2 atalx4; +typedef enum E3 Talx4E3 atalx4; +typedef enum E4 Talx4E4 atalx4; +typedef enum E5 Talx4E5 atalx4; +typedef enum E6 Talx4E6 atalx4; +typedef enum E7 Talx4E7 atalx4; +typedef enum E8 Talx4E8 atalx4; +typedef enum E9 Talx4E9 atalx4; +typedef void *Talx4ptr atalx4; +typedef char *Talx4cptr atalx4; +typedef int *Talx4iptr atalx4; +typedef long int Taly8long ataly8; +typedef unsigned long int Taly8ulong ataly8; +typedef long long int Talx8llong atalx8; +typedef unsigned long long int Talx8ullong atalx8; +typedef double Talx8double atalx8; +typedef long double Talx8ldouble atalx8; +typedef _Complex float Talx8cfloat atalx8; +typedef _Complex double Talx8cdouble atalx8; +typedef _Complex long double Talx8cldouble atalx8; +typedef void *Taly8ptr ataly8; +typedef char *Taly8cptr ataly8; +typedef int *Taly8iptr ataly8; +typedef _Complex double Talx16cdouble atalx16; +typedef _Complex long double Talx16cldouble atalx16; +typedef int (*Tfnptr) (void); + +#define T(n, fields, ops) TX(n, struct, , fields, ({ ops });) +#define U(n, fields, ops) TX(n, union, , fields, ({ ops });) diff --git a/gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c b/gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c new file mode 100644 index 000000000..b6846a918 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c @@ -0,0 +1,1665 @@ +/* Structure layout test generator. + Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. + Contributed by Jakub Jelinek <jakub@redhat.com>. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + + +/* Compile with gcc -o struct-layout-1_generate{,.c} generate_random{,_r}.c */ + +/* N.B. -- This program cannot use libiberty as that will not work + when testing an installed compiler. */ +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stddef.h> +/* We use our own pseudo-random number generator, so that it gives the same + values on all hosts. */ +#include "../../gcc.dg/compat/generate-random.h" + +#if LLONG_MAX != 9223372036854775807LL && __LONG_LONG_MAX__ != 9223372036854775807LL +# error Need 64-bit long long +#endif + +#if defined __MSVCRT__ +#define COMPAT_PRLL "I64" +#else +#define COMPAT_PRLL "ll" +#endif + +const char *dg_options[] = { +"/* { dg-options \"%s-I%s\" } */\n", +"/* { dg-options \"%s-I%s -mno-mmx -Wno-abi\" { target i?86-*-* x86_64-*-* } } */\n", +"/* { dg-options \"%s-I%s -fno-common\" { target hppa*-*-hpux* powerpc*-*-darwin* *-*-mingw32* *-*-cygwin* } } */\n", +"/* { dg-options \"%s-I%s -mno-mmx -fno-common -Wno-abi\" { target i?86-*-darwin* x86_64-*-darwin* } } */\n", +"/* { dg-options \"%s-I%s -mno-base-addresses\" { target mmix-*-* } } */\n", +"/* { dg-options \"%s-I%s -mlongcalls -mtext-section-literals\" { target xtensa*-*-* } } */\n" +#define NDG_OPTIONS (sizeof (dg_options) / sizeof (dg_options[0])) +}; + +typedef unsigned int hashval_t; + +enum TYPE +{ + TYPE_INT, + TYPE_UINT, + TYPE_FLOAT, + TYPE_SENUM, + TYPE_UENUM, + TYPE_PTR, + TYPE_FNPTR, + TYPE_OTHER +}; + +struct types +{ + const char *name; + enum TYPE type; + unsigned long long int maxval; + char bitfld; +}; + +struct types base_types[] = { +/* As we don't know whether char will be signed or not, just limit ourselves + to unsigned values less than maximum signed char value. */ +{ "char", TYPE_UINT, 127, 'C' }, +{ "signed char", TYPE_INT, 127, 'C' }, +{ "unsigned char", TYPE_UINT, 255, 'C' }, +{ "short int", TYPE_INT, 32767, 'S' }, +{ "unsigned short int", TYPE_UINT, 65535, 'S' }, +{ "int", TYPE_INT, 2147483647, 'I' }, +{ "unsigned int", TYPE_UINT, 4294967295U, 'I' }, +{ "long int", TYPE_INT, 9223372036854775807LL, 'L' }, +{ "unsigned long int", TYPE_UINT, 18446744073709551615ULL, 'L' }, +{ "long long int", TYPE_INT, 9223372036854775807LL, 'Q' }, +{ "unsigned long long int", TYPE_UINT, 18446744073709551615ULL, 'Q' }, +{ "bool", TYPE_UINT, 1, 'B' }, +{ "void *", TYPE_PTR, 0, 0 }, +{ "char *", TYPE_PTR, 0, 0 }, +{ "int *", TYPE_PTR, 0, 0 }, +{ "float", TYPE_FLOAT, 0, 0 }, +{ "double", TYPE_FLOAT, 0, 0 }, +{ "long double", TYPE_FLOAT, 0, 0 }, +#define NTYPES1 18 +{ "Tchar", TYPE_UINT, 127, 'C' }, +{ "Tschar", TYPE_INT, 127, 'C' }, +{ "Tuchar", TYPE_UINT, 255, 'C' }, +{ "Tshort", TYPE_INT, 32767, 'S' }, +{ "Tushort", TYPE_UINT, 65535, 'S' }, +{ "Tint", TYPE_INT, 2147483647, 'I' }, +{ "Tuint", TYPE_UINT, 4294967295U, 'I' }, +{ "Tlong", TYPE_INT, 9223372036854775807LL, 'L' }, +{ "Tulong", TYPE_UINT, 18446744073709551615ULL, 'L' }, +{ "Tllong", TYPE_INT, 9223372036854775807LL, 'Q' }, +{ "Tullong", TYPE_UINT, 18446744073709551615ULL, 'Q' }, +{ "Tbool", TYPE_UINT, 1, 'B' }, +{ "size_t", TYPE_UINT, 18446744073709551615ULL, 0 }, +{ "Tptr", TYPE_PTR, 0, 0 }, +{ "Tcptr", TYPE_PTR, 0, 0 }, +{ "Tiptr", TYPE_PTR, 0, 0 }, +{ "Tfnptr", TYPE_FNPTR, 0, 0 }, +{ "Tfloat", TYPE_FLOAT, 0, 0 }, +{ "Tdouble", TYPE_FLOAT, 0, 0 }, +{ "Tldouble", TYPE_FLOAT, 0, 0 }, +{ "enum E0", TYPE_UENUM, 0, ' ' }, +{ "enum E1", TYPE_UENUM, 1, ' ' }, +{ "enum E2", TYPE_SENUM, 3, ' ' }, +{ "enum E3", TYPE_SENUM, 127, ' ' }, +{ "enum E4", TYPE_UENUM, 255, ' ' }, +{ "enum E5", TYPE_SENUM, 32767, ' ' }, +{ "enum E6", TYPE_UENUM, 65535, ' ' }, +{ "enum E7", TYPE_SENUM, 2147483647, ' ' }, +{ "enum E8", TYPE_UENUM, 4294967295U, ' ' }, +{ "enum E9", TYPE_SENUM, 1099511627775LL, ' ' }, +{ "TE0", TYPE_UENUM, 0, ' ' }, +{ "TE1", TYPE_UENUM, 1, ' ' }, +{ "TE2", TYPE_SENUM, 3, ' ' }, +{ "TE3", TYPE_SENUM, 127, ' ' }, +{ "TE4", TYPE_UENUM, 255, ' ' }, +{ "TE5", TYPE_SENUM, 32767, ' ' }, +{ "TE6", TYPE_UENUM, 65535, ' ' }, +{ "TE7", TYPE_SENUM, 2147483647, ' ' }, +{ "TE8", TYPE_UENUM, 4294967295U, ' ' }, +{ "TE9", TYPE_SENUM, 1099511627775LL, ' ' }, +/* vector-defs.h typedefs */ +{ "qi", TYPE_INT, 127, 0 }, +{ "hi", TYPE_INT, 32767, 0 }, +{ "si", TYPE_INT, 2147483647, 0 }, +{ "di", TYPE_INT, 9223372036854775807LL, 0 }, +{ "sf", TYPE_FLOAT, 0, 0 }, +{ "df", TYPE_FLOAT, 0, 0 } +#define NTYPES2 (sizeof (base_types) / sizeof (base_types[0])) +}; +struct types vector_types[] = { +/* vector-defs.h typedefs */ +{ "v8qi", TYPE_OTHER, 0, 0 }, +{ "v16qi", TYPE_OTHER, 0, 0 }, +{ "v2hi", TYPE_OTHER, 0, 0 }, +{ "v4hi", TYPE_OTHER, 0, 0 }, +{ "v8hi", TYPE_OTHER, 0, 0 }, +{ "v2si", TYPE_OTHER, 0, 0 }, +{ "v4si", TYPE_OTHER, 0, 0 }, +{ "v1di", TYPE_OTHER, 0, 0 }, +{ "v2di", TYPE_OTHER, 0, 0 }, +{ "v2sf", TYPE_OTHER, 0, 0 }, +{ "v4sf", TYPE_OTHER, 0, 0 }, +{ "v16sf", TYPE_OTHER, 0, 0 }, +{ "v2df", TYPE_OTHER, 0, 0 }, +{ "u8qi", TYPE_OTHER, 0, 0 }, +{ "u16qi", TYPE_OTHER, 0, 0 }, +{ "u2hi", TYPE_OTHER, 0, 0 }, +{ "u4hi", TYPE_OTHER, 0, 0 }, +{ "u8hi", TYPE_OTHER, 0, 0 }, +{ "u2si", TYPE_OTHER, 0, 0 }, +{ "u4si", TYPE_OTHER, 0, 0 }, +{ "u1di", TYPE_OTHER, 0, 0 }, +{ "u2di", TYPE_OTHER, 0, 0 }, +{ "u2sf", TYPE_OTHER, 0, 0 }, +{ "u4sf", TYPE_OTHER, 0, 0 }, +{ "u16sf", TYPE_OTHER, 0, 0 }, +{ "u2df", TYPE_OTHER, 0, 0 }, +{ "__m64", TYPE_OTHER, 0, 0 }, +{ "__m128", TYPE_OTHER, 0, 0 } +#define NVTYPES2 (sizeof (vector_types) / sizeof (vector_types[0])) +}; +struct types attrib_types[] = { +{ "Talchar", TYPE_UINT, 127, 'C' }, +{ "Talschar", TYPE_INT, 127, 'C' }, +{ "Taluchar", TYPE_UINT, 255, 'C' }, +{ "Talshort", TYPE_INT, 32767, 'S' }, +{ "Talushort", TYPE_UINT, 65535, 'S' }, +{ "Talint", TYPE_INT, 2147483647, 'I' }, +{ "Taluint", TYPE_UINT, 4294967295U, 'I' }, +{ "Tallong", TYPE_INT, 9223372036854775807LL, 'L' }, +{ "Talulong", TYPE_UINT, 18446744073709551615ULL, 'L' }, +{ "Talllong", TYPE_INT, 9223372036854775807LL, 'Q' }, +{ "Talullong", TYPE_UINT, 18446744073709551615ULL, 'Q' }, +{ "Talbool", TYPE_UINT, 1, 'B' }, +{ "Talptr", TYPE_PTR, 0, 0 }, +{ "Talcptr", TYPE_PTR, 0, 0 }, +{ "Taliptr", TYPE_PTR, 0, 0 }, +{ "Talfloat", TYPE_FLOAT, 0, 0 }, +{ "Taldouble", TYPE_FLOAT, 0, 0 }, +{ "Talldouble", TYPE_FLOAT, 0, 0 }, +{ "TalE0", TYPE_UENUM, 0, ' ' }, +{ "TalE1", TYPE_UENUM, 1, ' ' }, +{ "TalE2", TYPE_SENUM, 3, ' ' }, +{ "TalE3", TYPE_SENUM, 127, ' ' }, +{ "TalE4", TYPE_UENUM, 255, ' ' }, +{ "TalE5", TYPE_SENUM, 32767, ' ' }, +{ "TalE6", TYPE_UENUM, 65535, ' ' }, +{ "TalE7", TYPE_SENUM, 2147483647, ' ' }, +{ "TalE8", TYPE_UENUM, 4294967295U, ' ' }, +{ "TalE9", TYPE_SENUM, 1099511627775LL, ' ' }, +{ "Tal1char", TYPE_UINT, 127, 'C' }, +{ "Tal1schar", TYPE_INT, 127, 'C' }, +{ "Tal1uchar", TYPE_UINT, 255, 'C' }, +{ "Tal1short", TYPE_INT, 32767, 'S' }, +{ "Tal1ushort", TYPE_UINT, 65535, 'S' }, +{ "Tal1int", TYPE_INT, 2147483647, 'I' }, +{ "Tal1uint", TYPE_UINT, 4294967295U, 'I' }, +{ "Tal1long", TYPE_INT, 9223372036854775807LL, 'L' }, +{ "Tal1ulong", TYPE_UINT, 18446744073709551615ULL, 'L' }, +{ "Tal1llong", TYPE_INT, 9223372036854775807LL, 'Q' }, +{ "Tal1ullong", TYPE_UINT, 18446744073709551615ULL, 'Q' }, +{ "Tal1bool", TYPE_UINT, 1, 'B' }, +{ "Tal1ptr", TYPE_PTR, 0, 0 }, +{ "Tal1cptr", TYPE_PTR, 0, 0 }, +{ "Tal1iptr", TYPE_PTR, 0, 0 }, +{ "Tal1float", TYPE_FLOAT, 0, 0 }, +{ "Tal1double", TYPE_FLOAT, 0, 0 }, +{ "Tal1ldouble", TYPE_FLOAT, 0, 0 }, +{ "Tal1E0", TYPE_UENUM, 0, ' ' }, +{ "Tal1E1", TYPE_UENUM, 1, ' ' }, +{ "Tal1E2", TYPE_SENUM, 3, ' ' }, +{ "Tal1E3", TYPE_SENUM, 127, ' ' }, +{ "Tal1E4", TYPE_UENUM, 255, ' ' }, +{ "Tal1E5", TYPE_SENUM, 32767, ' ' }, +{ "Tal1E6", TYPE_UENUM, 65535, ' ' }, +{ "Tal1E7", TYPE_SENUM, 2147483647, ' ' }, +{ "Tal1E8", TYPE_UENUM, 4294967295U, ' ' }, +{ "Tal1E9", TYPE_SENUM, 1099511627775LL, ' ' }, +{ "Tal2char", TYPE_UINT, 127, 'C' }, +{ "Tal2schar", TYPE_INT, 127, 'C' }, +{ "Tal2uchar", TYPE_UINT, 255, 'C' }, +{ "Tal2short", TYPE_INT, 32767, 'S' }, +{ "Tal2ushort", TYPE_UINT, 65535, 'S' }, +{ "Tal2int", TYPE_INT, 2147483647, 'I' }, +{ "Tal2uint", TYPE_UINT, 4294967295U, 'I' }, +{ "Tal2long", TYPE_INT, 9223372036854775807LL, 'L' }, +{ "Tal2ulong", TYPE_UINT, 18446744073709551615ULL, 'L' }, +{ "Tal2llong", TYPE_INT, 9223372036854775807LL, 'Q' }, +{ "Tal2ullong", TYPE_UINT, 18446744073709551615ULL, 'Q' }, +{ "Tal2bool", TYPE_UINT, 1, 'B' }, +{ "Tal2ptr", TYPE_PTR, 0, 0 }, +{ "Tal2cptr", TYPE_PTR, 0, 0 }, +{ "Tal2iptr", TYPE_PTR, 0, 0 }, +{ "Tal2float", TYPE_FLOAT, 0, 0 }, +{ "Tal2double", TYPE_FLOAT, 0, 0 }, +{ "Tal2ldouble", TYPE_FLOAT, 0, 0 }, +{ "Tal2E0", TYPE_UENUM, 0, ' ' }, +{ "Tal2E1", TYPE_UENUM, 1, ' ' }, +{ "Tal2E2", TYPE_SENUM, 3, ' ' }, +{ "Tal2E3", TYPE_SENUM, 127, ' ' }, +{ "Tal2E4", TYPE_UENUM, 255, ' ' }, +{ "Tal2E5", TYPE_SENUM, 32767, ' ' }, +{ "Tal2E6", TYPE_UENUM, 65535, ' ' }, +{ "Tal2E7", TYPE_SENUM, 2147483647, ' ' }, +{ "Tal2E8", TYPE_UENUM, 4294967295U, ' ' }, +{ "Tal2E9", TYPE_SENUM, 1099511627775LL, ' ' }, +{ "Tal4char", TYPE_UINT, 127, 'C' }, +{ "Tal4schar", TYPE_INT, 127, 'C' }, +{ "Tal4uchar", TYPE_UINT, 255, 'C' }, +{ "Tal4short", TYPE_INT, 32767, 'S' }, +{ "Tal4ushort", TYPE_UINT, 65535, 'S' }, +{ "Tal4int", TYPE_INT, 2147483647, 'I' }, +{ "Tal4uint", TYPE_UINT, 4294967295U, 'I' }, +{ "Tal4long", TYPE_INT, 9223372036854775807LL, 'L' }, +{ "Tal4ulong", TYPE_UINT, 18446744073709551615ULL, 'L' }, +{ "Tal4llong", TYPE_INT, 9223372036854775807LL, 'Q' }, +{ "Tal4ullong", TYPE_UINT, 18446744073709551615ULL, 'Q' }, +{ "Tal4bool", TYPE_UINT, 1, 'B' }, +{ "Tal4ptr", TYPE_PTR, 0, 0 }, +{ "Tal4cptr", TYPE_PTR, 0, 0 }, +{ "Tal4iptr", TYPE_PTR, 0, 0 }, +{ "Tal4float", TYPE_FLOAT, 0, 0 }, +{ "Tal4double", TYPE_FLOAT, 0, 0 }, +{ "Tal4ldouble", TYPE_FLOAT, 0, 0 }, +{ "Tal4E0", TYPE_UENUM, 0, ' ' }, +{ "Tal4E1", TYPE_UENUM, 1, ' ' }, +{ "Tal4E2", TYPE_SENUM, 3, ' ' }, +{ "Tal4E3", TYPE_SENUM, 127, ' ' }, +{ "Tal4E4", TYPE_UENUM, 255, ' ' }, +{ "Tal4E5", TYPE_SENUM, 32767, ' ' }, +{ "Tal4E6", TYPE_UENUM, 65535, ' ' }, +{ "Tal4E7", TYPE_SENUM, 2147483647, ' ' }, +{ "Tal4E8", TYPE_UENUM, 4294967295U, ' ' }, +{ "Tal4E9", TYPE_SENUM, 1099511627775LL, ' ' }, +{ "Tal8char", TYPE_UINT, 127, 'C' }, +{ "Tal8schar", TYPE_INT, 127, 'C' }, +{ "Tal8uchar", TYPE_UINT, 255, 'C' }, +{ "Tal8short", TYPE_INT, 32767, 'S' }, +{ "Tal8ushort", TYPE_UINT, 65535, 'S' }, +{ "Tal8int", TYPE_INT, 2147483647, 'I' }, +{ "Tal8uint", TYPE_UINT, 4294967295U, 'I' }, +{ "Tal8long", TYPE_INT, 9223372036854775807LL, 'L' }, +{ "Tal8ulong", TYPE_UINT, 18446744073709551615ULL, 'L' }, +{ "Tal8llong", TYPE_INT, 9223372036854775807LL, 'Q' }, +{ "Tal8ullong", TYPE_UINT, 18446744073709551615ULL, 'Q' }, +{ "Tal8bool", TYPE_UINT, 1, 'B' }, +{ "Tal8ptr", TYPE_PTR, 0, 0 }, +{ "Tal8cptr", TYPE_PTR, 0, 0 }, +{ "Tal8iptr", TYPE_PTR, 0, 0 }, +{ "Tal8float", TYPE_FLOAT, 0, 0 }, +{ "Tal8double", TYPE_FLOAT, 0, 0 }, +{ "Tal8ldouble", TYPE_FLOAT, 0, 0 }, +{ "Tal8E0", TYPE_UENUM, 0, ' ' }, +{ "Tal8E1", TYPE_UENUM, 1, ' ' }, +{ "Tal8E2", TYPE_SENUM, 3, ' ' }, +{ "Tal8E3", TYPE_SENUM, 127, ' ' }, +{ "Tal8E4", TYPE_UENUM, 255, ' ' }, +{ "Tal8E5", TYPE_SENUM, 32767, ' ' }, +{ "Tal8E6", TYPE_UENUM, 65535, ' ' }, +{ "Tal8E7", TYPE_SENUM, 2147483647, ' ' }, +{ "Tal8E8", TYPE_UENUM, 4294967295U, ' ' }, +{ "Tal8E9", TYPE_SENUM, 1099511627775LL, ' ' }, +{ "Tal16char", TYPE_UINT, 127, 'C' }, +{ "Tal16schar", TYPE_INT, 127, 'C' }, +{ "Tal16uchar", TYPE_UINT, 255, 'C' }, +{ "Tal16short", TYPE_INT, 32767, 'S' }, +{ "Tal16ushort", TYPE_UINT, 65535, 'S' }, +{ "Tal16int", TYPE_INT, 2147483647, 'I' }, +{ "Tal16uint", TYPE_UINT, 4294967295U, 'I' }, +{ "Tal16long", TYPE_INT, 9223372036854775807LL, 'L' }, +{ "Tal16ulong", TYPE_UINT, 18446744073709551615ULL, 'L' }, +{ "Tal16llong", TYPE_INT, 9223372036854775807LL, 'Q' }, +{ "Tal16ullong", TYPE_UINT, 18446744073709551615ULL, 'Q' }, +{ "Tal16bool", TYPE_UINT, 1, 'B' }, +{ "Tal16ptr", TYPE_PTR, 0, 0 }, +{ "Tal16cptr", TYPE_PTR, 0, 0 }, +{ "Tal16iptr", TYPE_PTR, 0, 0 }, +{ "Tal16float", TYPE_FLOAT, 0, 0 }, +{ "Tal16double", TYPE_FLOAT, 0, 0 }, +{ "Tal16ldouble", TYPE_FLOAT, 0, 0 }, +{ "Tal16E0", TYPE_UENUM, 0, ' ' }, +{ "Tal16E1", TYPE_UENUM, 1, ' ' }, +{ "Tal16E2", TYPE_SENUM, 3, ' ' }, +{ "Tal16E3", TYPE_SENUM, 127, ' ' }, +{ "Tal16E4", TYPE_UENUM, 255, ' ' }, +{ "Tal16E5", TYPE_SENUM, 32767, ' ' }, +{ "Tal16E6", TYPE_UENUM, 65535, ' ' }, +{ "Tal16E7", TYPE_SENUM, 2147483647, ' ' }, +{ "Tal16E8", TYPE_UENUM, 4294967295U, ' ' }, +{ "Tal16E9", TYPE_SENUM, 1099511627775LL, ' ' } +#define NATYPES2 (sizeof (attrib_types) / sizeof (attrib_types[0])) +}; + +struct types bitfld_types[NTYPES2]; +int n_bitfld_types; +struct types aligned_bitfld_types[NATYPES2]; +int n_aligned_bitfld_types; + +const char *attributes[] = { +"atal", +"atpa", +"atal1", +"atal2", +"atal4", +"atal8", +"atal16", +#define NATTRIBS1 7 +"atalpa", +"atpaal", +"atal1pa", +"atal2pa", +"atal4pa", +"atal8pa", +"atal16pa", +"atpaal1", +"atpaal2", +"atpaal4", +"atpaal8", +"atpaal16" +#define NATTRIBS2 (sizeof (attributes) / sizeof (attributes[0])) +}; + +enum ETYPE +{ + ETYPE_TYPE, + ETYPE_ARRAY, + ETYPE_BITFLD, + ETYPE_STRUCT, + ETYPE_UNION, + ETYPE_STRUCT_ARRAY, + ETYPE_UNION_ARRAY +}; + +struct entry +{ +#ifdef __GNUC__ + enum ETYPE etype : 8; +#else + unsigned char etype; +#endif + unsigned short len; + unsigned char arr_len; + struct types *type; + const char *attrib; + /* Used to chain together entries in the hash table. */ + struct entry *next; +}; +struct types attrib_array_types[] = { +{ "Talx1char", TYPE_UINT, 127, 'C' }, +{ "Talx1schar", TYPE_INT, 127, 'C' }, +{ "Talx1uchar", TYPE_UINT, 255, 'C' }, +{ "Talx1short", TYPE_INT, 32767, 'S' }, +{ "Talx1ushort", TYPE_UINT, 65535, 'S' }, +{ "Talx1int", TYPE_INT, 2147483647, 'I' }, +{ "Talx1uint", TYPE_UINT, 4294967295U, 'I' }, +{ "Talx1long", TYPE_INT, 9223372036854775807LL, 'L' }, +{ "Talx1ulong", TYPE_UINT, 18446744073709551615ULL, 'L' }, +{ "Talx1llong", TYPE_INT, 9223372036854775807LL, 'Q' }, +{ "Talx1ullong", TYPE_UINT, 18446744073709551615ULL, 'Q' }, +{ "Talx1bool", TYPE_UINT, 1, 'B' }, +{ "Talx1ptr", TYPE_PTR, 0, 0 }, +{ "Talx1cptr", TYPE_PTR, 0, 0 }, +{ "Talx1iptr", TYPE_PTR, 0, 0 }, +{ "Talx1float", TYPE_FLOAT, 0, 0 }, +{ "Talx1double", TYPE_FLOAT, 0, 0 }, +{ "Talx1ldouble", TYPE_FLOAT, 0, 0 }, +{ "Talx1E0", TYPE_UENUM, 0, ' ' }, +{ "Talx1E1", TYPE_UENUM, 1, ' ' }, +{ "Talx1E2", TYPE_SENUM, 3, ' ' }, +{ "Talx1E3", TYPE_SENUM, 127, ' ' }, +{ "Talx1E4", TYPE_UENUM, 255, ' ' }, +{ "Talx1E5", TYPE_SENUM, 32767, ' ' }, +{ "Talx1E6", TYPE_UENUM, 65535, ' ' }, +{ "Talx1E7", TYPE_SENUM, 2147483647, ' ' }, +{ "Talx1E8", TYPE_UENUM, 4294967295U, ' ' }, +{ "Talx1E9", TYPE_SENUM, 1099511627775LL, ' ' }, +{ "Talx2short", TYPE_INT, 32767, 'S' }, +{ "Talx2ushort", TYPE_UINT, 65535, 'S' }, +{ "Talx2int", TYPE_INT, 2147483647, 'I' }, +{ "Talx2uint", TYPE_UINT, 4294967295U, 'I' }, +{ "Talx2long", TYPE_INT, 9223372036854775807LL, 'L' }, +{ "Talx2ulong", TYPE_UINT, 18446744073709551615ULL, 'L' }, +{ "Talx2llong", TYPE_INT, 9223372036854775807LL, 'Q' }, +{ "Talx2ullong", TYPE_UINT, 18446744073709551615ULL, 'Q' }, +{ "Talx2ptr", TYPE_PTR, 0, 0 }, +{ "Talx2cptr", TYPE_PTR, 0, 0 }, +{ "Talx2iptr", TYPE_PTR, 0, 0 }, +{ "Talx2float", TYPE_FLOAT, 0, 0 }, +{ "Talx2double", TYPE_FLOAT, 0, 0 }, +{ "Talx2ldouble", TYPE_FLOAT, 0, 0 }, +{ "Talx2E0", TYPE_UENUM, 0, ' ' }, +{ "Talx2E1", TYPE_UENUM, 1, ' ' }, +{ "Talx2E2", TYPE_SENUM, 3, ' ' }, +{ "Talx2E3", TYPE_SENUM, 127, ' ' }, +{ "Talx2E4", TYPE_UENUM, 255, ' ' }, +{ "Talx2E5", TYPE_SENUM, 32767, ' ' }, +{ "Talx2E6", TYPE_UENUM, 65535, ' ' }, +{ "Talx2E7", TYPE_SENUM, 2147483647, ' ' }, +{ "Talx2E8", TYPE_UENUM, 4294967295U, ' ' }, +{ "Talx2E9", TYPE_SENUM, 1099511627775LL, ' ' }, +{ "Talx4int", TYPE_INT, 2147483647, 'I' }, +{ "Talx4uint", TYPE_UINT, 4294967295U, 'I' }, +{ "Talx4long", TYPE_INT, 9223372036854775807LL, 'L' }, +{ "Talx4ulong", TYPE_UINT, 18446744073709551615ULL, 'L' }, +{ "Talx4llong", TYPE_INT, 9223372036854775807LL, 'Q' }, +{ "Talx4ullong", TYPE_UINT, 18446744073709551615ULL, 'Q' }, +{ "Talx4ptr", TYPE_PTR, 0, 0 }, +{ "Talx4cptr", TYPE_PTR, 0, 0 }, +{ "Talx4iptr", TYPE_PTR, 0, 0 }, +{ "Talx4float", TYPE_FLOAT, 0, 0 }, +{ "Talx4double", TYPE_FLOAT, 0, 0 }, +{ "Talx4ldouble", TYPE_FLOAT, 0, 0 }, +{ "Talx4E0", TYPE_UENUM, 0, ' ' }, +{ "Talx4E1", TYPE_UENUM, 1, ' ' }, +{ "Talx4E2", TYPE_SENUM, 3, ' ' }, +{ "Talx4E3", TYPE_SENUM, 127, ' ' }, +{ "Talx4E4", TYPE_UENUM, 255, ' ' }, +{ "Talx4E5", TYPE_SENUM, 32767, ' ' }, +{ "Talx4E6", TYPE_UENUM, 65535, ' ' }, +{ "Talx4E7", TYPE_SENUM, 2147483647, ' ' }, +{ "Talx4E8", TYPE_UENUM, 4294967295U, ' ' }, +{ "Talx4E9", TYPE_SENUM, 1099511627775LL, ' ' }, +{ "Taly8long", TYPE_INT, 9223372036854775807LL, 'L' }, +{ "Taly8ulong", TYPE_UINT, 18446744073709551615ULL, 'L' }, +{ "Talx8llong", TYPE_INT, 9223372036854775807LL, 'Q' }, +{ "Talx8ullong", TYPE_UINT, 18446744073709551615ULL, 'Q' }, +{ "Taly8ptr", TYPE_PTR, 0, 0 }, +{ "Taly8cptr", TYPE_PTR, 0, 0 }, +{ "Taly8iptr", TYPE_PTR, 0, 0 }, +{ "Talx8double", TYPE_FLOAT, 0, 0 }, +{ "Talx8ldouble", TYPE_FLOAT, 0, 0 } +#define NAATYPES2 (sizeof (attrib_array_types) / sizeof (attrib_array_types[0])) +}; + +/* A prime number giving the number of slots in the hash table. */ +#define HASH_SIZE 32749 +static struct entry *hash_table[HASH_SIZE]; + +static int idx, limidx, output_one, short_enums; +static const char *destdir; +static const char *srcdir; +static const char *srcdir_safe; +FILE *outfile; + +void +switchfiles (int fields) +{ + static int filecnt; + static char *destbuf, *destptr; + int i; + + ++filecnt; + if (outfile) + fclose (outfile); + if (output_one) + { + outfile = stdout; + return; + } + if (destbuf == NULL) + { + size_t len = strlen (destdir); + destbuf = malloc (len + 20); + if (!destbuf) + abort (); + memcpy (destbuf, destdir, len); + if (!len || destbuf[len - 1] != '/') + destbuf[len++] = '/'; + destptr = destbuf + len; + } + sprintf (destptr, "t%03d_main.C", filecnt); + outfile = fopen (destbuf, "w"); + if (outfile == NULL) + { + fail: + fputs ("failed to create test files\n", stderr); + exit (1); + } + for (i = 0; i < NDG_OPTIONS; i++) + fprintf (outfile, dg_options[i], "", srcdir_safe); + fprintf (outfile, "\n\ +#include \"struct-layout-1.h\"\n\ +\n\ +#define TX(n, type, attrs, fields, ops) extern void test##n (void);\n\ +#include \"t%03d_test.h\"\n\ +#undef TX\n\ +\n\ +int main (void)\n\ +{\n\ +#define TX(n, type, attrs, fields, ops) test##n ();\n\ +#include \"t%03d_test.h\"\n\ +#undef TX\n\ + if (fails)\n\ + {\n\ + fflush (stdout);\n\ + abort ();\n\ + }\n\ + exit (0);\n\ +}\n", filecnt, filecnt); + fclose (outfile); + sprintf (destptr, "t%03d_x.C", filecnt); + outfile = fopen (destbuf, "w"); + if (outfile == NULL) + goto fail; + for (i = 0; i < NDG_OPTIONS; i++) + fprintf (outfile, dg_options[i], "-w ", srcdir_safe); + fprintf (outfile, "\n\ +#include \"struct-layout-1_x1.h\"\n\ +#include \"t%03d_test.h\"\n\ +#include \"struct-layout-1_x2.h\"\n\ +#include \"t%03d_test.h\"\n", filecnt, filecnt); + fclose (outfile); + sprintf (destptr, "t%03d_y.C", filecnt); + outfile = fopen (destbuf, "w"); + if (outfile == NULL) + goto fail; + for (i = 0; i < NDG_OPTIONS; i++) + fprintf (outfile, dg_options[i], "-w ", srcdir_safe); + fprintf (outfile, "\n\ +#include \"struct-layout-1_y1.h\"\n\ +#include \"t%03d_test.h\"\n\ +#include \"struct-layout-1_y2.h\"\n\ +#include \"t%03d_test.h\"\n", filecnt, filecnt); + fclose (outfile); + sprintf (destptr, "t%03d_test.h", filecnt); + outfile = fopen (destbuf, "w"); + if (outfile == NULL) + goto fail; + if (fields <= 2) + limidx = idx + 300; + else if (fields <= 4) + limidx = idx + 200; + else if (fields <= 6) + limidx = idx + 100; + else + limidx = idx + 50; +} + +unsigned long long int +getrandll (void) +{ + unsigned long long int ret; + ret = generate_random () & 0xffffff; + ret |= (generate_random () & 0xffffffLL) << 24; + ret |= ((unsigned long long int) generate_random ()) << 48; + return ret; +} + +int +subfield (struct entry *e, char *letter) +{ + int i, type; + char buf[20]; + const char *p; + switch (e[0].etype) + { + case ETYPE_STRUCT: + case ETYPE_UNION: + case ETYPE_STRUCT_ARRAY: + case ETYPE_UNION_ARRAY: + type = e[0].attrib ? 1 + (generate_random () & 3) : 0; + if (e[0].etype == ETYPE_STRUCT || e[0].etype == ETYPE_STRUCT_ARRAY) + p = "struct"; + else + p = "union"; + if (e[0].etype == ETYPE_STRUCT_ARRAY || e[0].etype == ETYPE_UNION_ARRAY) + { + if (e[0].arr_len == 255) + snprintf (buf, 20, "%c[]", *letter); + else + snprintf (buf, 20, "%c[%d]", *letter, e[0].arr_len); + /* If this is an array type, do not put aligned attributes on + elements. Aligning elements to a value greater than their + size will result in a compiler error. */ + if (type == 1 + && ((strncmp (e[0].attrib, "atal", 4) == 0) + || strncmp (e[0].attrib, "atpaal", 6) == 0)) + type = 2; + } + else + { + buf[0] = *letter; + buf[1] = '\0'; + } + ++*letter; + switch (type) + { + case 0: + case 3: + case 4: + fprintf (outfile, "%s{", p); + break; + case 1: + fprintf (outfile, "%s %s{", e[0].attrib, p); + break; + case 2: + fprintf (outfile, "%s %s{", p, e[0].attrib); + break; + } + + for (i = 1; i <= e[0].len; ) + i += subfield (e + i, letter); + + switch (type) + { + case 0: + case 1: + case 2: + fprintf (outfile, "}%s;", buf); + break; + case 3: + fprintf (outfile, "}%s %s;", e[0].attrib, buf); + break; + case 4: + fprintf (outfile, "}%s %s;", buf, e[0].attrib); + break; + } + return 1 + e[0].len; + case ETYPE_TYPE: + case ETYPE_ARRAY: + if (e[0].etype == ETYPE_ARRAY) + { + if (e[0].arr_len == 255) + snprintf (buf, 20, "%c[]", *letter); + else + snprintf (buf, 20, "%c[%d]", *letter, e[0].arr_len); + } + else + { + buf[0] = *letter; + buf[1] = '\0'; + } + ++*letter; + if (e[0].attrib) + { + /* If this is an array type, do not put aligned attributes on + elements. Aligning elements to a value greater than their + size will result in a compiler error. */ + if (e[0].etype == ETYPE_ARRAY + && ((strncmp (e[0].attrib, "atal", 4) == 0) + || strncmp (e[0].attrib, "atpaal", 6) == 0)) + type = 2; + else + type = generate_random () % 3; + switch (type) + { + case 0: + fprintf (outfile, "%s %s %s;", e[0].attrib, e[0].type->name, + buf); + break; + case 1: + fprintf (outfile, "%s %s %s;", e[0].type->name, e[0].attrib, + buf); + break; + case 2: + fprintf (outfile, "%s %s %s;", e[0].type->name, buf, + e[0].attrib); + break; + } + } + else + fprintf (outfile, "%s %s;", e[0].type->name, buf); + return 1; + case ETYPE_BITFLD: + if (e[0].len == 0) + { + if (e[0].attrib) + switch (generate_random () % 3) + { + case 0: + fprintf (outfile, "%s %s:0;", e[0].attrib, e[0].type->name); + break; + case 1: + fprintf (outfile, "%s %s:0;", e[0].type->name, e[0].attrib); + break; + case 2: + fprintf (outfile, "%s:0 %s;", e[0].type->name, e[0].attrib); + break; + } + else + fprintf (outfile, "%s:0;", e[0].type->name); + ++*letter; + return 1; + } + snprintf (buf, 20, "%d", e[0].len); + if (e[0].attrib) + switch (generate_random () % 3) + { + case 0: + fprintf (outfile, "%s %s %c:%s;", e[0].attrib, e[0].type->name, + *letter, buf); + break; + case 1: + fprintf (outfile, "%s %s %c:%s;", e[0].type->name, e[0].attrib, + *letter, buf); + break; + case 2: + fprintf (outfile, "%s %c:%s %s;", e[0].type->name, *letter, + buf, e[0].attrib); + break; + } + else + fprintf (outfile, "%s %c:%s;", e[0].type->name, *letter, buf); + ++*letter; + return 1; + default: + abort (); + } +} + +char namebuf[1024]; + +void +output_FNB (char mode, struct entry *e) +{ + unsigned long long int l1, l2, m; + int signs = 0; + const char *p, *q; + + if (e->type->type == TYPE_OTHER) + { + if (mode == 'B') + abort (); + fprintf (outfile, "N(%d,%s)", idx, namebuf); + return; + } + fprintf (outfile, "%c(%d,%s,", mode, idx, namebuf); + l1 = getrandll (); + l2 = getrandll (); + switch (e->type->type) + { + case TYPE_INT: + signs = generate_random () & 3; + m = e->type->maxval; + if (mode == 'B') + m &= e->len > 1 ? (1ULL << (e->len - 1)) - 1 : 1; + l1 &= m; + l2 &= m; + fprintf (outfile, "%s%" COMPAT_PRLL "u%s,%s%" COMPAT_PRLL "u%s", + (signs & 1) ? "-" : "", l1, l1 > 2147483647 ? "LL" : "", + (signs & 2) ? "-" : "", l2, l2 > 2147483647 ? "LL" : ""); + break; + case TYPE_UINT: + m = e->type->maxval; + if (mode == 'B') + m &= (1ULL << e->len) - 1; + l1 &= m; + l2 &= m; + fprintf (outfile,"%" COMPAT_PRLL "uU%s,%" COMPAT_PRLL "uU%s", + l1, l1 > 4294967295U ? "LL" : "", + l2, l2 > 4294967295U ? "LL" : ""); + break; + case TYPE_FLOAT: + l1 &= 0xffffff; + l2 &= 0xffffff; + signs = generate_random () & 3; + fprintf (outfile, "%s%f,%s%f", (signs & 1) ? "-" : "", + ((double) l1) / 64, (signs & 2) ? "-" : "", ((double) l2) / 64); + break; + case TYPE_UENUM: + if (e->type->maxval == 0) + fputs ("e0_0,e0_0", outfile); + else if (e->type->maxval == 1) + fprintf (outfile, "e1_%" COMPAT_PRLL "d,e1_%" COMPAT_PRLL "d", + l1 & 1, l2 & 1); + else + { + p = strchr (e->type->name, '\0'); + while (--p >= e->type->name && *p >= '0' && *p <= '9'); + p++; + l1 %= 7; + l2 %= 7; + if (l1 > 3) + l1 += e->type->maxval - 6; + if (l2 > 3) + l2 += e->type->maxval - 6; + fprintf (outfile, "e%s_%" COMPAT_PRLL "d,e%s_%" COMPAT_PRLL "d", + p, l1, p, l2); + } + break; + case TYPE_SENUM: + p = strchr (e->type->name, '\0'); + while (--p >= e->type->name && *p >= '0' && *p <= '9'); + p++; + l1 %= 7; + l2 %= 7; + fprintf (outfile, "e%s_%s%" COMPAT_PRLL "d,e%s_%s%" COMPAT_PRLL "d", + p, l1 < 3 ? "m" : "", + l1 == 3 ? 0LL : e->type->maxval - (l1 & 3), + p, l2 < 3 ? "m" : "", + l2 == 3 ? 0LL : e->type->maxval - (l2 & 3)); + break; + case TYPE_PTR: + l1 %= 256; + l2 %= 256; + fprintf (outfile, + "(%s)&intarray[%" COMPAT_PRLL "d], (%s)&intarray[%" COMPAT_PRLL "d]", + e->type->name, l1, e->type->name, l2); + break; + case TYPE_FNPTR: + l1 %= 10; + l2 %= 10; + fprintf (outfile, + "fn%" COMPAT_PRLL "d,fn%" COMPAT_PRLL "d", l1, l2); + break; + default: + abort (); + } + fputs (")", outfile); +} + +int +subvalues (struct entry *e, char *p, char *letter) +{ + int i, j; + char *q; + if (p >= namebuf + sizeof (namebuf) - 32) + abort (); + p[0] = *letter; + p[1] = '\0'; + q = p + 1; + switch (e[0].etype) + { + case ETYPE_STRUCT_ARRAY: + case ETYPE_UNION_ARRAY: + if (e[0].arr_len == 0 || e[0].arr_len == 255) + { + *letter += 1 + e[0].len; + return 1 + e[0].len; + } + i = generate_random () % e[0].arr_len; + snprintf (p, sizeof (namebuf) - (p - namebuf) - 1, + "%c[%d]", *letter, i); + q = strchr (p, '\0'); + /* FALLTHROUGH */ + case ETYPE_STRUCT: + case ETYPE_UNION: + *q++ = '.'; + ++*letter; + for (i = 1; i <= e[0].len; ) + { + i += subvalues (e + i, q, letter); + if (e[0].etype == ETYPE_UNION || e[0].etype == ETYPE_UNION_ARRAY) + { + *letter += e[0].len - i + 1; + break; + } + } + return 1 + e[0].len; + case ETYPE_TYPE: + ++*letter; + output_FNB ('F', e); + return 1; + case ETYPE_ARRAY: + if (e[0].arr_len == 0 || e[0].arr_len == 255) + { + ++*letter; + return 1; + } + i = generate_random () % e[0].arr_len; + snprintf (p, sizeof (namebuf) - (p - namebuf), + "%c[%d]", *letter, i); + output_FNB ('F', e); + if ((generate_random () & 7) == 0) + { + j = generate_random () % e[0].arr_len; + if (i != j) + { + snprintf (p, sizeof (namebuf) - (p - namebuf), + "%c[%d]", *letter, j); + output_FNB ('F', e); + } + } + ++*letter; + return 1; + case ETYPE_BITFLD: + ++*letter; + if (e[0].len != 0) + output_FNB ('B', e); + return 1; + } +} + +/* DERIVED FROM: +-------------------------------------------------------------------- +lookup2.c, by Bob Jenkins, December 1996, Public Domain. +hash(), hash2(), hash3, and mix() are externally useful functions. +Routines to test the hash are included if SELF_TEST is defined. +You can use this free for any purpose. It has no warranty. +-------------------------------------------------------------------- +*/ + +/* +-------------------------------------------------------------------- +mix -- mix 3 32-bit values reversibly. +For every delta with one or two bit set, and the deltas of all three + high bits or all three low bits, whether the original value of a,b,c + is almost all zero or is uniformly distributed, +* If mix() is run forward or backward, at least 32 bits in a,b,c + have at least 1/4 probability of changing. +* If mix() is run forward, every bit of c will change between 1/3 and + 2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.) +mix() was built out of 36 single-cycle latency instructions in a + structure that could supported 2x parallelism, like so: + a -= b; + a -= c; x = (c>>13); + b -= c; a ^= x; + b -= a; x = (a<<8); + c -= a; b ^= x; + c -= b; x = (b>>13); + ... + Unfortunately, superscalar Pentiums and Sparcs can't take advantage + of that parallelism. They've also turned some of those single-cycle + latency instructions into multi-cycle latency instructions. Still, + this is the fastest good hash I could find. There were about 2^^68 + to choose from. I only looked at a billion or so. +-------------------------------------------------------------------- +*/ +/* same, but slower, works on systems that might have 8 byte hashval_t's */ +#define mix(a,b,c) \ +{ \ + a -= b; a -= c; a ^= (c>>13); \ + b -= c; b -= a; b ^= (a<< 8); \ + c -= a; c -= b; c ^= ((b&0xffffffff)>>13); \ + a -= b; a -= c; a ^= ((c&0xffffffff)>>12); \ + b -= c; b -= a; b = (b ^ (a<<16)) & 0xffffffff; \ + c -= a; c -= b; c = (c ^ (b>> 5)) & 0xffffffff; \ + a -= b; a -= c; a = (a ^ (c>> 3)) & 0xffffffff; \ + b -= c; b -= a; b = (b ^ (a<<10)) & 0xffffffff; \ + c -= a; c -= b; c = (c ^ (b>>15)) & 0xffffffff; \ +} + +/* +-------------------------------------------------------------------- +hash() -- hash a variable-length key into a 32-bit value + k : the key (the unaligned variable-length array of bytes) + len : the length of the key, counting by bytes + level : can be any 4-byte value +Returns a 32-bit value. Every bit of the key affects every bit of +the return value. Every 1-bit and 2-bit delta achieves avalanche. +About 36+6len instructions. + +The best hash table sizes are powers of 2. There is no need to do +mod a prime (mod is sooo slow!). If you need less than 32 bits, +use a bitmask. For example, if you need only 10 bits, do + h = (h & hashmask(10)); +In which case, the hash table should have hashsize(10) elements. + +If you are hashing n strings (ub1 **)k, do it like this: + for (i=0, h=0; i<n; ++i) h = hash( k[i], len[i], h); + +By Bob Jenkins, 1996. bob_jenkins@burtleburtle.net. You may use this +code any way you wish, private, educational, or commercial. It's free. + +See http://burtleburtle.net/bob/hash/evahash.html +Use for hash table lookup, or anything where one collision in 2^32 is +acceptable. Do NOT use for cryptographic purposes. +-------------------------------------------------------------------- +*/ + +static hashval_t +iterative_hash (const void *k_in /* the key */, + register size_t length /* the length of the key */, + register hashval_t initval /* the previous hash, or + an arbitrary value */) +{ + register const unsigned char *k = (const unsigned char *)k_in; + register hashval_t a,b,c,len; + + /* Set up the internal state */ + len = length; + a = b = 0x9e3779b9; /* the golden ratio; an arbitrary value */ + c = initval; /* the previous hash value */ + + /*---------------------------------------- handle most of the key */ + while (len >= 12) + { + a += (k[0] +((hashval_t)k[1]<<8) +((hashval_t)k[2]<<16) +((hashval_t)k[3]<<24)); + b += (k[4] +((hashval_t)k[5]<<8) +((hashval_t)k[6]<<16) +((hashval_t)k[7]<<24)); + c += (k[8] +((hashval_t)k[9]<<8) +((hashval_t)k[10]<<16)+((hashval_t)k[11]<<24)); + mix(a,b,c); + k += 12; len -= 12; + } + + /*------------------------------------- handle the last 11 bytes */ + c += length; + switch(len) /* all the case statements fall through */ + { + case 11: c+=((hashval_t)k[10]<<24); + case 10: c+=((hashval_t)k[9]<<16); + case 9 : c+=((hashval_t)k[8]<<8); + /* the first byte of c is reserved for the length */ + case 8 : b+=((hashval_t)k[7]<<24); + case 7 : b+=((hashval_t)k[6]<<16); + case 6 : b+=((hashval_t)k[5]<<8); + case 5 : b+=k[4]; + case 4 : a+=((hashval_t)k[3]<<24); + case 3 : a+=((hashval_t)k[2]<<16); + case 2 : a+=((hashval_t)k[1]<<8); + case 1 : a+=k[0]; + /* case 0: nothing left to add */ + } + mix(a,b,c); + /*-------------------------------------------- report the result */ + return c; +} + +hashval_t +e_hash (const void *a) +{ + const struct entry *e = a; + hashval_t ret = 0; + int i; + + if (e[0].etype != ETYPE_STRUCT && e[0].etype != ETYPE_UNION) + abort (); + for (i = 0; i <= e[0].len; ++i) + { + int attriblen; + ret = iterative_hash (&e[i], offsetof (struct entry, attrib), ret); + attriblen = e[i].attrib ? strlen (e[i].attrib) : -1; + ret = iterative_hash (&attriblen, sizeof (int), ret); + if (e[i].attrib) + ret = iterative_hash (e[i].attrib, attriblen, ret); + } + return ret; +} + +int +e_eq (const void *a, const void *b) +{ + const struct entry *ea = a, *eb = b; + int i; + if (ea[0].etype != ETYPE_STRUCT && ea[0].etype != ETYPE_UNION) + abort (); + if (ea[0].len != eb[0].len) + return 0; + for (i = 0; i <= ea[0].len; ++i) + { + if (ea[i].etype != eb[i].etype + || ea[i].len != eb[i].len + || ea[i].arr_len != eb[i].arr_len + || ea[i].type != eb[i].type) + return 0; + if ((ea[i].attrib == NULL) ^ (eb[i].attrib == NULL)) + return 0; + if (ea[i].attrib && strcmp (ea[i].attrib, eb[i].attrib) != 0) + return 0; + } + return 1; +} + +static int +e_exists (const struct entry *e) +{ + struct entry *h; + hashval_t hval; + + hval = e_hash (e); + for (h = hash_table[hval % HASH_SIZE]; h; h = h->next) + if (e_eq (e, h)) + return 1; + return 0; +} + +static void +e_insert (struct entry *e) +{ + hashval_t hval; + + hval = e_hash (e); + e->next = hash_table[hval % HASH_SIZE]; + hash_table[hval % HASH_SIZE] = e; +} + +void +output (struct entry *e) +{ + int i; + char c; + struct entry *n; + + if (e[0].etype != ETYPE_STRUCT && e[0].etype != ETYPE_UNION) + abort (); + + if (e_exists (e)) + return; + + n = (struct entry *) malloc ((e[0].len + 1) * sizeof (struct entry)); + memcpy (n, e, (e[0].len + 1) * sizeof (struct entry)); + e_insert (n); + + if (idx == limidx) + switchfiles (e[0].len); + + if (e[0].etype == ETYPE_STRUCT) + fprintf (outfile, "T(%d,", idx); + else + fprintf (outfile, "U(%d,", idx); + c = 'a'; + for (i = 1; i <= e[0].len; ) + i += subfield (e + i, &c); + fputs (",", outfile); + c = 'a'; + for (i = 1; i <= e[0].len; ) + { + i += subvalues (e + i, namebuf, &c); + if (e[0].etype == ETYPE_UNION) + break; + } + fputs (")\n", outfile); + if (output_one && idx == limidx) + exit (0); + ++idx; +} + +enum FEATURE +{ + FEATURE_VECTOR = 1, + FEATURE_ALIGNEDPACKED = 2, + FEATURE_ZEROARRAY = 4, + FEATURE_ZEROBITFLD = 8, + ALL_FEATURES = FEATURE_VECTOR | FEATURE_ZEROARRAY + | FEATURE_ALIGNEDPACKED | FEATURE_ZEROBITFLD +}; + +void +singles (enum FEATURE features) +{ + struct entry e[2]; + int i; + memset (e, 0, sizeof (e)); + e[0].etype = ETYPE_STRUCT; + output (e); + e[0].etype = ETYPE_UNION; + output (e); + e[0].len = 1; + for (i = 0; i < NTYPES2; ++i) + { + e[0].etype = ETYPE_STRUCT; + e[1].etype = ETYPE_TYPE; + e[1].type = &base_types[i]; + output (e); + e[0].etype = ETYPE_UNION; + output (e); + } + if (features & FEATURE_VECTOR) + for (i = 0; i < NVTYPES2; ++i) + { + e[0].etype = ETYPE_STRUCT; + e[1].etype = ETYPE_TYPE; + e[1].type = &vector_types[i]; + output (e); + e[0].etype = ETYPE_UNION; + output (e); + } +} + +void +choose_type (enum FEATURE features, struct entry *e, int r, int in_array) +{ + int i; + + i = NTYPES2 - NTYPES1; + if (features & FEATURE_VECTOR) + i += NVTYPES2; + if ((r & 3) == 0) + { + if (in_array) + i += NAATYPES2; + else + i += NATYPES2; + } + r >>= 2; + r %= i; + if (r < NTYPES2 - NTYPES1) + e->type = &base_types[r + NTYPES1]; + r -= NTYPES2 - NTYPES1; + if (e->type == NULL && (features & FEATURE_VECTOR)) + { + if (r < NVTYPES2) + e->type = &vector_types[r]; + r -= NVTYPES2; + } + if (e->type == NULL && !in_array) + { + if (r < NATYPES2) + e->type = &attrib_types[r]; + r -= NATYPES2; + } + if (e->type == NULL && in_array) + { + if (r < NAATYPES2) + e->type = &attrib_array_types[r]; + r -= NAATYPES2; + } + if (e->type == NULL) + abort (); +} + +/* This is from gcc.c-torture/execute/builtin-bitops-1.c. */ +static int +my_ffsll (unsigned long long x) +{ + int i; + if (x == 0) + return 0; + /* We've tested LLONG_MAX for 64 bits so this should be safe. */ + for (i = 0; i < 64; i++) + if (x & (1ULL << i)) + break; + return i + 1; +} + +void +generate_fields (enum FEATURE features, struct entry *e, struct entry *parent, + int len) +{ + int r, i, j, ret = 1, n, incr, sametype; + + for (n = 0; n < len; n += incr) + { + r = generate_random (); + /* 50% ETYPE_TYPE base_types NTYPES1 + 12.5% ETYPE_TYPE other + 12.5% ETYPE_ARRAY + 12.5% ETYPE_BITFLD + 12.5% ETYPE_STRUCT|ETYPE_UNION|ETYPE_STRUCT_ARRAY|ETYPE_UNION_ARRAY */ + i = (r & 7); + r >>= 3; + incr = 1; + switch (i) + { + case 0: + case 1: + case 2: + case 3: + e[n].etype = ETYPE_TYPE; + e[n].type = &base_types[r % NTYPES1]; + break; + case 4: + e[n].etype = ETYPE_TYPE; + choose_type (features, &e[n], r, 0); + break; + case 5: + e[n].etype = ETYPE_ARRAY; + i = r & 1; + r >>= 1; + if (i) + e[n].type = &base_types[r % NTYPES1]; + else + choose_type (features, &e[n], r, 1); + r = generate_random (); + if ((features & FEATURE_ZEROARRAY) && (r & 3) == 0) + { + e[n].arr_len = 0; + if (n == len - 1 && (r & 4) + && (parent->etype == ETYPE_STRUCT + || parent->etype == ETYPE_STRUCT_ARRAY)) + { + int k; + for (k = 0; k < n; ++k) + if (e[k].etype != ETYPE_BITFLD || e[k].len) + { + e[n].arr_len = 255; + break; + } + } + } + else if ((r & 3) != 3) + e[n].arr_len = (r >> 2) & 7; + else + e[n].arr_len = (r >> 2) & 31; + break; + case 6: + sametype = 1; + switch (r & 7) + { + case 0: + case 1: + case 2: + break; + case 3: + case 4: + case 5: + incr = 1 + (r >> 3) % (len - n); + break; + case 6: + case 7: + sametype = 0; + incr = 1 + (r >> 3) % (len - n); + break; + } + for (j = n; j < n + incr; ++j) + { + int mi, ma; + + e[j].etype = ETYPE_BITFLD; + if (j == n || !sametype) + { + int k; + r = generate_random (); + k = r & 3; + r >>= 2; + if (!k) + e[j].type + = &aligned_bitfld_types[r % n_aligned_bitfld_types]; + else + e[j].type + = &bitfld_types[r % n_bitfld_types]; + } + else + e[j].type = e[n].type; + r = generate_random (); + mi = 0; + ma = 0; + switch (e[j].type->bitfld) + { + case 'C': ma = 8; break; + case 'S': ma = 16; break; + case 'I': ma = 32; break; + case 'L': + case 'Q': ma = 64; break; + case 'B': ma = 1; break; + case ' ': + if (e[j].type->type == TYPE_UENUM) + mi = my_ffsll (e[j].type->maxval + 1) - 1; + else if (e[j].type->type == TYPE_SENUM) + mi = my_ffsll (e[j].type->maxval + 1); + else + abort (); + if (!mi) + mi = 1; + if (mi > 32) + ma = 64; + else if (mi > 16 || !short_enums) + ma = 32; + else if (mi > 8) + ma = 16; + else + ma = 8; + break; + default: + abort (); + } + e[j].len = ma + 1; + if (sametype && (r & 3) == 0 && ma > 1) + { + int sum = 0, k; + for (k = n; k < j; ++k) + sum += e[k].len; + sum %= ma; + e[j].len = sum ? ma - sum : ma; + } + r >>= 2; + if (!sametype && (r & 7) == 0) + ma *= 8; + r >>= 3; + if (! (features & FEATURE_ZEROBITFLD) && mi == 0) + mi = 1; + if (e[j].len < mi || e[j].len > ma) + e[j].len = mi + (r % (ma + 1 - mi)); + r >>= 6; + if ((features & FEATURE_ZEROBITFLD) && (r & 3) == 0 + && mi == 0) + e[j].len = 0; + } + break; + case 7: + switch (r & 7) + { + case 0: + case 1: + case 2: + e[n].etype = ETYPE_STRUCT; + break; + case 3: + case 4: + e[n].etype = ETYPE_UNION; + break; + case 5: + case 6: + e[n].etype = ETYPE_STRUCT_ARRAY; + break; + case 7: + e[n].etype = ETYPE_UNION_ARRAY; + break; + } + r >>= 3; + e[n].len = r % (len - n); + incr = 1 + e[n].len; + generate_fields (features, &e[n + 1], &e[n], e[n].len); + if (e[n].etype == ETYPE_STRUCT_ARRAY + || e[n].etype == ETYPE_UNION_ARRAY) + { + r = generate_random (); + if ((features & FEATURE_ZEROARRAY) && (r & 3) == 0) + { + e[n].arr_len = 0; + if (n + incr == len && (r & 4) + && (parent->etype == ETYPE_STRUCT + || parent->etype == ETYPE_STRUCT_ARRAY)) + { + int k; + for (k = 0; k < n; ++k) + if (e[k].etype != ETYPE_BITFLD || e[k].len) + { + e[n].arr_len = 255; + break; + } + } + } + else if ((r & 3) != 3) + e[n].arr_len = (r >> 2) & 7; + else + e[n].arr_len = (r >> 2) & 31; + } + break; + } + r = generate_random (); + if ((r & 7) == 0) + { + r >>= 3; + i = (features & FEATURE_ALIGNEDPACKED) ? NATTRIBS2 : NATTRIBS1; + e[n].attrib = attributes[r % i]; + if (! (features & FEATURE_ALIGNEDPACKED) + && strcmp (e[n].attrib, "atpa") == 0 + && ((e[n].type >= &attrib_types[0] + && e[n].type < &attrib_types[NATYPES2]) + || (e[n].type >= &attrib_array_types[0] + && e[n].type < &attrib_array_types[NAATYPES2]) + || (e[n].type >= &aligned_bitfld_types[0] + && e[n].type < &aligned_bitfld_types[n_aligned_bitfld_types]))) + e[n].attrib = NULL; + } + } +} + +void +generate_random_tests (enum FEATURE features, int len) +{ + struct entry e[len + 1]; + int i, r; + if (len > 'z' - 'a' + 1) + abort (); + memset (e, 0, sizeof (e)); + r = generate_random (); + if ((r & 7) == 0) + e[0].etype = ETYPE_UNION; + else + e[0].etype = ETYPE_STRUCT; + r >>= 3; + e[0].len = len; + generate_fields (features, &e[1], &e[0], len); + output (e); +} + +struct { const char *name; enum FEATURE f; } +features[] = { +{ "normal", 0 }, +{ "vector", FEATURE_VECTOR }, +{ "[0] :0", FEATURE_ZEROARRAY | FEATURE_ZEROBITFLD }, +{ "vector [0]", + FEATURE_VECTOR | FEATURE_ZEROARRAY }, +{ "aligned packed vector [0] :0", + FEATURE_VECTOR | FEATURE_ZEROARRAY + | FEATURE_ALIGNEDPACKED | FEATURE_ZEROBITFLD }, +}; + +int +main (int argc, char **argv) +{ + int i, j, count, c, n = 3000; + char *optarg; + + if (sizeof (int) != 4 || sizeof (long long) != 8) + return 1; + + i = 1; + while (i < argc) + { + c = '\0'; + if (argv[i][0] == '-' && argv[i][2] == '\0') + c = argv[i][1]; + optarg = argv[i + 1]; + if (!optarg) + goto usage; + switch (c) + { + case 'n': + n = atoi (optarg); + break; + case 'd': + destdir = optarg; + break; + case 's': + srcdir = optarg; + break; + case 'i': + output_one = 1; + limidx = atoi (optarg); + break; + case 'e': + short_enums = 1; + i--; + break; + default: + fprintf (stderr, "unrecognized option %s\n", argv[i]); + goto usage; + } + i += 2; + } + + if (output_one) + { + outfile = fopen ("/dev/null", "w"); + if (outfile == NULL) + { + fputs ("could not open /dev/null", stderr); + return 1; + } + n = limidx + 1; + } + + if (destdir == NULL && !output_one) + { + usage: + fprintf (stderr, "Usage:\n\ +%s [-e] [-s srcdir -d destdir] [-n count] [-i idx]\n\ +Either -s srcdir -d destdir or -i idx must be used\n", argv[0]); + return 1; + } + + if (srcdir == NULL && !output_one) + goto usage; + + if (srcdir != NULL) + { + const char *s = srcdir; + char *ss, *t; + t = ss = malloc (strlen (srcdir) + 1); + if (!ss) + abort (); + do { + if (*s == '\\') + *t++ = '/'; + else + *t++ = *s; + } while (*s++); + srcdir_safe = ss; + } + + for (i = 0; i < NTYPES2; ++i) + if (base_types[i].bitfld) + bitfld_types[n_bitfld_types++] = base_types[i]; + for (i = 0; i < NATYPES2; ++i) + if (attrib_types[i].bitfld) + aligned_bitfld_types[n_aligned_bitfld_types++] = attrib_types[i]; + for (i = 0; i < sizeof (features) / sizeof (features[0]); ++i) + { + int startidx = idx; + if (! output_one) + limidx = idx; + if (!i) + count = 200; + else + count = 20; + for (j = 1; j <= 9; ++j) + while (idx < startidx + j * count) + generate_random_tests (features[i].f, j); + while (idx < startidx + count * 10) + generate_random_tests (features[i].f, 10 + (generate_random () % 16)); + } + for (i = 0; n > 3000 && i < sizeof (features) / sizeof (features[0]); ++i) + { + int startidx; + startidx = idx; + if (! output_one) + limidx = idx; + singles (features[i].f); + if (!i) + { + count = 1000; + while (idx < startidx + 1000) + generate_random_tests (features[i].f, 1); + } + else + { + startidx = idx; + count = 100; + while (idx < startidx + 100) + generate_random_tests (features[i].f, 1); + } + startidx = idx; + for (j = 2; j <= 9; ++j) + while (idx < startidx + (j - 1) * count) + generate_random_tests (features[i].f, j); + while (idx < startidx + count * 9) + generate_random_tests (features[i].f, 10 + (generate_random () % 16)); + } + if (! output_one) + limidx = idx; + while (idx < n) + generate_random_tests (ALL_FEATURES, 1 + (generate_random () % 25)); + fclose (outfile); + return 0; +} diff --git a/gcc/testsuite/g++.dg/compat/struct-layout-1_x1.h b/gcc/testsuite/g++.dg/compat/struct-layout-1_x1.h new file mode 100644 index 000000000..e14433e03 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/struct-layout-1_x1.h @@ -0,0 +1,68 @@ +#include "struct-layout-1.h" + +struct Info info; +int fails; +int intarray[256]; +int fn0 (void) { return 0; } +int fn1 (void) { return 1; } +int fn2 (void) { return 2; } +int fn3 (void) { return 3; } +int fn4 (void) { return 4; } +int fn5 (void) { return 5; } +int fn6 (void) { return 6; } +int fn7 (void) { return 7; } +int fn8 (void) { return 8; } +int fn9 (void) { return 9; } + +/* This macro is intended for fields where their + addresses/sizes/alignments and value passing should be checked. */ +#define F(n, x, v, w) \ + info.flds[i] = &s##n.x; \ + info.sizes[i] = sizeof (s##n.x); \ + info.aligns[i] = __alignof__ (s##n.x); \ + s##n.x = v; \ + a##n[2].x = w; \ + ++i; +/* This macro is for fields where just their addresses/sizes/alignments + should be checked. */ +#define N(n, x) \ + info.flds[i] = &s##n.x; \ + info.sizes[i] = sizeof (s##n.x); \ + info.aligns[i] = __alignof__ (s##n.x); \ + ++i; +/* This macro is for fields where just value passing should be checked. */ +#define B(n, x, v, w) \ + s##n.x = v; \ + a##n[2].x = w; \ + ++j; +#define TX(n, type, attrs, fields, ops) \ +type S##n { fields } attrs; \ +type S##n s##n; \ +extern type S##n a##n[5]; \ +extern type S##n check##n (type S##n, type S##n *, \ + type S##n); \ +extern void check##n##va (int i, ...); \ +extern void checkx##n (type S##n); \ +void test##n (void) \ +{ \ + int i, j; \ + memset (&s##n, '\0', sizeof (s##n)); \ + memset (a##n, '\0', sizeof (a##n)); \ + memset (&info, '\0', sizeof (info)); \ + info.sp = &s##n; \ + info.a0p = &a##n[0]; \ + info.a3p = &a##n[3]; \ + info.sz = sizeof (s##n); \ + info.als = __alignof__ (s##n); \ + info.ala0 = __alignof__ (a##n[0]); \ + info.ala3 = __alignof__ (a##n[3]); \ + if (((long) (__SIZE_TYPE__) &a##n[3]) & (info.als - 1)) \ + FAIL (n, 1); \ + i = 0; j = 0; \ + ops \ + info.nfields = i; \ + info.nbitfields = j; \ + checkx##n (check##n (s##n, &a##n[1], a##n[2])); \ + check##n##va (1, 1.0, s##n, 2LL, a##n[2], a##n[2]); \ + check##n##va (2, s##n, s##n, 2.0L, a##n[2], s##n); \ +} diff --git a/gcc/testsuite/g++.dg/compat/struct-layout-1_x2.h b/gcc/testsuite/g++.dg/compat/struct-layout-1_x2.h new file mode 100644 index 000000000..907a2c959 --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/struct-layout-1_x2.h @@ -0,0 +1,14 @@ +#undef F +#undef N +#undef B +#undef TX +#define F(n, x, v, w) \ + if (arg.x != s##n.x) FAIL (n, 30); +#define N(n, x) +#define B(n, x, v, w) \ + if (arg.x != s##n.x) FAIL (n, 30); +#define TX(n, type, attrs, fields, ops) \ +void checkx##n (type S##n arg) \ +{ \ + ops \ +} diff --git a/gcc/testsuite/g++.dg/compat/struct-layout-1_y1.h b/gcc/testsuite/g++.dg/compat/struct-layout-1_y1.h new file mode 100644 index 000000000..9a5d2468a --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/struct-layout-1_y1.h @@ -0,0 +1,76 @@ +#include "struct-layout-1.h" + +#define F(n, x, v, w) \ + if (info.flds[i] != &s##n.x) \ + FAIL (n, 50); \ + if (info.sizes[i] != sizeof (s##n.x)) \ + FAIL (n, 51); \ + if (info.aligns[i] != __alignof__ (s##n.x)) \ + FAIL (n, 52); \ + if (s##n.x != (__typeof__ (s##n.x)) v) \ + FAIL (n, 53); \ + if (a##n[2].x != (__typeof__ (s##n.x)) w) \ + FAIL (n, 54); \ + if (arg0.x != s##n.x) \ + FAIL (n, 55); \ + if (arg2.x != a##n[2].x) \ + FAIL (n, 56); \ + ret.x = s##n.x; \ + ++i; +#define N(n, x) \ + if (info.flds[i] != &s##n.x) \ + FAIL (n, 50); \ + if (info.sizes[i] != sizeof (s##n.x)) \ + FAIL (n, 51); \ + if (info.aligns[i] != __alignof__ (s##n.x)) \ + FAIL (n, 52); \ + ++i; +#define B(n, x, v, w) \ + b1.x = v; b2.x = w; \ + if (s##n.x != b1.x) \ + FAIL (n, 53); \ + if (a##n[2].x != b2.x) \ + FAIL (n, 54); \ + if (arg0.x != s##n.x) \ + FAIL (n, 55); \ + if (arg2.x != a##n[2].x) \ + FAIL (n, 56); \ + ret.x = s##n.x; \ + ++j; +#define TX(n, type, attrs, fields, ops) \ +type S##n { fields } attrs; \ +extern type S##n s##n; \ +type S##n a##n[5]; \ +type S##n \ +check##n (type S##n arg0, type S##n *arg1, type S##n arg2) \ +{ \ + type S##n ret; \ + type S##n b1, b2; \ + int i, j; \ + \ + memset (&ret, 0, sizeof (ret)); \ + memset (&b1, 0, sizeof (b1)); \ + memset (&b2, 0, sizeof (b2)); \ + if (info.sp != &s##n) \ + FAIL (n, 10); \ + if (info.a0p != &a##n[0]) \ + FAIL (n, 11); \ + if (info.a3p != &a##n[3]) \ + FAIL (n, 12); \ + if (info.sz != sizeof (s##n)) \ + FAIL (n, 13); \ + if (info.als != __alignof__ (s##n)) \ + FAIL (n, 14); \ + if (info.ala0 != __alignof__ (a##n[0])) \ + FAIL (n, 15); \ + if (info.ala3 != __alignof__ (a##n[3])) \ + FAIL (n, 16); \ + if (arg1 != &a##n[1]) \ + FAIL (n, 17); \ + i = 0; j = 0; \ + ops \ + if (i != info.nfields || j != info.nbitfields) \ + FAIL (n, 18); \ + \ + return ret; \ +} diff --git a/gcc/testsuite/g++.dg/compat/struct-layout-1_y2.h b/gcc/testsuite/g++.dg/compat/struct-layout-1_y2.h new file mode 100644 index 000000000..02a341e1c --- /dev/null +++ b/gcc/testsuite/g++.dg/compat/struct-layout-1_y2.h @@ -0,0 +1,69 @@ +#undef F +#undef N +#undef B +#undef TX + +#ifdef SKIP_VA +const int test_va = 0; +#else +const int test_va = 1; +#endif + +#define F(n, x, v, w) \ + if (p->x != arg.x) FAIL (n, 74); +#define N(n, x) +#define B(n, x, v, w) \ + if (p->x != arg.x) FAIL (n, 74); +#define TX(n, type, attrs, fields, ops) \ +void \ +check##n##va (int z, ...) \ +{ \ + type S##n arg, *p; \ + va_list ap; \ + int i; \ + \ + if (test_va) \ + { \ + va_start (ap, z); \ + for (i = 0; i < 5; ++i) \ + { \ + p = NULL; \ + switch ((z << 4) | i) \ + { \ + case 0x10: \ + if (va_arg (ap, double) != 1.0) \ + FAIL (n, 70); \ + break; \ + case 0x12: \ + if (va_arg (ap, long long) != 2LL) \ + FAIL (n, 71); \ + break; \ + case 0x22: \ + if (va_arg (ap, long double) != 2.0L) \ + FAIL (n, 72); \ + break; \ + case 0x11: \ + case 0x20: \ + case 0x21: \ + case 0x24: \ + p = &s##n; \ + arg = va_arg (ap, type S##n); \ + break; \ + case 0x13: \ + case 0x14: \ + case 0x23: \ + p = &a##n[2]; \ + arg = va_arg (ap, type S##n); \ + break; \ + default: \ + FAIL (n, 73); \ + break; \ + } \ + if (p) \ + { \ + ops \ + } \ + } \ + va_end (ap); \ + } \ +} diff --git a/gcc/testsuite/g++.dg/constexpr-null1.C b/gcc/testsuite/g++.dg/constexpr-null1.C new file mode 100644 index 000000000..44cf9a0b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/constexpr-null1.C @@ -0,0 +1,11 @@ +// PR c++/46670 +// { dg-options -std=c++0x } + +extern unsigned char __TBB_ReverseByte(unsigned char src); +extern unsigned char *reversed; +template<typename T> T __TBB_ReverseBits(T src) +{ + unsigned char *original = (unsigned char *) &src; + for( int i = sizeof(T)-1; i--; ) + reversed[i] = __TBB_ReverseByte( original[sizeof(T)-i-1] ); +} diff --git a/gcc/testsuite/g++.dg/conversion/access1.C b/gcc/testsuite/g++.dg/conversion/access1.C new file mode 100644 index 000000000..f187e63a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/access1.C @@ -0,0 +1,25 @@ +// PR c++/38579 + +struct P +{ +protected: + P() {} + P(const P&) {} +}; + +struct B : protected P +{ + B() {} +}; + +struct C : public P +{ + // C can access P's copy ctor, but can't convert b to const P&. + C(const B& b) : P(b) {} // { dg-error "inaccessible base" } +}; + +void foo() +{ + B b; + C c(b); +} diff --git a/gcc/testsuite/g++.dg/conversion/ambig1.C b/gcc/testsuite/g++.dg/conversion/ambig1.C new file mode 100644 index 000000000..85ea1d25f --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ambig1.C @@ -0,0 +1,9 @@ +// PR c++/19787 + +struct H { + operator char(); // { dg-message "note" } + operator short(); // { dg-message "note" } +}; + +int const& ref = H(); // { dg-error "ambiguous" } +// { dg-message "candidate" "candidate note" { target *-*-* } 8 } diff --git a/gcc/testsuite/g++.dg/conversion/base1.C b/gcc/testsuite/g++.dg/conversion/base1.C new file mode 100644 index 000000000..e236504ae --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/base1.C @@ -0,0 +1,20 @@ +// PR c++/48749 + +struct Tuple3 +{ + float x; +}; + +struct Pos: virtual Tuple3 { }; + +struct TexCoords +{ + Pos pos; +}; + +template <class T> +void eval (const TexCoords &coords) +{ + const Pos &pos = coords.pos; + pos.x; +} diff --git a/gcc/testsuite/g++.dg/conversion/bitfield1.C b/gcc/testsuite/g++.dg/conversion/bitfield1.C new file mode 100644 index 000000000..a660e7950 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield1.C @@ -0,0 +1,17 @@ +// { dg-do run } +// { dg-options "-w" } + +enum E { a, b = 1LL << 48 }; + +struct S { + E e : 3; +}; + +S s; + +int main () { + if (sizeof (E) != sizeof (long long)) + return 1; + if (sizeof (s.e + 3) != sizeof (long long)) + return 2; +} diff --git a/gcc/testsuite/g++.dg/conversion/bitfield10.C b/gcc/testsuite/g++.dg/conversion/bitfield10.C new file mode 100644 index 000000000..f75504e0d --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield10.C @@ -0,0 +1,24 @@ +// PR c++/38007 +// We need to use the conversion function to the declared type of a bitfield, +// not the lowered bitfield type. +// { dg-do link } + +struct A +{ + operator unsigned int() { return 42; } + operator unsigned char(); +}; + +struct B +{ + unsigned int b : 8; +}; + +int +main () +{ + A u; + unsigned int v = u; + B w; + w.b = u; +} diff --git a/gcc/testsuite/g++.dg/conversion/bitfield11.C b/gcc/testsuite/g++.dg/conversion/bitfield11.C new file mode 100644 index 000000000..e36539c64 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield11.C @@ -0,0 +1,8 @@ +// Make sure that digest_init converts to the declared type of the +// bitfield, not just the lowered type. + +enum E { EA, EB }; + +struct A { E e: 8; }; + +A a = { 0 }; // { dg-error "invalid conversion" } diff --git a/gcc/testsuite/g++.dg/conversion/bitfield2.C b/gcc/testsuite/g++.dg/conversion/bitfield2.C new file mode 100644 index 000000000..aa60d3505 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield2.C @@ -0,0 +1,11 @@ +// PR c++/27292 + +struct A +{ + int i : 8; +}; + +bool foo(A a) +{ + return int(a.i); +} diff --git a/gcc/testsuite/g++.dg/conversion/bitfield3.C b/gcc/testsuite/g++.dg/conversion/bitfield3.C new file mode 100644 index 000000000..a897bf59e --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield3.C @@ -0,0 +1,14 @@ +// PR c++/16376 +// { dg-do run } + +int main(void){ + struct bits { + unsigned int ui3 : 3; + } bits; + int i = -1; /* is a very large positive number as unsigned */ + + bits.ui3 = 1u; + if( bits.ui3 < i ) + return 1; + return 0; +} diff --git a/gcc/testsuite/g++.dg/conversion/bitfield4.C b/gcc/testsuite/g++.dg/conversion/bitfield4.C new file mode 100644 index 000000000..75fe3016e --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield4.C @@ -0,0 +1,20 @@ +// PR c++/27292 + +enum ColorRole +{ + WindowText, Button +}; + +struct QPalette { + +ColorRole bg_role:8; + + bool hasBackground(); +}; + + +bool +QPalette::hasBackground () +{ + return (ColorRole (bg_role) != WindowText); +} diff --git a/gcc/testsuite/g++.dg/conversion/bitfield5.C b/gcc/testsuite/g++.dg/conversion/bitfield5.C new file mode 100644 index 000000000..b931ec97c --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield5.C @@ -0,0 +1,14 @@ +// PR c++/27506 + +enum EBorderStyle + { + BNATIVE, BHIDDEN + }; +struct BorderValue +{ + enum EBorderStyle style:8; +}; +enum EBorderStyle f(const struct BorderValue *border) +{ + return border ? border->style : BNATIVE; +} diff --git a/gcc/testsuite/g++.dg/conversion/bitfield6.C b/gcc/testsuite/g++.dg/conversion/bitfield6.C new file mode 100644 index 000000000..79664ab7d --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield6.C @@ -0,0 +1,10 @@ +// PR c++/27471 + +struct A { unsigned a:8; }; + +extern void b(unsigned char); + +void breakme (A f) +{ + b((unsigned char) f.a); +} diff --git a/gcc/testsuite/g++.dg/conversion/bitfield7.C b/gcc/testsuite/g++.dg/conversion/bitfield7.C new file mode 100644 index 000000000..1080168dc --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield7.C @@ -0,0 +1,16 @@ +// PR c++/33984 +// { dg-do compile } + +struct S +{ + unsigned int bar : 3; +} s; + +int foo (unsigned int &); +int foo (double); + +int +main () +{ + return foo (s.bar); // { dg-error "cannot bind bitfield" } +} diff --git a/gcc/testsuite/g++.dg/conversion/bitfield8.C b/gcc/testsuite/g++.dg/conversion/bitfield8.C new file mode 100644 index 000000000..dbc62fade --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield8.C @@ -0,0 +1,16 @@ +// PR c++/35056 +// { dg-do compile } +// { dg-options "-O2" } + +enum EBorderStyle { bla = 1 }; +inline bool compare_ref(const unsigned int &t, const EBorderStyle &u) +{ return t == u; } +inline bool compare_val(const unsigned int t, const EBorderStyle u) +{ return t == u; } +struct S { + unsigned m_style : 4; +}; +void call_ref (S *s, EBorderStyle v) +{ if (!compare_ref(s->m_style, v)) s->m_style = v; } +void call_val (S *s, EBorderStyle v) +{ if (!compare_val(s->m_style, v)) s->m_style = v; } diff --git a/gcc/testsuite/g++.dg/conversion/bitfield9.C b/gcc/testsuite/g++.dg/conversion/bitfield9.C new file mode 100644 index 000000000..998dd4873 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/bitfield9.C @@ -0,0 +1,17 @@ +// PR c++/35909 +// { dg-do compile } + +struct MidiCommand +{ + unsigned data1 : 8; +}; + +void g(const unsigned char &); +void h(const unsigned int &); + +void f(MidiCommand mc) +{ + g(mc.data1); + h(mc.data1); +} + diff --git a/gcc/testsuite/g++.dg/conversion/cast1.C b/gcc/testsuite/g++.dg/conversion/cast1.C new file mode 100644 index 000000000..f90b42165 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cast1.C @@ -0,0 +1,22 @@ +// PR c++/10841 + +int main() { + class Base { + public: + int i, j, k; + void f(); }; + + class Derived : private Base { + public: + int m, n, p; + void g(); + }; + + Derived derived; + Base &base = (Base &)derived; + (int Base::*)&Derived::n; + (int Derived::*)&Base::j; + (void (Base::*)(void))&Derived::g; + (void (Derived::*)(void))&Base::f; +} + diff --git a/gcc/testsuite/g++.dg/conversion/cast2.C b/gcc/testsuite/g++.dg/conversion/cast2.C new file mode 100644 index 000000000..ac8329730 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cast2.C @@ -0,0 +1,9 @@ +// Origin: PR c++/42260 +// { dg-do compile } + +struct A +{ + template<typename T> operator T*(); +}; + +int i = *A();// { dg-error "no match" } diff --git a/gcc/testsuite/g++.dg/conversion/cast3.C b/gcc/testsuite/g++.dg/conversion/cast3.C new file mode 100644 index 000000000..43287a1eb --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cast3.C @@ -0,0 +1,14 @@ +// Origin: PR c++/46824 + +class Incomplete; +struct Ptr +{ + operator Incomplete*(); +}; + +int +main() +{ + Ptr p; + *p; +} diff --git a/gcc/testsuite/g++.dg/conversion/cond1.C b/gcc/testsuite/g++.dg/conversion/cond1.C new file mode 100644 index 000000000..16184ccb4 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cond1.C @@ -0,0 +1,12 @@ +// PR c++/9440 + struct A { + explicit A(int = 0); + A(const A&); + operator int() const; + }; + + A + bar(bool b, const A& a) + { + return (b ? A() : a); + } diff --git a/gcc/testsuite/g++.dg/conversion/cond2.C b/gcc/testsuite/g++.dg/conversion/cond2.C new file mode 100644 index 000000000..d31de33e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cond2.C @@ -0,0 +1,15 @@ +// PR c++/10245 + +struct X {}; + +struct Y { + Y (); + operator X () const; +private: + Y (const Y &); +}; + +Y y; +void foo() { + X x = (1 ? Y() : Y()); +} diff --git a/gcc/testsuite/g++.dg/conversion/cond3.C b/gcc/testsuite/g++.dg/conversion/cond3.C new file mode 100644 index 000000000..da052d453 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cond3.C @@ -0,0 +1,20 @@ +// PR c++/9537 + +class String +{ +public: + String(); + String( char *str ); + operator char *(); +}; + +const String operator+( String s1, String ) +{ + return s1; +} + +String valGlue(const String before) +{ + String ret; + return false ? ret : before + before; +} diff --git a/gcc/testsuite/g++.dg/conversion/cond4.C b/gcc/testsuite/g++.dg/conversion/cond4.C new file mode 100644 index 000000000..3bd64763a --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cond4.C @@ -0,0 +1,31 @@ +// Origin: PR c++/45383 +// { dg-do run } + +struct null { + null() {} + template<class T> + operator T*() const { + return 0; + } + + template<class C, class T> + operator T C::*() const { + return 0; + } +private: + null(const null&); + null& operator=(const null&); + void operator&() const; +}; + +static struct null null; + +int +main() +{ + int* ptr = null; + if (ptr == null) + return 0; + if (ptr != null) + return 1; +} diff --git a/gcc/testsuite/g++.dg/conversion/cond6.C b/gcc/testsuite/g++.dg/conversion/cond6.C new file mode 100644 index 000000000..8c05e1b14 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cond6.C @@ -0,0 +1,18 @@ +// PR c++/11283 +// Converting "a" to the type of "i" produces "int" rather than "const +// int", which was causing build_conditional_expr to abort. But we don't +// care about cv-quals on non-class rvalues. + +struct A +{ + operator int (); +}; + +extern A a; +extern const int i; +extern bool b; + +int f () +{ + return b ? a : i; +} diff --git a/gcc/testsuite/g++.dg/conversion/const1.C b/gcc/testsuite/g++.dg/conversion/const1.C new file mode 100644 index 000000000..5e43bc063 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/const1.C @@ -0,0 +1,5 @@ +// PR c++/14211 + +void f(char *str) { + char *& m = const_cast<char *>(str); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/conversion/const2.C b/gcc/testsuite/g++.dg/conversion/const2.C new file mode 100644 index 000000000..fd2be1f44 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/const2.C @@ -0,0 +1,11 @@ +struct B {}; +struct D : public B {}; + +typedef int B::*bm; +typedef int D::*dm; + +bm bp; + +void f() { + const_cast<dm>(bp); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/conversion/const3.C b/gcc/testsuite/g++.dg/conversion/const3.C new file mode 100644 index 000000000..faa9f810c --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/const3.C @@ -0,0 +1,7 @@ +// PR c++/18177 + +void foo() +{ + X; // { dg-error "" } + const_cast<int&>(X); +} diff --git a/gcc/testsuite/g++.dg/conversion/dr195-1.C b/gcc/testsuite/g++.dg/conversion/dr195-1.C new file mode 100644 index 000000000..ca38580e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/dr195-1.C @@ -0,0 +1,34 @@ +// { dg-options "" } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 20 Oct 2004 <nathan@codesourcery.com> + +// DR 195 will allow conversions between function and object pointers +// under some circumstances. It is in drafting, so we don't implement +// it (yet). + +// this checks we are silent when not being pedantic. + +typedef void (*PF)(void); +typedef void *PV; +typedef int *PO; + + +void foo () +{ + PF pf; + PV pv; + PO po; + + /* the following two will almost definitly be ok with 195. */ + pf = reinterpret_cast <PF>(pv); + pv = reinterpret_cast <PV>(pf); + + /* the following two might or might not be ok with 195. */ + pf = reinterpret_cast <PF>(po); + po = reinterpret_cast <PO>(pf); + + /* These will never be ok, as they are implicit. */ + pv = pf; // { dg-error "invalid conversion" "" } + pf = pv; // { dg-error "invalid conversion" "" } +} diff --git a/gcc/testsuite/g++.dg/conversion/dr195.C b/gcc/testsuite/g++.dg/conversion/dr195.C new file mode 100644 index 000000000..8502c1578 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/dr195.C @@ -0,0 +1,31 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 20 Oct 2004 <nathan@codesourcery.com> + +// DR 195 will allow conversions between function and object pointers +// under some circumstances. It is in drafting, so we don't implement +// it (yet). + +// This checks we warn when being pedantic. + +typedef void (*PF)(void); +typedef void *PV; +typedef int *PO; + +void foo () +{ + PF pf; + PV pv; + PO po; + + /* the following two will almost definitly be ok with 195. */ + pf = reinterpret_cast <PF>(pv); // { dg-warning "casting between" "" } + pv = reinterpret_cast <PV>(pf); // { dg-warning "casting between" "" } + + /* the following two might or might not be ok with 195. */ + pf = reinterpret_cast <PF>(po); // { dg-warning "casting between" "" } + po = reinterpret_cast <PO>(pf); // { dg-warning "casting between" "" } + + /* These will never be ok, as they are implicit. */ + pv = pf; // { dg-error "invalid conversion" "" } + pf = pv; // { dg-error "invalid conversion" "" } +} diff --git a/gcc/testsuite/g++.dg/conversion/dynamic1.C b/gcc/testsuite/g++.dg/conversion/dynamic1.C new file mode 100644 index 000000000..a781cbaa3 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/dynamic1.C @@ -0,0 +1,15 @@ +// PR c++/10385 +// Origin: <douglas@coc.ufrj.br> +// { dg-do compile } + +struct A +{ + void foo(); +}; + +A& bar(); + +void baz() +{ + dynamic_cast<A&>( bar().foo ); // { dg-error "cannot dynamic_cast" } +} diff --git a/gcc/testsuite/g++.dg/conversion/enum1.C b/gcc/testsuite/g++.dg/conversion/enum1.C new file mode 100644 index 000000000..6ea8cadb6 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/enum1.C @@ -0,0 +1,10 @@ +// { dg-do run } +// { dg-options "-O2 -finline-functions" } + +enum E { V = 1 }; +static const E E_MIN = V; +static const E E_MAX = V; + +bool valid(E v) { return v >= E_MIN && v <= E_MAX; } + +int main() { return valid(E(2)); } diff --git a/gcc/testsuite/g++.dg/conversion/err-recover1.C b/gcc/testsuite/g++.dg/conversion/err-recover1.C new file mode 100644 index 000000000..97237893d --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/err-recover1.C @@ -0,0 +1,8 @@ +// PR c++/42219 + +void foo(const void); // { dg-error "incomplete|const" } + +void bar() +{ + void (*pf)() = foo; // { dg-error "cannot convert" } +} diff --git a/gcc/testsuite/g++.dg/conversion/memfn1.C b/gcc/testsuite/g++.dg/conversion/memfn1.C new file mode 100644 index 000000000..da2fb0fad --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/memfn1.C @@ -0,0 +1,26 @@ +// PR c++/36334 + +struct X +{ + typedef int* foobar(); + static void foo(foobar&); +}; + +void X::foo(foobar&) +{ +} + +struct Y : public X +{ + static foobar bar; + static void foo(); +}; + +void Y::foo() +{ + X::foo(bar); +} +int* Y::bar() +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/conversion/memfn2.C b/gcc/testsuite/g++.dg/conversion/memfn2.C new file mode 100644 index 000000000..c3d76133d --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/memfn2.C @@ -0,0 +1,11 @@ +// PR c++/37646 + +struct A +{ + void foo(); + + void bar(int i) + { + void (*p)() = i ? foo : foo; // { dg-error "invalid use of member" } + } +}; diff --git a/gcc/testsuite/g++.dg/conversion/nullptr1.C b/gcc/testsuite/g++.dg/conversion/nullptr1.C new file mode 100644 index 000000000..5e9767a00 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/nullptr1.C @@ -0,0 +1,10 @@ +/* Test for overflow in NULL pointer constant. */ +/* { dg-do compile } */ + +#include <limits.h> + +void *p = 0; + +void *q = 0 * (INT_MAX + 1); // { dg-error "invalid conversion" } +// { dg-warning "integer overflow in expression" "" { target *-*-* } 8 } + diff --git a/gcc/testsuite/g++.dg/conversion/nullptr2.C b/gcc/testsuite/g++.dg/conversion/nullptr2.C new file mode 100644 index 000000000..74ceff49d --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/nullptr2.C @@ -0,0 +1,10 @@ +/* Test for enumeration as NULL pointer constant. */ +/* PR c++/14644 */ +/* { dg-do compile } */ + +enum { NULL = 0 }; + +void *p = 0; + +void *q = NULL; // { dg-error "cannot convert" } + diff --git a/gcc/testsuite/g++.dg/conversion/op1.C b/gcc/testsuite/g++.dg/conversion/op1.C new file mode 100644 index 000000000..e0a3e5f46 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/op1.C @@ -0,0 +1,11 @@ +class C +{ + template<typename U> + operator U(); // { dg-message "note" } +}; + +int fn (C c) +{ + return C::operator float(c); // { dg-error "operator float.C" } + // { dg-message "candidate" "candidate note" { target *-*-* } 9 } +} diff --git a/gcc/testsuite/g++.dg/conversion/op2.C b/gcc/testsuite/g++.dg/conversion/op2.C new file mode 100644 index 000000000..b40098810 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/op2.C @@ -0,0 +1,16 @@ +// PR c++/13907 + +struct A { + operator int & (); + operator const int & () const; +}; + + +void f(int &); +void f(const int &); + + +int main() { + const A x = A(); + f(x); +} diff --git a/gcc/testsuite/g++.dg/conversion/op3.C b/gcc/testsuite/g++.dg/conversion/op3.C new file mode 100644 index 000000000..a01cdcf76 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/op3.C @@ -0,0 +1,3 @@ +// PR c++/22256 + +struct node { int* operator int*(); }; // { dg-error "return type specified" } diff --git a/gcc/testsuite/g++.dg/conversion/op4.C b/gcc/testsuite/g++.dg/conversion/op4.C new file mode 100644 index 000000000..5f8214bc0 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/op4.C @@ -0,0 +1,19 @@ +/* PR c++/26698 */ +/* { dg-do compile } */ + +struct X { + int x; + X (int i = 0) : x (i) {} + operator X& (void) const { + return *(new X); + } +}; + +void add_one (X & ref) { /* { dg-error "in passing argument" } */ + ++ ref.x; +} + +void foo() { + X const a (2); + add_one(a); /* { dg-error "invalid initialization of reference of type" } */ +} diff --git a/gcc/testsuite/g++.dg/conversion/op5.C b/gcc/testsuite/g++.dg/conversion/op5.C new file mode 100644 index 000000000..69ef996d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/op5.C @@ -0,0 +1,20 @@ +// Contributed by Dodji Seketeli <dseketel@redhat.com> +// Origin: PR c++/36407 +// { dg-do compile } + +struct A +{ + A (const A&); +}; + +struct B +{ + operator A&(); +}; + +void +foo (const B& b) +{ + const A a = b; // { dg-error "conversion from 'const B' to non-scalar type 'const A' requested" } +} + diff --git a/gcc/testsuite/g++.dg/conversion/op6.C b/gcc/testsuite/g++.dg/conversion/op6.C new file mode 100644 index 000000000..9aec9f0a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/op6.C @@ -0,0 +1,18 @@ +// Origin: PR c++/42766 +// { dg-do compile } + +template<class T> class smart_pointer { +public: + operator T* () const { } + operator bool () const { } + operator bool () { } +}; +class Context { }; +typedef smart_pointer<Context> ContextP; +class SvnClient { + ~SvnClient(); + ContextP svnContext; +}; +SvnClient::~SvnClient() { + delete svnContext; +} diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem1.C b/gcc/testsuite/g++.dg/conversion/ptrmem1.C new file mode 100644 index 000000000..ed00ea3f7 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ptrmem1.C @@ -0,0 +1,13 @@ +struct S {}; + +void f (int S::*const*); + +typedef int I; + +void f (I S::*const*); + +void g() { + int S::*const* p; + + f(p); +} diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem2.C b/gcc/testsuite/g++.dg/conversion/ptrmem2.C new file mode 100644 index 000000000..d46113db6 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ptrmem2.C @@ -0,0 +1,39 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild <aaw@google.com> +// { dg-do compile } + +// Assorted pointer to data member static cast tests. + +struct A { int x; }; +struct B : A { int x; }; +struct P : A { int x; }; +struct V { int x; }; +struct D : B, virtual V, private P { int x; }; + +// Valid static casts. +int B::*p1 = static_cast<int B::*>(&D::x); +int D::*p2 = static_cast<int D::*>(&B::x); + +// Virtual base class. +int V::*p3 = static_cast<int V::*>(&D::x); // { dg-error "" } +int D::*p4 = static_cast<int D::*>(&V::x); // { dg-error "" } + +// Inaccessible base class. +int P::*p5 = static_cast<int P::*>(&D::x); // { dg-error "" } +int D::*p6 = static_cast<int D::*>(&P::x); // { dg-error "" } + +// Ambiguous base class. +int A::*p7 = static_cast<int A::*>(&D::x); // { dg-error "" } +int D::*p8 = static_cast<int D::*>(&A::x); // { dg-error "" } + +// Valid conversions which increase cv-qualification. +const int B::*p9 = static_cast<const int B::*>(&D::x); +const int D::*p10 = static_cast<const int D::*>(&B::x); + +// Invalid conversions which decrease cv-qualification. +int B::*p11 = static_cast<int B::*>(p10); // { dg-error "casts away qualifiers" } +int D::*p12 = static_cast<int D::*>(p9); // { dg-error "casts away qualifiers" } + +// Attempts to change member type. +float B::*p13 = static_cast<float B::*>(&D::x); // { dg-error "" } +float D::*p14 = static_cast<float D::*>(&B::x); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem3.C b/gcc/testsuite/g++.dg/conversion/ptrmem3.C new file mode 100644 index 000000000..13005e429 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ptrmem3.C @@ -0,0 +1,31 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild <aaw@google.com> +// { dg-do compile } + +// Assorted pointer to member function static cast tests. + +struct A { int f (); }; +struct B : A { int f (); }; +struct P : A { int f (); }; +struct V { int f (); }; +struct D : B, virtual V, private P { int f (); }; + +// Valid static casts. +int (B::*p1)() = static_cast<int (B::*)()>(&D::f); +int (D::*p2)() = static_cast<int (D::*)()>(&B::f); + +// Virtual base class. +int (V::*p3)() = static_cast<int (V::*)()>(&D::f); // { dg-error "" } +int (D::*p4)() = static_cast<int (D::*)()>(&V::f); // { dg-error "" } + +// Inaccessible base class. +int (P::*p5)() = static_cast<int (P::*)()>(&D::f); // { dg-error "" } +int (D::*p6)() = static_cast<int (D::*)()>(&P::f); // { dg-error "" } + +// Ambiguous base class. +int (A::*p7)() = static_cast<int (A::*)()>(&D::f); // { dg-error "" } +int (D::*p8)() = static_cast<int (D::*)()>(&A::f); // { dg-error "" } + +// Attempts to change member type. +float (B::*p13)() = static_cast<float (B::*)()>(&D::f); // { dg-error "" } +float (D::*p14)() = static_cast<float (D::*)()>(&B::f); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem4.C b/gcc/testsuite/g++.dg/conversion/ptrmem4.C new file mode 100644 index 000000000..fd260df64 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ptrmem4.C @@ -0,0 +1,43 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild <aaw@google.com> +// { dg-do compile } + +// Assorted pointer to data member c-style cast tests. + +struct X {}; +struct A { int x; }; +struct B : A { int x; }; +struct P : A { int x; }; +struct V { int x; }; +struct D : B, virtual V, private P { int x; }; + +// Accessible, non-virtual, non-ambiguous base clas. +int B::*p1 = (int B::*)&D::x; +int D::*p2 = (int D::*)&B::x; + +// Virtual base class. +int V::*p3 = (int V::*)&D::x; // { dg-error "" } +int D::*p4 = (int D::*)&V::x; // { dg-error "" } + +// Inaccessible base class. +int P::*p5 = (int P::*)&D::x; +int D::*p6 = (int D::*)&P::x; + +// Ambiguous base class. +int A::*p7 = (int A::*)&D::x; // { dg-error "" } +int D::*p8 = (int D::*)&A::x; // { dg-error "" } + +// Valid conversions which increase cv-qualification. +const int B::*p9 = (const int B::*)&D::x; +const int D::*p10 = (const int D::*)&B::x; + +// Valid conversions which decrease cv-qualification. +int B::*p11 = (int B::*)p10; +int D::*p12 = (int D::*)p9; + +// Attempts to change member type allowed via reinterpret_cast. +float B::*p13 = (float B::*)&D::x; +float D::*p14 = (float D::*)&B::x; + +// Conversion via unrelated classes allwed via reinterpret_cast. +int X::*p15 = (int X::*)&D::x; diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem5.C b/gcc/testsuite/g++.dg/conversion/ptrmem5.C new file mode 100644 index 000000000..6f06badd7 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ptrmem5.C @@ -0,0 +1,35 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild <aaw@google.com> +// { dg-do compile } + +// Assorted pointer to member function c-style cast tests. + +struct X {}; +struct A { int f (); }; +struct B : A { int f (); }; +struct P : A { int f (); }; +struct V { int f (); }; +struct D : B, virtual V, private P { int f (); }; + +// Accessible, non-virtual, non-ambiguous base clas. +int (B::*p1)() = (int (B::*)())&D::f; +int (D::*p2)() = (int (D::*)())&B::f; + +// Virtual base class. +int (V::*p3)() = (int (V::*)())&D::f; // { dg-error "" } +int (D::*p4)() = (int (D::*)())&V::f; // { dg-error "" } + +// Inaccessible base class. +int (P::*p5)() = (int (P::*)())&D::f; +int (D::*p6)() = (int (D::*)())&P::f; + +// Ambiguous base class. +int (A::*p7)() = (int (A::*)())&D::f; // { dg-error "" } +int (D::*p8)() = (int (D::*)())&A::f; // { dg-error "" } + +// Attempts to change member type allowed via reinterpret_cast. +float (B::*p13)() = (float (B::*)())&D::f; +float (D::*p14)() = (float (D::*)())&B::f; + +// Conversion via unrelated classes allwed via reinterpret_cast. +int (X::*p15)() = (int (X::*)())&D::f; diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem6.C b/gcc/testsuite/g++.dg/conversion/ptrmem6.C new file mode 100644 index 000000000..a3c0c966c --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ptrmem6.C @@ -0,0 +1,35 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild <aaw@google.com> +// { dg-do compile } + +// Assorted pointer to data member implicit cast tests. + +struct A { int x; }; +struct B : A { int x; }; +struct P : A { int x; }; +struct V { int x; }; +struct D : B, virtual V, private P { int x; }; + +// Valid. +int D::*p1 = &B::x; + +// Derived class. +int B::*p2 = &D::x; // { dg-error "" } + +// Virtual base class. +int D::*p3 = &V::x; // { dg-error "" } + +// Inaccessible base class. +int D::*p4 = &P::x; // { dg-error "" } + +// Ambiguous base class. +int D::*p5 = &A::x; // { dg-error "" } + +// Increases cv-qualification. +const int D::*p6 = &B::x; + +// Decreases cv-qualification. +int D::*p7 = static_cast<const int D::*>(&D::x); // { dg-error "" } + +// Different member type. +float D::*p8 = &B::x; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem7.C b/gcc/testsuite/g++.dg/conversion/ptrmem7.C new file mode 100644 index 000000000..ad75a52bc --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ptrmem7.C @@ -0,0 +1,29 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild <aaw@google.com> +// { dg-do compile } + +// Assorted pointer to member function implicit cast tests. + +struct A { int f (); }; +struct B : A { int f (); }; +struct P : A { int f (); }; +struct V { int f (); }; +struct D : B, virtual V, private P { int f (); }; + +// Valid. +int (D::*p1)() = &B::f; + +// Derived class. +int (B::*p2)() = &D::f; // { dg-error "" } + +// Virtual base class. +int (D::*p3)() = &V::f; // { dg-error "" } + +// Inaccessible base class. +int (D::*p4)() = &P::f; // { dg-error "" } + +// Ambiguous base class. +int (D::*p5)() = &A::f; // { dg-error "" } + +// Different member type. +float (D::*p6)() = &B::f; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem8.C b/gcc/testsuite/g++.dg/conversion/ptrmem8.C new file mode 100644 index 000000000..95d902fa9 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ptrmem8.C @@ -0,0 +1,25 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild <aaw@google.com> +// { dg-do run } + +// Test for proper conversion of null pointers to data members. + +struct B1 { + int x; +}; + +struct B2 { + int x; +}; + +struct D : B1, B2 { + int x; +}; + +int main () +{ + int D::*pd = 0; + int B2::*pb2 = 0; + + return pd != pb2; +} diff --git a/gcc/testsuite/g++.dg/conversion/ptrmem9.C b/gcc/testsuite/g++.dg/conversion/ptrmem9.C new file mode 100644 index 000000000..d4a260f92 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ptrmem9.C @@ -0,0 +1,26 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild <aaw@google.com> +// { dg-do compile } + +// Test implicit conversion of pointers to member functions appearing as +// operands of the equality operators. + +struct B { }; + +struct BV { }; + +struct D : B, virtual BV { }; + +struct C { }; + +void f () +{ + void (D::*pd) () = 0; + void (B::*pb) () = 0; + void (BV::*pbv) () = 0; + void (C::*pc) () = 0; + + pd == pb; + pd == pbv; // { dg-error "" } + pd == pc; // { dg-error "comparison between distinct pointer-to-member types" } +} diff --git a/gcc/testsuite/g++.dg/conversion/reinterpret1.C b/gcc/testsuite/g++.dg/conversion/reinterpret1.C new file mode 100644 index 000000000..d4567822e --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/reinterpret1.C @@ -0,0 +1,6 @@ +// PR c++/15076 + +struct Y { Y(int &); }; + +int v; +Y y1(reinterpret_cast<int>(v)); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/conversion/reinterpret2.C b/gcc/testsuite/g++.dg/conversion/reinterpret2.C new file mode 100644 index 000000000..e9b2328b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/reinterpret2.C @@ -0,0 +1,5 @@ +bool b; + +void f() { + reinterpret_cast<void*>(b); +} diff --git a/gcc/testsuite/g++.dg/conversion/reinterpret3.C b/gcc/testsuite/g++.dg/conversion/reinterpret3.C new file mode 100644 index 000000000..62fb91444 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/reinterpret3.C @@ -0,0 +1,7 @@ +struct S {}; + +S s; + +void f() { + reinterpret_cast<const S>(s); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/conversion/self1.C b/gcc/testsuite/g++.dg/conversion/self1.C new file mode 100644 index 000000000..f36500a9f --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/self1.C @@ -0,0 +1,15 @@ +// PR c++/31419 + +struct B +{ + template<typename T> + operator T const& () const + { + return 42; + } +}; + +B f() +{ + return B(); +} diff --git a/gcc/testsuite/g++.dg/conversion/simd1.C b/gcc/testsuite/g++.dg/conversion/simd1.C new file mode 100644 index 000000000..fa40b0eaa --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/simd1.C @@ -0,0 +1,26 @@ +/* { dg-do compile } */ + +/* Test overload resolution of vector types. + From Janis Johnson and Paolo Bonzini, based on PR/16882 */ + +#define vector __attribute__((vector_size(16))) + +vector signed int vld (int a1, const vector signed int *a2) { return *a2; } /* { dg-message "vld|no known conversion" } */ +vector signed short vld (int a1, const vector signed short *a2) { return *a2; } /* { dg-message "vld|no known conversion" } */ + +extern int i; +extern vector signed short vss; +extern vector signed char *vscp; +extern vector signed short *vssp; +extern const vector signed short *cvssp; + +void foo () +{ + vss = vld(i, vscp); /* { dg-error "no matching function for call" } */ + // { dg-message "candidate" "candidate note" { target *-*-* } 19 } + vss = vld(i, vssp); + vss = vld(i, cvssp); +} + +/* Ignore a warning that is irrelevant to the purpose of this test. */ +/* { dg-prune-output ".*GCC vector returned by reference.*" } */ diff --git a/gcc/testsuite/g++.dg/conversion/simd2.C b/gcc/testsuite/g++.dg/conversion/simd2.C new file mode 100644 index 000000000..873e707e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/simd2.C @@ -0,0 +1,16 @@ +/* { dg-do compile } */ + +/* Test generic operations on vectors. */ + +int __attribute__((vector_size(16))) a, b, c; +int __attribute__((vector_size(8))) d; +void foo() +{ + a = b ^ c; + a = b + c; + a = b - c; + a = b * c; + a = b / c; + a = -b; + a = d + b; /* { dg-error "invalid operands to binary +" } */ +} diff --git a/gcc/testsuite/g++.dg/conversion/simd3.C b/gcc/testsuite/g++.dg/conversion/simd3.C new file mode 100644 index 000000000..8d9626449 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/simd3.C @@ -0,0 +1,15 @@ +/* { dg-do compile } */ + +typedef int myint; + +float __attribute__((vector_size(16))) b; +int __attribute__((vector_size(16))) d; +myint __attribute__((vector_size(16))) d2; +unsigned int __attribute__((vector_size(16))) e; + +void foo() +{ + b + d; /* { dg-error "invalid operands to binary" } */ + d += e; /* { dg-message "use -flax-vector-conversions to permit conversions between vectors with differing element types or numbers of subparts.*cannot convert '__vector.4. unsigned int' to '__vector.4. int' in assignment" } */ + d2 += d; +} diff --git a/gcc/testsuite/g++.dg/conversion/simd4.C b/gcc/testsuite/g++.dg/conversion/simd4.C new file mode 100644 index 000000000..f8f7f2e45 --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/simd4.C @@ -0,0 +1,34 @@ +// PR c++/29734 +// { dg-do compile } +// { dg-options "" } + +int t; +float u; +int __attribute__((vector_size (8))) v; +float __attribute__((vector_size (8))) w; +int b[10]; + +void +foo () +{ + b[t]; + b[u]; // { dg-error "invalid types" } + b[v]; // { dg-error "invalid types" } + b[w]; // { dg-error "invalid types" } + t[b]; + u[b]; // { dg-error "invalid types" } + v[b]; // { dg-error "invalid types" } + w[b]; // { dg-error "invalid types" } + new int[t]; + new int[u]; // { dg-error "new-declarator must have integral" } + new int[v]; // { dg-error "new-declarator must have integral" } + new int[w]; // { dg-error "new-declarator must have integral" } + switch (t) { default: break; } + switch (u) { default: break; } // { dg-error "switch quantity not an integer" } + switch (v) { default: break; } // { dg-error "switch quantity not an integer" } + switch (w) { default: break; } // { dg-error "switch quantity not an integer" } + t = ~t; + u = ~u; // { dg-error "wrong type argument to bit-complement" } + v = ~v; + w = ~w; // { dg-error "wrong type argument to bit-complement" } +} diff --git a/gcc/testsuite/g++.dg/conversion/to-virtual-base-1.C b/gcc/testsuite/g++.dg/conversion/to-virtual-base-1.C new file mode 100644 index 000000000..3fa8e418e --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/to-virtual-base-1.C @@ -0,0 +1,15 @@ +// Copyright (C) 2002 Free Software Foundation +// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net> + +struct A { + virtual void f(const A* a) = 0; +}; + +struct B : virtual A { + virtual void f(const A* a); +}; + +void B::f(const A* a) +{ + static_cast<const B&>(*a); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/conversion/void1.C b/gcc/testsuite/g++.dg/conversion/void1.C new file mode 100644 index 000000000..120fc0e1d --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/void1.C @@ -0,0 +1,5 @@ +// PR c++/27422 +// { dg-do compile } + +void foo(void i); // { dg-error "incomplete type|invalid use" } +void bar() { foo(0); } diff --git a/gcc/testsuite/g++.dg/cpp/_Pragma1.C b/gcc/testsuite/g++.dg/cpp/_Pragma1.C new file mode 100644 index 000000000..2a4086b81 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/_Pragma1.C @@ -0,0 +1,10 @@ +// PR c++/27748 +// This is supposed to succeed only if +// the target doesn't define HANDLE_PRAGMA_PACK_WITH_EXPANSION. +// { dg-do compile { target { ! { *-*-solaris2* } } } } + +#define push bar +#define foo _Pragma ("pack(push)") +foo +int i; +#pragma pack(pop) diff --git a/gcc/testsuite/g++.dg/cpp/c++98-pedantic.C b/gcc/testsuite/g++.dg/cpp/c++98-pedantic.C new file mode 100644 index 000000000..61e13c5d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/c++98-pedantic.C @@ -0,0 +1,10 @@ +/* Copyright (C) 2000 Free Software Foundation, Inc. */ + +/* { dg-do preprocess } */ +/* { dg-options "-std=c++98 -pedantic" } */ + +/* This file is for testing the preprocessor in -std=c++98 -pedantic mode. + Neil Booth, 2 Dec 2000. */ + +#if 1LL /* { dg-warning "long long" } */ +#endif diff --git a/gcc/testsuite/g++.dg/cpp/c++98.C b/gcc/testsuite/g++.dg/cpp/c++98.C new file mode 100644 index 000000000..0ec4f359f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/c++98.C @@ -0,0 +1,10 @@ +/* Copyright (C) 2000 Free Software Foundation, Inc. */ + +/* { dg-do preprocess } */ +/* { dg-options "-std=c++98" } */ + +/* This file is for testing the preprocessor in -std=c++98 mode. + Neil Booth, 2 Dec 2000. */ + +#if 1LL +#endif diff --git a/gcc/testsuite/g++.dg/cpp/c++_cmd_1.C b/gcc/testsuite/g++.dg/cpp/c++_cmd_1.C new file mode 100644 index 000000000..e4e048293 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/c++_cmd_1.C @@ -0,0 +1,12 @@ +/* Copyright (C) 2003 Free Software Foundation, Inc. */ + +/* { dg-do preprocess } */ +/* { dg-options "-c -include ${srcdir}/g++.dg/cpp/c++_cmd_1.h" } */ + +/* Contributed by Devang Patel <dpatel@apple.com> */ + +int main () +{ + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp/c++_cmd_1.h b/gcc/testsuite/g++.dg/cpp/c++_cmd_1.h new file mode 100644 index 000000000..06f4941bc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/c++_cmd_1.h @@ -0,0 +1,6 @@ +/* Copyright (C) 2003 Free Software Foundation, Inc. */ + +/* Contributed by Devang Patel <dpatel@apple.com> */ + +/* Header file for c++_cmd_1.C */ + diff --git a/gcc/testsuite/g++.dg/cpp/pedantic-errors.C b/gcc/testsuite/g++.dg/cpp/pedantic-errors.C new file mode 100644 index 000000000..0c6045af8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/pedantic-errors.C @@ -0,0 +1,5 @@ +/* { dg-do preprocess } */ +/* { dg-options "-std=c++98 -pedantic-errors" } */ + +#if 1 +#endif 1 /* { dg-error "extra tokens at end of #endif directive" } */ diff --git a/gcc/testsuite/g++.dg/cpp/pragma-float-const-decimal64-1.C b/gcc/testsuite/g++.dg/cpp/pragma-float-const-decimal64-1.C new file mode 100644 index 000000000..31e1ad6d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/pragma-float-const-decimal64-1.C @@ -0,0 +1,5 @@ +// { dg-do compile } +// { dg-options "-Wunknown-pragmas" } + +#pragma STDC FLOAT_CONST_DECIMAL64 ON // { dg-warning "not supported for C\\\+\\\+" } +double d = 1.0; diff --git a/gcc/testsuite/g++.dg/cpp/string-1.C b/gcc/testsuite/g++.dg/cpp/string-1.C new file mode 100644 index 000000000..da3133071 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/string-1.C @@ -0,0 +1,9 @@ +// Test location of diagnostics for interpreting strings. Bug 17964. +// Origin: Joseph Myers <joseph@codesourcery.com> +// { dg-do compile } + +const char *s = "\q"; // { dg-error "unknown escape sequence" } + +const char *t = "\ "; // { dg-error "unknown escape sequence" } + +const char *u = ""; diff --git a/gcc/testsuite/g++.dg/cpp/string-2.C b/gcc/testsuite/g++.dg/cpp/string-2.C new file mode 100644 index 000000000..f71486231 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/string-2.C @@ -0,0 +1,6 @@ +// Test diagnostics for interpreting strings: This is a pedwarn. +// Origin: Joseph Myers <joseph@codesourcery.com> +// { dg-do compile } +// { dg-options "" } + +const char *s = "\q"; // { dg-warning "unknown escape sequence" } diff --git a/gcc/testsuite/g++.dg/cpp/stringop-1.C b/gcc/testsuite/g++.dg/cpp/stringop-1.C new file mode 100644 index 000000000..071a1009c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/stringop-1.C @@ -0,0 +1,29 @@ +/* Test for buffer overrun stringizing named operators longer than 4 + characters. */ +/* { dg-do compile } */ + +#define str(x) #x +#define var(v,a,b,c,d) static const char v##a##b##c##d[] = str(xor_eq) +#define var1(v,a,b,c) \ + var(v,a,b,c,0); var(v,a,b,c,1); var(v,a,b,c,2); var(v,a,b,c,3); \ + var(v,a,b,c,4); var(v,a,b,c,5); var(v,a,b,c,6); var(v,a,b,c,7); \ + var(v,a,b,c,8); var(v,a,b,c,9) +#define var2(v,a,b) \ + var1(v,a,b,0); var1(v,a,b,1); var1(v,a,b,2); var1(v,a,b,3); \ + var1(v,a,b,4); var1(v,a,b,5); var1(v,a,b,6); var1(v,a,b,7); \ + var1(v,a,b,8); var1(v,a,b,9) +#define var3(v,a) \ + var2(v,a,0); var2(v,a,1); var2(v,a,2); var2(v,a,3); \ + var2(v,a,4); var2(v,a,5); var2(v,a,6); var2(v,a,7); \ + var2(v,a,8); var2(v,a,9) + +var3(v,0); +var3(v,1); +var3(v,2); +var3(v,3); +var3(v,4); +var3(v,5); +var3(v,6); +var3(v,7); +var3(v,8); +var3(v,9); diff --git a/gcc/testsuite/g++.dg/cpp/truefalse.C b/gcc/testsuite/g++.dg/cpp/truefalse.C new file mode 100644 index 000000000..d852d4e2f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/truefalse.C @@ -0,0 +1,17 @@ +/* Copyright (C) 2003 Free Software Foundation, Inc. */ + +/* Source: Neil Booth, 18 Apr 2003. */ + +/* { dg-do preprocess } */ +/* { dg-options "-ansi -pedantic -Wundef" } */ + +/* Check that for C++ we handle true and false correctly, and do not + treat them as undefined identifiers. */ + +#if true /* { dg-bogus "is not defined" } */ +#error foo /* { dg-error "foo" } */ +#endif + +#if false /* { dg-bogus "is not defined" } */ +#error foo /* { dg-bogus "foo" } */ +#endif diff --git a/gcc/testsuite/g++.dg/cpp/ucn-1.C b/gcc/testsuite/g++.dg/cpp/ucn-1.C new file mode 100644 index 000000000..354e1d976 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/ucn-1.C @@ -0,0 +1,13 @@ +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2170.html +// { dg-options "-std=c++0x -fextended-identifiers" } + +int main() +{ + "\u0041"; // 'A' UCN is OK in string literal + '\u0041'; // also OK in character literal + + int c\u0041c; // { dg-error "not valid in an identifier" } + int c\u0024c; // $ is OK; not part of basic source char set + + U"\uD800"; // { dg-error "not a valid universal character" } +} diff --git a/gcc/testsuite/g++.dg/cpp/ucnid-1.C b/gcc/testsuite/g++.dg/cpp/ucnid-1.C new file mode 100644 index 000000000..7a8f72a5d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/ucnid-1.C @@ -0,0 +1,17 @@ +/* { dg-do preprocess } */ +/* { dg-options "-std=gnu++98 -pedantic -fextended-identifiers" } */ + +\u00AA /* { dg-error "not valid in an identifier" } */ +\u00AB /* { dg-error "not valid in an identifier" } */ +\u00B6 /* { dg-error "not valid in an identifier" } */ +\u00BA /* { dg-error "not valid in an identifier" } */ +\u00C0 +\u00D6 +\u0384 + +\u0669 /* { dg-error "not valid in an identifier" } */ +A\u0669 /* { dg-error "not valid in an identifier" } */ +0\u00BA /* { dg-error "not valid in an identifier" } */ +0\u0669 /* { dg-error "not valid in an identifier" } */ +\u0E59 +A\u0E59 diff --git a/gcc/testsuite/g++.dg/cpp/weak.C b/gcc/testsuite/g++.dg/cpp/weak.C new file mode 100644 index 000000000..6c51e1985 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/weak.C @@ -0,0 +1,5 @@ +// { dg-options "-fno-weak" } + +#if __GXX_WEAK__ +#error "__GXX_WEAK__ defined when -fno-weak in use" +#endif diff --git a/gcc/testsuite/g++.dg/cpp0x/__func__.C b/gcc/testsuite/g++.dg/cpp0x/__func__.C new file mode 100644 index 000000000..1ac906515 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/__func__.C @@ -0,0 +1,6 @@ +// { dg-options "-std=c++0x -pedantic" } + +const char* foo() +{ + return __func__; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/access01.C b/gcc/testsuite/g++.dg/cpp0x/access01.C new file mode 100644 index 000000000..43e5e8637 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/access01.C @@ -0,0 +1,15 @@ +// PR c++/49042 +// { dg-options -std=c++0x } + +template <class T> +class A +{ + T p; +public: + template <class U> auto f() -> decltype(+p) { } +}; + +int main() +{ + A<int>().f<int>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/alignof.C b/gcc/testsuite/g++.dg/cpp0x/alignof.C new file mode 100644 index 000000000..8e8f715cd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alignof.C @@ -0,0 +1,5 @@ +// { dg-options "-std=c++0x" } +int main(void) +{ + static_assert(alignof(int) == __alignof(int), "alignof(int) does not equal __alignof(int)"); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/alignof2.C b/gcc/testsuite/g++.dg/cpp0x/alignof2.C new file mode 100644 index 000000000..7c5aad3de --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/alignof2.C @@ -0,0 +1,7 @@ +// { dg-do compile } +// { dg-options "-std=c++0x -pedantic" } +int main(void) +{ + alignof(int); //ok with a type but not with an expression + alignof(3); // { dg-warning "alignof" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto1.C b/gcc/testsuite/g++.dg/cpp0x/auto1.C new file mode 100644 index 000000000..9e274b622 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto1.C @@ -0,0 +1,8 @@ +// { dg-options "-std=c++98 -Wc++0x-compat" } + +// Test warning for use of auto in C++98 mode with C++0x +// compatibility warnings +void f() +{ + auto int x = 5; // { dg-warning "will change meaning" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto10.C b/gcc/testsuite/g++.dg/cpp0x/auto10.C new file mode 100644 index 000000000..9b89291d6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto10.C @@ -0,0 +1,22 @@ +// Positive test for auto +// { dg-do run } +// { dg-options "-std=c++0x" } + +#include <typeinfo> +extern "C" void abort(); + +int main() +{ + if (auto i = 42L) + { + if (typeid (i) != typeid (long int)) + abort (); + } + + while (auto i = 1) + { + if (typeid (i) != typeid (int)) + abort (); + break; + } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto11.C b/gcc/testsuite/g++.dg/cpp0x/auto11.C new file mode 100644 index 000000000..bd21daef0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto11.C @@ -0,0 +1,12 @@ +// PR c++/38256 +// { dg-options "-std=c++0x" } + +template<int> struct A +{ + template<typename T> operator T(); +}; + +void foo() +{ + A<0>().operator auto(); // { dg-error "auto.*conversion" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto14.C b/gcc/testsuite/g++.dg/cpp0x/auto14.C new file mode 100644 index 000000000..cb2c4e035 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto14.C @@ -0,0 +1,29 @@ +// PR c++/40306, c++/40307 +// { dg-options "-std=c++0x" } +// { dg-do run } + +template< typename T > +struct test { + test run() { + auto tmp = *this; + return tmp; + } + test run_pass() { + test tmp( *this ); + return tmp; + } + + test run_fail() { + auto tmp( *this ); + return tmp; + } +}; + +int main() +{ + test<int> x; + x.run(); + x.run_pass(); + x.run_fail(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto15.C b/gcc/testsuite/g++.dg/cpp0x/auto15.C new file mode 100644 index 000000000..b23e1e2fd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto15.C @@ -0,0 +1,13 @@ +// { dg-options "-std=c++0x" } + +template< typename Fn > struct function; + +template< typename Result, typename ... ArgTypes > +struct function< auto (ArgTypes...)->Result > { +}; + +int main() +{ + function< auto(double)->int > y; + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto16.C b/gcc/testsuite/g++.dg/cpp0x/auto16.C new file mode 100644 index 000000000..1b4ae8f82 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto16.C @@ -0,0 +1,7 @@ +// PR c++/40619 +// { dg-options "-std=c++0x" } + +template<typename U> struct X {}; + +template<typename T> auto f(T t) -> X<decltype(t+1)> {} +template<typename T> auto g(T t) -> X<decltype(t+1)> {} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto17.C b/gcc/testsuite/g++.dg/cpp0x/auto17.C new file mode 100644 index 000000000..03608d33a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto17.C @@ -0,0 +1,10 @@ +// PR c++/42567 +// { dg-options "-std=c++0x" } + +template<typename B> +struct A { + template<typename C> + void fn(C c) { + auto& key = *c; + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/auto18.C b/gcc/testsuite/g++.dg/cpp0x/auto18.C new file mode 100644 index 000000000..17f7f9959 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto18.C @@ -0,0 +1,6 @@ +// { dg-options "-std=c++0x" } + +void f() +{ + auto val = val; // { dg-error "auto. type used in its own initializer" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto19.C b/gcc/testsuite/g++.dg/cpp0x/auto19.C new file mode 100644 index 000000000..f70990287 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto19.C @@ -0,0 +1,8 @@ +// { dg-options -std=c++0x } + +struct Explicit { + Explicit() = default; // Line 2 + explicit Explicit(const Explicit&){} +} ex; + +auto ex2(ex); // Line 6 diff --git a/gcc/testsuite/g++.dg/cpp0x/auto2.C b/gcc/testsuite/g++.dg/cpp0x/auto2.C new file mode 100644 index 000000000..626e9e245 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto2.C @@ -0,0 +1,74 @@ +// Positive test for auto +// { dg-do run } +// { dg-options "-std=c++0x" } + +#include <typeinfo> +extern "C" void abort(); + +int f() {} + +struct A +{ + int i; + int f() {} + A operator+(A a) { return a; } +}; + +template <class T> +void g(T t) +{ + auto x = t+t; + if (typeid(x) != typeid(t+t)) + abort(); + + auto p = new auto(&t); + if (typeid(p) != typeid(T**)) + abort(); +} + +int main() +{ + auto i = 42; + if (typeid (i) != typeid (int)) + abort(); + + auto *p = &i; + if (typeid (p) != typeid (int*)) + abort(); + + auto *p2 = &p; + if (typeid (p2) != typeid (int**)) + abort(); + + auto (*fp)() = f; + if (typeid (fp) != typeid (int (*)())) + abort(); + + auto A::* pm = &A::i; + if (typeid (pm) != typeid (int A::*)) + abort(); + + auto (A::*pmf)() = &A::f; + if (typeid (pmf) != typeid (int (A::*)())) + abort(); + + g(42); + g(10.f); + g(A()); + + auto *p3 = new auto (i); + if (typeid (p3) != typeid (int*)) + abort(); + + for (auto idx = i; idx != 0; idx = 0); + while (auto idx = 0); + if (auto idx = 1); + + switch (auto s = i) + { + case 42: + break; + } + + auto j = 42, k = 24; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto20.C b/gcc/testsuite/g++.dg/cpp0x/auto20.C new file mode 100644 index 000000000..90f875114 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto20.C @@ -0,0 +1,20 @@ +// Test for proper non-deduced context handling of the initializer +// for an auto declaration/new. +// { dg-options -std=c++0x } + +struct with_apply +{ + template <unsigned> + void apply(const double&){} +}; + +auto p = &with_apply::apply<0>; +auto pp = new auto(&with_apply::apply<0>); + +template <class T> +void f() +{ + auto p = &T::template apply<0>; +} + +template void f<with_apply>(); diff --git a/gcc/testsuite/g++.dg/cpp0x/auto21.C b/gcc/testsuite/g++.dg/cpp0x/auto21.C new file mode 100644 index 000000000..1cbcac58d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto21.C @@ -0,0 +1,5 @@ +// Origin PR c++/47208 +// { dg-options "-std=c++0x" } + +constexpr auto list = { }; // { dg-error "deducing from brace-enclosed initializer list requires #include <initializer_list>" } +static const int l = list.size(); diff --git a/gcc/testsuite/g++.dg/cpp0x/auto22.C b/gcc/testsuite/g++.dg/cpp0x/auto22.C new file mode 100644 index 000000000..66630e536 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto22.C @@ -0,0 +1,21 @@ +// PR c++/47999 +// { dg-options -std=c++0x } + +int& identity(int& i) +{ + return i; +} + +// In a function template, auto type deduction works incorrectly. +template <typename = void> +void f() +{ + int i = 0; + auto&& x = identity(i); // Type of x should be `int&`, but it is `int&&`. +} + +int main (int argc, char* argv[]) +{ + f(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto23.C b/gcc/testsuite/g++.dg/cpp0x/auto23.C new file mode 100644 index 000000000..49b5a0eb9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto23.C @@ -0,0 +1,4 @@ +// PR c++/46245 +// { dg-options -std=c++0x } + +template<auto f()->int> struct A { }; diff --git a/gcc/testsuite/g++.dg/cpp0x/auto3.C b/gcc/testsuite/g++.dg/cpp0x/auto3.C new file mode 100644 index 000000000..860790d7d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto3.C @@ -0,0 +1,27 @@ +// Negative test for auto +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +auto x; // { dg-error "auto" } + +// If the type deduced for the template parameter U is not the same in each +// deduction, the program is ill-formed. +auto i = 42, j = 42.0; // { dg-error "auto" } + +// New CWG issue +auto a[2] = { 1, 2 }; // { dg-error "initializer_list" } + +template<class T> +struct A { }; + +A<int> A1; +// CWG issue 625 +A<auto> A2 = A1; // { dg-error "" } + +auto foo() { } // { dg-error "auto" } + +void bar(auto i) // { dg-error "incomplete|auto" } +{ + (void)i; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto31.C b/gcc/testsuite/g++.dg/cpp0x/auto31.C new file mode 100644 index 000000000..2c74b72df --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto31.C @@ -0,0 +1,12 @@ +// PR c++/51416 +// { dg-options "-std=c++0x" } + +template<typename T, typename... U> void foo(T, U... u) +{ + auto foo(u...); // { dg-error "auto" } +} + +void bar() +{ + foo(0); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto4.C b/gcc/testsuite/g++.dg/cpp0x/auto4.C new file mode 100644 index 000000000..d47bca436 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto4.C @@ -0,0 +1,28 @@ +// Testcase for deduction of std::initializer_list for auto. +// { dg-do run } +// { dg-options "-std=c++0x" } + +#include <typeinfo> +#include <initializer_list> +extern "C" void abort(); + +template <class T> +void f (T t) +{ + auto ilt = { &t, &t }; + if (typeid(ilt) != typeid(std::initializer_list<T*>)) + abort(); + + auto il = { 1, 2, 3 }; + if (typeid(il) != typeid(std::initializer_list<int>)) + abort(); +} + +int main() +{ + auto il = { 1, 2, 3 }; + if (typeid(il) != typeid(std::initializer_list<int>)) + abort(); + + f('c'); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto5.C b/gcc/testsuite/g++.dg/cpp0x/auto5.C new file mode 100644 index 000000000..ebe2df22e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto5.C @@ -0,0 +1,22 @@ +// Testcase for non-dependent auto in templates +// { dg-options "-std=c++0x" } + +struct A +{ + template<class> void f(); +} a; + +template <class T> +void g() +{ + auto aa = a; + aa.f<int>(); + + auto p = new auto (a); + p->f<int>(); +} + +int main() +{ + g<double>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto7.C b/gcc/testsuite/g++.dg/cpp0x/auto7.C new file mode 100644 index 000000000..9ef5a80eb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto7.C @@ -0,0 +1,13 @@ +// PR c++/37965 +// Negative test for auto +// { dg-options "-std=c++0x" } + +auto i = 6; +auto j; // { dg-error "has no initializer" } + +template<int> struct A +{ + static auto k = 7; + static auto l; // { dg-error "has no initializer" } + auto m; // { dg-error "has no initializer" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/auto9.C b/gcc/testsuite/g++.dg/cpp0x/auto9.C new file mode 100644 index 000000000..190bfa6e8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto9.C @@ -0,0 +1,124 @@ +// PR c++/37962 +// Negative test for auto +// { dg-do compile } +// { dg-options "-std=c++0x" } + +#include <typeinfo> +#include <stdarg.h> +#include <stddef.h> + +int i = *(auto *) 0; // { dg-error "auto" } +struct A *p = (auto *) 0; // { dg-error "auto" } +int *q = static_cast <auto *>(0); // { dg-error "auto" } +const int *r = const_cast <auto *>(q); // { dg-error "auto" } +const std::type_info &t1 = typeid (auto); // { dg-error "auto" } +const std::type_info &t2 = typeid (auto *); // { dg-error "auto" } + +struct A +{ + operator auto (); // { dg-error "auto" } + operator auto *(); // { dg-error "auto" } +}; + +struct A2 +{ + operator auto () -> int; // { dg-error "invalid use of" } + operator auto *() -> int; // { dg-error "auto" } +}; + +template <typename> struct B +{ + enum { e }; +}; + +template <typename T> struct C +{ + C () : i () {} + int i; +}; + +bool d = (auto (A::*)()) 0; // { dg-error "auto" } + +void +foo () +{ + (auto) { 0 }; // { dg-error "auto" } + C<int> c; + dynamic_cast<auto> (c); // { dg-error "auto" } + reinterpret_cast<auto> (c); // { dg-error "auto" } + int i = auto (0); // { dg-error "auto" } + auto p1 = new (auto); // { dg-error "auto" } + auto p2 = new (auto) (42); // { dg-error "invalid use of|deduce" } + offsetof (auto, fld); // { dg-error "auto" } + offsetof (auto *, fld); // { dg-error "auto" } + sizeof (auto); // { dg-error "auto" } + sizeof (auto *); // { dg-error "auto" } +} + +void +foo2 (void) +{ + __alignof__ (auto); // { dg-error "auto" } + __alignof__ (auto *); // { dg-error "auto" } + __typeof__ (auto) v1; // { dg-error "auto" } + __typeof__ (auto *) v2; // { dg-error "auto" } + __is_class (auto); // { dg-error "auto|expected" } + __is_pod (auto *); // { dg-error "auto|expected" } + __is_base_of (int, auto); // { dg-error "auto|expected" } + __is_base_of (auto, int); // { dg-error "auto|expected" } + __is_base_of (auto, auto *); // { dg-error "auto|expected" } +} + +B<auto> b; // { dg-error "auto|invalid" } +C<auto> c; // { dg-error "auto|invalid" } +C<auto *> c2; // { dg-error "auto|invalid" } + +enum : auto { EE = 0 }; // { dg-error "must be an integral type" } +enum struct D : auto * { FF = 0 }; // { dg-error "must be an integral type|declar|expected" } + +void +bar () +{ + try { } catch (auto i) { } // { dg-error "parameter declared" } + try { } catch (auto) { } // { dg-error "parameter declared" } + try { } catch (auto *i) { } // { dg-error "parameter declared" } + try { } catch (auto *) { } // { dg-error "parameter declared" } +} + +void +baz (int i, ...) +{ + va_list ap; + va_start (ap, i); + va_arg (ap, auto); // { dg-error "invalid use of" } + va_arg (ap, auto *); // { dg-error "invalid use of|expected" } + va_arg (ap, auto &); // { dg-error "invalid use of|expected" } + va_end (ap); +} + +template <typename T = auto> struct E {}; // { dg-error "invalid use of" } +template <class T = auto *> struct F {}; // { dg-error "invalid use of|expected" } + +auto fnlate () -> auto; // { dg-error "invalid use of" } +auto fnlate2 () -> auto *; // { dg-error "invalid use of|expected" } + +void +badthrow () throw (auto) // { dg-error "invalid use of" } +{ +} + +void +badthrow2 () throw (auto &) // { dg-error "invalid use of|expected" } +{ +} + +template <auto V = 4> struct G {}; // { dg-error "auto" } + +template <typename T> struct H { H (); ~H (); }; +H<auto> h; // { dg-error "invalid" } + +void qq (auto); // { dg-error "auto" } +void qr (auto*); // { dg-error "auto" } + +// PR c++/46145 +typedef auto autot; // { dg-error "auto" } diff --git a/gcc/testsuite/g++.dg/cpp0x/bind.C b/gcc/testsuite/g++.dg/cpp0x/bind.C new file mode 100644 index 000000000..42a2ac203 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/bind.C @@ -0,0 +1,8 @@ +// { dg-options "--std=c++0x" } +struct S{}; +void f(S&&); + +int main() +{ + f(S()); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/bracket1.C b/gcc/testsuite/g++.dg/cpp0x/bracket1.C new file mode 100644 index 000000000..dfb5bf4ea --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/bracket1.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template<typename T> +struct list {}; + +template<typename T> +struct vector { + operator T() const; +}; + +void f() +{ + vector<vector<int>> v; + const vector<int> vi = static_cast<vector<int>>(v); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/bracket2.C b/gcc/testsuite/g++.dg/cpp0x/bracket2.C new file mode 100644 index 000000000..300015d01 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/bracket2.C @@ -0,0 +1,11 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template<int i> class X { /* ... */ }; +X< 1>2 > x1; // // { dg-error "numeric constant" } +X<(1>2)> x2; // Okay. + +template<class T> class Y { /* ... */ }; +Y<X<1>> x3; // Okay, same as "Y<X<1> > x3;". +Y<X<6>>1>> x4; // { dg-error "numeric constant" } +Y<X<(6>>1)>> x5; // Okay diff --git a/gcc/testsuite/g++.dg/cpp0x/bracket3.C b/gcc/testsuite/g++.dg/cpp0x/bracket3.C new file mode 100644 index 000000000..4ef7a0e9d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/bracket3.C @@ -0,0 +1,10 @@ +// { dg-options "-std=c++98 -Wc++0x-compat" } + +template<int N> struct X {}; + +X<1 >> 2> x; // { dg-warning "will be treated as|suggest parentheses" } + +// From cp/parser.c +typedef int Y; +template <int V> struct Foo {}; +Foo<Y () >> 5> r; // { dg-warning "will be treated as|suggest parentheses" } diff --git a/gcc/testsuite/g++.dg/cpp0x/bracket4.C b/gcc/testsuite/g++.dg/cpp0x/bracket4.C new file mode 100644 index 000000000..0e1985cef --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/bracket4.C @@ -0,0 +1,35 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } +template<typename T> +struct vector { +}; + +struct X { + template<typename T> + struct tmpl { + operator T() const; + }; +}; + +template<typename T> +void g() +{ + T::template tmpl<vector<int>>() + 2; +} + +template<typename T> +void operator+(vector<T>, int); + +void f() +{ + vector<vector<int>>() + 2; +} + +// PR c++/36460 +template <class a> +class A {}; +template <class b> +class B {}; + +A<B<void()>> x; + diff --git a/gcc/testsuite/g++.dg/cpp0x/cast-bug.C b/gcc/testsuite/g++.dg/cpp0x/cast-bug.C new file mode 100644 index 000000000..211f88b2b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/cast-bug.C @@ -0,0 +1,14 @@ +// { dg-options "--std=c++0x" } +struct S +{ + S(); + S(S &&); +private: + S(S &); +}; + +S f() +{ + S s; + return static_cast<S&&>(s); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/cast.C b/gcc/testsuite/g++.dg/cpp0x/cast.C new file mode 100644 index 000000000..9162d09f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/cast.C @@ -0,0 +1,30 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test cast from lvalue to rvalue + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; + +struct A {}; + +one foo(const A&) {return one();} +two foo(A&&) {return two();} + +int test1() +{ + A a; + sa<sizeof(foo(a)) == 1 * sizeof(long)> t1; + sa<sizeof(foo(static_cast<A&&>(a))) == 2 * sizeof(long)> t2; + return 0; +} + +int main() +{ + return test1(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/collapse-bug.C b/gcc/testsuite/g++.dg/cpp0x/collapse-bug.C new file mode 100644 index 000000000..02a59cd1d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/collapse-bug.C @@ -0,0 +1,16 @@ +// { dg-options "--std=c++0x" } +template<typename T, typename U> struct same_type; +template<typename T> struct same_type<T, T> {}; + +template <typename T> +struct S +{ + typedef T const (&type)(); +}; + +void f() +{ + // initial implementation didn't ignore const qualifier on + // reference, resulting in a typedef of 'const int& (&)()' + same_type<S<int &>::type, int&(&)()>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/collapse.C b/gcc/testsuite/g++.dg/cpp0x/collapse.C new file mode 100644 index 000000000..96c327324 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/collapse.C @@ -0,0 +1,38 @@ +// { dg-options "--std=c++0x" } +template<typename T, typename U> struct same_type; +template<typename T> struct same_type<T, T> {}; + +typedef int & lref; +typedef int const & clref; +typedef int && rref; +typedef int const && crref; + +template<typename T> +struct S +{ + typedef T & lref; + typedef T const & clref; + typedef T && rref; + typedef T const && crref; +}; + +void f() +{ + same_type<lref &, int &>(); + same_type<lref &&, int &>(); + same_type<rref &, int &>(); + same_type<rref &&, int &&>(); + + same_type<rref const &, int &>(); + same_type<crref volatile &&, int const &&>(); + same_type<clref const &&, int const &>(); + + same_type<S<int &>::lref &, int &>(); + same_type<S<int &&>::lref &&, int &>(); + same_type<S<int &>::rref &, int &>(); + same_type<S<int &&>::rref &&, int &&>(); + + same_type<S<int const &>::rref, int const &>(); + same_type<S<int volatile &&>::crref, int volatile &&>(); + same_type<S<int const &&>::clref, int const &>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-46420.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-46420.C new file mode 100644 index 000000000..757a6e315 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-46420.C @@ -0,0 +1,13 @@ +// PR c++/46420 +// { dg-options -std=c++0x } + +template<typename> class vector { }; +struct A{}; +template <class T1> +void complete_test(vector<T1> data1){ + A drop=A(); +} +int main(){ + vector<double> vect1; + complete_test(vect1); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-47570.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-47570.C new file mode 100644 index 000000000..c60ba8658 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-47570.C @@ -0,0 +1,25 @@ +// PR c++/47570 +// { dg-options -std=c++0x } + +unsigned int constexpr one() +{ return 1; } + +int constexpr one_B() +{ return 1; } + +int main() +{ + // FAIL TO COMPILE: + static bool constexpr SC_huh1 = ((unsigned int)one()) >= ((unsigned int)0); + static bool constexpr SC_huh2 = one() >= ((unsigned int)0); + static bool constexpr SC_huh3 = one() >= 0; + + // COMPILE OK: + static bool constexpr SC_huh4 = ((one() == 0) || (one() > 0)); + static bool constexpr SC_huh5 = one() == 0; + static bool constexpr SC_huh6 = one() > 0; + static bool constexpr SC_huh7 = one_B() >= 0; + static bool constexpr SC_huh8 = one() >= 1; + + return SC_huh3; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C new file mode 100644 index 000000000..5124f7c7f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-48089.C @@ -0,0 +1,50 @@ +// PR c++/48089 +// { dg-options -std=c++0x } + +// bang is ill-formed (diagnostic required) because its initializer is +// non-constant, because it uses the value of an uninitialized object. + +// s() is ill-formed (no diagnostic required) because there is no set of +// arguments that would produce a constant expression. + +// R() is well-formed because i is initialized before j. + +struct s { + constexpr s() : v(v) { } // { dg-message "" } + int v; +}; + +constexpr s bang; // { dg-error "" } + +struct R { + int i,j; + constexpr R() : i(42),j(i) { } // { dg-bogus "" "" { xfail *-*-* } } +}; + +constexpr R r; // { dg-bogus "" "" { xfail *-*-* } } + +// Ill-formed (no diagnostic required) +struct T { + int i; + constexpr int f() { return i; } + constexpr T(): i(0) { } + constexpr T(const T& t) : i(f()) { } // { dg-message "" } +}; + +constexpr T t1; +// Ill-formed (diagnostic required) +constexpr T t2(t1); // { dg-error "" } + +// Well-formed +struct U { + int i, j; + constexpr int f(int _i) { return _i; } + constexpr int g() { return i; } + constexpr U(): i(0), j(0) { } + constexpr U(const U& t) : i(f(t.i)),j(0) { } // { dg-bogus "" "" { xfail *-*-* } } + constexpr U(int _i) : i(_i),j(g()) { } // { dg-bogus "" "" { xfail *-*-* } } +}; + +constexpr U u1; +constexpr U u2(u1); // { dg-bogus "" "" { xfail *-*-* } } +constexpr U u3(1); // { dg-bogus "" "" { xfail *-*-* } } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-98.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-98.C new file mode 100644 index 000000000..4ae3944c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-98.C @@ -0,0 +1,4 @@ +// { dg-options "-std=c++98" } + +constexpr int i = 42; // { dg-message "std=c\\+\\+0x" } +// { dg-error "constexpr" "" { target *-*-* } 3 } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-access.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-access.C new file mode 100644 index 000000000..ee5fc9854 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-access.C @@ -0,0 +1,14 @@ +// { dg-options -std=c++0x } + +class base +{ +protected: + constexpr base() { } +}; + +struct A : base { }; + +int main() +{ + A a; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr.C new file mode 100644 index 000000000..36939e1af --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr.C @@ -0,0 +1,15 @@ +// { dg-options -std=c++0x } + +template<class T> +constexpr T do_get(T* x, int n) { + return x[n - 1]; +} + +template<class T, int N> +constexpr T get(T (&x)[N]) { + return do_get(x, N); +} + +constexpr int arr_i[] = {1}; +constexpr auto var = get(arr_i); // #2 +static_assert(var == arr_i[0], "Error"); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr2.C new file mode 100644 index 000000000..7cf733445 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr2.C @@ -0,0 +1,21 @@ +// { dg-options -std=c++0x } + +template<class T> +struct IsNegative { + int dummy; // Workaround for empty class problem + constexpr IsNegative() : dummy(0) {} + constexpr bool operator()(const T& x) { + return x < T(0); + } +}; + +template<class T, int N, class Pred> +constexpr bool has_neg(T (&x)[N], Pred p) { + return p(x[0]) || p(x[1]); +} + +constexpr int a[] = {1, -2}; + +constexpr auto answer = has_neg(a, IsNegative<int>{}); // #1 + +static_assert(answer, "Error"); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr3.C new file mode 100644 index 000000000..f84cb5257 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr3.C @@ -0,0 +1,19 @@ +// { dg-options -std=c++0x } + +constexpr bool is_negative(int x) { + return x < 0; +}; + +constexpr bool do_has_neg(const int* x, bool(*p)(int)) { + return p(x[0]) || p(x[1]); // Line 6 +} + +constexpr bool has_neg(const int (&x)[2], bool(*p)(int)) { + return do_has_neg(x, p); // Line 10 +} + +constexpr int a[] = {1, -2}; + +constexpr auto answer = has_neg(a, is_negative); // Line 15 + +static_assert(answer, "Error"); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr4.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr4.C new file mode 100644 index 000000000..697d2d9f7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr4.C @@ -0,0 +1,23 @@ +// { dg-options -std=c++0x } + +constexpr const int do_last(const int* x, int n) { + return x[n - 1]; +} + +struct IsNegative { + constexpr bool operator()(const int& x) { + return x < 0; + } +}; + +template<int N, class Pred> +constexpr bool has_neg(const int (&x)[N], Pred p) { + return p(do_last(x, N)); // Line 13 +} + +constexpr int a[] = {1, -2}; + +constexpr auto answer = has_neg(a, IsNegative{}); // Line 18 + +static_assert(answer, "Error"); + diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr5.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr5.C new file mode 100644 index 000000000..d58f254f6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr5.C @@ -0,0 +1,32 @@ +// { dg-options -std=c++0x } + +template<class T> +constexpr T do_last(T* x, int n) { + return x[n - 1]; // +} + +template<class T, int N> +constexpr T last(T (&x)[N]) { + return do_last(x, N); +} + +constexpr bool is_negative(int x) { return x < 0; } + +template<class T> +struct IsNegative { + constexpr bool operator()(const T& x) { + return x < T(0); + } +}; + +template<class T, int N, class Pred> +constexpr bool has_neg(T (&x)[N], Pred p) { + return p(last(x)); // Line 22 +} + +constexpr int a[] = {1, -2}; + +constexpr auto answer1 = has_neg(a, IsNegative<int>{}); // Line 27 +constexpr auto answer2 = has_neg(a, is_negative); + +static_assert(answer2 == answer1, "Error"); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr6.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr6.C new file mode 100644 index 000000000..17dd6e50b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-ptr6.C @@ -0,0 +1,18 @@ +// { dg-options "-std=c++0x" } + +typedef decltype(sizeof(char)) size_type; + +template<class T, size_type N> +constexpr size_type size(T (&)[N]) { return N; } + +double array_double[] = { 1.0, 2.0, 3.0 }; + +constexpr auto sz_d = size(array_double); + +static_assert(sz_d == 3, "Array size failure"); + +void f(bool (¶m)[2]) { + static_assert(size(param) == 2, "Array size failure"); // Line 13 + short data[] = {-1, 2, -45, 6, 88, 99, -345}; + static_assert(size(data) == 7, "Array size failure"); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array-tparm.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-tparm.C new file mode 100644 index 000000000..c17090cc3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array-tparm.C @@ -0,0 +1,5 @@ +// { dg-options -std=c++0x } + +template <const int I[2]> struct A { int ir[I[0]]; }; +extern constexpr int ar[2] = { 1, 2 }; +A<ar> a; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array.C new file mode 100644 index 000000000..e37400a8b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array.C @@ -0,0 +1,15 @@ +// { dg-options -std=c++0x } +// { dg-final { scan-assembler-not "static_initialization" } } + +struct A +{ + int i; + constexpr A(): i(0) { } +}; + +struct B +{ + A a[4]; +}; + +extern const B b{}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array2.C new file mode 100644 index 000000000..9577f75d9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array2.C @@ -0,0 +1,19 @@ +// PR c++/46348 +// { dg-options -std=c++0x } + +template<__SIZE_TYPE__ _Nw> + struct _Base + { + typedef unsigned long _WordT; + + _WordT _M_w[_Nw]; + + constexpr + _Base() + : _M_w() { } + }; + +int main() +{ + _Base<256> bs; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array3.C new file mode 100644 index 000000000..145a4307e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array3.C @@ -0,0 +1,14 @@ +// PR c++/48132 +// { dg-options -std=c++0x } + +struct C +{ + constexpr C (int x) : c (x) {} + int c; +}; + +void +foo () +{ + C a[] = { C (0) }; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array4.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array4.C new file mode 100644 index 000000000..9aeb75d6b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array4.C @@ -0,0 +1,14 @@ +// PR c++/49924 +// { dg-options -std=c++0x } + +struct A { constexpr A() { } }; + +struct B { + A array[1]; //non-static member array of a literal type w constexpr ctor + constexpr B() : array{} { } // here is the problem +}; + +int main() +{ + constexpr B b{}; // won't compile +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute.C new file mode 100644 index 000000000..ac85c076d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-attribute.C @@ -0,0 +1,63 @@ +// { dg-options -std=c++0x } + +//A few constexpr's +constexpr int foo() { return __alignof__(int); } + +template<typename T> +constexpr int fooT() { return __alignof__(T); } + +template<int N> +constexpr int fooN() { return N; } + +//Now the attributes + +//with normal variables, +int a __attribute__((aligned(foo()))); +int b __attribute__((aligned(fooT<int>()))); +int c __attribute__((aligned(fooN<__alignof__(int)>()))); + +//with variables inside a template, +template <typename T> +void fun() +{ + T a __attribute__((aligned(foo()))); + T b __attribute__((aligned(fooT<T>()))); + T c __attribute__((aligned(fooN<__alignof__(T)>()))); + T d __attribute__((aligned(fooT<int>()))); + T e __attribute__((aligned(fooN<__alignof__(int)>()))); +} + +//instantiate it, +void bar() +{ + fun<int>(); +} + +//with classes +struct __attribute__((aligned(foo()))) S0 +{ + char dummy; +}; +S0 s0; + +struct __attribute__((aligned(fooT<int>()))) S1 +{ + char dummy; +}; +S1 s1; + +//and class templates +template <typename T> +struct __attribute__((aligned(foo()))) S2 +{ + char dummy; +}; + +S2<int> s2; + +template <typename T> +struct __attribute__((aligned(fooT<T>()))) S3 +{ + char dummy; +}; +S3<int> s3; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-auto.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-auto.C new file mode 100644 index 000000000..ddf0da0b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-auto.C @@ -0,0 +1,2 @@ +// { dg-options -std=c++0x } +constexpr auto value = 0; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-base.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-base.C new file mode 100644 index 000000000..774df318a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-base.C @@ -0,0 +1,17 @@ +// Test base/member class and static_assert with constexpr +// { dg-options -std=c++0x } + +struct A { + int i; + constexpr A(int _i): i(_i) { } +}; +struct B: A { + A a; + int j; + constexpr B(int _ib, int _ia, int _j): A(_ib), a(_ia), j(_j) { } +}; + +constexpr B b (12, 24, 36); + +#define SA(X) static_assert (X, #X) +SA(b.i==12 && b.a.i==24 && b.j==36); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-base2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-base2.C new file mode 100644 index 000000000..3ea75432a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-base2.C @@ -0,0 +1,19 @@ +// PR c++/46293 +// { dg-options -std=c++0x } + +struct A +{ +}; + +struct C +{ + int i; + constexpr C(int i): i(i) {} +}; + +struct B: A, C +{ + constexpr B(): A(), C(42) { } +}; + +constexpr B b{}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-base3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-base3.C new file mode 100644 index 000000000..cffe9ea24 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-base3.C @@ -0,0 +1,27 @@ +// PR c++/46526 +// { dg-do run } +// { dg-options "-std=c++0x" } + +struct Base +{ + virtual int getid () = 0; +}; + +struct A : public Base +{ + virtual int getid () { return 1; } +}; + +struct B : public Base +{ + virtual int getid () { throw "here"; } +}; + +int +main () +{ + A a; + B b; + Base& ar = a; + ar.getid (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-base4.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-base4.C new file mode 100644 index 000000000..ce23cb9dd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-base4.C @@ -0,0 +1,28 @@ +// PR c++/46626 +// { dg-do run } +// { dg-options "-std=c++0x" } + +struct A +{ + virtual void f () = 0; + virtual ~A () { } +}; + +struct B : A +{ + virtual void f () { } +}; + +static void +foo (A *a) +{ + a->f (); +} + +int +main () +{ + B b; + foo (&b); + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield.C new file mode 100644 index 000000000..7eba49833 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield.C @@ -0,0 +1,10 @@ +// PR c++/46369 +// { dg-options -std=c++0x } + +struct A +{ + unsigned i : 1; +}; + +constexpr A f() { return { 1 }; } +constexpr bool b = (f().i == 1); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield2.C new file mode 100644 index 000000000..531bf31fc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield2.C @@ -0,0 +1,19 @@ +// PR c++/49136 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +struct day +{ + unsigned d : 5; + unsigned n : 3; + constexpr explicit day (int dd) : d(dd), n(7) {} +}; + +struct date { + int d; + constexpr date (day dd) : d(dd.n != 7 ? 7 : dd.d) {} +}; + +constexpr day d(0); +constexpr date dt(d); +static_assert (dt.d == 0, "Error"); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield3.C new file mode 100644 index 000000000..b0ecbfb9a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-bitfield3.C @@ -0,0 +1,33 @@ +// PR c++/49136 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +struct S +{ + unsigned : 1; unsigned s : 27; unsigned : 4; + constexpr S (unsigned int x) : s(x) {} +}; + +template <typename S> +struct T +{ + unsigned int t; + constexpr T (S s) : t(s.s != 7 ? 0 : s.s) {} + constexpr T (S s, S s2) : t(s.s != s2.s ? 0 : s.s) {} +}; + +constexpr S s (7), s2 (7); +constexpr T<S> t (s), t2 (s, s2); +static_assert (t.t == 7, "Error"); +static_assert (t2.t == 7, "Error"); + +struct U +{ + int a : 1; int s : 1; + constexpr U (int x, int y) : a (x), s (y) {} +}; + +constexpr U u (0, -1), u2 (-1, -1); +constexpr T<U> t3 (u), t4 (u, u2); +static_assert (t3.t == 0, "Error"); +static_assert (t4.t == -1, "Error"); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-cleanup.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-cleanup.C new file mode 100644 index 000000000..de17f3ddb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-cleanup.C @@ -0,0 +1,9 @@ +// { dg-options -std=c++0x } + +struct A +{ + int i; + ~A(); +}; + +constexpr int i = A().i; // { dg-error "non-literal" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-complex.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-complex.C new file mode 100644 index 000000000..fbaae5dcd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-complex.C @@ -0,0 +1,17 @@ +// Make sure C99 complex works with constexpr +// { dg-options -std=c++0x } + +struct complex +{ + typedef float value_type; + typedef __complex__ float _ComplexT; + + constexpr complex(_ComplexT __z) : _M_value(__z) { } + + constexpr complex(float __r = 0.0f, float __i = 0.0f) + : _M_value(__r + __i * 1.0fi) { } + +private: + _ComplexT _M_value; +}; +constexpr complex c1; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-condition.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-condition.C new file mode 100644 index 000000000..e2328fcc5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-condition.C @@ -0,0 +1,9 @@ +// { dg-options -std=c++0x } +// Core DR 948 + +constexpr int something() { return 3; } + +int main() { + if (constexpr long v = something()) {} + if (static long v = something()) { } // { dg-error "decl-specifier invalid" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-condition2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-condition2.C new file mode 100644 index 000000000..243409669 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-condition2.C @@ -0,0 +1,18 @@ +// PR c++/48909 +// { dg-options -std=c++0x } + +#define SA(X) static_assert((X),#X) + +constexpr int const * is_sorted_until(int const * first, int const * last) +{ + return first == last || first + 1 == last ? last + : (*(first + 1) < *first) != false ? first + 1 + : is_sorted_until(first + 1, last); +} + +int main() +{ + static constexpr int array[2] = {0, 1}; + constexpr int const * last = is_sorted_until(array, array + 2); + SA(last==array+2); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor.C new file mode 100644 index 000000000..91c489db2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor.C @@ -0,0 +1,7 @@ +// { dg-options -std=c++0x } + +struct A +{ + int i; + constexpr A() { } // { dg-error "uninitialized member .A::i" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor2.C new file mode 100644 index 000000000..5280b131b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor2.C @@ -0,0 +1,11 @@ +// { dg-options -std=c++0x } + +struct A +{ + A(); +}; + +struct B : A +{ + constexpr B(): A() { } // { dg-error "A::A" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor3.C new file mode 100644 index 000000000..d5bfbad3d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor3.C @@ -0,0 +1,10 @@ +// PR c++/46348 +// { dg-options -std=c++0x } + +struct A +{ + int arr[1]; + + constexpr A() + : arr() { } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor4.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor4.C new file mode 100644 index 000000000..397b4b054 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor4.C @@ -0,0 +1,15 @@ +// PR c++/46873 +// { dg-options -std=c++0x } + +struct S +{ + int i:1; +}; + +struct T +{ + const S s; + constexpr T (S a = S ()) : s (a) { } +}; + +T t; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor5.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor5.C new file mode 100644 index 000000000..36b01785f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor5.C @@ -0,0 +1,30 @@ +// PR c++/46877 +// { dg-options -std=c++0x } + +struct new_allocator +{ + constexpr new_allocator (); +}; + +struct string +{ + constexpr string () + { + } + new_allocator a; +}; + +struct pair +{ + const string first; + constexpr pair () + { + } +}; + +constexpr +new_allocator::new_allocator () +{ +} + +pair p; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor6.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor6.C new file mode 100644 index 000000000..4f86f73a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor6.C @@ -0,0 +1,9 @@ +// PR c++/47041 +// { dg-options "-std=c++0x -fno-elide-constructors" } + +struct S +{ + int i; +}; + +S s = S (); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor7.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor7.C new file mode 100644 index 000000000..8338bf1f7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor7.C @@ -0,0 +1,17 @@ +// PR c++/47199 +// { dg-options "-std=c++0x -fno-elide-constructors" } + +template < int > struct S +{ + constexpr S (int r):rr (r) + { + } + S (const S &) = default; + static constexpr S s () + { + return -1; + } + int rr; +}; + +static const int d = S < 0 >::s ().rr; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor8.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor8.C new file mode 100644 index 000000000..81fc83737 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor8.C @@ -0,0 +1,6 @@ +// PR c++/46466 +// { dg-options "-std=c++0x -fno-elide-constructors" } + +struct S { bool b; }; +constexpr S f() { return S{true}; } +static_assert(f().b, ""); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor9.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor9.C new file mode 100644 index 000000000..b7693f1e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor9.C @@ -0,0 +1,19 @@ +// PR c++/47774 +// { dg-options -std=c++0x } + +struct A +{ + A() {} +}; + +template <typename T> +struct array +{ + constexpr array() : mem() {} + T mem[7]; +}; + +int main() +{ + array<A> ar; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-data1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-data1.C new file mode 100644 index 000000000..0943fa422 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-data1.C @@ -0,0 +1,43 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +// From N2235 + +// 1 +struct A2 +{ + static const int eights = 888; + static constexpr int nines = 999; +}; + +A2 a; + +// 2 +struct pixel +{ + int x, y; +}; +constexpr pixel ur = { 1294, 1024 }; // OK + +// p4 +struct Length +{ + explicit constexpr Length(int i = 0) : val(i) { } +private: + int val; +}; + +constexpr int myabs(int x) +{ return x < 0 ? -x : x; } // OK + +Length l(myabs(-97)); // OK + +// p6 +class debug_flag +{ +public: + explicit debug_flag(bool); + constexpr bool is_on(); // { dg-error "enclosing class .* not a literal type" } +private: + bool flag; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-data2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-data2.C new file mode 100644 index 000000000..2d614ec32 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-data2.C @@ -0,0 +1,47 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template<typename _Tp, _Tp v> + struct A3 + { + typedef _Tp value_type; + typedef A3<value_type,v> type; + + static constexpr value_type value = v; + + constexpr operator value_type() { return value; } + }; + +// Partial specialization. +template<typename _Tp, _Tp v> + struct A3<_Tp*, v> + { + typedef _Tp* value_type; + typedef A3<value_type,v> type; + + static constexpr value_type value = v; + + constexpr operator value_type() { return value; } + }; + +// Explicit specialization. +template<> + struct A3<unsigned short, 0> + { + typedef unsigned short value_type; + typedef A3<value_type, 0> type; + + static constexpr value_type value = 0; + + constexpr operator value_type() { return value; } + }; + +// Explicitly instantiate. +template struct A3<int, 415>; + +// Extern explicitly instantiate. +extern template struct A3<int, 510>; + +// Use. +A3<int, 1111> a31; +A3<char, 9999> a32; // { dg-warning "overflow" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C new file mode 100644 index 000000000..0a3fcb656 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-decl.C @@ -0,0 +1,10 @@ +// PR c++/46930 +// { dg-options -std=c++0x } + +struct S { + static constexpr int size; // { dg-error "must have an initializer" } + // { dg-error "previous declaration" "" { target *-*-* } 5 } +}; + +const int limit = 2 * S::size; +constexpr int S::size = 256; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg.C new file mode 100644 index 000000000..1413b24bd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg.C @@ -0,0 +1,12 @@ +// PR c++/46335 +// { dg-options -std=c++0x } + +struct T { }; +struct A { + A(const T &tr =T()) {} +}; +struct B { + A k; +}; +B kk_; +A fk_; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg2.C new file mode 100644 index 000000000..faa8a3603 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-defarg2.C @@ -0,0 +1,44 @@ +// PR c++/46368 +// { dg-options "-std=c++0x" } + +class A; + +class B +{ + A foo (); + A bar (); +}; + +class C +{ +}; + +struct D +{ + D (C); +}; + +struct A : D +{ + A (const C & n) : D (n) {} +}; + +A baz (const char *, A = C ()); + +A +B::foo () +{ + try + { + baz ("foo"); + } + catch (...) + { + } +} + +A +B::bar () +{ + baz ("bar"); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-delete.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-delete.C new file mode 100644 index 000000000..67c950302 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-delete.C @@ -0,0 +1,3 @@ +// { dg-options -std=c++0x } + +constexpr bool never() = delete; // useless, but OK diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-deref.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-deref.C new file mode 100644 index 000000000..7363e98ec --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-deref.C @@ -0,0 +1,16 @@ +// { dg-options -std=c++0x } + +struct A +{ + const int *p[2]; +}; + +constexpr const int * f(const int *p) { return p; } + +int main() +{ + constexpr int i = 42; + constexpr int j = *&i; // OK + constexpr int k = *A{{&i}}.p[0]; // OK + constexpr int l = *f(&i); // OK +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C new file mode 100644 index 000000000..183d3f768 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag1.C @@ -0,0 +1,20 @@ +// Test that we explain why a template instantiation isn't constexpr +// { dg-options -std=c++0x } + +template <class T> +struct A +{ + T t; + constexpr int f() { return 42; } // { dg-error "enclosing class" } +}; + +struct B { B(); operator int(); }; + +constexpr A<int> ai = { 42 }; +constexpr int i = ai.f(); + +constexpr int b = A<B>().f(); // { dg-error "not a constexpr function" } + +template <class T> +constexpr int f (T t) { return 42; } // { dg-error "parameter" } +constexpr int x = f(B()); // { dg-error "constexpr function" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-diag2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag2.C new file mode 100644 index 000000000..c78416ec1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-diag2.C @@ -0,0 +1,5 @@ +// PR c++/47207 +// { dg-options -std=c++0x } + +constexpr int X (X); // { dg-error "not usable" } +// { dg-message "own initializer" "" { target *-*-* } 4 } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-eh-spec.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-eh-spec.C new file mode 100644 index 000000000..6d231fafa --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-eh-spec.C @@ -0,0 +1,9 @@ +// { dg-options -std=c++0x } +template<class T> class my_limits { +public: + static constexpr T min() throw() { return T(); } + static constexpr T max() noexcept { return T(); } +}; + +constexpr double var_min = my_limits<double>::min(); // #1 OK +constexpr double var_max = my_limits<double>::max(); // #2 Error diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis.C new file mode 100644 index 000000000..5d090b541 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis.C @@ -0,0 +1,5 @@ +// { dg-options -std=c++0x } +constexpr int ellipsis(...) { return 1; } + +constexpr int ellipsis_c = ellipsis(); // OK +constexpr int ellipsis_c2 = ellipsis(42); // Internal error diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis2.C new file mode 100644 index 000000000..0bb690406 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ellipsis2.C @@ -0,0 +1,12 @@ +// { dg-options -std=c++0x } + +struct A +{ + A(); + A(const A&); + bool empty(); +}; + +constexpr int ellipsis(...) { return 1; } + +static_assert(ellipsis(A().empty()), "Error"); // { dg-error "non-constant condition|empty" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-empty.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-empty.C new file mode 100644 index 000000000..a9fc4388a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-empty.C @@ -0,0 +1,7 @@ +// { dg-options -std=c++0x } + +struct Empty {}; + +constexpr bool f(Empty) { return true; } + +constexpr bool x(f(Empty{})); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-empty2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-empty2.C new file mode 100644 index 000000000..ef2121194 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-empty2.C @@ -0,0 +1,7 @@ +// { dg-options -std=c++0x } + +struct IsLiteral {}; + +constexpr IsLiteral bar(IsLiteral x) { return x; } + +constexpr auto xy = bar(IsLiteral()); // #1 Error, but should be OK diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-empty3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-empty3.C new file mode 100644 index 000000000..e0026fcc7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-empty3.C @@ -0,0 +1,9 @@ +// { dg-options -std=c++0x } + +struct IsLiteral {}; + +constexpr auto ab = IsLiteral(); + +constexpr IsLiteral bar(IsLiteral x) { return x; } + +constexpr auto xy = bar(ab); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-empty4.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-empty4.C new file mode 100644 index 000000000..b07f92464 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-empty4.C @@ -0,0 +1,34 @@ +// { dg-options -std=c++0x } + +typedef decltype(sizeof(char)) size_type; + +template<class T, size_type N, class Pred> +constexpr size_type do_find_if_or_stop(T (&x)[N], size_type i, Pred p); + +template<class T, size_type N, class Pred> +constexpr size_type do_find_if(T (&x)[N], size_type i, Pred p) { + return p(x[i]) ? i : do_find_if_or_stop(x, i + 1, p); // line 8 +} + +template<class T, size_type N, class Pred> +constexpr size_type do_find_if_or_stop(T (&x)[N], size_type i, Pred p) { + return i == N ? N : do_find_if(x, i, p); +} // Line 14 + +template<class T, size_type N, class Pred> +constexpr size_type find_if(T (&x)[N], Pred p) { + return do_find_if(x, 0, p); // Line 18 +} + +constexpr long items_long[] = {1, 2, 3, 4, -5, 6, -7, 8}; + +template<class T> +struct IsNegative { + constexpr bool operator()(const T& x) { + return x < T(0); + } +}; + +constexpr auto pos1 = find_if(items_long, IsNegative<long>{}); // Line 30 + +static_assert(pos1 == 4, "find_if failure"); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-empty5.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-empty5.C new file mode 100644 index 000000000..9bd9aa583 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-empty5.C @@ -0,0 +1,7 @@ +// { dg-options -std=c++0x } + +struct A { }; +struct B: A { }; + +constexpr B b { }; +constexpr A a = b; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C new file mode 100644 index 000000000..4ab467780 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C @@ -0,0 +1,94 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +// From N2235 + +// 4.1 constant-expression functions +// 1 examples + + + + + +// 2 defined before first use +// NOTE: this is only needed in contexts that require a constant-expression +struct S { + constexpr int twice(); + constexpr int t(); // { dg-message "used but never defined" } +private: + static constexpr int val = 7; // constexpr variable +}; + +constexpr int S::twice() { return val + val; } +constexpr S s = { }; +int x1 = s.twice(); // ok +int x2 = s.t(); // error: S::t() not defined +constexpr int x2a = s.t(); // { dg-error "S::t" } error: S::t() not defined +constexpr int ff(); // ok +constexpr int gg(); // ok +int x3 = ff(); // error: ff() not defined +constexpr int x3a = ff(); // { dg-error "ff" } error: ff() not defined +constexpr int ff() { return 1; } // too late +constexpr int gg() { return 2; } +int x4 = gg(); // ok + + +// 4.2 const-expression data + +// 2 +// storage not allocated untill address taken +constexpr double x = 9484.748; +const double* p = &x; // the &x forces x into memory + +// 4.3 constant-expression constructors + +// 1 +struct complex { + constexpr complex(double r, double i) : re(r), im(i) { } + constexpr double real() { return re; } + constexpr double imag() { return im; } +private: + double re; + double im; +}; +constexpr complex I(0, 1); // OK -- literal complex + + +// 2 invoked with non-const args +double x5 = 1.0; // { dg-message "not declared .constexpr" } +constexpr complex unit(x5, 0); // { dg-error "x5|argument" } error: x5 non-constant +const complex one(x5, 0); // OK, ‘‘ordinary const’’ -- dynamic + // initialization +constexpr double xx = I.real(); // OK +complex z(2, 4); // OK -- ordinary variable + +// 3 +constexpr complex v[] = { + complex(0, 0), complex(1, 1), complex(2, 2) +}; +constexpr double x6 = v[2].real(); // OK + +// 4 + constexpr int i = 98; + typedef __INTPTR_TYPE__ intptr_t; + constexpr intptr_t ip = (intptr_t) &i; // { dg-error "constant" } + +// 4.3.2 copy-constructor +constexpr complex operator+(complex z, complex w) +{ + return complex(z.real() + w.real(), z.imag() + w.imag()); // fine +} +constexpr complex I2 = I + I; // OK +struct resource { + int id; + constexpr resource(int i) : id(i) { } // fine + resource(const resource& r) : id(r.id) // oops, not constexpr + { + //cout << id << " copied" << endl; + } +}; +constexpr resource f(resource d) +{ return d; } // { dg-error "not .constexpr" } +constexpr resource d = f(9); // { dg-error "resource" } + +// 4.4 floating-point constant expressions diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C new file mode 100644 index 000000000..29e835c4b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex2.C @@ -0,0 +1,23 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +// From N2235 + +// 4.5.3 constant expressions + +// p 4 +struct A { + constexpr A(int i) : val(i) { } + constexpr operator int() { return val; } + constexpr operator long() { return -1; } +private: + int val; +}; + +template<int I> struct X { static const int i = I; }; +constexpr A a = 42; + +X<a> x; // OK: unique conversion to int +int ar[X<a>::i]; // also OK +int ary[a]; // { dg-error "ambiguous|conversion|array" } ambiguous conversion + diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C new file mode 100644 index 000000000..08552cd7d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex3.C @@ -0,0 +1,30 @@ +// { dg-options "-std=c++0x" } + +#define SA(X) static_assert (X, #X) + +struct A +{ + int i; + constexpr A(int _i) { i = _i; } // { dg-error "empty body|uninitialized member" } +}; + +template <class T> +struct B +{ + T t; + constexpr B(T _t): t(_t) { } +}; + +B<int> b(1); // { dg-message "not declared .constexpr" } +SA(b.t==1); // { dg-error "non-constant condition|'b'" } +constexpr B<int> b2(1); +SA(b2.t==1); + +template <class T> +constexpr T f(T a, T b) +{ + typedef T myT; + return a + b; +} + +SA(f(1,2)==3); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex4.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex4.C new file mode 100644 index 000000000..4214f5c52 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex4.C @@ -0,0 +1,16 @@ +// { dg-options "-std=c++0x" } + +struct A +{ + constexpr A(int) { } + constexpr operator int() { return 1; }; +}; + +template <class T> +struct B +{ + static constexpr A a = A(1); + int ar[a]; +}; + +B<int> b; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-expinst.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-expinst.C new file mode 100644 index 000000000..208987369 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-expinst.C @@ -0,0 +1,5 @@ +// { dg-options -std=c++0x } +// Error: Explicit instantiation of a function template shall not use the +// inline or constexpr specifiers +template<class T> constexpr inline T bar(T x) { return x; } +template constexpr inline float bar(float x); // { dg-error "specifier" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-explicit-inst.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-explicit-inst.C new file mode 100644 index 000000000..8f0da0af0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-explicit-inst.C @@ -0,0 +1,9 @@ +// { dg-options -std=c++0x } + +template<class T> constexpr inline T bar(T x) { return x; } + +template short bar(short x); // #EI + +constexpr auto yz = bar(0); // OK +constexpr auto ab = bar(short()); // #1 Error, but should be OK +constexpr auto mn = bar(short{}); // #2 Error, but should be OK diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-fnptr.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-fnptr.C new file mode 100644 index 000000000..4c84d827f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-fnptr.C @@ -0,0 +1,7 @@ +// { dg-options -std=c++0x } + +constexpr bool is_negative(int x) { return x < 0; } + +constexpr bool check(int x, bool (*p)(int)) { return p(x); } // #1 + +static_assert(check(-2, is_negative), "Error"); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C new file mode 100644 index 000000000..f1d9ccee7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-friend.C @@ -0,0 +1,23 @@ +// PR c++/48948 +// { dg-options -std=c++0x } + +struct A { A(); }; + +struct B { + friend constexpr int f(B) { return 0; } // OK + friend constexpr int f(A) { return 0; } // { dg-error "constexpr" } +}; + +template <class T> +struct C +{ + friend constexpr int f(C) { return 0; } + friend constexpr int g(C, A) { return 0; } // { dg-error "double" } + constexpr int m(C) { return 0; } + constexpr int m(A) { return 0; } // { dg-error "double" } +}; + +constexpr int i = f(C<int>()); +constexpr int j = C<int>().m(C<int>()); +constexpr int k = C<double>().m(A()); // { dg-error "not a constexpr function" } +constexpr int l = g(C<double>(),A()); // { dg-error "not a constexpr function" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-function1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-function1.C new file mode 100644 index 000000000..c708b040f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-function1.C @@ -0,0 +1,10 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +// From N2235 + +constexpr int veryabs(int x) { return x < 0 ? -x : x; } + +constexpr long long_max() { return 2147483647; } + +constexpr int verysquare(int x) { return x * x; } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-function2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-function2.C new file mode 100644 index 000000000..5a2ec76e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-function2.C @@ -0,0 +1,50 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +// From N2235 + +// Mess with the builtin by redeclaring. +constexpr int abs(int x) { return x < 0 ? -x : x; } + +extern "C" +{ + constexpr float + squaref(float x) { return x * x; } +} + +// implicitly inline, already: warn? +inline constexpr double +squared(double x) { return x * x; } + +constexpr int squarei(int x) { return x * x; } +extern const int side; // { dg-message "not initialized with a constant expression" } +constexpr int area = squarei(side); // { dg-error "side|argument" } +// error: squarei(side) is not a constant expression + +int next(constexpr int x) // { dg-error "parameter" } +{ return x + 1; } + +constexpr void f(int x) // { dg-error "return type .void" } +{ /* ... */ } + +constexpr int prev(int x) +{ return --x; } // { dg-error "--" } + +constexpr int g(int x, int n) // error: body not just ‘‘return expr’’ +{ + int r = 1; + while (--n > 0) r *= x; + return r; +} // { dg-error "not a return-statement" } + +constexpr int +bar(int x, int y) { return x + y + x * y; } // { dg-error "previously" } + +int bar(int x, int y) // { dg-error "redefinition" } +{ return x * 2 + 3 * y; } + +constexpr int twice(int x); // { dg-message "never defined" } +enum { bufsz = twice(256) }; // { dg-error "" } twice() isn’t (yet) defined + +constexpr int fac(int x) +{ return x > 2 ? x * fac(x - 1) : 1; } // OK diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-function3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-function3.C new file mode 100644 index 000000000..e8ca7bc68 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-function3.C @@ -0,0 +1,30 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +// From N2235 + +// function template 1 +template<typename T> + constexpr int bytesize(T t) + { return sizeof (t); } // OK + +char buf[bytesize(0)]; // OK -- not C99 VLA + + +// function template 2 +template<typename _Tp> + constexpr _Tp + square(_Tp x) { return x; } + +// Explicit specialization +template<> + constexpr unsigned long + square(unsigned long x) { return x * x; } + +// Explicit instantiation +template int square(int); + +class A { }; +template A square(A); + +template long square(long); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ice.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice.C new file mode 100644 index 000000000..3b72484a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice.C @@ -0,0 +1,11 @@ +// We used to crash on this instead of giving a decent error. +// { dg-options -std=c++0x } + +struct A { int i; }; + +struct B { + const A *a; + constexpr B(const A& a): a(&a) { } +}; + +constexpr B b{A{42}}; // { dg-error "constant|expansion" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ice2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice2.C new file mode 100644 index 000000000..35643b990 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice2.C @@ -0,0 +1,3 @@ +// { dg-options -std=c++0x } +int x; +constexpr int& rx = x; // { dg-error "int&" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ice3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice3.C new file mode 100644 index 000000000..23903bca7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice3.C @@ -0,0 +1,13 @@ +// PR c++/46289 +// { dg-options -std=c++0x } + +struct A +{ + int i; +}; + +struct B +{ + A a; + constexpr B(): a({1,2}) { } // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete1.C new file mode 100644 index 000000000..71372d226 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete1.C @@ -0,0 +1,7 @@ +// { dg-options -std=c++0x } + +struct A +{ + static constexpr A a = 1; // { dg-error "incomplete|literal" } + constexpr A(int i) { } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C new file mode 100644 index 000000000..dc0b7429d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete2.C @@ -0,0 +1,31 @@ +// A constructor that might or might not be constexpr still makes +// its class literal. +// { dg-options -std=c++0x } + +template <class T> +struct B +{ + constexpr B(T) { } + constexpr B() {} +}; + +struct A +{ + B<A> b; +}; + +constexpr A a {}; + +template <class T> +struct C +{ + constexpr C(T) { } + C() {} +}; + +struct D +{ + C<D> c; +}; + +constexpr D d {}; // { dg-error "not a constexpr function" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete3.C new file mode 100644 index 000000000..81822b07e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-incomplete3.C @@ -0,0 +1,12 @@ +// PR c++/49015 +// { dg-options -std=c++0x } + +class A; + +class B { + friend constexpr B f(A); // Line 5 +}; + +class A {}; + +constexpr B f(A) { return B(); } // Line 10 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist.C new file mode 100644 index 000000000..6854e7341 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist.C @@ -0,0 +1,65 @@ +// { dg-options -std=c++0x } +// { dg-do run } + +namespace xstd { + +typedef decltype(sizeof(char)) size_t; + +template<class E> +class initializer_list { +private: + size_t sz; + const E* start; + +public: + typedef E value_type; + typedef const E& reference; + typedef const E& const_reference; + typedef size_t size_type; + typedef const E* iterator; + typedef const E* const_iterator; + + constexpr initializer_list() : sz(), start(nullptr) {} + + template<size_t N> + constexpr initializer_list(const E(&array)[N]) : sz(N), start(array) {} + + constexpr size_t size() { return sz; } + + constexpr const E* begin() { return start; } + + constexpr const E* end() { return start + sz; } +}; + +template<class E, size_t N> +constexpr initializer_list<E> make_list(const E(&array)[N]) { + return initializer_list<E>(array); +} + +template<class E> +E min(initializer_list<E> list) +{ + // static_assert(list.size() > 0, "Invalid list"); + auto it = list.begin(); + E result = *it; + for (++it; it != list.end(); ++it) { + if (*it < result) { + result = *it; + } + } + return result; +} + +} + +constexpr int global_i[] = {2, 4, -5, 6, 10}; +constexpr xstd::initializer_list<int> list(global_i); +#define SA(X) static_assert(X, #X) +SA(list.size() == 5); +SA(list.begin()[2] == -5); +SA(list.end()[-1] == 10); + +int main() { + if (xstd::min(xstd::make_list(global_i)) != -5) + return 1; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist2.C new file mode 100644 index 000000000..f34b98016 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist2.C @@ -0,0 +1,10 @@ +// { dg-options -std=c++0x } + +#include <initializer_list> + +constexpr auto list = { 1, 2, 3, 4 }; + +#define SA(X) static_assert(X, #X) +SA(list.size() == 4); +SA(list.begin()[2] == 3); +SA(list.end()[-1] == 4); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist3.C new file mode 100644 index 000000000..7620e6b2c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist3.C @@ -0,0 +1,12 @@ +// { dg-options -std=c++0x } + +#include <initializer_list> +#define SA(X) static_assert(X,#X) + +constexpr int f(std::initializer_list<int> l) { return l.begin()[0]; } + +int main() +{ + constexpr int i = f({42}); + SA(i==42); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C new file mode 100644 index 000000000..97f039998 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist5.C @@ -0,0 +1,15 @@ +// PR c++/50024 +// { dg-options -std=c++0x } + +template< class T > +struct Container +{ + Container(){ + int* ptr = new int{}; + } +}; + +int main() { + Container< int > c; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C new file mode 100644 index 000000000..d1b95437d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C @@ -0,0 +1,38 @@ +// { dg-options -std=c++0x } + +#include <type_traits> + +#define IS_LIT(T) (std::is_literal_type<T>::value) +#define SA(X) static_assert (X, #X) +#define YES(T) SA(IS_LIT(T)) +#define NO(T) SA(!IS_LIT(T)) + +enum E1 { }; +enum class E2 { }; +struct Literal {}; + +struct NotLiteral { + ~NotLiteral(); +}; + +YES(int); +YES(int[]); +YES(int[3]); +YES(double); +YES(void *); +YES(decltype (nullptr)); +YES(int Literal::*); +YES(void (Literal::*)()); +YES(E1); +YES(E2); +YES(Literal); +NO (NotLiteral); +YES(NotLiteral *); +YES(NotLiteral NotLiteral::*); +YES(NotLiteral (NotLiteral::*)(NotLiteral)); + +struct A { + A(const A&) = default; +}; + +NO(A); // no constexpr ctor other than copy diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-memfn1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-memfn1.C new file mode 100644 index 000000000..ef7ac6b48 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-memfn1.C @@ -0,0 +1,18 @@ +// PR c++/48296 +// { dg-options -std=c++0x } + +struct X +{ + constexpr X() { } + constexpr X f(X x) { return x; } + constexpr X g(X x); +}; + +constexpr X X::g(X x) { return x; } + +struct Y +{ + Y() { } + constexpr Y f(Y y); // { dg-error "not a literal type" } + static constexpr Y g(Y y) {} // { dg-error "constexpr" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-missing.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-missing.C new file mode 100644 index 000000000..547f552e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-missing.C @@ -0,0 +1,39 @@ +// PR c++/48911 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +#define SA(X) static_assert((X),#X) + +struct A +{ + constexpr A () : a (6) {} + int a; +}; + +int +main () +{ + constexpr int a[2] = { 42 }; + constexpr int i = a[1]; + SA(i==0); + constexpr int b[1] = { }; + constexpr int j = b[0]; + SA(j==0); + constexpr char c[2] = "a"; + constexpr char k = c[1]; + SA(k==0); + constexpr char d[2] = ""; + constexpr char l = d[1]; + SA(l==0); + constexpr wchar_t e[2] = L"a"; + constexpr wchar_t m = e[1]; + SA(m==0); + constexpr wchar_t f[2] = L""; + constexpr wchar_t n = f[1]; + SA(n==0); + constexpr A g[2] = { A () }; + constexpr A o = g[0]; + SA(o.a == 6); + constexpr A p = g[1]; + SA(p.a == 6); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C new file mode 100644 index 000000000..8294afa98 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-neg1.C @@ -0,0 +1,69 @@ +// Negative examples from N3092 (FCD) +// { dg-options -std=c++0x } + +// OK: declaration +constexpr int square(int x); // { dg-message "never defined" } + +// error: pixel is a type +constexpr struct pixel { + int x; + int y; + // OK: declaration + constexpr pixel(int); +}; // { dg-error "constexpr" } +constexpr pixel::pixel(int a) +// OK: definition + : x(square(a)), y(square(a)) // { dg-error "square" } +{ } + +// error: square not defined, so small(2) not constant (5.19), so constexpr +// not satisfied +constexpr pixel small(2); // { dg-message "in constexpr expansion" } + +// error: not for parameters +int next(constexpr int x) { // { dg-error "parameter" } + return x + 1; +} + +// error: not a definition +extern constexpr int memsz; // { dg-error "definition" } + +// error: return type is void +constexpr void f(int x) // { dg-error "void" } +{ /* ... */ } +// error: use of decrement +constexpr int prev(int x) +{ return --x; } // { dg-error "-- x" } + +// error: body not just return expr +constexpr int g(int x, int n) { + int r = 1; + while (--n > 0) r *= x; + return r; +} // { dg-error "body of constexpr function" } + +class debug_flag { +public: + explicit debug_flag(bool); + constexpr bool is_on(); // { dg-error "not a literal type" } debug_flag not literal type +private: + bool flag; +}; +// OK +constexpr int bar(int x, int y) // { dg-error "previously defined here" } +{ return x + y + x*y; } +// ... +// error: redefinition of bar +int bar(int x, int y) // { dg-error "redefinition" } +{ return x * 2 + 3 * y; } + +struct pixel2 { // { dg-message "no user-provided default constructor" } + int x, y; +}; +constexpr pixel2 ur = { 1294, 1024 };// OK +constexpr pixel2 origin; // { dg-error "uninitialized const" } + +constexpr const int* addr(const int& ir) { return &ir; } // OK + +// error, initializer for constexpr variable not a constant +extern constexpr const int* tp = addr(5); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept.C new file mode 100644 index 000000000..0476f9096 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept.C @@ -0,0 +1,13 @@ +// { dg-options -std=c++0x } + +template<class T> +struct is_funny { + static constexpr bool value = false; +}; + +template<class T> +constexpr T value(T t) noexcept(is_funny<T>::value) { return t; } // Line 7 + +constexpr bool ok = noexcept(value(42)); + +static_assert(ok, "Assertion failure"); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept2.C new file mode 100644 index 000000000..95a1443fa --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept2.C @@ -0,0 +1,14 @@ +// { dg-options -std=c++0x } + +template<class T> +constexpr T value(T t) { return t; } + +template<class T> +struct is_funny { + static constexpr bool value = false; +}; + +template<class T> +void eval() noexcept(value(is_funny<T>::value)) {} + +constexpr bool ok = noexcept(eval<int>()); // line 12 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept3.C new file mode 100644 index 000000000..6e76ea8fa --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept3.C @@ -0,0 +1,7 @@ +// { dg-options -std=c++0x } + +constexpr int f(int i) { return i; } +#define SA(X) static_assert (X, #X) +SA(noexcept(f(42))); +int j; +SA(!noexcept(f(j))); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept4.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept4.C new file mode 100644 index 000000000..119d4e167 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept4.C @@ -0,0 +1,14 @@ +// { dg-options -std=c++0x } +// A call is noexcept if it is a valid subexpression of a constant +// expression, even if it is not itself a constant expression. + +#define SA(X) static_assert(X,#X) + +constexpr const int* f(const int *p) { return p; } + +int main() +{ + constexpr int i = 42; + SA(noexcept(*f(&i))); + SA(noexcept(f(&i))); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept5.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept5.C new file mode 100644 index 000000000..7bf961b3c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-noexcept5.C @@ -0,0 +1,15 @@ +// { dg-options -std=c++0x } + +struct booleable { + bool data; + constexpr explicit operator bool() { return data; } +}; + +constexpr booleable truthy_func() { return {true}; } + +void funky() noexcept(truthy_func()) {} + +int main() { + funky(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg.C new file mode 100644 index 000000000..7637c0a05 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg.C @@ -0,0 +1,24 @@ +// Example from issue 1125 drafting; D() and v were well-formed with the +// wording approved in Rapperswil, now seems they should be ill-formed. +// { dg-options "-std=c++0x -pedantic-errors" } + +struct B { + constexpr B(int x) : i(0) { } // "x" is unused + int i; +}; + +int global; // { dg-message "not const" } + +struct D : B { + constexpr D() : B(global) { } // { dg-error "global|argument" } +}; + +struct A2 { + constexpr A2(bool b, int x) : m(b ? 42 : x) { } + int m; +}; + +// ok, constructor call initializes m with the value 42 after substitution +constexpr int v = A2(true, global).m; // { dg-error "global" } +// error: initializer for m is "x", which is non-constant +constexpr int w = A2(false, global).m; // { dg-error "global" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg2.C new file mode 100644 index 000000000..20e05c3c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg2.C @@ -0,0 +1,16 @@ +// PR c++/47200 +// { dg-options "-std=c++0x -w" } + +template < int > struct duration +{ + constexpr int count (); + static constexpr duration min (); +}; + +constexpr int +f (duration < 0 > d, duration < 0 > ) +{ + return d.count (); +} + +static_assert (f (duration < 0 >::min (), duration < 0 > ()), ""); // { dg-error "non-constant|before its definition" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg3.C new file mode 100644 index 000000000..581be6d15 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-non-const-arg3.C @@ -0,0 +1,23 @@ +// PR c++/49988 +// { dg-options -std=c++0x } +// { dg-do run } + +template<int ... I> struct X { }; + +struct A { + char data[3]; + template<int ... I> + constexpr + A(const char (&s)[3], X<I...> x) : data{ s[I]...} { } +}; +struct B { + A a; + B(const char (&s)[3]) : a{s,X<0,1,2>{}} { } +}; + +int main() +{ + B b{"12"}; + if (b.a.data[0] != '1') + return 1; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit.C new file mode 100644 index 000000000..9104c8afa --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit.C @@ -0,0 +1,13 @@ +// FIXME this is currently invalid, but seems like it should be OK +// { dg-options -std=c++0x } + +struct A { A() { } }; + +template<class T> +constexpr bool ignore(T&&) { return true; } + +static_assert(ignore(10), "Error"); // OK + +A s; + +static_assert(ignore(s), "Error"); // Currently an error diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit2.C new file mode 100644 index 000000000..21e8bd509 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-nonlit2.C @@ -0,0 +1,19 @@ +// { dg-options -std=c++0x } + +struct A +{ + ~A(); +}; + +template<class T> +struct W { + T t; + template<class U> + constexpr W(U&& u) : t(u) {} +}; + +template <class T> +constexpr W<T> make_w(T& w) { return W<T>(w); } + +A a; +constexpr auto w = make_w(a); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-nonstatic.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-nonstatic.C new file mode 100644 index 000000000..3951fbdb1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-nonstatic.C @@ -0,0 +1,6 @@ +// { dg-options -std=c++0x } + +struct A +{ + constexpr int i; // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-nullptr.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-nullptr.C new file mode 100644 index 000000000..7ac53db48 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-nullptr.C @@ -0,0 +1,6 @@ +// { dg-options -std=c++0x } + +constexpr int zero() { return 0; } + +void* ptr1 = zero(); // #1 +constexpr void* ptr2 = zero(); // #2 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C new file mode 100644 index 000000000..4ff398bf1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-object1.C @@ -0,0 +1,31 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +// From N2235 + +// 4.5.2 semantics + +// p 1 constexpr specifier +// objects, static const data +struct A1 { int i; }; // { dg-message "no user-provided default constructor" } + +constexpr int i1 = 1024; +constexpr A1 a1 = A1(); + +// error: not a definition +extern constexpr int i2; // { dg-error "definition" } + +// error: missing initializer +constexpr A1 a2; // { dg-error "uninitialized const" } + +// error: duplicate cv +const constexpr A1 a3 = A1(); // { dg-error "both .const. and .constexpr. cannot" } + +volatile constexpr A1 a4 = A1(); // { dg-error "both .volatile. and .constexpr. cannot" } + +// error: on type declaration +constexpr struct pixel +{ + int x; + int y; +}; // { dg-error "cannot be used for type declarations" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-object2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-object2.C new file mode 100644 index 000000000..a038970f6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-object2.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +constexpr int verysquare(int x) { return x * x; } + +const double mass = 9.8; +constexpr double energy = mass * verysquare(56.6); // { dg-error "mass" "" { xfail *-*-* } } + +int arr[(int)mass]; // { dg-error "mass" "" { xfail *-*-* } } + +float array[verysquare(9)]; // OK -- not C99 VLA + +extern const int medium; +const int high = verysquare(medium); // OK -- dynamic initialization + +enum { Max = verysquare(7) }; // OK diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow.C new file mode 100644 index 000000000..9b3b1fa0e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow.C @@ -0,0 +1,6 @@ +// { dg-options "-std=c++0x -w" } + +#include <limits.h> +extern constexpr int max_s = INT_MAX + 1; // { dg-error "" } +extern constexpr unsigned max_u = UINT_MAX + 1u; // OK +extern constexpr int abs_s = -INT_MIN; // { dg-error "" } overflows on 2's complement machines diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow2.C new file mode 100644 index 000000000..5d5749ce2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-overflow2.C @@ -0,0 +1,8 @@ +// PR c++/47504 +// { dg-options -std=c++0x } + +char constexpr sub(char arg) +{ return char(arg - char(1)); } + +int main() +{ static char constexpr m = sub(-1); } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-pedantic.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-pedantic.C new file mode 100644 index 000000000..dc393d759 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-pedantic.C @@ -0,0 +1,16 @@ +// The FCD doesn't allow typedefs and static_assert in constexpr functions, +// but it should. +// { dg-options "-std=c++0x -pedantic" } + +template <class T> +constexpr T f(T t) +{ + typedef T T2; // { dg-warning "constexpr" "" { xfail *-*-* } } + static_assert (T2(0) == T(0), ""); // { dg-warning "constexpr" "" { xfail *-*-* } } + return t; +} + +int main() +{ + constexpr int i = f(42); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-pos1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-pos1.C new file mode 100644 index 000000000..775080acc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-pos1.C @@ -0,0 +1,60 @@ +// Positive examples from N3092 (FCD) +// { dg-options -std=c++0x } + +#define SA(X) static_assert(X, #X) + +constexpr int bufsz = 1024; // OK: definition +SA (bufsz == 1024); + +constexpr int square(int x); // OK: declaration + +struct pixel { + int x; + int y; + // OK: declaration + constexpr pixel(int); +}; +constexpr pixel::pixel(int a) // OK: definition + : x(square(a)), y(square(a)) +{ } + +constexpr int square(int x) // OK: definition +{ return x * x; } + +constexpr pixel large(4); // OK: square defined +SA(large.x == 16 && large.y==16); + +constexpr long long_max() // OK +{ return 2147483647; } + +SA(long_max() == 2147483647); + +constexpr int abs(int x) // OK +{ return x < 0 ? -x : x; } + +SA(abs(-1) == 1); +SA(abs(24) == 24); + +struct Length { + explicit constexpr Length(int i = 0) : val(i) { } +private: + int val; +}; + +constexpr Length l1; +constexpr Length l2(12); + +struct pixel2 { + int x, y; +}; +constexpr pixel2 ur = { 1294, 1024 };// OK + +SA(ur.x == 1294 && ur.y == 1024); + +constexpr const int* addr(const int& ir) { return &ir; } // OK +static const int x = 5; +extern constexpr const int* xp = addr(x); // OK: (const int*)&(const int&)x + // is an address contant expression +SA(xp == &x); +extern constexpr int x2 = *addr(5); +SA(x2 == 5); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-potential1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-potential1.C new file mode 100644 index 000000000..e933506b8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-potential1.C @@ -0,0 +1,7 @@ +// { dg-options -std=c++0x } +// We decided in Rapperswil that it's OK if any value of decide can produce +// a constant expression. + +constexpr int may_throw(bool decide) { + return decide ? 42 : throw -1; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem.C new file mode 100644 index 000000000..f6ed2f40a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ptrmem.C @@ -0,0 +1,20 @@ +// { dg-options -std=c++0x } + +struct C { // literal type + int m; + int n; + constexpr C(int m) : m(m), n(-m) {} + constexpr bool is_neg() { return m < 0; } +}; + +constexpr bool check1(const C& c, int C:: *pm) { return c.*pm < 0; } // #1 + +constexpr bool check2(const C* pc, bool (C::*pm)() const) { return +(pc->*pm)(); } // #2 + +constexpr C c(-1); + +static_assert(!check1(c, &C::n), "Error"); +static_assert(check1(c, &C::m), "Error"); + +static_assert(check2(&c, &C::is_neg), "Error"); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-pure.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-pure.C new file mode 100644 index 000000000..e17e02a42 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-pure.C @@ -0,0 +1,13 @@ +// { dg-options -std=c++0x } + +struct A +{ + virtual void f() = 0; +}; + +struct B: A +{ + void f() { } +}; + +B b; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion.C new file mode 100644 index 000000000..2f9b4887d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-recursion.C @@ -0,0 +1,5 @@ +// Test that we catch excessive recursion. +// { dg-options "-std=c++0x -fconstexpr-depth=5" } +// { dg-prune-output "in constexpr expansion" } +constexpr int f (int i) { return f (i-1); } +constexpr int i = f(42); // { dg-error "constexpr evaluation depth" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-sassert.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-sassert.C new file mode 100644 index 000000000..3e08fb0ef --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-sassert.C @@ -0,0 +1,13 @@ +// Allow static_assert in constexpr constructors, too. +// { dg-options -std=c++0x } + +template<typename T> +struct A +{ + int i; + + constexpr A(int i) : i(i) + { + static_assert(sizeof(T) == 1, ""); + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-static.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-static.C new file mode 100644 index 000000000..8ed2b5e82 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-static.C @@ -0,0 +1,24 @@ +// Test for constant initialization of non-literal class (e.g. mutex) +// { dg-options "-std=c++0x -save-temps" } +// { dg-do run } + +struct A +{ + int i; + constexpr A(int _i): i(_i) { } + A(const A&); // non-trivial copy ctor makes A non-literal +}; + +A a(42); // constexpr constructor allows constant initialization +A ar[3] = { { 1 }, { 2 }, { 3 } }; +// { dg-final { scan-assembler-not "static_initialization" } } +// { dg-final cleanup-saved-temps } + +int main() +{ + if (a.i != 42 + || ar[0].i != 1 + || ar[1].i != 2 + || ar[2].i != 3) + return 1; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-static2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-static2.C new file mode 100644 index 000000000..67c353080 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-static2.C @@ -0,0 +1,11 @@ +// { dg-options -std=c++0x } +struct IsLiteral {}; + +struct ShouldBeLiteral { + constexpr ShouldBeLiteral(int){} +}; + +struct StaticDataMember { + static constexpr IsLiteral one = IsLiteral(); // #1 + static constexpr ShouldBeLiteral two= ShouldBeLiteral(-1); // #2 +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-static3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-static3.C new file mode 100644 index 000000000..dccdc854b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-static3.C @@ -0,0 +1,18 @@ +// Test for constant initialization of class with vtable +// { dg-options "-std=c++0x -save-temps" } +// { dg-final { scan-assembler-not "static_initialization" } } +// { dg-final cleanup-saved-temps } +// { dg-do run } + +int r = 1; +// implicit default constructor for A and B is constexpr +struct A { virtual void f() {} }; +struct B: A { virtual void f() { r = 0; } }; + +B b; + +int main() +{ + b.f(); + return r; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-static4.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-static4.C new file mode 100644 index 000000000..8189fc5de --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-static4.C @@ -0,0 +1,20 @@ +// { dg-options -std=c++0x } +// { dg-do run } + +extern "C" void abort (); +extern int ar[2]; + +int f() +{ + if (ar[0] != 42 || ar[1] != 0) + abort (); + return 1; +} + +int i = f(); + +int ar[2] = { 42, i }; + +int main() +{ +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C new file mode 100644 index 000000000..a401cc0b8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-static5.C @@ -0,0 +1,17 @@ +// { dg-options -std=c++0x } + +template <class T> +struct A +{ + constexpr static T t = T(); // { dg-error "literal" } +}; +template <class T> +constexpr T A<T>::t; + +struct B +{ + ~B(); +}; + +B b = A<B>::t; + diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-static6.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-static6.C new file mode 100644 index 000000000..a34704d83 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-static6.C @@ -0,0 +1,21 @@ +// { dg-options -std=c++0x } + +struct B +{ + constexpr operator int() { return 4; } +}; + +template <int I> +struct C; + +template<> +struct C<4> { typedef int TP; }; + +template <class T> +struct A +{ + constexpr static B t = B(); + C<t>::TP tp; +}; + +A<B> a; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C new file mode 100644 index 000000000..ba4a25184 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-static7.C @@ -0,0 +1,8 @@ +// PR c++/48945 +// { dg-options -std=c++0x } + +struct A { + static constexpr bool is(); +}; + +constexpr bool A::is() { return true; } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-stmtexpr.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-stmtexpr.C new file mode 100644 index 000000000..40e0c2d65 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-stmtexpr.C @@ -0,0 +1,8 @@ +// PR c++/46977 +// { dg-options "-std=c++0x" } + +template < typename > void +foo () +{ + ({int i;}), 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-string.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-string.C new file mode 100644 index 000000000..e76d00d7e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-string.C @@ -0,0 +1,5 @@ +// { dg-options -std=c++0x } + +constexpr char c1 = "hi"[1]; +constexpr char c2 = "hi"[2]; +constexpr char c3 = "hi"[3]; // { dg-error "out of bound" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-switch.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-switch.C new file mode 100644 index 000000000..d229304e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-switch.C @@ -0,0 +1,13 @@ +// { dg-options -std=c++0x } + +template<class T> +constexpr T value(T t = T()) { return t; } + +enum us_enum { us_item = value<short>() }; // OK + +void func(us_enum n) { + switch (n) { + case value(us_item): ; // #1 Error + default: ; + } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-switch2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-switch2.C new file mode 100644 index 000000000..55cf2ad7c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-switch2.C @@ -0,0 +1,23 @@ +// Test for constexpr conversion in case context +// { dg-options -std=c++0x } + +enum class E { e1, e2 }; + +struct A +{ + E e; + constexpr operator E() { return e; } + constexpr A(E e): e(e) { } +}; + +E e; + +int main() +{ + switch (e) + { + case A(E::e1): + case A(E::e2): + ; + } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-synth1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-synth1.C new file mode 100644 index 000000000..983093980 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-synth1.C @@ -0,0 +1,14 @@ +// PR c++/46472 +// { dg-options -std=c++0x } + +template<class T> struct A { + T t; + constexpr A(){} +}; + +struct B +{ + A<int> a; +}; + +B b; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-targ.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-targ.C new file mode 100644 index 000000000..0c8c73d2e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-targ.C @@ -0,0 +1,13 @@ +// { dg-options -std=c++0x } + +struct A +{ + constexpr operator double() { return 1.0; } +}; + +template <int I> +struct B +{ }; + +constexpr A a { }; +B<a> b; // { dg-error "template argument|invalid type" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-throw.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-throw.C new file mode 100644 index 000000000..f1ef9dc7d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-throw.C @@ -0,0 +1,8 @@ +// { dg-options -std=c++0x } + +constexpr int may_throw(bool decide) { + return decide ? 42 : throw -1; // { dg-error "throw" } +} + +constexpr int x = may_throw(false); // { dg-message "may_throw" } +constexpr int y = may_throw(true); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-typedef1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-typedef1.C new file mode 100644 index 000000000..2719e3aea --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-typedef1.C @@ -0,0 +1,11 @@ +// PR c++/50508 +// { dg-options -std=c++0x } + +template <class T> + struct integral_constant { + typedef T value_type; + constexpr operator value_type() { return true; } + }; + +static constexpr bool value = integral_constant<bool>() + && true; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-typeid.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-typeid.C new file mode 100644 index 000000000..b523bb38c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-typeid.C @@ -0,0 +1,10 @@ +// { dg-options -std=c++0x } + +#include <typeinfo> + +struct A { virtual void f(); }; + +extern constexpr const std::type_info* p1 = &typeid(int); +extern constexpr const std::type_info* p2 = &typeid(A); +// typeid-expression whose operand is of a polymorphic class type +extern constexpr const std::type_info* p3 = &typeid((A())); // { dg-error "" "" { xfail *-*-* } } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-union.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-union.C new file mode 100644 index 000000000..b4613058e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-union.C @@ -0,0 +1,16 @@ +// Test that we don't have to deal with type punning +// FIXME Mike Miller thinks it should work +// { dg-options -std=c++0x } + +union U +{ + float f; + unsigned char ca[sizeof(float)]; +}; + +constexpr U u = { 1.0 }; +constexpr float f = u.f; +constexpr unsigned char c = u.ca[0]; // { dg-error "U::ca" } + +constexpr double d = 1.0; +constexpr unsigned char c2 = (unsigned char&)d; // { dg-error "char. glvalue" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-value.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-value.C new file mode 100644 index 000000000..85799d90b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-value.C @@ -0,0 +1,10 @@ +// { dg-options -std=c++0x } + +struct HopefullyLiteral { + HopefullyLiteral() = default; // Should be a constexpr c'tor as of 12.1/6 and 8.4.2/4 +}; + +constexpr HopefullyLiteral var1{}; // OK +constexpr HopefullyLiteral var2 = HopefullyLiteral{}; // #1 +constexpr HopefullyLiteral var3 = HopefullyLiteral(); // #2 +constexpr HopefullyLiteral var4 = HopefullyLiteral(var3); // #3 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-value2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-value2.C new file mode 100644 index 000000000..1b0e28f16 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-value2.C @@ -0,0 +1,19 @@ +// { dg-options -std=c++0x } + +template<class T> +constexpr T value_init() { return T(); } + +template<class T> +constexpr inline T bar(T x) { return x; } + +union EmptyUnion {}; +union Union1 { int i; }; +union Union3 { double d; int i; char* c; }; + +constexpr auto u1 = value_init<EmptyUnion>(); +constexpr auto u2 = value_init<Union1>(); +constexpr auto u3 = value_init<Union3>(); +constexpr auto u4 = bar(EmptyUnion{}); +constexpr auto u5 = bar(Union1{}); +constexpr auto u6 = bar(Union3{}); +constexpr auto u7 = bar(u1); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-value3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-value3.C new file mode 100644 index 000000000..38d89936e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-value3.C @@ -0,0 +1,10 @@ +// PR c++/50234 +// { dg-options -std=c++0x } + +#define SA(X) static_assert((X),#X) + +struct A { int i; }; + +constexpr int f(A a) { return a.i; } + +SA(f({}) == 0); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-variadic.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-variadic.C new file mode 100644 index 000000000..5d0ad0594 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-variadic.C @@ -0,0 +1,9 @@ +// { dg-options -std=c++0x } +template<class... T> +constexpr bool variadics(T&&...) { return true; } + +struct IsLiteral {}; + +constexpr bool variadic_var = variadics(0, true, 1.2, IsLiteral{}); // Error, so below + +int main() {} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual.C new file mode 100644 index 000000000..448ecb1dc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-virtual.C @@ -0,0 +1,14 @@ +// PR c++/47067 +// { dg-options -std=c++0x } + +struct X { + virtual void x(); + virtual ~X(); +}; + +struct Y { + virtual void y(); + virtual ~Y(); +}; + +struct Z: X, Y {} z; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring1.C new file mode 100644 index 000000000..059977bff --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring1.C @@ -0,0 +1,34 @@ +// PR c++/48570 +// { dg-do run } +// { dg-options "-std=c++0x" } + +extern "C" void abort (); +constexpr wchar_t foo (int i) { return L"0123"[i]; } +constexpr char16_t bar (int i) { return u"0123"[i]; } +constexpr char32_t baz (int i) { return U"0123"[i]; } +const wchar_t foo0 = foo (0); +const wchar_t foo1 = foo (1); +const wchar_t foo2 = foo (2); +const wchar_t foo3 = foo (3); +const wchar_t foo4 = foo (4); +const char16_t bar0 = bar (0); +const char16_t bar1 = bar (1); +const char16_t bar2 = bar (2); +const char16_t bar3 = bar (3); +const char16_t bar4 = bar (4); +const char32_t baz0 = baz (0); +const char32_t baz1 = baz (1); +const char32_t baz2 = baz (2); +const char32_t baz3 = baz (3); +const char32_t baz4 = baz (4); + +int +main () +{ + if (foo0 != L'0' || foo1 != L'1' || foo2 != L'2' || foo3 != L'3' || foo4 != L'\0') + abort (); + if (bar0 != u'0' || bar1 != u'1' || bar2 != u'2' || bar3 != u'3' || bar4 != u'\0') + abort (); + if (baz0 != U'0' || baz1 != U'1' || baz2 != U'2' || baz3 != U'3' || baz4 != U'\0') + abort (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring2.C new file mode 100644 index 000000000..4fc8980ef --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-wstring2.C @@ -0,0 +1,7 @@ +// PR c++/48570 +// { dg-do compile } +// { dg-options -std=c++0x } + +constexpr wchar_t c1 = L"hi"[3]; // { dg-error "out of bound" } +constexpr char16_t c2 = u"hi"[3]; // { dg-error "out of bound" } +constexpr char32_t c3 = U"hi"[3]; // { dg-error "out of bound" } diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C b/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C new file mode 100644 index 000000000..2c263dd0a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype-33837.C @@ -0,0 +1,7 @@ +// { dg-options -std=c++0x } +// PR c++/33837 +void foo() +{ + __decltype (A::foo()); // { dg-error "was not declared|expected" } + __decltype (B); // { dg-error "was not declared" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype-33838.C b/gcc/testsuite/g++.dg/cpp0x/decltype-33838.C new file mode 100644 index 000000000..260a0d1cf --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype-33838.C @@ -0,0 +1,6 @@ +// { dg-options -std=c++0x } +// PR c++/33838 +template<typename T> struct A +{ + __decltype (T* foo()); // { dg-error "expected|no arguments|accept" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype-38655.C b/gcc/testsuite/g++.dg/cpp0x/decltype-38655.C new file mode 100644 index 000000000..3b8455bc1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype-38655.C @@ -0,0 +1,4 @@ +// PR c++/38655 +// { dg-options "" } + +__decltype(0r)* p = 1; // { dg-error "not supported|invalid" } diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype-refbug.C b/gcc/testsuite/g++.dg/cpp0x/decltype-refbug.C new file mode 100644 index 000000000..8e3c82407 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype-refbug.C @@ -0,0 +1,17 @@ +// { dg-options "-std=c++0x" } +// PR c++/33045 +int && f (); + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +static_assert(is_same<decltype(f()), int&&>::value, "decltype of rvalue reference"); diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype1.C b/gcc/testsuite/g++.dg/cpp0x/decltype1.C new file mode 100644 index 000000000..d1288e07d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype1.C @@ -0,0 +1,28 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +const int& foo(); +int i; +struct A { double x; }; +const A* a = new A(); + +static_assert(is_same<decltype(foo()), const int&>::value, + "type should be const int&"); +static_assert(is_same<decltype(i), int>::value, + "type should be int"); +static_assert(is_same<decltype(a->x), double>::value, + "type should be double"); +static_assert(is_same<decltype((a->x)), const double&>::value, + "type should be const double&"); diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype10.C b/gcc/testsuite/g++.dg/cpp0x/decltype10.C new file mode 100644 index 000000000..6c488998c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype10.C @@ -0,0 +1,10 @@ +// PR c++/34271 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template<int> struct A +{ + static int i; +}; + +template<int N> int A<N>::i(decltype (A::i; // { dg-error "expected primary-expression before" } diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype11.C b/gcc/testsuite/g++.dg/cpp0x/decltype11.C new file mode 100644 index 000000000..ac32d349a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype11.C @@ -0,0 +1,12 @@ +// PR c++/35316 +// { dg-options "-std=c++0x" } + +template<int> struct A +{ + int i : 2; + + void foo() + { + decltype(i) j; + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype12.C b/gcc/testsuite/g++.dg/cpp0x/decltype12.C new file mode 100644 index 000000000..77c794bcf --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype12.C @@ -0,0 +1,38 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +int&& f(const int&) {} +int&& (*fp)(const int&) = f; +int&& (&fr)(const int&) = f; + +struct X { int&& f(const int&); }; + +int&& (X::*mfp)(const int&) = &X::f; + +void g(X& xr, X* xp) +{ + int i; + static_assert(is_same<decltype(f(i)), int&&>::value, "direct call"); + static_assert(is_same<decltype(fp(i)), int&&>::value, "pointer"); + static_assert(is_same<decltype((*fp)(i)), int&&>::value, + "dereferenced pointer"); + static_assert(is_same<decltype(fr(i)), int&&>::value, + "reference"); + static_assert(is_same<decltype(xr.f(i)), int&&>::value, + "member function call"); + static_assert(is_same<decltype((xr.*mfp)(i)), int&&>::value, + "member function pointer with .*"); + static_assert(is_same<decltype((xp->*mfp)(i)), int&&>::value, + "member function pointer with ->*"); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype13.C b/gcc/testsuite/g++.dg/cpp0x/decltype13.C new file mode 100644 index 000000000..8e6c6d2bf --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype13.C @@ -0,0 +1,38 @@ +// PR c++/34269 +// { dg-do compile } + +void +f1 () +{ + __decltype; // { dg-error "expected" } +} + +void +f2 () +{ + __decltype (; // { dg-error "expected" } +} + +void +f3 () +{ + __decltype (); // { dg-error "expected" } +} + +void +f4 () +{ + __typeof__; // { dg-error "expected" } +} + +void +f5 () +{ + __typeof__ (; // { dg-error "expected" } +} + +void +f6 () +{ + __typeof__ (); // { dg-error "expected" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype14.C b/gcc/testsuite/g++.dg/cpp0x/decltype14.C new file mode 100644 index 000000000..9484173cd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype14.C @@ -0,0 +1,17 @@ +// PR c++/37540 + +struct A +{ + int g() {return 0;} +}; + +template <typename T_> +void f(A a) +{ + __decltype(a.g()) i; +} + +int main() +{ + f<int>(A()); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype15.C b/gcc/testsuite/g++.dg/cpp0x/decltype15.C new file mode 100644 index 000000000..5c2d445de --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype15.C @@ -0,0 +1,13 @@ +// PR c++/38640 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template<int N> void foo (decltype (N)); +template<long int N> void foo (decltype (N)); + +void +bar (void) +{ + foo<5> (6); + foo<5L> (6L); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype16.C b/gcc/testsuite/g++.dg/cpp0x/decltype16.C new file mode 100644 index 000000000..2002458b8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype16.C @@ -0,0 +1,10 @@ +// PR c++/39070 +// { dg-options "-std=c++0x" } + +template<typename X> struct junk { + template<typename Z> static Z y(); + template<typename Y> static int test(...); + template<typename Y> static char test(decltype(y<Y>())*); + static int const value=sizeof(test<X>(0)); +}; +typedef char type[junk<int>::value==sizeof(char) ? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype17.C b/gcc/testsuite/g++.dg/cpp0x/decltype17.C new file mode 100644 index 000000000..3c98105fc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype17.C @@ -0,0 +1,29 @@ +// PR c++/36628 +// { dg-options "-std=c++0x" } +// { dg-do run } + +#include <typeinfo> +#include <string.h> + +int rvalue(); +int& lvalueref(); +int&& rvalueref(); + +decltype(true ? rvalue() : rvalue()) f() +{} + +decltype(true ? lvalueref() : lvalueref()) g() +{} + +decltype(true ? rvalueref() : rvalueref()) h() +{} + +int main() +{ + if (strcmp (typeid(f).name(), "FivE") != 0) + return 1; + if (strcmp (typeid(g).name(), "FRivE") != 0) + return 2; + if (strcmp (typeid(h).name(), "FivE") != 0) + return 3; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype18.C b/gcc/testsuite/g++.dg/cpp0x/decltype18.C new file mode 100644 index 000000000..0d44586e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype18.C @@ -0,0 +1,5 @@ +// PR c++/37875 +// { dg-options "-std=c++0x" } + +template <typename> struct X {}; +X<decltype(1 > 2)> x; diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype19.C b/gcc/testsuite/g++.dg/cpp0x/decltype19.C new file mode 100644 index 000000000..41d602f34 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype19.C @@ -0,0 +1,24 @@ +// PR c++/42013 + +template<typename _Tp> + _Tp +__attribute ((const)) declval(); + +template<typename _Tp, typename _Up> + struct common_type + { + typedef __decltype(true ? declval<_Tp>() : declval<_Up>()) typet; + typedef __decltype(false ? declval<_Tp>() : declval<_Up>()) typef; + }; + +template<typename, typename> struct is_same; + +template<typename _Tp> struct is_same<_Tp, _Tp> { typedef _Tp type; }; + +void f() +{ + typedef common_type<int, const int>::typet typet; + typedef common_type<int, const int>::typef typef; + + typedef is_same<typet, typef>::type type; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype2.C b/gcc/testsuite/g++.dg/cpp0x/decltype2.C new file mode 100644 index 000000000..186d75b72 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype2.C @@ -0,0 +1,59 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +#define CHECK_DECLTYPE(DECLTYPE,RESULT) \ + static_assert(is_same< DECLTYPE , RESULT >::value, #RESULT) + +struct A {}; + +int a; +int& b = a; +const int& c = a; +const int d = 5; +const A e = A(); +CHECK_DECLTYPE(decltype(a), int); +CHECK_DECLTYPE(decltype(b), int&); +CHECK_DECLTYPE(decltype(c), const int&); +CHECK_DECLTYPE(decltype(d), const int); +CHECK_DECLTYPE(decltype(e), const A); + +CHECK_DECLTYPE(decltype(a), int); +CHECK_DECLTYPE(decltype((a)), int&); + +void foo_check(int a, int& b, float& c, int* d) +{ + CHECK_DECLTYPE(decltype(a), int); + CHECK_DECLTYPE(decltype(b), int&); + CHECK_DECLTYPE(decltype(c), float&); + CHECK_DECLTYPE(decltype(d), int*); +} + +int foo(char); +int bar(char); +int bar(int); +CHECK_DECLTYPE(decltype(foo), int(char)); + +decltype(bar) z; // { dg-error "overload" } +// { dg-error "invalid type" "" { target *-*-* } 48 } + +CHECK_DECLTYPE(decltype(&foo), int(*)(char)); +CHECK_DECLTYPE(decltype(*&foo), int(&)(char)); + +void array_types() +{ + int a[10]; + CHECK_DECLTYPE(decltype(a), int[10]); +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype20.C b/gcc/testsuite/g++.dg/cpp0x/decltype20.C new file mode 100644 index 000000000..3155cdcf8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype20.C @@ -0,0 +1,10 @@ +// PR c++/42277 +// { dg-options -std=c++0x } + +struct S { int s; }; +template <int N> +void foo () +{ + S s; + decltype (s.s) i; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype22.C b/gcc/testsuite/g++.dg/cpp0x/decltype22.C new file mode 100644 index 000000000..74811cfe7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype22.C @@ -0,0 +1,13 @@ +// PR c++/42761 +// { dg-options "-std=c++0x" } + +template<typename _Tp> _Tp* fn(); + +template <class T> struct A +{ + template <class U, + class S = decltype(fn<T>())> + struct B { }; +}; + +A<int> a; diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype23.C b/gcc/testsuite/g++.dg/cpp0x/decltype23.C new file mode 100644 index 000000000..78eb89d8e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype23.C @@ -0,0 +1,5 @@ +// { dg-options -std=c++0x } + +int x, &&y = static_cast<int &&>(x); +typedef decltype((y)) myInt; // `y' is a parenthesized id-expression of type int that is an lvalue +typedef int &myInt; diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype24.C b/gcc/testsuite/g++.dg/cpp0x/decltype24.C new file mode 100644 index 000000000..16d0736d6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype24.C @@ -0,0 +1,7 @@ +// PR c++/47068 +// { dg-options -std=c++0x } + +template <class T> struct broken { + int member; + typedef decltype(~ member) gcc_crashes_here; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype25.C b/gcc/testsuite/g++.dg/cpp0x/decltype25.C new file mode 100644 index 000000000..c9559f151 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype25.C @@ -0,0 +1,20 @@ +// PR c++/47851 +// { dg-options -std=c++0x } + +struct Type { + void display_type(); + void display_type() const { } +}; + +typedef Type const ConstType; + +struct ConvertibleToType { + operator Type&() { return *reinterpret_cast<Type*>(this); } +}; + +int main () +{ + // Both lines should call the const variant. + (true ? ConvertibleToType() : ConstType()).display_type(); + decltype((true ? ConvertibleToType() : ConstType()))().display_type(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype27.C b/gcc/testsuite/g++.dg/cpp0x/decltype27.C new file mode 100644 index 000000000..cb962ada5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype27.C @@ -0,0 +1,9 @@ +// PR c++/48617 +// { dg-options -std=c++0x } + +template<class T, decltype(T())> // # +struct A {}; + +A<int, 0> a; + +int main() {} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype3.C b/gcc/testsuite/g++.dg/cpp0x/decltype3.C new file mode 100644 index 000000000..aeacfae09 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype3.C @@ -0,0 +1,72 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +#define CHECK_DECLTYPE(DECLTYPE,RESULT) \ + static_assert(is_same< DECLTYPE , RESULT >::value, #DECLTYPE " should be " #RESULT) + +class A { +public: + int a; + int& b; + static int c; + + A(int& b) : b(b) { } + + void foo() { + CHECK_DECLTYPE(decltype(a), int); + CHECK_DECLTYPE(decltype(this->a), int); + CHECK_DECLTYPE(decltype((*this).a), int); + CHECK_DECLTYPE(decltype(b), int&); + CHECK_DECLTYPE(decltype(c), int); + } + void bar() const { + CHECK_DECLTYPE(decltype(a), int); + CHECK_DECLTYPE(decltype(b), int&); + CHECK_DECLTYPE(decltype(c), int); + } +}; + +int b; +A aa(b); +const A& caa = aa; +CHECK_DECLTYPE(decltype(aa.a), int); +CHECK_DECLTYPE(decltype(aa.b), int&); +CHECK_DECLTYPE(decltype(caa.a), int); + +class B { +public: + int a; + enum B_enum { b }; + decltype(a) c; + decltype(a) foo() { } + decltype(b) enums_are_in_scope() { return b; } // ok +}; + +CHECK_DECLTYPE(decltype(aa.*&A::a), int&); +decltype(aa.*&A::b) zz; // { dg-error "cannot create pointer to reference member" } +// { dg-error "invalid type" "" { target *-*-* } 58 } +CHECK_DECLTYPE(decltype(caa.*&A::a), const int&); + +class X { + void foo() { + CHECK_DECLTYPE(decltype(this), X*); + CHECK_DECLTYPE(decltype(*this), X&); + } + void bar() const { + CHECK_DECLTYPE(decltype(this), const X*); + CHECK_DECLTYPE(decltype(*this), const X&); + } +}; + diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype30.C b/gcc/testsuite/g++.dg/cpp0x/decltype30.C new file mode 100644 index 000000000..b23c9a94d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype30.C @@ -0,0 +1,17 @@ +// PR c++/49369 +// { dg-options -std=c++0x } + +template <class,class> struct assert_same; +template <class T> struct assert_same<T,T> {}; + +struct B { + int member; +}; + +struct C: B { + void method() const; +}; + +void C::method() const { + assert_same<decltype((B::member)), const int&> a; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype31.C b/gcc/testsuite/g++.dg/cpp0x/decltype31.C new file mode 100644 index 000000000..b9817eb9e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype31.C @@ -0,0 +1,13 @@ +// PR c++/49921 +// { dg-options -std=c++0x } + +struct Local +{ + void f(); +}; + +Local *l; +void (Local::*ptr)(); +decltype((l->*ptr)) i; // { dg-error "member function" } + +// { dg-prune-output "invalid type in declaration" } diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype35.C b/gcc/testsuite/g++.dg/cpp0x/decltype35.C new file mode 100644 index 000000000..d1fd47638 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype35.C @@ -0,0 +1,15 @@ +// PR c++/50870 +// { dg-options -std=c++0x } + +template <class V> + struct impl + { + template <class T> static T create(); + }; + +template <class T, class U, class V, class + = decltype(impl<V>::template create<T>() + -> impl<V>::template create<U>())> +struct tester { }; + +tester<impl<float>*, int, float> ti; diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype36.C b/gcc/testsuite/g++.dg/cpp0x/decltype36.C new file mode 100644 index 000000000..f3dfed992 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype36.C @@ -0,0 +1,21 @@ +// PR c++/51265 +// { dg-options -std=c++0x } + +struct Funny +{ + int print(int); +}; + +template<typename X> +void c(); + +template<typename X, X ff> +void xx() +{ + c<decltype(ff)>(); +} + +int main() +{ + xx<int(Funny::*)(int), &Funny::print>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype4.C b/gcc/testsuite/g++.dg/cpp0x/decltype4.C new file mode 100644 index 000000000..cd715cb28 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype4.C @@ -0,0 +1,83 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +#define CHECK_DECLTYPE(DECLTYPE,RESULT) \ + static_assert(is_same< DECLTYPE , RESULT >::value, #DECLTYPE " should be " #RESULT) + +struct A { + int x; + int& y; + int foo(char); + int& bar() const; +}; + +CHECK_DECLTYPE(decltype(&A::x), int A::*); +decltype(&A::y) Ay; // { dg-error "cannot create pointer to reference member|invalid type" } +CHECK_DECLTYPE(decltype(&A::foo), int (A::*) (char)); +CHECK_DECLTYPE(decltype(&A::bar), int& (A::*) () const); + +CHECK_DECLTYPE(decltype("decltype"), const char(&)[9]); +CHECK_DECLTYPE(decltype(1), int); + +int an_int = 5; +int& i = an_int; +const int j = an_int; + +CHECK_DECLTYPE(decltype(i)&, int&); +CHECK_DECLTYPE(const decltype(j), const int); + +int foo(); +CHECK_DECLTYPE(decltype(foo()), int); +float& bar(int); +CHECK_DECLTYPE(decltype (bar(1)), float&); +const A bar(); +CHECK_DECLTYPE(decltype (bar()), const A); +const A& bar2(); +CHECK_DECLTYPE(decltype (bar2()), const A&); + +void wibble() { + CHECK_DECLTYPE(decltype(1+2), int); + int* p; + CHECK_DECLTYPE(decltype(*p), int&); + int a[10]; + CHECK_DECLTYPE(decltype(a[3]), int&); + int i; int& j = i; + CHECK_DECLTYPE(decltype (i = 5), int&); + CHECK_DECLTYPE(decltype (j = 5), int&); + + CHECK_DECLTYPE(decltype (++i), int&); + CHECK_DECLTYPE(decltype (i++), int); +} + +struct B { + B () : bit(), cbit() {} + int bit : 2; + const int cbit : 3; + + void foo() + { + CHECK_DECLTYPE(decltype(bit), int); + CHECK_DECLTYPE(decltype((bit)), int&); + CHECK_DECLTYPE(decltype(cbit), const int); + CHECK_DECLTYPE(decltype((cbit)), const int&); + } +}; + +B b; +const B& bc = b; +CHECK_DECLTYPE(decltype(b.bit), int); +CHECK_DECLTYPE(decltype(bc.bit), int); +CHECK_DECLTYPE(decltype((b.bit)), int&); +CHECK_DECLTYPE(decltype((bc.bit)), const int&); diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype5.C b/gcc/testsuite/g++.dg/cpp0x/decltype5.C new file mode 100644 index 000000000..139153987 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype5.C @@ -0,0 +1,38 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +#define CHECK_DECLTYPE(DECLTYPE,RESULT) \ + static_assert(is_same< DECLTYPE , RESULT >::value, #RESULT) + +template<typename F> F create_a(); + +template<typename F, typename T1> +decltype(create_a<F&>()(create_a<const T1&>())) forward(F f, const T1& a1) +{ + return f(a1); +} + +struct identity { + template<typename T> + const T& operator()(const T& x) { return x; } +}; + + +identity id; +int i; +float f; + +CHECK_DECLTYPE(decltype(forward(id, i)), const int&); +CHECK_DECLTYPE(decltype(forward(id, f)), const float&); diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype6.C b/gcc/testsuite/g++.dg/cpp0x/decltype6.C new file mode 100644 index 000000000..7aa8e1505 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype6.C @@ -0,0 +1,36 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +template<typename T> const T& foo(); + + +int i; + +template<typename T> +struct A +{ + double x; +}; + +const A<double>* a = new A<double>(); + +static_assert(is_same<decltype(foo<int>()), const int&>::value, + "type should be const int&"); +static_assert(is_same<decltype(i), int>::value, + "type should be int"); +static_assert(is_same<decltype(a->x), double>::value, + "type should be double"); +static_assert(is_same<decltype((a->x)), const double&>::value, + "type should be const double&"); diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype7.C b/gcc/testsuite/g++.dg/cpp0x/decltype7.C new file mode 100644 index 000000000..f757c9e10 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype7.C @@ -0,0 +1,14 @@ +// PR c++/34268 +// { dg-do compile } + +struct A +{ + __decltype (A); // { dg-error "must be an expression" } + __decltype (~A); // { dg-error "must be an expression" } +}; + +struct B +{ + __typeof__ (B); + __typeof__ (~B); // { dg-error "expected primary-expression" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype8.C b/gcc/testsuite/g++.dg/cpp0x/decltype8.C new file mode 100644 index 000000000..368068926 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype8.C @@ -0,0 +1,12 @@ +// PR c++/34267 +// { dg-do compile } + +struct A {}; +__decltype (A); // { dg-error "must be an expression" } +template<int> struct B +{ + __decltype (A); // { dg-error "must be an expression" } + __decltype (~A); // { dg-error "must be an expression" } + __decltype (B); // { dg-error "must be an expression" } + __decltype (~B); // { dg-error "must be an expression" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype9.C b/gcc/testsuite/g++.dg/cpp0x/decltype9.C new file mode 100644 index 000000000..4cd150ea6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype9.C @@ -0,0 +1,10 @@ +// PR c++/34271 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template<int> struct A +{ + static int i; +}; + +template<int N> int A<N>::i(decltype (A::i)); // { dg-error "member function|must be an expression" } diff --git a/gcc/testsuite/g++.dg/cpp0x/deduce.C b/gcc/testsuite/g++.dg/cpp0x/deduce.C new file mode 100644 index 000000000..635228cca --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/deduce.C @@ -0,0 +1,36 @@ +// { dg-options "--std=c++0x" } +template<typename T, typename U> struct same_type; +template<typename T> struct same_type<T, T> {}; + +int lval_int; +int rval_int(); +int const lval_const_int=0; +int const&& rval_const_int(); + +template <typename T> void deduce_lval_int(T && t) +{ + same_type<T, int &>(); +} + +template <typename T> void deduce_rval_int(T && t) +{ + same_type<T, int>(); +} + +template <typename T> void deduce_lval_const_int(T && t) +{ + same_type<T, const int &>(); +} + +template <typename T> void deduce_rval_const_int(T && t) +{ + same_type<T, const int>(); +} + +void f() +{ + deduce_lval_int(lval_int); + deduce_rval_int(rval_int()); + deduce_lval_const_int(lval_const_int); + deduce_rval_const_int(rval_const_int()); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted1.C b/gcc/testsuite/g++.dg/cpp0x/defaulted1.C new file mode 100644 index 000000000..e8fe37eb3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted1.C @@ -0,0 +1,43 @@ +// Positive test for defaulted/deleted fns +// { dg-do run } +// { dg-options "-std=c++0x" } + +struct A +{ + int i; + A() = default; + A(const A&) = delete; + A& operator=(const A&) = default; + ~A(); +}; + +A::~A() = default; + +void f() = delete; + +struct B +{ + int i; + B() = default; +}; + +int main() +{ + A a1, a2; + B b = {1}; + a1 = a2; +} + +// fns defaulted in class defn are trivial +struct C +{ + C() = default; + C(const C&) = default; + C& operator=(const C&) = default; + ~C() = default; +}; + +union U +{ + C c; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted10.C b/gcc/testsuite/g++.dg/cpp0x/defaulted10.C new file mode 100644 index 000000000..64fa5f019 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted10.C @@ -0,0 +1,14 @@ +// PR c++/40381 +// { dg-options "-std=gnu++0x" } + +struct A +{ + template<typename T> void foo(T) = delete; // { dg-error "previously|declared" } +}; + +template<typename T> void A::foo(T) {} // { dg-error "redefinition" } + +void bar() +{ + A().foo(0); // { dg-error "use" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted11.C b/gcc/testsuite/g++.dg/cpp0x/defaulted11.C new file mode 100644 index 000000000..b9bed7e00 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted11.C @@ -0,0 +1,15 @@ +// Core issue 901 +// { dg-options "-std=c++0x" } + +struct A +{ + A(); ~A(); + void operator delete (void *) = delete; + void operator delete[] (void *) = delete; +}; + +int main() +{ + A* ap = new A; + ap = new A[2]; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted13.C b/gcc/testsuite/g++.dg/cpp0x/defaulted13.C new file mode 100644 index 000000000..8b2357921 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted13.C @@ -0,0 +1,29 @@ +// { dg-options -std=c++0x } + +template<typename T> +struct NonCopyable { + NonCopyable() = default; + NonCopyable(NonCopyable const&); +}; + +template<> +NonCopyable<int>::NonCopyable(NonCopyable<int> const&) = delete; // { dg-error "declared" } + +template<typename T> +NonCopyable<T>::NonCopyable(NonCopyable<T> const&) = default; + +template<> +NonCopyable<double>::NonCopyable(NonCopyable<double> const&) = delete; // { dg-error "declared" } + + +int main() +{ + NonCopyable<double> nc_dbl; + NonCopyable<double> nc_dbl_cpy(nc_dbl); // { dg-error "use" } + + NonCopyable<int> nc_int; + NonCopyable<int> nc_int_cpy(nc_int); // { dg-error "use" } + + NonCopyable<char> nc_char; + NonCopyable<char> nc_char_cpy(nc_char); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted14.C b/gcc/testsuite/g++.dg/cpp0x/defaulted14.C new file mode 100644 index 000000000..e476d576c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted14.C @@ -0,0 +1,20 @@ +// PR c++/39866 +// { dg-options "-std=c++0x" } + +struct A { + A& operator=(const A&) = delete; // { dg-bogus "" } + + void operator=(int) {} // { dg-message "" } + void operator=(char) {} // { dg-message "" } +}; + +struct B {}; + +int main() +{ + A a; + a = B(); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 16 } + a = 1.0; // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 18 } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted15.C b/gcc/testsuite/g++.dg/cpp0x/defaulted15.C new file mode 100644 index 000000000..4c5b11c9e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted15.C @@ -0,0 +1,58 @@ +// PR c++/38796 +// { dg-options -std=c++0x } + +#define SA(X) static_assert ((X), #X) + +struct A +{ + A (int); + A (const A& = 1) = default; // { dg-error "default argument" } + void operator= (const A&) = default; // { dg-error "defaulted|match" } +}; + +struct B +{ +private: + B() = default; +}; + +SA(__has_trivial_constructor(B)); + +struct C +{ +protected: + ~C() = default; +}; + +SA(__has_trivial_destructor(C)); + +struct D +{ +private: + D& operator= (const D&) = default; +}; + +SA(__has_trivial_assign(D)); + +struct E +{ + explicit E (const E&) = default; +}; + +SA(__has_trivial_copy(E)); + +struct F +{ + F(F&) = default; // { dg-error "non-const" } +}; + +struct G: public F +{ + // Can't be const because F copy ctor isn't. + G(const G&) = default; // { dg-error "const" } +}; + +struct H +{ + virtual ~H() = default; // { dg-error "declared virtual" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted16.C b/gcc/testsuite/g++.dg/cpp0x/defaulted16.C new file mode 100644 index 000000000..741b43de2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted16.C @@ -0,0 +1,13 @@ +// Test that non-inline default causes the function to be defined even if +// it isn't used. + +// { dg-options -std=c++0x } +// { dg-final { scan-assembler "_ZN1AC1Ev" } } + +struct A +{ + A(); +}; + +A::A() = default; + diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted17.C b/gcc/testsuite/g++.dg/cpp0x/defaulted17.C new file mode 100644 index 000000000..79e91a0eb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted17.C @@ -0,0 +1,12 @@ +// { dg-options -std=c++0x } + +struct A // { dg-error "const|operator=" } +{ + const int i; +}; + +int main() +{ + A a = { 0 }; + a = a; // { dg-error "deleted" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted18.C b/gcc/testsuite/g++.dg/cpp0x/defaulted18.C new file mode 100644 index 000000000..559dfde48 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted18.C @@ -0,0 +1,10 @@ +// { dg-options "-std=c++0x" } + +void f(char i, int j) = delete; // { dg-message "<deleted>" } +void f(int i, ...); // { dg-message "void f" } + +int main() +{ + f(1,1); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 8 } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted19.C b/gcc/testsuite/g++.dg/cpp0x/defaulted19.C new file mode 100644 index 000000000..ea33df398 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted19.C @@ -0,0 +1,21 @@ +// We allocate a cookie to help us run the destructor even if it's deleted. +// { dg-options -std=c++0x } +// { dg-do run } + +struct A +{ + ~A() = delete; +}; + +void *p = 0; +void *operator new[](__SIZE_TYPE__ t) +{ + p = ::operator new (t); + return p; +} + +int main() +{ + A* ap = new A[5]; + return ap == p; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted2.C b/gcc/testsuite/g++.dg/cpp0x/defaulted2.C new file mode 100644 index 000000000..e3aac8f1a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted2.C @@ -0,0 +1,69 @@ +// Negative test for defaulted/deleted fns. +// { dg-options "-std=c++0x" } + +void f(); // { dg-error "previous" } +void f() = delete; // { dg-error "deleted" } + +struct A +{ + A() { } // { dg-error "previous" } + void f() = default; // { dg-error "default" } +}; + +A::A() = default; // { dg-error "redefinition" } + +void g() {} // { dg-error "previous" } +void g() = delete; // { dg-error "redefinition" } + +struct B // { dg-message "user-provided default constructor" } +{ + int i; + B() = default; // { dg-message "not user-provided" } +}; + +const B b; // { dg-error "uninitialized const" } + +struct C +{ + virtual void f() = delete; // { dg-error "overriding deleted" } +}; + +struct D: public C +{ + virtual void f(); // { dg-error "non-deleted function" } +}; + +struct E +{ + const B b; + E() { } // { dg-error "uninitialized" } +}; + +struct F +{ + F() = default; + F(const F&) = delete; // { dg-error "declared" } +}; + +struct G +{ + G(); +}; + +// ctor defaulted after class defn is not trivial +G::G() = default; + +union U +{ + G g; // { dg-error "union member.*non-trivial" } +}; + +int main() +{ + F f; + F f2(f); // { dg-error "use" } + B* b = new const B; // { dg-error "uninitialized const" } + U u; // { dg-error "deleted" } +} + +// { dg-prune-output "implicitly deleted because" } diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted20.C b/gcc/testsuite/g++.dg/cpp0x/defaulted20.C new file mode 100644 index 000000000..5d536a97e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted20.C @@ -0,0 +1,20 @@ +// PR c++/46497 +// { dg-options -std=c++0x } + +struct A { + A(A&&) = default; // { dg-message "A::A|no known conversion" } +}; +struct B { + const A a; + B(const B&) = default; + B(B&&) = default; // { dg-error "implicitly deleted|no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 10 } +}; + +void g(B); // { dg-error "argument 1" } +B&& f(); + +int main() +{ + g(f()); // { dg-error "deleted" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted21.C b/gcc/testsuite/g++.dg/cpp0x/defaulted21.C new file mode 100644 index 000000000..3e740331d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted21.C @@ -0,0 +1,20 @@ +// PR c++/46736 +// { dg-options -std=c++0x } + +struct U { + U(); + U(U const&); +}; + +struct X { + U const u; + X(); + X(X&&); +}; + +X::X(X&&)=default; // { dg-error "implicitly deleted" } +// { dg-error "does not have a move constructor" "" { target *-*-* } 15 } + +X f() { + return X(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted24.C b/gcc/testsuite/g++.dg/cpp0x/defaulted24.C new file mode 100644 index 000000000..307bf94ab --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted24.C @@ -0,0 +1,6 @@ +// PR c++/48280 +// { dg-options -std=c++0x } + +struct S { + template < typename > S (const S &) = default; // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted26.C b/gcc/testsuite/g++.dg/cpp0x/defaulted26.C new file mode 100644 index 000000000..69bd0accb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted26.C @@ -0,0 +1,7 @@ +// PR c++/49066 +// { dg-options -std=c++0x } + +void foo() = delete; // { dg-error "declared here" } +void foo(); + +int main() { foo(); } // { dg-error "deleted" } diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted27.C b/gcc/testsuite/g++.dg/cpp0x/defaulted27.C new file mode 100644 index 000000000..7d9139d23 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted27.C @@ -0,0 +1,19 @@ +// PR c++/47544 +// { dg-options -std=c++0x } +// { dg-final { scan-assembler "_ZN1sIiEC2Ev" } } +// { dg-final { scan-assembler-not "_ZN1sIiED2Ev" } } + +template <typename T> +struct s { + s(); + ~s() = default; +}; + +extern template struct s<int>; + +template <typename T> +s<T>::s() = default; + +template struct s<int>; + +s<int> a; diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted29.C b/gcc/testsuite/g++.dg/cpp0x/defaulted29.C new file mode 100644 index 000000000..5fcf5b0c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted29.C @@ -0,0 +1,20 @@ +// PR c++/46696 +// { dg-options -std=c++0x } + +struct A +{ + A& operator= (A const&); +}; + +struct B +{ + A ar[1]; + B& operator= (B const&) = default; +}; + +int main() +{ + B x; + B y; + y = x; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted3.C b/gcc/testsuite/g++.dg/cpp0x/defaulted3.C new file mode 100644 index 000000000..5e2116b53 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted3.C @@ -0,0 +1,16 @@ +// PR c++/37006 +// { dg-options "-std=c++0x" } + +template<class T> +struct A { + template<class U> + bool operator==(const A<U>&) = delete; // { dg-error "declared" } + operator bool () { return true; } +}; + +int main() +{ + A<int> a1; + A<void> a2; + if(a1 == a2) {} // { dg-error "use" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted30.C b/gcc/testsuite/g++.dg/cpp0x/defaulted30.C new file mode 100644 index 000000000..0bf4425b8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted30.C @@ -0,0 +1,16 @@ +// PR c++/49507 +// { dg-options -std=c++0x } + +template<typename T> +struct ConcretePoolKey +{ + virtual ~ConcretePoolKey(); +}; + +template<typename T> +ConcretePoolKey<T>::~ConcretePoolKey() = default; + +int main() +{ + ConcretePoolKey<int> foo; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted32.C b/gcc/testsuite/g++.dg/cpp0x/defaulted32.C new file mode 100644 index 000000000..351cdae11 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted32.C @@ -0,0 +1,21 @@ +// PR c++/50531 +// { dg-options -std=c++0x } + +template <typename T> +class DataFilter +{ + public: + inline virtual ~DataFilter(); +}; + +template<typename T> +inline DataFilter<T>::~DataFilter() = default; + +class ARCalculator : public DataFilter<ARCalculator> +{ + public: + virtual void dataStart(int, int); +}; + +void ARCalculator::dataStart(int, int) +{} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted4.C b/gcc/testsuite/g++.dg/cpp0x/defaulted4.C new file mode 100644 index 000000000..56053840b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted4.C @@ -0,0 +1,26 @@ +// PR c++/37208: SFINAE and deleted functions. + +// { dg-options "-std=c++0x" } +// { dg-do compile } +template<int> struct A { }; + +template<typename T> +int& int_if_addable(A<sizeof((*(T*)0) + (*(T*)0))>*); + +template<typename T> +float& int_if_addable(...); + +struct X { }; + +struct Y { }; +Y operator+(Y, Y); + +struct Z { }; +Z operator+(Z, Z) = delete; + +void f() +{ + float& x = int_if_addable<X>(0); + int& y = int_if_addable<Y>(0); + float& z = int_if_addable<Z>(0); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted5.C b/gcc/testsuite/g++.dg/cpp0x/defaulted5.C new file mode 100644 index 000000000..b7bd16b40 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted5.C @@ -0,0 +1,20 @@ +// PR c++/37234 +// { dg-do link } +// { dg-options "-std=c++0x" } + +template <typename T> +class foo { + public: + foo() =default; + ~foo(); +}; + +template <typename T> +foo<T>::~foo() =default; + +int main() { + + foo<int> fi; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted6.C b/gcc/testsuite/g++.dg/cpp0x/defaulted6.C new file mode 100644 index 000000000..c33d57292 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted6.C @@ -0,0 +1,13 @@ +// PR c++/37906 +// { dg-options "-std=c++0x" } + +struct b +{ + b() = default; + b(const b&) = delete; +}; + +void test01() +{ + static_assert(__has_trivial_constructor(b), "default ctor not trivial"); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted7.C b/gcc/testsuite/g++.dg/cpp0x/defaulted7.C new file mode 100644 index 000000000..97c29258e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted7.C @@ -0,0 +1,12 @@ +// PR c++/38701, 38702 +// { dg-options "-std=c++0x" } + +void foo() = default; // { dg-error "cannot be defaulted" } +namespace +{ + void bar() = default; // { dg-error "cannot be defaulted" } +} + +enum E { e }; + +E& operator |= (E&, const E&) = default; // { dg-error "cannot be defaulted" } diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted8.C b/gcc/testsuite/g++.dg/cpp0x/defaulted8.C new file mode 100644 index 000000000..f446f8156 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted8.C @@ -0,0 +1,8 @@ +// PR c++/38649 +// { dg-options "-std=c++0x" } + +struct A +{ + A(...) = default; // { dg-error "cannot be defaulted" } + A(const A&, ...) = default; // { dg-error "cannot be defaulted" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted9.C b/gcc/testsuite/g++.dg/cpp0x/defaulted9.C new file mode 100644 index 000000000..1e5e2cbf9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted9.C @@ -0,0 +1,20 @@ +// PR c++/39153 +// { dg-options "-std=c++0x -fno-inline" } + +struct _Impl_base +{ + _Impl_base() = default; + virtual ~_Impl_base(); +}; + +inline _Impl_base::~_Impl_base() = default; + +template<typename _Tp> +class _Impl : public _Impl_base +{ }; + +int main() +{ + _Impl<int> i; + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/dependent1.C b/gcc/testsuite/g++.dg/cpp0x/dependent1.C new file mode 100644 index 000000000..1ceeeafd7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/dependent1.C @@ -0,0 +1,25 @@ +// PR c++/48319 +// { dg-options -std=c++0x } +// We were failing to recognize declval<_Args1> as dependent. + +template<typename Tp> Tp declval() noexcept; + +template<typename _Tp> +class __is_constructible_helper +{ + typedef char __one; + typedef struct { char __arr[2]; } __two; + + template<typename _Tp1, typename... _Args1> + static decltype(_Tp1(declval<_Args1>()...), __one()) __test(int); + + template<typename, typename...> + static __two __test(...); + +public: + static const bool __value = sizeof(__test<_Tp>(0)) == 1; +}; + +int main() { + return __is_constructible_helper<int>::__value; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/elision.C b/gcc/testsuite/g++.dg/cpp0x/elision.C new file mode 100644 index 000000000..35d5e4b02 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/elision.C @@ -0,0 +1,76 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test: Implicit cast to rvalue when eliding copy + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; + +class move_only +{ + move_only(const move_only&); + move_only& operator=(const move_only&); +public: + move_only() {} + move_only(move_only&&) {} + move_only& operator=(move_only&&) {return *this;} +}; + +move_only +test1() +{ + return move_only(); +} + +move_only +test2() +{ + move_only x; + return x; +} + +move_only +test3(bool b) +{ + move_only x1; + if (b) + { + move_only x2; + return x2; + } + return x1; +} + +void +test4(bool b) +{ + if (!b) + throw move_only(); +} + +void +test5(bool b) +{ + move_only x; + if (!b) + throw x; +} + +extern bool b; + +int main() +{ + move_only t1 = test1(); + move_only t2 = test2(); + move_only t3 = test3(b); + test4(b); + test5(b); + return 0; +} + +bool b = true; diff --git a/gcc/testsuite/g++.dg/cpp0x/elision2.C b/gcc/testsuite/g++.dg/cpp0x/elision2.C new file mode 100644 index 000000000..216b1b59d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/elision2.C @@ -0,0 +1,13 @@ +// Core 1148: should be able to move from value parameter on return +// { dg-options -std=c++0x } + +struct A +{ + A(const A&) = delete; + A(A&&); +}; + +A f (A a) +{ + return a; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/elision_neg.C b/gcc/testsuite/g++.dg/cpp0x/elision_neg.C new file mode 100644 index 000000000..78feac72a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/elision_neg.C @@ -0,0 +1,44 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test: Implicit cast to rvalue when eliding copy + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; + +class move_only +{ + move_only(const move_only&); // { dg-error "is private" } + move_only& operator=(const move_only&); +public: + move_only() {} + move_only(move_only&&) {} + move_only& operator=(move_only&&) {return *this;} +}; + +move_only +test1() +{ + static move_only x; + return x; // { dg-error "within this context" } +} + +move_only +test2(move_only&& x) +{ + return x; // { dg-error "within this context" } +} + +int main() +{ + move_only t1 = test1(); + move_only t2 = test2(move_only()); + return 0; +} + +bool b = true; diff --git a/gcc/testsuite/g++.dg/cpp0x/elision_weak.C b/gcc/testsuite/g++.dg/cpp0x/elision_weak.C new file mode 100644 index 000000000..e8ba7551d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/elision_weak.C @@ -0,0 +1,19 @@ +// { dg-do compile } + +struct S +{ + S() {} + S(S&) {} +}; + +S f() +{ + S s; + return s; +} + +void g() +{ + S s; + throw s; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/enum1.C b/gcc/testsuite/g++.dg/cpp0x/enum1.C new file mode 100644 index 000000000..fb03692fa --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum1.C @@ -0,0 +1,6 @@ +// PR c++/38021 +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +enum : { }; // { dg-error "expected" } +enum : 3 { }; // { dg-error "expected" } diff --git a/gcc/testsuite/g++.dg/cpp0x/enum10.C b/gcc/testsuite/g++.dg/cpp0x/enum10.C new file mode 100644 index 000000000..55a1ab46b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum10.C @@ -0,0 +1,9 @@ +// PR c++/48534 +// { dg-options -std=c++0x } + +enum class OpSE : bool; + +int main() +{ + return static_cast<bool>(OpSE()); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/enum13.C b/gcc/testsuite/g++.dg/cpp0x/enum13.C new file mode 100644 index 000000000..ec02d3bf6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum13.C @@ -0,0 +1,20 @@ +// PR c++/48780 +// { dg-options "-std=c++0x -fabi-version=5 -Wabi" } + +typedef __builtin_va_list __gnuc_va_list; +typedef __gnuc_va_list va_list; + +enum struct A : short { X }; + +void foo(int x, ...) { + va_list vl; + __builtin_va_start(vl, x); + enum A t = __builtin_va_arg(vl, enum A); // { dg-warning "promote" } + __builtin_va_end(vl); +} + +int main() { + foo(0, A::X); // { dg-warning "will not promote" } +} + +// { dg-prune-output "note" } diff --git a/gcc/testsuite/g++.dg/cpp0x/enum15.C b/gcc/testsuite/g++.dg/cpp0x/enum15.C new file mode 100644 index 000000000..d65321649 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum15.C @@ -0,0 +1,20 @@ +// PR c++/44311 +// { dg-options -std=c++0x } + +enum class A { Val0, Val1 }; + +void foo (A a, int i) +{ + switch (a) + { + case A::Val0: break; + case 1: break; // { dg-error "" } + } + + switch (i) + { + case A::Val0: break; // { dg-error "" } + case 1: break; + case 2.0: break; + } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/enum16.C b/gcc/testsuite/g++.dg/cpp0x/enum16.C new file mode 100644 index 000000000..ebb48688b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum16.C @@ -0,0 +1,6 @@ +// PR c++/48935 +// { dg-options -std=c++0x } + +enum class ENUM { a }; + +ENUM::Type func() { return ENUM::a; } // { dg-error "does not name a type" } diff --git a/gcc/testsuite/g++.dg/cpp0x/enum18.C b/gcc/testsuite/g++.dg/cpp0x/enum18.C new file mode 100644 index 000000000..5575ca6ce --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum18.C @@ -0,0 +1,8 @@ +// PR c++/47277 +// { dg-options -std=c++0x } + +int main(void) { + enum e {}; + e ev; + ev.e::~e_u(); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/enum19.C b/gcc/testsuite/g++.dg/cpp0x/enum19.C new file mode 100644 index 000000000..acdd86c0b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum19.C @@ -0,0 +1,12 @@ +// We shouldn't give an ABI warning about promotion in switch. +// { dg-options "-std=c++0x -fabi-version=5 -Wabi" } + +enum class Foo { X }; +void test(Foo val) +{ + switch(val) + { + case Foo::X: + break; + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/enum2.C b/gcc/testsuite/g++.dg/cpp0x/enum2.C new file mode 100644 index 000000000..21c265a92 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum2.C @@ -0,0 +1,5 @@ +// PR c++/38637 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template<int> enum E : int { e }; // { dg-error "declaration|expected" } diff --git a/gcc/testsuite/g++.dg/cpp0x/enum3.C b/gcc/testsuite/g++.dg/cpp0x/enum3.C new file mode 100644 index 000000000..5ae5e1a9d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum3.C @@ -0,0 +1,27 @@ +// PR c++/38064 +// { dg-options "-std=c++0x" } +// { dg-do run } + +enum class E { elem }; + +template <class T> +void f (T t); + +bool f (bool b) { return b; } + +int main() +{ + E e = E::elem; + if (!f (e == E::elem)) + return 1; + if (!f (e <= E::elem)) + return 1; + if (!f (e >= E::elem)) + return 1; + if (f (e < E::elem)) + return 1; + if (f (e > E::elem)) + return 1; + if (f (e != E::elem)) + return 1; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/enum4.C b/gcc/testsuite/g++.dg/cpp0x/enum4.C new file mode 100644 index 000000000..002edf092 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum4.C @@ -0,0 +1,8 @@ +// PR c++/40633 +// { dg-options "-std=c++0x" } + +template< typename T > +struct wrap { + enum class E { val }; +}; + diff --git a/gcc/testsuite/g++.dg/cpp0x/enum5.C b/gcc/testsuite/g++.dg/cpp0x/enum5.C new file mode 100644 index 000000000..c4ceebed7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum5.C @@ -0,0 +1,20 @@ +// PR c++/40639 +// { dg-options "-std=c++0x" } + +template< typename T > +struct wrap { + enum E : T { val }; +}; + +template< typename T > +struct dependant { + enum E : typename T::type { val }; +}; + +template<typename T> +struct identity { + typedef T type; +}; + +wrap<int> x; +dependant<identity<int>> y; diff --git a/gcc/testsuite/g++.dg/cpp0x/enum6.C b/gcc/testsuite/g++.dg/cpp0x/enum6.C new file mode 100644 index 000000000..e06398471 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum6.C @@ -0,0 +1,15 @@ +// PR c++/37946 +// { dg-options "-std=c++0x" } + +enum class E : char +{ + e1, + e2 +}; + +inline E operator| (E a1, E a2) +{ + char ret = static_cast<char> (a1) + | static_cast<char> (a2); + return static_cast<E>(ret); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/enum7.C b/gcc/testsuite/g++.dg/cpp0x/enum7.C new file mode 100644 index 000000000..407672a47 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum7.C @@ -0,0 +1,11 @@ +// PR c++/37816 +// { dg-options "-std=c++0x" } + +class A +{ + enum class Color { Red, Orange, Yellow, Green, Blue, Violet }; + enum class Alert { Green, Yellow, Red }; + static const Color x = Red; // { dg-error "" } + static const Color y = Color::Red; + static const Alert z = Alert::Red; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/enum8.C b/gcc/testsuite/g++.dg/cpp0x/enum8.C new file mode 100644 index 000000000..0075e2daa --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum8.C @@ -0,0 +1,10 @@ +// PR c++/47704 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +void +foo () +{ + enum class E { A, B }; + new E; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/enum9.C b/gcc/testsuite/g++.dg/cpp0x/enum9.C new file mode 100644 index 000000000..10e510bcd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum9.C @@ -0,0 +1,5 @@ +// { dg-options -std=c++0x } + +enum class E { }; +E f(); +bool b2 = static_cast<bool>(f()); diff --git a/gcc/testsuite/g++.dg/cpp0x/enum_base.C b/gcc/testsuite/g++.dg/cpp0x/enum_base.C new file mode 100644 index 000000000..5607961f2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum_base.C @@ -0,0 +1,25 @@ +// { dg-options "-std=c++0x" } + +typedef unsigned volatile long long uvlonglong; + +enum E1 : char { }; +enum E2 : signed const short { }; +enum E3 : uvlonglong { }; +enum E4 : char { + val = 500 // { dg-error "too large" } +}; + +enum class E5 { + val = (unsigned long long)-1 // { dg-error "too large" } +}; + +typedef float Float; + +enum class E6 : Float { }; // { dg-error "must be an integral type" } + +static_assert (sizeof(E1) == sizeof(char), "char-sized enum"); +static_assert (sizeof(E2) == sizeof(signed short), "short-sized enum"); +static_assert (sizeof(E3) == sizeof(unsigned long long), + "long long-sized enum"); +static_assert (sizeof(E4) == sizeof(char), "char-sized enum"); +static_assert (sizeof(E5) == sizeof(int), "scoped enum with int size"); diff --git a/gcc/testsuite/g++.dg/cpp0x/enum_base_warn.C b/gcc/testsuite/g++.dg/cpp0x/enum_base_warn.C new file mode 100644 index 000000000..4b14cf65e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/enum_base_warn.C @@ -0,0 +1,25 @@ +// { dg-do run } +// { dg-options "-O2 -Wtype-limits -std=c++0x" } +extern void link_error (void); + +enum Alpha : unsigned char { + ZERO = 0, ONE, TWO, THREE +}; + +Alpha a2; + +int m1 = -1; +int GetM1() { + return m1; +} + +int main() { + a2 = static_cast<Alpha>(GetM1()); + if (a2 == -1) { // { dg-warning "always false due" } + link_error (); + } + if (-1 == a2) { // { dg-warning "always false due" } + link_error (); + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/error1.C b/gcc/testsuite/g++.dg/cpp0x/error1.C new file mode 100644 index 000000000..751b3b75e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/error1.C @@ -0,0 +1,11 @@ +// PR c++/34395 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template<int... N> void foo (int... x[N]) // { dg-error "int \\\[N\\\]\\.\\.\\. x" } +{ + struct A + { + A () { x; } // { dg-error "use of parameter from containing function" } + }; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/error2.C b/gcc/testsuite/g++.dg/cpp0x/error2.C new file mode 100644 index 000000000..ca681eb2f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/error2.C @@ -0,0 +1,9 @@ +// PR c++/38656 +// { dg-options "-std=c++0x" } + +template<int> int foo(); + +template<typename F> void bar(F f) +{ + f((foo<0>()=0)...); // { dg-error "pattern '\\(foo\\<0\\>\\)\\(\\)=0'" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/error3.C b/gcc/testsuite/g++.dg/cpp0x/error3.C new file mode 100644 index 000000000..e7da96195 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/error3.C @@ -0,0 +1,24 @@ +// PR c++/47336 +// { dg-options -std=c++0x } + +template <typename T> +void g(T t) +{ + t+1; // { dg-error "no match" } +} + +template <typename S> +class C +{ + struct D {} d; +public: + decltype(g(d)) h() + { + return g(d); + } +}; + +int main() +{ + C<int>().h(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/error4.C b/gcc/testsuite/g++.dg/cpp0x/error4.C new file mode 100644 index 000000000..29a1cddab --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/error4.C @@ -0,0 +1,22 @@ +// PR c++/49156 +// { dg-options -std=c++0x } + +template<typename T> T declval(); + +template<typename T> +struct S { + + template<typename U> + static U get(const volatile T&); + + template<typename U> + static decltype(*declval<U>()) get(...); + + typedef decltype(get<T>(declval<T>())) type; // { dg-error "no match" } +}; + +struct X { }; + +S<X>::type x; + +// { dg-prune-output "note" } diff --git a/gcc/testsuite/g++.dg/cpp0x/error6.C b/gcc/testsuite/g++.dg/cpp0x/error6.C new file mode 100644 index 000000000..35156520b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/error6.C @@ -0,0 +1,8 @@ +// PR c++/48284 +// { dg-options -std=c++0x } + +template<typename C> +auto g(C& c) -> decltype (c.f()) { return c.f(); } // { dg-error "decltype .c\\.f" } + +template<typename C> +auto g(C& c) -> decltype (c.f()) { return c.f(); } // { dg-error "decltype .c\\.f" } diff --git a/gcc/testsuite/g++.dg/cpp0x/explicit1.C b/gcc/testsuite/g++.dg/cpp0x/explicit1.C new file mode 100644 index 000000000..fe164fc8c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/explicit1.C @@ -0,0 +1,58 @@ +// Test for explicit conversion ops from N2437. +// { dg-options "-std=c++0x" } + +class U; class V; +class T +{ +public: + T( U const & ); + //implicit converting ctor + explicit T( V const & ); + // explicit ctor +}; +class U +{ +}; +class V +{ +}; +class W +{ +public: + operator T() const; +}; +class X +{ +public: + explicit operator T() const; // theoretical +}; +int main() +{ + U u; V v; W w; X x; + // Direct initialization: + T t1( u ); + T t2( v ); + T t3( w ); + T t4( x ); + // Copy initialization: + T t5 = u; + T t6 = v; // { dg-error "" } + T t7 = w; + T t8 = x; // { dg-error "" } + // Cast notation: + T t9 = (T) u; + T t10 = (T) v; + T t11 = (T) w; + T t12 = (T) x; + // Static cast: + T t13 = static_cast<T>( u ); + T t14 = static_cast<T>( v ); + T t15 = static_cast<T>( w ); + T t16 = static_cast<T>( x ); + // Function-style cast: + T t17 = T( u ); + T t18 = T( v ); + T t19 = T( w ); + T t20 = T( x ); + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/explicit2.C b/gcc/testsuite/g++.dg/cpp0x/explicit2.C new file mode 100644 index 000000000..c2327c140 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/explicit2.C @@ -0,0 +1,29 @@ +// Test for explicit conversion ops in various conversion situations. +// { dg-options "-std=c++0x" } + +typedef void (*pfn)(); + +struct A +{ + explicit operator int() const; + explicit operator pfn() const; +}; + +int main() +{ + A a; + int i = a; // { dg-error "" } + const int &ir = a; // { dg-error "" } + a(); // { dg-error "" } + a + 1; // { dg-message "" } (error and note on same line) + + int j (a); + (int)a; + static_cast<int>(a); +} + +struct B +{ + int i; + B(const A& a): i(a) { } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/explicit3.C b/gcc/testsuite/g++.dg/cpp0x/explicit3.C new file mode 100644 index 000000000..be0a14e7a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/explicit3.C @@ -0,0 +1,51 @@ +// Test for "contextually converted to bool" +// { dg-options "-std=c++0x" } + +struct A +{ + explicit operator bool(); +}; + +void f (bool); + +struct B +{ + bool b; +}; + +struct C +{ + operator int(); +}; + +struct D +{ + operator int(); +}; + +int main() +{ + A a; C c; D d; + // These contexts use an explicit bool conversion. + if (a) {} + for (; a; ) {} + do {} while (a); + while (a) {} + a ? 1 : 0; + a || true; + a && true; + !a; + + a ? c : 1; + a ? c : d; + + // These do not. + switch (a); // { dg-error "" } + bool b = a; // { dg-error "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 44 } + f(a); // { dg-error "" } + B b2 = { a }; // { dg-error "" } + a + true; // { dg-message "" } + b ? a : true; // { dg-message "" } + a ? a : true; // { dg-message "" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/explicit4.C b/gcc/testsuite/g++.dg/cpp0x/explicit4.C new file mode 100644 index 000000000..0f3bc623a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/explicit4.C @@ -0,0 +1,18 @@ +// Negative explicit conv test. +// { dg-options "-std=c++0x" } + +struct A { + A(const A&, int = 0); // { dg-message "note" } +}; +struct B +{ + explicit operator A(); +}; + +int main() +{ + B b; + (A(b)); // OK + (A(b,1)); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 16 } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/explicit5.C b/gcc/testsuite/g++.dg/cpp0x/explicit5.C new file mode 100644 index 000000000..88a47071d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/explicit5.C @@ -0,0 +1,25 @@ +// test for extension of DR 899 to handle template ctors +// { dg-options "-std=c++0x" } +// { dg-do run } + +int r = 1; + +struct C { + C() { } + template <class T = int> C(C&, T = 0) { r = 0; } +}; + +C c; + +struct A +{ + explicit operator C&() const { return c; } +}; + +int main() +{ + A a; + C c2 (a); + + return r; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/extern_template-1.C b/gcc/testsuite/g++.dg/cpp0x/extern_template-1.C new file mode 100644 index 000000000..ec2cb784e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/extern_template-1.C @@ -0,0 +1,4 @@ +// { dg-options "-std=c++0x -pedantic" } + +template <typename> void f() {} +extern template void f<int>(); diff --git a/gcc/testsuite/g++.dg/cpp0x/extern_template-2.C b/gcc/testsuite/g++.dg/cpp0x/extern_template-2.C new file mode 100644 index 000000000..89a9ceb5a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/extern_template-2.C @@ -0,0 +1,4 @@ +// { dg-options "-std=c++0x -pedantic" } + +template <typename> class S {}; +extern template class S<int>; diff --git a/gcc/testsuite/g++.dg/cpp0x/extern_template-3.C b/gcc/testsuite/g++.dg/cpp0x/extern_template-3.C new file mode 100644 index 000000000..1b7ad0e01 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/extern_template-3.C @@ -0,0 +1,16 @@ +// PR c++/37256 +// { dg-options "-O" } + +template <typename T_> +struct B +{ + T_ f(); +}; + +extern template class B<int>; + +void f() +{ + B<int> t; + t.f(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg1.C b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg1.C new file mode 100644 index 000000000..25192ad86 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg1.C @@ -0,0 +1,7 @@ +// PR c++/37766 +// { dg-options -std=c++0x } + +int a = 1; +template<int& b = a> void f() { + f<>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg2.C b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg2.C new file mode 100644 index 000000000..12cc83659 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg2.C @@ -0,0 +1,14 @@ +// PR c++/46831 +// { dg-options -std=c++0x } + +struct B { }; +struct D : B { }; +struct A { + template<typename T = void> operator D&(); + operator long(); +}; + +void f(long); +void f(B&); + +int main() { f(A()); } diff --git a/gcc/testsuite/g++.dg/cpp0x/forw_enum1.C b/gcc/testsuite/g++.dg/cpp0x/forw_enum1.C new file mode 100644 index 000000000..2817ae595 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/forw_enum1.C @@ -0,0 +1,45 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// opaque enum declarations +enum class E1; +enum class E2 : int; +enum class E3 : short; +enum E4 : int; +enum E5 : short; + +// can be repeated +enum class E1; +enum class E2 : int; +enum class E3 : short; +enum E4 : int; +enum E5 : short; + +// are complete so we can declare variables +E1 b1; +E2 b2; +E3 b3; +E4 b4; +E5 b5; + +//even with elaborated-type-specifiers +enum E1 a1; +enum E2 a2; +enum E3 a3; +enum E4 a4; +enum E5 a5; + +// and the list can be added later +enum class E1 { e11, e12 }; +enum class E2 : int { e21, e22 }; +enum class E3 : short {e31, e32 }; +enum E4 : int { e41, e42 }; +enum E5 : short { e51, e52 }; + +// more repetitions allowed +enum class E1; +enum class E2 : int; +enum class E3 : short; +enum E4 : int; +enum E5 : short; + diff --git a/gcc/testsuite/g++.dg/cpp0x/forw_enum2.C b/gcc/testsuite/g++.dg/cpp0x/forw_enum2.C new file mode 100644 index 000000000..b6ad87148 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/forw_enum2.C @@ -0,0 +1,44 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +struct S1 +{ + struct S2 + { + // opaque enum declarations + enum class E1; + enum class E2 : int; + enum class E3 : short; + enum E4 : int; + enum E5 : short; + + // can be repeated + enum class E1; + enum class E2 : int; + enum class E3 : short; + enum E4 : int; + enum E5 : short; + }; +}; + +// are complete so we can declare variables +S1::S2::E1 b1; +S1::S2::E2 b2; +S1::S2::E3 b3; +S1::S2::E4 b4; +S1::S2::E5 b5; + +//even with elaborated-type-specifiers +enum S1::S2::E1 a1; +enum S1::S2::E2 a2; +enum S1::S2::E3 a3; +enum S1::S2::E4 a4; +enum S1::S2::E5 a5; + +// and the list can be added later +enum class S1::S2::E1 { e11, e12 }; +enum class S1::S2::E2 : int { e21, e22 }; +enum class S1::S2::E3 : short {e31, e32 }; +enum S1::S2::E4 : int { e41, e42 }; +enum S1::S2::E5 : short { e51, e52 }; + diff --git a/gcc/testsuite/g++.dg/cpp0x/forw_enum3.C b/gcc/testsuite/g++.dg/cpp0x/forw_enum3.C new file mode 100644 index 000000000..4a7e9f98d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/forw_enum3.C @@ -0,0 +1,44 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +namespace S1 +{ + namespace S2 + { + // opaque enum declarations + enum class E1; + enum class E2 : int; + enum class E3 : short; + enum E4 : int; + enum E5 : short; + + // can be repeated + enum class E1; + enum class E2 : int; + enum class E3 : short; + enum E4 : int; + enum E5 : short; + } +} + +// are complete so we can declare variables +S1::S2::E1 b1; +S1::S2::E2 b2; +S1::S2::E3 b3; +S1::S2::E4 b4; +S1::S2::E5 b5; + +//even with elaborated-type-specifiers +enum S1::S2::E1 a1; +enum S1::S2::E2 a2; +enum S1::S2::E3 a3; +enum S1::S2::E4 a4; +enum S1::S2::E5 a5; + +// and the list can be added later +enum class S1::S2::E1 { e11, e12 }; +enum class S1::S2::E2 : int { e21, e22 }; +enum class S1::S2::E3 : short {e31, e32 }; +enum S1::S2::E4 : int { e41, e42 }; +enum S1::S2::E5 : short { e51, e52 }; + diff --git a/gcc/testsuite/g++.dg/cpp0x/forw_enum4.C b/gcc/testsuite/g++.dg/cpp0x/forw_enum4.C new file mode 100644 index 000000000..0fcc3bde0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/forw_enum4.C @@ -0,0 +1,45 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template<typename T> struct S1 +{ + struct S2 + { + // opaque enum declarations + enum class E1; + enum class E2 : T; + enum class E3 : short; + enum E4 : T; + enum E5 : short; + + // can be repeated + enum class E1; + enum class E2 : T; + enum class E3 : short; + enum E4 : T; + enum E5 : short; + }; + + // are complete so we can declare variables + typename S2::E1 b1; + typename S2::E2 b2; + typename S2::E3 b3; + typename S2::E4 b4; + typename S2::E5 b5; + + //even with elaborated-type-specifiers + enum S1::S2::E1 a1; + enum S1::S2::E2 a2; + enum S1::S2::E3 a3; + enum S1::S2::E4 a4; + enum S1::S2::E5 a5; + + // and the list can be added later + enum class S1::S2::E1 { e11, e12 }; + enum class S1::S2::E2 : T { e21, e22 }; + enum class S1::S2::E3 : short {e31, e32 }; + enum S1::S2::E4 : T { e41, e42 }; + enum S1::S2::E5 : short { e51, e52 }; +}; + +template struct S1<int>; diff --git a/gcc/testsuite/g++.dg/cpp0x/forw_enum5.C b/gcc/testsuite/g++.dg/cpp0x/forw_enum5.C new file mode 100644 index 000000000..a2edfa763 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/forw_enum5.C @@ -0,0 +1,63 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +namespace one +{ + struct S + { + enum { A = 1, B = 2 }; + struct T + { + enum { B = 102 }; + + enum class E1; + enum E2 : int; + }; + }; + + enum class S::T::E1 { A1 = A, B1 = B, C1 }; + enum S::T::E2 : int { A1 = A, B1 = B, C1 }; + + static_assert(int(S::T::E1::A1) == 1, "error"); + static_assert(int(S::T::E1::B1) == 102, "error"); + static_assert(int(S::T::E1::C1) == 103, "error"); + + static_assert(int(S::T::E2::A1) == 1, "error"); + static_assert(int(S::T::E2::B1) == 102, "error"); + static_assert(int(S::T::E2::C1) == 103, "error"); + static_assert(int(S::T::A1) == 1, "error"); + static_assert(int(S::T::B1) == 102, "error"); + static_assert(int(S::T::C1) == 103, "error"); +} + + +namespace two +{ + namespace S + { + enum { A = 1, B = 2 }; + namespace T + { + enum { B = 102 }; + + enum class E1; + enum E2 : int; + } + } + + enum class S::T::E1 { A1 = A, B1 = B, C1 }; + enum S::T::E2 : int { A1 = A, B1 = B, C1 }; + + static_assert(int(S::T::E1::A1) == 1, "error"); + static_assert(int(S::T::E1::B1) == 102, "error"); + static_assert(int(S::T::E1::C1) == 103, "error"); + + static_assert(int(S::T::E2::A1) == 1, "error"); + static_assert(int(S::T::E2::B1) == 102, "error"); + static_assert(int(S::T::E2::C1) == 103, "error"); + static_assert(int(S::T::A1) == 1, "error"); + static_assert(int(S::T::B1) == 102, "error"); + static_assert(int(S::T::C1) == 103, "error"); +} + + diff --git a/gcc/testsuite/g++.dg/cpp0x/forw_enum6.C b/gcc/testsuite/g++.dg/cpp0x/forw_enum6.C new file mode 100644 index 000000000..51ef6e43e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/forw_enum6.C @@ -0,0 +1,74 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +enum class E1 : int; // { dg-error "previous definition" } +enum E1 : int; // { dg-error "scoped/unscoped mismatch" } + +enum E2 : int; // { dg-error "previous definition" } +enum class E2 : int; // { dg-error "scoped/unscoped mismatch" } + +enum struct E3 : int; +enum class E3 : int; //ok + +enum class E4 : int; // { dg-error "previous definition" } +enum class E4 : long; // { dg-error "different underlying type" } + +enum E5 : int; // { dg-error "previous definition" } +enum E5 : long; // { dg-error "different underlying type" } + +enum E6 : int; +enum E6 : int; //ok + +enum class E7; +enum class E7 : int; //ok + +enum class E3 e3; // { dg-warning "scoped enum must not use" } +enum struct E3 e4; // { dg-warning "scoped enum must not use" } +enum E5 : int e5; // { dg-error "expected|invalid type" } + +enum E6 : int { a, b, c }; // { dg-error "previous definition" } +enum E6 : int { a, b, c }; // { dg-error "multiple definition" } + +enum class E7 { }; // { dg-error "previous definition" } +enum class E7 { a, b, c }; // { dg-error "multiple definition" } + +namespace N1 +{ + struct D; + enum class E6; + enum E7 : int; +} + +enum class N1::E6; // { dg-error "must use a simple identifier" } +enum N1::E6 e6_1; //ok +enum ::N1::E6 e6_2; //ok + +namespace N2 +{ + enum class N1::E6 { e1, e2, e3 }; // { dg-error "does not enclose" } + enum N1::E7 : int { e1, e2, e3 }; // { dg-error "does not enclose" } +}; + +enum class N1::E6 { e1, e2, e3 }; +enum N1::E7 : int { e1, e2, e3 }; + +struct S1 +{ + struct D; + enum class E6; + enum E7 : int; +}; + +enum class S1::E6; // { dg-error "must use a simple identifier" } +enum S1::E6 e6_3; //ok +enum ::S1::E6 e6_4; //ok + +struct S2 +{ + enum class S1::E6 { e1, e2, e3 }; // { dg-error "does not enclose" } + enum S1::E7 : int { e1, e2, e3 }; // { dg-error "does not enclose" } +}; + +enum class S1::E6 { e1, e2, e3 }; +enum S1::E7 : int { e1, e2, e3 }; + diff --git a/gcc/testsuite/g++.dg/cpp0x/forw_enum7.C b/gcc/testsuite/g++.dg/cpp0x/forw_enum7.C new file mode 100644 index 000000000..62e445c70 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/forw_enum7.C @@ -0,0 +1,21 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template<typename T> struct S1 +{ + enum E1 : int; + enum E1 : T; + enum class E2 : int; + enum class E2 : T; +}; + +template<typename T> enum S1<T>::E1 : int { e1 }; +template<typename T> enum class S1<T>::E2 : T { e2 }; + +S1<int>::E1 x1 = S1<int>::e1; +S1<int>::E1 x11 = S1<int>::E1::e1; +S1<int>::E2 x2 = S1<int>::E2::e2; + +enum S1<int>::E1 ex1 = S1<int>::e1; +enum S1<int>::E1 ex11 = S1<int>::E1::e1; +enum S1<int>::E2 ex2 = S1<int>::E2::e2; diff --git a/gcc/testsuite/g++.dg/cpp0x/forw_enum8.C b/gcc/testsuite/g++.dg/cpp0x/forw_enum8.C new file mode 100644 index 000000000..c87aa5bf6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/forw_enum8.C @@ -0,0 +1,26 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +//This instatiation is ok +template<typename T> struct S1 +{ + enum E : int; + enum E : T; +}; +template struct S1<int>; //ok + +//This error is diagnosed at instantiation time +template<typename T> struct S2 +{ + enum E : int; // { dg-error "previous definition" } + enum E : T; // { dg-error "different underlying type" } +}; +template struct S2<short>; // { dg-message "instantiated from here" } + +//This error is diagnosed at compilation time +template<typename T> struct S3 +{ + enum E : int; // { dg-error "previous definition" } + enum E : short; // { dg-error "different underlying type" } +}; + diff --git a/gcc/testsuite/g++.dg/cpp0x/forw_enum9.C b/gcc/testsuite/g++.dg/cpp0x/forw_enum9.C new file mode 100644 index 000000000..da8cde27b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/forw_enum9.C @@ -0,0 +1,21 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template<typename T> struct S1 +{ + enum E1 : int; + enum class E2 : int; +}; + +template<typename T> enum S1<T>::E1 : int { e1 }; +template<typename T> enum class S1<T>::E2 : T { e2 }; + +template<> enum S1<int>::E1 : int { i1 }; +template<> enum class S1<int>::E2 : int { i2 }; + +S1<char>::E1 xci = S1<char>::e1; +S1<int>::E1 xi1 = S1<int>::i1; + +S1<char>::E2 xc2 = S1<char>::E2::e2; +S1<int>::E2 xi2 = S1<int>::E2::i2; + diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit-copy.C b/gcc/testsuite/g++.dg/cpp0x/implicit-copy.C new file mode 100644 index 000000000..861fe201f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit-copy.C @@ -0,0 +1,15 @@ +// { dg-options "--std=c++0x" } +struct S +{ + S(); +private: + S(S const &&); // { dg-error "" } + S & operator=(S const &&); // { dg-error "" } +}; + +void f() +{ + S a; + S b(a); // { dg-error "" } + a = b; // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit-trivial1.C b/gcc/testsuite/g++.dg/cpp0x/implicit-trivial1.C new file mode 100644 index 000000000..64084c148 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit-trivial1.C @@ -0,0 +1,23 @@ +// PR c++/46807 +// { dg-options -std=c++0x } +// In C++98/03, B::B(const B&) is trivial because A::A(const A&) is trivial, +// even though doing overload resolution would mean calling the template +// constructor. In C++0x, we do overload resolution to determine triviality. + +struct A +{ + A() {} +private: + template <class T> A(T&); // { dg-error "private" } +}; + +struct B // { dg-error "implicitly deleted|this context" } +{ + mutable A a; +}; + +int main() +{ + B b; + B b2(b); // { dg-error "deleted" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit1.C b/gcc/testsuite/g++.dg/cpp0x/implicit1.C new file mode 100644 index 000000000..2efbde6a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit1.C @@ -0,0 +1,26 @@ +// Test for implicitly deleted destructors. +// { dg-options "-std=c++0x" } +// { dg-prune-output "default definition would be ill-formed" } +// { dg-prune-output "within this context" } + +class C +{ + void operator delete (void *); // { dg-error "private" } +public: + virtual ~C(); // { dg-error "overriding" } +}; + +struct D: C { }; // { dg-error "deleted" } +D d; // { dg-error "deleted" } + +struct E +{ + ~E() = delete; // { dg-error "declared here" } +}; + +struct F +{ + virtual ~F(); // { dg-error "overriding" } +}; + +struct G: E, F { }; // { dg-error "deleted" } diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit10.C b/gcc/testsuite/g++.dg/cpp0x/implicit10.C new file mode 100644 index 000000000..721a93dd5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit10.C @@ -0,0 +1,19 @@ +// PR c++/46103 +// { dg-options -std=c++0x } + +struct MoveOnly { + MoveOnly(const MoveOnly&) = delete; + MoveOnly(MoveOnly&&) { } + MoveOnly() = default; +}; + +struct A { + MoveOnly mo[1]; + A() = default; + A(A&&) = default; +}; + +int main() { + A a; + A aa = static_cast<A&&>(a); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit2.C b/gcc/testsuite/g++.dg/cpp0x/implicit2.C new file mode 100644 index 000000000..f24a78838 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit2.C @@ -0,0 +1,33 @@ +// Test that the synthesized C copy constructor calls the A template +// constructor and has the appropriate exception specification. +// { dg-options -std=c++0x } +// { dg-do run } + +int r = 1; + +struct A +{ + A() {} + A(const A&) throw () { } + template <class T> + A(T& t) { r = 0; } +}; + +struct B +{ + B() {} + B(B&) throw () { } +}; + +struct C: A, B { }; + +#define SA(E) static_assert(E, #E) + +C c; +SA (!noexcept(C(c))); + +int main() +{ + (C(c)); + return r; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit3.C b/gcc/testsuite/g++.dg/cpp0x/implicit3.C new file mode 100644 index 000000000..a43eca708 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit3.C @@ -0,0 +1,56 @@ +// Basic runtime test for implicit move constructor +// { dg-do run } +// { dg-options -std=c++0x } + +int m; + +struct A +{ + A() = default; + A(A&&) { ++m; } + A& operator=(A&&) { ++m; return *this; } +}; + +struct B +{ + B() = default; + B(const B&); + B(B&&) { ++m; } + B& operator=(const B&); + B& operator=(B&&) { ++m; return *this; } +}; + +struct C +{ + C() = default; + C(C&); + C(C&&) { ++m; } + C& operator=(C&); + C& operator=(C&&) { ++m; return *this; } +}; + +struct D: public A, public B +{ + C c; + int i; +}; + +struct E: public A, public B +{ + C c; + int i; + E() = default; + E(E&&) = default; + E& operator=(E&&) = default; +}; + +int main() +{ + D d1; + D d2 (static_cast<D&&>(d1)); + d1 = static_cast<D&&>(d2); + E e1; + E e2 (static_cast<E&&>(e1)); + e1 = static_cast<E&&>(e2); + return m != 12; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit4.C b/gcc/testsuite/g++.dg/cpp0x/implicit4.C new file mode 100644 index 000000000..f97eb7549 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit4.C @@ -0,0 +1,21 @@ +// Test that a base with only a move constructor causes the implicit copy +// constructor to be deleted. +// { dg-options "-std=c++0x" } + +struct A +{ + A(); // { dg-message "A::A|candidate expects" } + A(A&&); // { dg-message "A::A|no known conversion" } +}; + +struct B: A // { dg-error "implicit|no match" } +// { dg-message "candidate" "candidate note" { target *-*-* } 11 } +{ +}; + +int main() +{ + B b1; + B b2(b1); // { dg-error "deleted function .B::B.const" } + B b3(static_cast<B&&>(b1)); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit5.C b/gcc/testsuite/g++.dg/cpp0x/implicit5.C new file mode 100644 index 000000000..f25c08530 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit5.C @@ -0,0 +1,19 @@ +// Test that the default B copy constructor calls the A member template +// constructor. +// { dg-options -std=c++0x } + +struct A +{ + A() = default; + A(A&&) = default; + template <class T> + A(const T& t) { t.i; } // { dg-error "no member" } +}; + +struct B: A { }; + +int main() +{ + B b; + B b2(b); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit6.C b/gcc/testsuite/g++.dg/cpp0x/implicit6.C new file mode 100644 index 000000000..c7902969d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit6.C @@ -0,0 +1,23 @@ +// Circular implicit declarations were causing errors +// { dg-options -std=c++0x } + +struct Ray; + +struct Vector +{ + virtual void f(); // make non-trivially-copyable + Vector(const Ray &) ; +}; + +struct array +{ + Vector v; +}; + +struct Ray +{ + array a; +}; + +extern Ray r1; +Ray r2=r1; diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit7.C b/gcc/testsuite/g++.dg/cpp0x/implicit7.C new file mode 100644 index 000000000..f29e5009f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit7.C @@ -0,0 +1,37 @@ +// PR c++/44909 +// { dg-options -std=c++0x } +// Declaring A<D<E>>'s copy ctor means choosing a ctor to initialize D<E>, +// which means choosing a ctor for C<B<E>>, which meant considering +// C(const B<E>&) which means choosing a ctor for B<E>, which means choosing +// a ctor for A<D<E>>. Cycle. + +template<typename T> +struct A +{ + T t; +}; + +template <typename T> +struct B +{ + typename T::U u; +}; + +template <typename T> +struct C +{ + C(const T&); +}; + +template <typename T> +struct D +{ + C<B<T> > v; +}; + +struct E { + typedef A<D<E> > U; +}; + +extern A<D<E> > a; +A<D<E> > a2(a); diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit8.C b/gcc/testsuite/g++.dg/cpp0x/implicit8.C new file mode 100644 index 000000000..2f3febae8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit8.C @@ -0,0 +1,34 @@ +// The hack for PR c++/44909 breaks this testcase. We need feedback +// from the C++ committee to know how to proceed. +// { dg-options -std=c++0x } +// { dg-prune-output "implicitly deleted" } +// { dg-prune-output "cannot bind" } +// { dg-prune-output "initializing argument" } + +struct A +{ + A(); + A(A&); +}; + +struct B; +struct BP +{ + BP(const B&); +}; + +struct B +{ + B(); + B(B&&); + B(const BP&); +}; + +// If B(B&&) suppresses the B copy constructor, then copying the B +// subobject of C should use B(const BP&). But we ignore that constructor +// in order to break the cycle in 44909. Perhaps the move ctor shouldn't +// suppress the copy ctor? +struct C: A, B { }; + +C c; +C c2(c); // { dg-bogus "deleted" "" { xfail *-*-* } } diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit9.C b/gcc/testsuite/g++.dg/cpp0x/implicit9.C new file mode 100644 index 000000000..3a6dbc558 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/implicit9.C @@ -0,0 +1,12 @@ +// Test that private base dtor makes derived ctor deleted +// { dg-options -std=c++0x } + +struct A +{ + A(); +private: + ~A(); // { dg-error "private" } +}; + +struct B: A { }; // { dg-error "implicitly deleted|context" } +B * b = new B; // { dg-error "deleted" } diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-49216.C b/gcc/testsuite/g++.dg/cpp0x/initlist-49216.C new file mode 100644 index 000000000..4bf608229 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-49216.C @@ -0,0 +1,6 @@ +// PR c++/49216 +// { dg-options -std=c++0x } + +int main() { + new int[1]{}; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-array2.C b/gcc/testsuite/g++.dg/cpp0x/initlist-array2.C new file mode 100644 index 000000000..19eec33ac --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-array2.C @@ -0,0 +1,12 @@ +// { dg-options -std=c++0x } + +typedef int IA[2]; +typedef double DA[2]; + +void f(const IA&) { } +void f(const DA&); + +int main() +{ + f({1,2}); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-arrray1.C b/gcc/testsuite/g++.dg/cpp0x/initlist-arrray1.C new file mode 100644 index 000000000..25113d770 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-arrray1.C @@ -0,0 +1,5 @@ +// { dg-options -std=c++0x } + +typedef int IRT[2]; + +const IRT& ir = IRT{1,2}; diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-deduce.C b/gcc/testsuite/g++.dg/cpp0x/initlist-deduce.C new file mode 100644 index 000000000..e422132af --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-deduce.C @@ -0,0 +1,26 @@ +// Test for deduction of T as std::initializer_list. This isn't currently +// supported by the working draft, but is necessary for perfect forwarding +// of initializer-lists to things that can take a std::initializer_list. + +// { dg-options -std=c++0x } +// { dg-do run } + +#include <initializer_list> + +struct A +{ + A(std::initializer_list<int>) { } +}; + +void f (A a) { } + +template <class T> +auto g (T&& t) -> decltype (f(t)) // { dg-warning "call" } +{ + return f(t); +} + +int main() +{ + g({1}); // { dg-warning "deduc" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-opt.C b/gcc/testsuite/g++.dg/cpp0x/initlist-opt.C new file mode 100644 index 000000000..d17cda3f6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-opt.C @@ -0,0 +1,19 @@ +// PR c++/41997 +// { dg-options "-std=c++0x -O2 -fdump-tree-optimized" } +// { dg-final { scan-tree-dump-not "_0" "optimized" } } +// { dg-final { cleanup-tree-dump "optimized" } } + +#include <initializer_list> + +inline int max_val(std::initializer_list<int> il) +{ + int i = *(il.begin()); + int j = *(il.begin() + 1); + return (i > j ? i : j); +} + +int main(void) +{ + return max_val({1,2}); +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist1.C b/gcc/testsuite/g++.dg/cpp0x/initlist1.C new file mode 100644 index 000000000..ff45f7176 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist1.C @@ -0,0 +1,72 @@ +// Basic uses of initializer lists +// { dg-do run } +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +extern "C" void abort(); + +using namespace std; + +struct A { int i,j; A(int _i,int _j): i(_i), j(_j) {} }; +struct B { A a; B(A _a): a(_a) {} }; +struct C { B b; C(B _b): b(_b) {} }; + +struct D +{ + int ia[3]; + D (initializer_list<int> l) + { + const int *p = l.begin(); + for (int i = 0; i < 3; ++i) + ia[i] = *p++; + } +}; + +void f(C c) +{ + if (c.b.a.i != 1) abort(); + if (c.b.a.j != 2) abort(); +} +void f(int); + +void g(D d) +{ + if (d.ia[0] != 1 || d.ia[1] != 2 || d.ia[2] != 3) + abort(); +} + +struct E +{ + int i, j, k; +}; + +void h(E e) +{ + if (e.i != 1 || e.j != 2 || e.k != 3) + abort(); +} + +void i(initializer_list<int> l) +{ + const int *p = l.begin(); + if (*p++ != 1) abort(); + if (*p++ != 2) abort(); + if (*p++ != 3) abort(); + if (p != l.end()) abort(); +} + +struct U { U(int, int) {} }; +U ua[] = { { 3, 2 } }; + +int main() +{ + g({1,2,3}); + + h({1,2,3}); + + f({{{1,2}}}); + f({{A{1,2}}}); + + i({1,2,3}); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist10.C b/gcc/testsuite/g++.dg/cpp0x/initlist10.C new file mode 100644 index 000000000..bf955f513 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist10.C @@ -0,0 +1,53 @@ +// PR c++/38380 +// { dg-options "-std=gnu++0x" } + +namespace std +{ + struct atomic_bool + { + bool _M_i; + + atomic_bool() = default; + ~atomic_bool() = default; + atomic_bool(const atomic_bool&) = delete; + atomic_bool& operator=(const atomic_bool&) = delete; + + explicit atomic_bool(bool __i) { _M_i = __i; } + + operator bool() const volatile + { return true; } + }; +} + +namespace __gnu_test +{ + struct direct_list_initializable + { + template<typename _Ttype, typename _Tvalue> + void + operator()() + { + struct _Concept + { + void __constraint() + { + _Ttype __v1 = { }; // default ctor + _Ttype __v2 { __a }; // single-argument ctor + } + + _Tvalue __a; + }; + + void (_Concept::*__x)() __attribute__((unused)) + = &_Concept::__constraint; + } + }; +} + +int main() +{ + __gnu_test::direct_list_initializable test; + + test.operator()<std::atomic_bool, bool>(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist11.C b/gcc/testsuite/g++.dg/cpp0x/initlist11.C new file mode 100644 index 000000000..546a5335f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist11.C @@ -0,0 +1,18 @@ +// PR c++/38684 +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +struct Y {}; + +struct X : Y { + X(std::initializer_list<int>) {} +}; + +struct A { + X v; +}; + +int main() { + A a{ {1,2,3} }; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist12.C b/gcc/testsuite/g++.dg/cpp0x/initlist12.C new file mode 100644 index 000000000..f344c780c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist12.C @@ -0,0 +1,21 @@ +// PR c++/38698 +// { dg-options "-std=c++0x" } +// { dg-prune-output "note" } + +struct A +{ + int i; +}; + +A a({1,2}); // { dg-error "no match" } + +union U +{ + int i,j; +}; + +U u({1,2}); // { dg-error "no match" } + +union V {}; + +V v({1}); // { dg-error "no match" } diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist13.C b/gcc/testsuite/g++.dg/cpp0x/initlist13.C new file mode 100644 index 000000000..9ed6c7441 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist13.C @@ -0,0 +1,8 @@ +// PR c++/39056 +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +#include <complex> + +__complex__ int i ({0}); +std::complex<int> i2 ({0}); diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist14.C b/gcc/testsuite/g++.dg/cpp0x/initlist14.C new file mode 100644 index 000000000..bb67f3e54 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist14.C @@ -0,0 +1,19 @@ +// Bug: We weren't doing the normal replacement of array with pointer +// for deduction in the context of a call because of the initializer list. +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +struct string +{ + string (const char *); +}; + +template <class T> +struct vector +{ + template <class U> + vector (std::initializer_list<U>); +}; + +vector<string> v = { "a", "b", "c" }; diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist15.C b/gcc/testsuite/g++.dg/cpp0x/initlist15.C new file mode 100644 index 000000000..b75cc8172 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist15.C @@ -0,0 +1,20 @@ +// { dg-options "-std=c++0x" } + +// Just discard errors pointing at header files +// { dg-prune-output "include" } + +#include <vector> +#include <typeinfo> + +using namespace std; + +template< typename ... ArgTypes > +void test( ArgTypes ... args ) { + vector<type_info*> x = { &typeid(ArgTypes)... }; // { dg-error "" } +} + +int main() +{ + test( 1, 3.14f, 2.78 ); + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist16.C b/gcc/testsuite/g++.dg/cpp0x/initlist16.C new file mode 100644 index 000000000..86a003960 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist16.C @@ -0,0 +1,12 @@ +// { dg-options "-std=c++0x" } +// { dg-do run } + +extern "C" void abort(); + +void f(int i) { if (i != 42) abort(); } + +int main() +{ + f({42}); + return {0}; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist17.C b/gcc/testsuite/g++.dg/cpp0x/initlist17.C new file mode 100644 index 000000000..86371e819 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist17.C @@ -0,0 +1,9 @@ +// { dg-options "-std=c++0x" } + +void f(int i); + +int main() +{ + f({42.0}); // { dg-error "narrowing" } + return {1.0}; // { dg-error "narrowing" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist18.C b/gcc/testsuite/g++.dg/cpp0x/initlist18.C new file mode 100644 index 000000000..c9a9bcd94 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist18.C @@ -0,0 +1,19 @@ +// PR c++/40308, 40311 +// { dg-do run } +// { dg-options "-std=c++0x" } + +template< typename T > +struct test { + test() : data{} {} + + T data; +}; + +int main() +{ + test<int> x; + test<int*> y; + int * a = new int{}; + int * b = new int{5}; + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist19.C b/gcc/testsuite/g++.dg/cpp0x/initlist19.C new file mode 100644 index 000000000..9cb197c9b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist19.C @@ -0,0 +1,10 @@ +// { dg-options "-std=c++0x" } + +// Allow other errors, too +// { dg-prune-output "error" } + +void f(double); +int main() +{ + f({{1}}); // { dg-error "too many braces" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist2.C b/gcc/testsuite/g++.dg/cpp0x/initlist2.C new file mode 100644 index 000000000..2fe477056 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist2.C @@ -0,0 +1,32 @@ +// Test that conversion to std::initializer_list takes priority over other +// user-defined conversions. + +// { dg-do link } +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +struct string +{ + string (const char *) {} + template <class Iter> string (Iter, Iter); +}; + +template <class T, class U> +struct pair +{ + pair (T t, U u) {} +}; + +template<class T, class U> +struct map +{ + void insert (pair<T,U>); + void insert (std::initializer_list<pair<T,U> >) {} +}; + +int main() +{ + map<string,string> m; + m.insert({ {"this","that"}, {"me","you"} }); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist20.C b/gcc/testsuite/g++.dg/cpp0x/initlist20.C new file mode 100644 index 000000000..fcdb73f19 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist20.C @@ -0,0 +1,17 @@ +// PR c++/40689 +// { dg-options "-std=c++0x" } + +class X +{ + public: + X(): data {1,2,3,4,5} {} + private: + const short data[5]; +}; + +int main() +{ + const float * pData = new const float[4] { 1.5, 2.5, 3.5, 4.5 }; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist21.C b/gcc/testsuite/g++.dg/cpp0x/initlist21.C new file mode 100644 index 000000000..9412a0851 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist21.C @@ -0,0 +1,18 @@ +// PR c++/40689 +// { dg-options "-std=c++0x" } + +class X +{ + public: + X(): data {1,2} {} // { dg-error "too many initializers" } + private: + const short data[1]; +}; + +int f(int n) +{ + const float * pData = new const float[1] { 1.5, 2.5 }; // { dg-error "too many initializers" } + pData = new const float[n] { 1.5, 2.5 }; // { dg-warning "array size" } + + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist22.C b/gcc/testsuite/g++.dg/cpp0x/initlist22.C new file mode 100644 index 000000000..0855b59d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist22.C @@ -0,0 +1,24 @@ +// Core issue 934 +// { dg-options "-std=c++0x" } + +int i; + +int& r1{ i }; // OK, direct binding +int&& r2{ i }; // { dg-error "" } binding && to lvalue + +int& r3{ }; // { dg-error "" } reference to temporary +int&& r4{ }; // OK, reference to temporary + +struct A { int i; } a; + +A& r5 { i }; // { dg-error "" } reference to temporary +A&& r6 { i }; // OK, aggregate initialization of temporary +A& r7 { a }; // { dg-error "" } invalid aggregate initializer for A +A&& r8 { a }; // { dg-error "" } invalid aggregate initializer for A + +struct B { B(int); int i; } b(0); + +B& r9 { i }; // { dg-error "" } reference to temporary +B&& r10 { i }; // OK, make temporary with B(int) constructor +B& r11 { b }; // { dg-error "" } reference to temporary +B&& r12 { b }; // OK, make temporary with copy constructor diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist23.C b/gcc/testsuite/g++.dg/cpp0x/initlist23.C new file mode 100644 index 000000000..48a997fca --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist23.C @@ -0,0 +1,15 @@ +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +struct A +{ + A& operator=(int i); + A& operator=(std::initializer_list<int> l) { return *this; } +}; + +int main() +{ + A a; + a = { }; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist24.C b/gcc/testsuite/g++.dg/cpp0x/initlist24.C new file mode 100644 index 000000000..33e97c7df --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist24.C @@ -0,0 +1,9 @@ +// PR c++/39923 +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +void test3() +{ + std::initializer_list<int> list{move}; // { dg-error "not declared|could not convert" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist25.C b/gcc/testsuite/g++.dg/cpp0x/initlist25.C new file mode 100644 index 000000000..8e5e0065c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist25.C @@ -0,0 +1,17 @@ +// PR c++/41754 +// { dg-options -std=c++0x } +// { dg-do run } + +#include <map> +#include <string> +#include <iostream> + +using namespace std; + +int main() +{ + map<string, string> m; + m.insert({{"t", "t"}, {"y", "y"}}); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist26.C b/gcc/testsuite/g++.dg/cpp0x/initlist26.C new file mode 100644 index 000000000..bb28bdbd9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist26.C @@ -0,0 +1,10 @@ +// PR c++/42059 +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +void +foo (int i) +{ + int a[i]; + a = { }; // { dg-error "assign" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist27.C b/gcc/testsuite/g++.dg/cpp0x/initlist27.C new file mode 100644 index 000000000..f8536d3e7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist27.C @@ -0,0 +1,5 @@ +// PR c++/42061 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +int& i = { j }; // { dg-error "invalid initialization|was not declared" } diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist28.C b/gcc/testsuite/g++.dg/cpp0x/initlist28.C new file mode 100644 index 000000000..d1df7cb00 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist28.C @@ -0,0 +1,8 @@ +// PR c++/42060 +// { dg-options "-std=c++0x" } + +void foo() +{ + int a[1]; + throw a = {}; // { dg-error "assign" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist29.C b/gcc/testsuite/g++.dg/cpp0x/initlist29.C new file mode 100644 index 000000000..1568678e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist29.C @@ -0,0 +1,14 @@ +// PR c++/42331 +// { dg-options "-std=c++0x" } + +class Mesh +{ +public: + Mesh(const char*) + { typele={0}; } // { dg-error "" } + +private: + int typele[7][2]; +}; + +Mesh m(0); diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist3.C b/gcc/testsuite/g++.dg/cpp0x/initlist3.C new file mode 100644 index 000000000..412deb511 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist3.C @@ -0,0 +1,11 @@ +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +template <class T> void f(std::initializer_list<T>); + +void g() +{ + f({1,2,3}); +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist30.C b/gcc/testsuite/g++.dg/cpp0x/initlist30.C new file mode 100644 index 000000000..a5bdb2eda --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist30.C @@ -0,0 +1,12 @@ +// Testcase for variadic init list deduction. +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +template <class... Ts> +void f (std::initializer_list<Ts>... ls); + +int main() +{ + f({1},{2.0}); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist31.C b/gcc/testsuite/g++.dg/cpp0x/initlist31.C new file mode 100644 index 000000000..ffc985567 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist31.C @@ -0,0 +1,13 @@ +// PR c++/43028 +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +struct string { string(std::initializer_list<char>) { } }; + +void f() { + auto y = + { + string(Equation()) // { dg-error "not declared" } + }; // { dg-error "unable to deduce" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist32.C b/gcc/testsuite/g++.dg/cpp0x/initlist32.C new file mode 100644 index 000000000..78bbb5ef9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist32.C @@ -0,0 +1,21 @@ +// Test that we try normal init if no list ctor is viable. +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +struct B {}; + +struct C +{ + C(B); +}; + +struct A +{ + A(std::initializer_list<int>); + A(B) { } + A(C); +}; + +B b; +A a{b}; diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist33.C b/gcc/testsuite/g++.dg/cpp0x/initlist33.C new file mode 100644 index 000000000..b1c0ba09b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist33.C @@ -0,0 +1,13 @@ +// PR c++/44045 +// { dg-options "-std=c++0x" } + +struct base +{ + virtual ~base() { } +}; + +int main() +{ + base ptr_array[1]; + ptr_array = { base() }; // { dg-error "assign" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist34.C b/gcc/testsuite/g++.dg/cpp0x/initlist34.C new file mode 100644 index 000000000..92f5a3a46 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist34.C @@ -0,0 +1,14 @@ +// PR c++/44157 +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +template<typename T> +void f(T) { } + +int main() { + std::initializer_list<int> a = { 0 }; + f(a); + + f<std::initializer_list<int> >({ 0 }); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist35.C b/gcc/testsuite/g++.dg/cpp0x/initlist35.C new file mode 100644 index 000000000..e5b7cb4bd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist35.C @@ -0,0 +1,24 @@ +// PR c++/41510 +// { dg-options "-std=c++0x" } + +struct B +{ + B(int, int); +}; +struct A +{ + A(int, int); + A(const B&); +}; + +void f() +{ + A a = { 1, 2 }; +}; + +template <class T> void g() +{ + A a = { 1, 2 }; +}; + +template void g<int>(); diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist36.C b/gcc/testsuite/g++.dg/cpp0x/initlist36.C new file mode 100644 index 000000000..94624c977 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist36.C @@ -0,0 +1,23 @@ +// PR c++/44358 +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +struct A +{ + A(int); +}; + +struct B +{ + B(std::initializer_list<A>); +}; + +void f (B b); +int main() +{ + B b0 = {{1}}; + B b1 = {{1.0}}; // { dg-error "narrowing" } + B b2 {1.0}; // { dg-error "narrowing" } + A a {1.0}; // { dg-error "narrowing" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist37.C b/gcc/testsuite/g++.dg/cpp0x/initlist37.C new file mode 100644 index 000000000..20c6ab631 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist37.C @@ -0,0 +1,24 @@ +// DR 990 +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +struct S { + S(std::initializer_list<double>); // #1 + S(std::initializer_list<int>); // #2 + S(); // #3 + // ... +}; +S s1 = { 1.0, 2.0, 3.0 }; // invoke #1 +S s2 = { 1, 2, 3 }; // invoke #2 +S s3 = { }; // invoke #3 (for value-initialization) + + +// Test some other situations, too. +void f (S); +int main() +{ + S s4 { }; + f({ }); + S {}; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist38.C b/gcc/testsuite/g++.dg/cpp0x/initlist38.C new file mode 100644 index 000000000..32e20d591 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist38.C @@ -0,0 +1,21 @@ +// DR 990 +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +struct A { + A(std::initializer_list<int>); // #1 +}; +struct B { + A a; +}; + +void f (B); +int main() +{ + B{}; + f({}); + B b0 = { }; + B b1 { }; // OK, uses #1 + B b2 { 1 }; // { dg-error "could not convert" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist39.C b/gcc/testsuite/g++.dg/cpp0x/initlist39.C new file mode 100644 index 000000000..a6dd1ec43 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist39.C @@ -0,0 +1,15 @@ +// { dg-options -std=c++0x } + +struct A { int i; }; + +void f (const A &); +void f (A &&); + +void g (A, int); +void g (A, double); + +int main() +{ + f ( { 1 } ); + g ( { 1 }, 1 ); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist4.C b/gcc/testsuite/g++.dg/cpp0x/initlist4.C new file mode 100644 index 000000000..d1ffab854 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist4.C @@ -0,0 +1,32 @@ +// Test for initializer-list 'explicit' rule +// { dg-options "-std=c++0x" } + +struct A +{ + explicit A(int,int); + operator bool(); +}; + +A f(A) +{ + A{1,2}; + A a1{1,2}; + new A{1,2}; + if (A a5{1,2}); + + A({1,2}); // { dg-error "explicit" } + A a2({1,2}); // { dg-error "explicit" } + A a3 = {1,2}; // { dg-error "explicit" } + new A({1,2}); // { dg-error "explicit" } + f({1,2}); // { dg-error "explicit" } + a1 = {1,2}; // { dg-error "explicit" } + if (A a4 = {1,2}); // { dg-error "explicit" } + return {1,2}; // { dg-error "explicit" } +} + +struct B +{ + A a; + B(): a{1,2} {} + B(const B&): a({1,2}) {} // { dg-error "explicit" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist40.C b/gcc/testsuite/g++.dg/cpp0x/initlist40.C new file mode 100644 index 000000000..f2703602c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist40.C @@ -0,0 +1,12 @@ +// { dg-options "-std=c++0x" } + +struct A +{ + explicit A(int = 42); +}; + +int main() +{ + A a1 = { }; + A a2 = { 24 }; // { dg-error "explicit" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist41.C b/gcc/testsuite/g++.dg/cpp0x/initlist41.C new file mode 100644 index 000000000..b5385480c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist41.C @@ -0,0 +1,14 @@ +// PR c++/44703 +// { dg-options -std=c++0x } + +#include <initializer_list> + +typedef std::initializer_list<int> type ; +void f(type) {} + +int main() +{ +// error: could not convert '{1, 2, 3}' to 'type' + f({1,2,3}) ; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist42.C b/gcc/testsuite/g++.dg/cpp0x/initlist42.C new file mode 100644 index 000000000..e63959deb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist42.C @@ -0,0 +1,13 @@ +// { dg-options -std=c++0x } + +enum Unscoped { }; +enum class Scoped { }; + +Unscoped bar(Unscoped x) { return x; } +Scoped bar(Scoped x) { return x; } + +auto var1u = bar(Unscoped()); // OK +auto var1s = bar(Scoped()); // OK + +auto var2u = bar(Unscoped{}); // #1 Error, but should work +auto var2s = bar(Scoped{}); // #2 Error, but should work diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist43.C b/gcc/testsuite/g++.dg/cpp0x/initlist43.C new file mode 100644 index 000000000..72a09bdea --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist43.C @@ -0,0 +1,7 @@ +// Test that using T{} at file scope doesn't create a static temporary. +// { dg-options -std=c++0x } +// { dg-final { scan-assembler-not "local" } } + +struct A { }; + +A a = A{}; diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist44.C b/gcc/testsuite/g++.dg/cpp0x/initlist44.C new file mode 100644 index 000000000..fbe0ea3fe --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist44.C @@ -0,0 +1,5 @@ +// { dg-options -std=c++0x } + +#include <initializer_list> + +auto value = std::initializer_list<int>{ 1, 2, 3 }; diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist45.C b/gcc/testsuite/g++.dg/cpp0x/initlist45.C new file mode 100644 index 000000000..0e34bc189 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist45.C @@ -0,0 +1,13 @@ +// PR c++/46289 +// { dg-options -std=c++0x } + +struct A +{ + int i[2]; +}; + +struct B +{ + A a; + B(): a({{1,2}}) { } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist46.C b/gcc/testsuite/g++.dg/cpp0x/initlist46.C new file mode 100644 index 000000000..2b9f07dbd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist46.C @@ -0,0 +1,14 @@ +// PR c++/48281 +// { dg-options "-std=c++0x -O2" } +// { dg-do run } + +#include <initializer_list> + +typedef std::initializer_list<int> int1; +typedef std::initializer_list<int1> int2; +static int2 ib = {{42,2,3,4,5},{2,3,4,5,1},{3,4,5,2,1}}; + +int main() +{ + return *(ib.begin()->begin()) != 42; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist47.C b/gcc/testsuite/g++.dg/cpp0x/initlist47.C new file mode 100644 index 000000000..b76fb5836 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist47.C @@ -0,0 +1,9 @@ +// { dg-options -std=c++0x } + +struct A { ~A() = delete; }; // { dg-error "declared" } + +int main() +{ + typedef const A cA[2]; + cA{}; // { dg-error "deleted" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist48.C b/gcc/testsuite/g++.dg/cpp0x/initlist48.C new file mode 100644 index 000000000..9eb451a82 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist48.C @@ -0,0 +1,11 @@ +// PR c++/48726 +// { dg-options -std=c++0x } + +#include <memory> + +struct Foo{ + int i; +}; +typedef std::unique_ptr<Foo> up; + +std::initializer_list<up> il{up{new Foo}, up{new Foo}}; diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist5.C b/gcc/testsuite/g++.dg/cpp0x/initlist5.C new file mode 100644 index 000000000..32caac382 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist5.C @@ -0,0 +1,27 @@ +// Test for narrowing diagnostics +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +struct A { int i; int j; }; +A a2 { 1.2 }; // { dg-error "narrowing" } +A a1 { 1, 2 }; // aggregate initialization +struct B { + B(std::initializer_list<int>); +}; +B b1 { 1, 2 }; // creates initializer_list<int> and calls constructor +B b2 { 1, 2.0 }; // { dg-error "narrowing" } +struct C { + C(int i, double j); +}; +C c1 = { 1, 2.2 }; // calls constructor with arguments (1, 2.2) +C c2 = { 1.1, 2 }; // { dg-error "narrowing" } + +int j { 1 }; // initialize to 1 +int k {}; // initialize to 0 + +// PR c++/36963 +double d = 1.1; +float fa[] = { d, 1.1 }; // { dg-error "narrowing conversion of 'd'" } +constexpr double d2 = 1.1; +float fa2[] = { d2, 1.1 }; diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist50.C b/gcc/testsuite/g++.dg/cpp0x/initlist50.C new file mode 100644 index 000000000..ef4e72c7c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist50.C @@ -0,0 +1,21 @@ +// PR c++/45418 +// { dg-options -std=c++0x } + +struct A1 { }; +struct A2 { + A2(); +}; + +template <class T> struct B { + T ar[1]; + B(T t):ar({t}) {} +}; + +int main(){ + B<int> bi{1}; + A1 a1; + B<A1> ba1{a1}; + A2 a2; + A2 a2r[1]{{a2}}; + B<A2> ba2{a2}; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist51.C b/gcc/testsuite/g++.dg/cpp0x/initlist51.C new file mode 100644 index 000000000..9163dd3a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist51.C @@ -0,0 +1,15 @@ +// PR c++/47184 +// { dg-options -std=c++0x } + +struct S +{ + int a; +}; +struct T +{ + T(S s) {} +}; +int main() +{ + T t(S{1}); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist57.C b/gcc/testsuite/g++.dg/cpp0x/initlist57.C new file mode 100644 index 000000000..d945a4689 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist57.C @@ -0,0 +1,8 @@ +// PR c++/50054 +// { dg-options -std=c++0x } + +void g( const int& (a)[1] ) {} // { dg-error "array of references" } + +int main () { + g( { 1, 2 } ); // { dg-error "initializer list" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist6.C b/gcc/testsuite/g++.dg/cpp0x/initlist6.C new file mode 100644 index 000000000..523570315 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist6.C @@ -0,0 +1,30 @@ +// Test for initlist lifetime +// { dg-options "-std=c++0x" } +// { dg-do run } + +#include <initializer_list> + +int c; + +struct A +{ + A(int,int) { ++c; } + ~A() { --c; } +}; + +void f (std::initializer_list<A> l) { } + +int main() +{ + f({ {1,2}, {3,4} }); + if (c != 0) + return 1; + + { + std::initializer_list<A> l { {1,2}, {3,4} }; + if (c != 2) + return 2; + } + if (c != 0) + return 3; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist7.C b/gcc/testsuite/g++.dg/cpp0x/initlist7.C new file mode 100644 index 000000000..7913ed7ed --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist7.C @@ -0,0 +1,12 @@ +// PR c++/37932 +// { dg-options "-std=c++0x" } + +typedef enum { AA=1, BB=2 } my_enum; + +typedef struct { my_enum a:4 ; unsigned b:28; } stru; + +void foo (char c, my_enum x, int i) +{ + char arr[2] = {c+'0', 0}; // { dg-error "narrowing" } + stru s = {x,0}; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist8.C b/gcc/testsuite/g++.dg/cpp0x/initlist8.C new file mode 100644 index 000000000..db63eee78 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist8.C @@ -0,0 +1,19 @@ +// PR c++/37740 +// { dg-options "-std=c++0x" } + +struct A +{ + int i; +}; + +struct B +{ + double d; + A i; +}; + +int main() +{ + A a; + new B{3.2, a}; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist9.C b/gcc/testsuite/g++.dg/cpp0x/initlist9.C new file mode 100644 index 000000000..d596b3915 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist9.C @@ -0,0 +1,29 @@ +// PR c++/37860 +// { dg-options "-std=c++0x" } + +struct b +{ + bool t; + + b() = default; + ~b() = default; + b& operator=(const b&) = delete; + b(const b&) = delete; // { dg-error "declared" } + + b(bool _t): t (_t) { } +}; + +int main() +{ + // copy list initialization + b tst1 = { false }; + + // copy initialization. + b tst2 = false; // { dg-error "use" } + + // direct list initialization + b tst3 { false }; + + // default initialization + b tst4; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/inline-ns1.C b/gcc/testsuite/g++.dg/cpp0x/inline-ns1.C new file mode 100644 index 000000000..e422d8970 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inline-ns1.C @@ -0,0 +1,12 @@ +// { dg-options -std=c++0x } +// { dg-final { scan-assembler "_ZN1Q2V11fEv" } } +// { dg-final { scan-assembler "_ZN1Q2V11iE" } } + +namespace Q { + inline namespace V1 { + extern int i; + void f(); + } +} +int Q::i = 1; +void Q::f() { } diff --git a/gcc/testsuite/g++.dg/cpp0x/inline-ns2.C b/gcc/testsuite/g++.dg/cpp0x/inline-ns2.C new file mode 100644 index 000000000..03851725b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inline-ns2.C @@ -0,0 +1,25 @@ +// { dg-options -std=c++0x } + +namespace Q { + inline namespace V1 { + extern int i; // { dg-error "" } + extern int j; // { dg-error "" } + void f(); // { dg-error "" } + void g(); // { dg-error "" } + } + inline namespace V2 { + extern int j; // { dg-error "" } + void g(); // { dg-error "" } + } + extern int i; // { dg-error "" } + void f(); // { dg-error "" } + void h(); +} +namespace R { + using namespace Q; +} +int Q::i = 1; // { dg-error "ambiguous" } +int Q::j = 1; // { dg-error "ambiguous" } +void Q::f() { } // { dg-error "ambiguous" } +void Q::g() { } // { dg-error "ambiguous" } +void R::h() { } // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp0x/inline-ns3.C b/gcc/testsuite/g++.dg/cpp0x/inline-ns3.C new file mode 100644 index 000000000..7c9d6b9b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inline-ns3.C @@ -0,0 +1,26 @@ +// { dg-options -std=c++0x } + +namespace C +{ + void f(); +} + +namespace B +{ + using namespace C; + + inline namespace B1 + { + void f(); + } +} + +namespace A +{ + using namespace B; +} + +int main() +{ + A::f(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/inline-ns4.C b/gcc/testsuite/g++.dg/cpp0x/inline-ns4.C new file mode 100644 index 000000000..25caefc0a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inline-ns4.C @@ -0,0 +1,2 @@ +// { dg-options "-std=gnu++98 -pedantic" } +inline namespace { } // { dg-warning "inline namespaces" } diff --git a/gcc/testsuite/g++.dg/cpp0x/inline-ns5.C b/gcc/testsuite/g++.dg/cpp0x/inline-ns5.C new file mode 100644 index 000000000..20a3dc6bb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inline-ns5.C @@ -0,0 +1,2 @@ +// { dg-options "-std=gnu++98 -pedantic-errors" } +inline namespace { } // { dg-error "inline namespaces" } diff --git a/gcc/testsuite/g++.dg/cpp0x/iop.C b/gcc/testsuite/g++.dg/cpp0x/iop.C new file mode 100644 index 000000000..834cd314a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/iop.C @@ -0,0 +1,41 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test that the implicit object parameter is *not* an rvalue reference, but is instead +// identical to that specified in C++03. That is, the implicit object parameter is +// an lvalue reference that can bind to an rvalue. :-\ +// See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html under the +// section "Revision 1 Summary and Rationale" for more details. + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; + +struct os +{ + one operator<<(int); +}; + +struct A +{ + A(int); +}; + +two operator<<(os&, const A&); + +void test() +{ + os o; + sa<sizeof(o << 1) == 1 * sizeof(long)> t1; // Calls os::operator<<(int) + // Would be ambiguous if the implicit object parameter + // was an rvalue reference. +} + +int main() +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-50220.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-50220.C new file mode 100644 index 000000000..240143cf6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-50220.C @@ -0,0 +1,9 @@ +// PR c++/50220 +// { dg-options -std=c++0x } + +template<typename Foo> struct Foobar {}; + +void foobar(const Foobar<void>& obj) +{ + [obj](){}(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-98.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-98.C new file mode 100644 index 000000000..ff1085f30 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-98.C @@ -0,0 +1,8 @@ +// PR c++/46159 +// { dg-options -std=c++98 } + +void +f() +{ + int **p = new(int(*[2])); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-array.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-array.C new file mode 100644 index 000000000..2129051ed --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-array.C @@ -0,0 +1,20 @@ +// Test that array capture by copy works. +// { dg-options -std=c++0x } +// { dg-do run } + +struct A +{ + int i; + A(int i): i(i) {} + A(const A& a): i(a.i+1) {} +}; + +int main() +{ + A ar[4][3] = { { 10, 20, 30 }, + { 40, 50, 60 }, + { 70, 80, 90 }, + { 100, 110, 120 } }; + int i = [ar] { return ar[1][1]; }().i; + return (i!= 52); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref-neg.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref-neg.C new file mode 100644 index 000000000..7d1a1bd89 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref-neg.C @@ -0,0 +1,14 @@ +// { dg-options "-std=c++0x" } +#include <cassert> + +int main() { + int i = 1, j = 2; + const int& ci = i; + [&ci, &j] () -> void { j = ci; } (); + assert(i == 1); + assert(j == 1); + [&ci] () -> void { ci = 0; } (); // { dg-error "" "cannot assign to const int&" } + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref.C new file mode 100644 index 000000000..704c24085 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-const-ref.C @@ -0,0 +1,15 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } +#include <cassert> + +int main() { + int i = 1, j = 2; + const int& ci = i; + [&ci, &j] () -> void { j = ci; } (); + assert(i == 1); + assert(j == 1); + //[&ci] () -> void { ci = 0; } (); { dg-error: cannot assign to const int& } + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const-neg.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const-neg.C new file mode 100644 index 000000000..7e7541ca2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const-neg.C @@ -0,0 +1,19 @@ +// { dg-options "-std=c++0x" } + +#include <cassert> + +template<typename F> +void call(const F& f) { f(); } + +int main() { + call([] () -> void {}); + call([] () mutable -> void {}); + + int i = -1; + call([&i] () -> void { i = 0; }); + assert(i == 0); + call([i] () -> void { i = 0; }); // { dg-error "" "assignment to non-reference capture in const lambda" } + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const.C new file mode 100644 index 000000000..5f6f0b3dc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const.C @@ -0,0 +1,20 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } + +#include <cassert> + +template<typename F> +void call(const F& f) { f(); } + +int main() { + call([] () -> void {}); + //call([] () mutable -> void {}); // { dg-error: "`f' does not have const `operator()'" } + + int i = -1; + call([&i] () -> void { i = 0; }); + assert(i == 0); + //call([i] () -> void { i = 0; }); // { dg-error: "assignment to non-reference capture in const lambda" } + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C new file mode 100644 index 000000000..5409d5ca3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv.C @@ -0,0 +1,14 @@ +// Test for conversion from stateless lambda to function pointer. + +// { dg-options -std=c++0x } +// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZZ1fvENKUlvE_cvPFvvEEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin *-*-hpux10* } } } } } + +inline void f() +{ + void (*pfn)() = []{}; +} + +int main() +{ + f(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv2.C new file mode 100644 index 000000000..fc19c9969 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv2.C @@ -0,0 +1,12 @@ +// Test for conversion from stateless lambda to function pointer. + +// { dg-options -std=c++0x } +// { dg-do run } + +typedef int (*pfn)(int); + +int main() +{ + pfn p = [](int i) { return i-42; }; + return p (42); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv3.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv3.C new file mode 100644 index 000000000..e4e7daffd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv3.C @@ -0,0 +1,12 @@ +// Conversion to a function pointer uses a generic thunk, which doesn't +// work properly for variadics. Make sure that we can still use the lambda +// normally. + +// { dg-options -std=c++0x } + +void f() +{ + auto l = [](...){}; + void (*p1)(...) = l; // { dg-bogus "sorry" "" { xfail *-*-* } } + l(); // OK +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv4.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv4.C new file mode 100644 index 000000000..6584d28b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv4.C @@ -0,0 +1,13 @@ +// PR c++/43641 +// { dg-options "-std=c++0x" } + +struct B +{ + int i; +}; + +void func() +{ + [](const B& b) -> const int& { return b.i; }; + [](const B& b) { return b; }; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv5.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv5.C new file mode 100644 index 000000000..53d8e995e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv5.C @@ -0,0 +1,15 @@ +// PR c++/45080 +// { dg-options -std=c++0x } + +typedef void(*pfn)(); + +template<typename=int> +void f() +{ + pfn fn = []{}; +} + +void test() +{ + f(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default-neg.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default-neg.C new file mode 100644 index 000000000..1af2a95d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default-neg.C @@ -0,0 +1,13 @@ +// { dg-options "-std=c++0x" } + +int main() { + int i; + const char* s; + [=] () -> void { i; s; i; s; } (); + + [] () -> void { i; } (); // { dg-error "" "`i' is not captured" } + [1] () -> void {} (); // { dg-error "expected identifier" } + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default.C new file mode 100644 index 000000000..239a99cbf --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-default.C @@ -0,0 +1,14 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } + +int main() { + int i; + const char* s; + [=] () -> void { i; s; i; s; } (); + + //[] () -> void { i; } (); // { dg-error: "`i' is not in scope" } + //[1] () -> void {} (); // { dg-error: "expected identifier" } + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-neg.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-neg.C new file mode 100644 index 000000000..d77e57e63 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy-neg.C @@ -0,0 +1,13 @@ +// { dg-options "-std=c++0x" } + +int main() { + int i; + const char* s; + [i, s] () -> void { i; s; } (); + + [] () -> void { i; } (); // { dg-error "" "`i' is not captured" } + [1] () -> void {} (); // { dg-error "expected identifier" } + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy.C new file mode 100644 index 000000000..7356872e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-copy.C @@ -0,0 +1,14 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } + +int main() { + int i; + const char* s; + [i, s] () -> void { i; s; } (); + + //[] () -> void { i; } (); // { dg-error: "`i' is not in scope" } + //[1] () -> void {} (); // { dg-error: "expected identifier" } + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctor-neg.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctor-neg.C new file mode 100644 index 000000000..76ed7445f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctor-neg.C @@ -0,0 +1,25 @@ +// { dg-options -std=c++0x } + +void f() +{ + int i; + auto lam = [i]{}; // { dg-message "" } + decltype(lam) lam2 = { 1 }; // { dg-error "" "not an aggregate" } + decltype(lam) lam3; // { dg-error "" "deleted default ctor" } + lam3 = lam; // { dg-error "" "deleted assignment op" } +} + +template <class T> +void g(T i) +{ + auto lam = [i]{}; // { dg-message "" } + decltype(lam) lam2 = { 1 }; // { dg-error "" "not an aggregate" } + decltype(lam) lam3; // { dg-error "" "deleted default ctor" } + lam3 = lam; // { dg-error "" "deleted assignment op" } +} + +int main() +{ + f(); + g(1); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctors.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctors.C new file mode 100644 index 000000000..e263145b0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ctors.C @@ -0,0 +1,18 @@ +// { dg-options -std=c++0x } +// { dg-do run } + +struct A +{ + A() { } + A(A&) { } + A(A&&) { } +}; + +int main() +{ + A a; + auto lam4 = [a]{}; // OK, implicit move ctor + lam4(); + auto lam5 = lam4; // OK, implicit copy ctor + lam5(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-debug.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-debug.C new file mode 100644 index 000000000..07fc1896c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-debug.C @@ -0,0 +1,15 @@ +// PR c++/43502 +// { dg-options "-std=c++0x -fcompare-debug" } + +void g (int n) +{ + int bef ([]{return 0;}()); +} +struct S { + void f (int = []{return 0;}(), int = [] { return 0;}()); +}; +int main () +{ + S ().f (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C new file mode 100644 index 000000000..bfe7acab6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg.C @@ -0,0 +1,24 @@ +// Testcase for an extension to allow return type deduction when the lambda +// contains more than just a single return-statement. + +// { dg-options -std=c++0x } + +bool b; +template <class T> +T f (T t) +{ + return [=] + { + auto i = t+1; + if (b) + return i+1; + else + return i+2; // { dg-error "lambda return type" } + }(); +} + +int main() +{ + if (f(1) != 3) + return 1; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg2.C new file mode 100644 index 000000000..a236e6d11 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext-neg2.C @@ -0,0 +1,22 @@ +// Test that in pedantic mode, we warn about the extension to allow return +// type deduction when the lambda contains more than just a single +// return-statement. + +// { dg-options "-std=c++0x -pedantic" } + +bool b; +template <class T> +T f (T t) +{ + [=] { return t+1; }; // OK + return [=] { + auto i = t+1; + return i+1; // { dg-warning "only statement" } + }(); +} + +int main() +{ + if (f(1) != 3) + return 1; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext.C new file mode 100644 index 000000000..9b5ab7983 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-ext.C @@ -0,0 +1,27 @@ +// Testcase for an extension to allow return type deduction when the lambda +// contains more than just a single return-statement. + +// { dg-options -std=c++0x } +// { dg-do run } + +bool b; +template <class T> +T f (T t) +{ + return [=] { + auto i = t+1; + if (b) + return i+1; + else + return i+1; + }(); +} + +int main() +{ + // Pointless, but well-formed. + [] { return 1; return 2; }(); + + if (f(1) != 3) + return 1; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-neg.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-neg.C new file mode 100644 index 000000000..4abdf59a6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce-neg.C @@ -0,0 +1,10 @@ +// { dg-options "-std=c++0x" } +#include <cassert> + +int main() { + int i = 0; + int& r = [&] () { return i; } (); // { dg-error "" "invalid initialization of non-const reference of type .int&. from a temporary of type .int." } + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce.C new file mode 100644 index 000000000..cc5cc5402 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce.C @@ -0,0 +1,29 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } +#include <cassert> + +int main() { + [] {}; + [] {} (); + [] () {}; + [] () {} (); + [] () { return "lambda"; }; + + int i = 1, j = 2; + [&i, j] () { i = j; } (); + assert(i == 2); + assert(j == 2); + + i = [] () { return 3; } (); + assert(i == 3); + + int k = [&] () { return i; } (); + + []{ return; }; + + int array[] = { 1, 2, 3 }; + int* p = [&] () { return array; } (); + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C new file mode 100644 index 000000000..718d49cd9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-deduce2.C @@ -0,0 +1,7 @@ +// PR c++/43875 +// { dg-options "-std=c++0x" } + +int main() +{ + auto x2 = []{ return { 1, 2 }; }; // { dg-message "return" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg.C new file mode 100644 index 000000000..069935823 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg.C @@ -0,0 +1,6 @@ +// { dg-options "-std=c++0x -pedantic-errors" } + +int main() +{ + [](int a = 1) { return a; }(); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg2.C new file mode 100644 index 000000000..f47c5ba27 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg2.C @@ -0,0 +1,7 @@ +// PR c++/43886 +// { dg-options -std=c++0x } + +void f2() { + int i = 1; + void g5(int = ([]{ return sizeof i; })()); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-direct-init.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-direct-init.C new file mode 100644 index 000000000..bbc2a1ca5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-direct-init.C @@ -0,0 +1,14 @@ +// Test that capture by copy uses direct-initialization. +// { dg-options "-std=c++0x" } + +struct A +{ + A(); + explicit A(const A&); +}; + +int main() +{ + A a; + [a]{}; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh.C new file mode 100644 index 000000000..ea5060d1a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh.C @@ -0,0 +1,35 @@ +// Test that we properly clean up if we get an exception in the middle of +// constructing the closure object. +// { dg-options -std=c++0x } + +// This test fails because of PR 41449; it isn't a lambda issue. +// { dg-do run { xfail *-*-* } } + +struct A +{ + A() {} + A(const A&) { throw 1; } +}; + +int bs; +struct B +{ + B() { ++bs; } + B(const B&) { ++bs; } + ~B() { --bs; } +}; + +int main() +{ + { + B b1, b2; + A a; + + try + { + [b1, a, b2]{ }; + } + catch(...) {} + } + return bs; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C new file mode 100644 index 000000000..0c94b554f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-eh2.C @@ -0,0 +1,17 @@ +// PR c++/47263 +// PR c++/49260 +// { dg-options "-std=c++0x -fno-asynchronous-unwind-tables -fno-dwarf2-cfi-asm" } +// { dg-do run } + +#include <exception> + +int main( void ) +{ + std::set_unexpected( []{ throw 0; } ); + try + { + []() throw( int ) { throw nullptr; }(); + } + catch( int ) + { } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C new file mode 100644 index 000000000..f4766691e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc.C @@ -0,0 +1,18 @@ +// Test that error messages about creating the closure object refer to +// the lambda-introducer. +// { dg-options -std=c++0x } + +struct A +{ + A(); + A(const A& a) = delete; // { dg-error "declared" } +}; + +int main() +{ + A ar[4][3]; + [ar] { }; // { dg-error "3:" } + + A a; + [a] { }; // { dg-error "3:" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C new file mode 100644 index 000000000..dab53f127 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-errloc2.C @@ -0,0 +1,19 @@ +// PR c++/42399 +// { dg-options "-std=c++0x" } + +struct A { + A(); + A(const A&) = delete; // { dg-error "declared" } +}; + +template <class T> +void f() +{ + T t; + [t] { return 0; }; // { dg-error "use" } +} + +int main() +{ + f<A>(); // { dg-message "instantiated" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-field-names.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-field-names.C new file mode 100644 index 000000000..b292d8898 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-field-names.C @@ -0,0 +1,21 @@ +// "For each entity captured by copy, an unnamed non-static data member is +// declared in the closure type" -- test that there isn't a member of the +// closure with the same name as the captured variable. + +// { dg-options -std=c++0x } + +template <class T> +struct A: public T +{ + A(T t): T(t) { } + int f() { return this->i; } // { dg-error "" "no member named i" } +}; + +int main() +{ + int i = 42; + auto lam = [i]{ }; + lam.i = 24; // { dg-error "" "no member named i" } + A<decltype(lam)> a(lam); + return a.f(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice1.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice1.C new file mode 100644 index 000000000..1ea8f4d7b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice1.C @@ -0,0 +1,13 @@ +// PR c++/43790 +// { dg-options "-std=c++0x" } + +struct A +{ + int f(); +}; + +int main() +{ + A a; + auto l = [] () { return a.f(); }; // { dg-error "not captured|return" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice2.C new file mode 100644 index 000000000..352137aad --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice2.C @@ -0,0 +1,16 @@ +// PR c++/42083 +// { dg-options "-std=c++0x" } + +template<typename F> +decltype(F()) run(F f) // { dg-message "note" } +{ + return f(); +} + +int main() +{ + auto l = []() { return 5; }; + + run(l); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 14 } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C new file mode 100644 index 000000000..8ff36478d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice3.C @@ -0,0 +1,23 @@ +// PR c++/47795 +// { dg-options "-std=c++0x" } + +class Klass +{ + unsigned int local; +public: + bool dostuff(); +}; + +bool Klass::dostuff() +{ + auto f = []() -> bool { + if (local & 1) { return true; } // { dg-error "not captured" } + return false; + }; +} + +int main() +{ + Klass c; + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice4.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice4.C new file mode 100644 index 000000000..77c773bbd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice4.C @@ -0,0 +1,14 @@ +// PR c++/47242 +// { dg-options "-std=c++0x" } + +template < typename > void +bar () +{ + [i]{}; // { dg-error "declared|invalid" } +} + +void +foo () +{ + bar<int>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class-neg.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class-neg.C new file mode 100644 index 000000000..a93857e46 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class-neg.C @@ -0,0 +1,35 @@ +// { dg-options "-std=c++0x" } + +#include <cassert> + +class C { + private: + int m_i; + + public: + C() : m_i(-1) { + [] { this; } (); // { dg-error "not captured" } + [this] () -> void { m_i = 0; } (); + assert(m_i == 0); + [this] () -> void { this->m_i = 1; } (); + assert(m_i == 1); + [&] () -> void { m_i = 2; } (); + assert(m_i == 2); + [&] () -> void { this->m_i = 3; } (); + assert(m_i == 3); + [=] () -> void { m_i = 4; } (); // copies 'this' or --copies-m_i--? + assert(m_i == 4); + [=] () -> void { this->m_i = 5; } (); + assert(m_i == 5); + } + +}; + +int main() { + C c; + + [this] () -> void {} (); // { dg-error "use of 'this' in non-member function" } + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class.C new file mode 100644 index 000000000..33f4301e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-in-class.C @@ -0,0 +1,36 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } + +#include <cassert> + +class C { + private: + int m_i; + + public: + C() : m_i(-1) { + //[] { this; } (); + [this] () -> void { m_i = 0; } (); + assert(m_i == 0); + [this] () -> void { this->m_i = 1; } (); + assert(m_i == 1); + [&] () -> void { m_i = 2; } (); + assert(m_i == 2); + [&] () -> void { this->m_i = 3; } (); + assert(m_i == 3); + [=] () -> void { m_i = 4; } (); // copies 'this' or --copies-m_i--? + assert(m_i == 4); + [=] () -> void { this->m_i = 5; } (); + assert(m_i == 5); + } + +}; + +int main() { + C c; + + //[this] () -> void {} (); // { dg-error: "cannot capture `this' outside of class method" } + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-init.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-init.C new file mode 100644 index 000000000..03c94e959 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-init.C @@ -0,0 +1,8 @@ +// Test for the explicit initializer extension +// { dg-options "-std=c++0x" } + +int main() +{ + int j = [i = 2]{sizeof(i); return i;}(); + return (j != 2); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-lookup-neg.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-lookup-neg.C new file mode 100644 index 000000000..e07e892a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-lookup-neg.C @@ -0,0 +1,7 @@ +// Test that we don't crash on a failed lookup. +// { dg-options -std=c++0x } + +int main() +{ + [i]{}; // { dg-error "not declared" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C new file mode 100644 index 000000000..5c9b483d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle.C @@ -0,0 +1,103 @@ +// Test lambda mangling +// { dg-require-weak "" } +// { dg-options "-std=c++0x -fno-inline" } + +template<typename F> int algo(F fn) { return fn(); } +inline void g(int n) { + int bef(int i = []{ return 1; }()); + // Default arguments of block-extern function declarations + // remain in the context of the encloding function body. + // The closure type is encoded as Z1giEUlvE_. + // The call operator of that type is _ZZ1giENKUlvE_clEv. + +// { dg-final { scan-assembler "_ZZ1giENKUlvE_clEv" } } +// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZZ1giENKUlvE_clEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin } } } } } + + algo([=]{return n+bef();}); + // The captured entities do not participate in <lambda-sig> + // and so this closure type has the same <lambda-sig> as + // the previous one. It encoding is therefore Z1giEUlvE0_ + // and the call operator is _ZZ1giENKUlvE0_clEv. The + // instance of "algo" being called is then + // _Z4algoIZ1giEUlvE0_EiT_. + +// { dg-final { scan-assembler "_Z4algoIZ1giEUlvE0_EiT_" } } +// { dg-final { scan-assembler "_ZZ1giENKUlvE0_clEv" } } + + int i = []{return 1;}(); + +} + +struct S { + void f(int = + // Type: ZN1S1fEiiEd0_UlvE_ + // Operator: _ZZN1S1fEiiEd0_NKUlvE_clEv +// { dg-final { scan-assembler "_ZZN1S1fEiiEd0_NKUlvE_clEv" } } +// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZZN1S1fEiiEd0_NKUlvE_clEv" { target { ! { *-*-darwin* *-*-mingw* *-*-cygwin } } } } } + []{return 1;}() + // Type: ZN1S1fEiiEd0_UlvE0_ + // Operator: _ZZN1S1fEiiEd0_NKUlvE0_clEv +// { dg-final { scan-assembler "_ZZN1S1fEiiEd0_NKUlvE0_clEv" } } + + []{return 2;}(), + int = + // Type: ZN1S1fEiiEd_UlvE_ + // Operator: _ZZN1S1fEiiEd_NKUlvE_clEv +// { dg-final { scan-assembler "_ZZN1S1fEiiEd_NKUlvE_clEv" } } + []{return 3;}()); +}; + +template<typename T> struct R { + static int x; +}; +template<typename T> int R<T>::x = []{return 1;}(); +template int R<int>::x; +// Type of lambda in intializer of R<int>::x: N1RIiE1xMUlvE_E +// Corresponding operator(): _ZNK1RIiE1xMUlvE_clEv +// { dg-final { scan-assembler "_ZNK1RIiE1xMUlvE_clEv" } } +// { dg-final { scan-assembler "weak\[^\n\r\]*_?_ZNK1RIiE1xMUlvE_clEv" { target { ! { *-*-mingw* *-*-cygwin } } } } } + +void bar() +{ + // lambdas in non-vague linkage functions have internal linkage. + // { dg-final { scan-assembler-not "weak\[^\n\r\]*bar\[^\n\r\]*Ul" } } + []{}(); +} + +// lambdas used in non-template, non-class body initializers are internal. +// { dg-final { scan-assembler-not "weak\[^\n\r\]*_ZNKUlv" } } +// { dg-final { scan-assembler-not "weak\[^\n\r\]*variable" } } +int variable = []{return 1;}(); + +// And a template instantiated with such a lambda is also internal. +// { dg-final { scan-assembler-not "weak\[^\n\r\]*algoIUl" } } +int var2 = algo([]{return 1;}); + +// As are lambdas used in non-class-body default arguments. +// { dg-final { scan-assembler-not "weak\[^\n\r\]*function" } } +void function (int i = []{return 1;}()+[]{return 1;}()); + +struct Foo +{ + static int Int; + void Bar(int); +}; + +int Foo::Int = []{return 1;}(); +// Even default arguments for member functions that appear outside the +// class body are internal. +// { dg-final { scan-assembler-not "weak\[^\n\r\]*Foo" } } +void Foo::Bar(int i = []{return 1;}()) {} + +// Even default arguments for function templates. +// { dg-final { scan-assembler-not "weak\[^\n\r\]*fn2\[^\n\r\]*Ulv" } } +template <class T> +void fn2 (T t = []{return 1;}()) {} + +int main() +{ + g(42); + S().f(); + function(); + Foo().Bar(); + fn2<int>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle2.C new file mode 100644 index 000000000..4b7d15ad9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle2.C @@ -0,0 +1,21 @@ +// PR c++/49276 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <int N> +struct F +{ + template <typename U> F (U); +}; + +struct S +{ + void foo (F <0> x = [] {}) {} +}; + +int +main () +{ + S s; + s.foo (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mixed.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mixed.C new file mode 100644 index 000000000..ed0565fa9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mixed.C @@ -0,0 +1,13 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } +#include <cassert> + +int main() { + int i = 1, j = 2; + [&i, j] () mutable -> void { i = 0; j = 0; } (); + assert(i == 0); + assert(j == 2); + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable.C new file mode 100644 index 000000000..73a4d1bac --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mutable.C @@ -0,0 +1,16 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } +#include <cassert> + +int main() { + int i = 1; + const char* s1 = "hello"; + const char* s2 = s1; + [i, s2] () mutable -> void { i = 2; s2 = "world"; } (); + //[i, s2] () -> void { i = 2; s2 = "world"; } (); // { dg-error: "assignment of data-member in read-only structure" } + assert(i == 1); + assert(s1 == s2); + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested.C new file mode 100644 index 000000000..feb0cde59 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested.C @@ -0,0 +1,63 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } + +#include <cassert> + +struct A { + int i; + A(): i(42) { } + int f() { + return [this]{ + return [=]{ return i; }(); + }(); + } +}; + +int main() { + int i = 1; + + [] (int& i) -> void { + [&] () -> void { + i = 2; + } (); + } (i); + + assert(i == 2); + + [&] () -> void { + [&i] () -> void { + i = 3; + } (); + } (); + + assert(i == 3); + + [&] () -> void { + [&] () -> void { + i = 4; + } (); + } (); + + assert(i == 4); + i = 4; + + [&] () -> void { + [=] () mutable -> void { + i = 5; + } (); + } (); + + assert(i == 4); + + [=] () mutable -> void { + [&] () -> void { + i = 6; + } (); + } (); + + assert(i == 4); + + assert (A().f() == 42); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested2.C new file mode 100644 index 000000000..b78874855 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested2.C @@ -0,0 +1,31 @@ +// Testcase from N2998 +// { dg-options -std=c++0x } + +void f1(int i) { + int const N = 20; + auto m1 = [=]{ + int const M = 30; + auto m2 = [i]{ + int x[N][M]; // OK: N and M are not "used" + x[0][0] = i; // OK: i is explicitly captured by m2 + // and implicitly captured by m1 + }; + }; + struct s1 { + int f; + int work(int n) { + int m = n*n; + int j = 40; + auto m3 = [this,m]{ + /*auto m4=*/[&,j]{ // { dg-error "j. is not captured" } + int x = n; // { dg-error "n. is not captured" } + x += m; // OK: m implicitly captured by m4 + // and explicitly captured by m3 + x += i; // { dg-error "i. is not captured" } + x += f; // OK: this captured implicitly by m4 + // and explicitly by m3 + }; + }; + } + }; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested3.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested3.C new file mode 100644 index 000000000..2cc6f9640 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nested3.C @@ -0,0 +1,12 @@ +// PR c++/41896 +// { dg-options "-std=c++0x" } + +void nested_lambda() +{ + float val; + + [val]() + { + [val](){}; + }; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-non-const.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-non-const.C new file mode 100644 index 000000000..b6489de4b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-non-const.C @@ -0,0 +1,19 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } + +#include <cassert> + +template<typename F> +void call(F f) { f(); } + +int main() { + call([] () -> void {}); + call([] () mutable -> void {}); + + int i = -1; + call([i] () mutable -> void { i = 0; }); + assert(i == -1); + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nop.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nop.C new file mode 100644 index 000000000..74149b231 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-nop.C @@ -0,0 +1,19 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } +#include <cassert> + +int main() { + int i = 1, j = 2; + [i, j] () -> void {} (); + assert(i == 1); + assert(j == 2); + [&i, &j] () -> void {} (); + assert(i == 1); + assert(j == 2); + [] (int x) -> void {} (1); + [] (int& x) -> void {} (i); + [] (int x, int y) -> void {} (i, j); + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ns-scope.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ns-scope.C new file mode 100644 index 000000000..cde0c2e53 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ns-scope.C @@ -0,0 +1,18 @@ +// { dg-options -std=c++0x } +// { dg-do run } + +auto f = [](int i) { return i+1; }; + +int g(int i = [] { return 237; }()) +{ + return i; +} + +int main() +{ + if (f(41) != 42) + return 1; + if (g() != 237) + return 2; + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-pass.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-pass.C new file mode 100644 index 000000000..9dd64484a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-pass.C @@ -0,0 +1,27 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } + +#include <cassert> +#include <algorithm> + +template <typename F, typename A1> +void call(F f, const A1& arg1) { + f(arg1); +} + +int main() { + int i = 1; + call( + [&i] (int j) -> void { i = j; }, + 2 + ); + assert(i == 2); + + int A[] = {1, 2, 3, 4}; + int sum = 0; + std::for_each(A, A+4, [&sum] (int n) -> void { sum += n; }); + assert(sum == 10); + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-qualified.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-qualified.C new file mode 100644 index 000000000..ef041c2bb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-qualified.C @@ -0,0 +1,17 @@ +// PR c++/50089 +// { dg-options -std=c++0x } + +struct TestBase +{ + void foo() {} +}; + +struct Test : TestBase +{ + void foo() + { + [this]{ + /*this->*/TestBase::foo(); // ICE without this-> + }(); + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-recursive.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-recursive.C new file mode 100644 index 000000000..1a12eab31 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-recursive.C @@ -0,0 +1,21 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } + +//#include <iostream> +#include <functional> +#include <cassert> + +int main() { + + std::function<int(int)> fib = [&fib] (int n) -> int { + //std::cerr << "fib(" << n << ")\n"; + if (n <= 2) return 1; + else return fib(n-1) + fib(n-2); + }; + + assert(fib(5) == 5); + assert(fib(10) == 55); + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref-default.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref-default.C new file mode 100644 index 000000000..40376f43d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref-default.C @@ -0,0 +1,15 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } + +#include <cassert> + +int main() { + int i = 1; + float j = 2.0; + [&] () -> void { i = 3; j = 4.0; } (); + assert(i == 3); + assert(j == 4.0); + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref.C new file mode 100644 index 000000000..a5ee7b4c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref.C @@ -0,0 +1,15 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } + +#include <cassert> + +int main() { + int i = 1; + float j = 2.0; + [&i, &j] () -> void { i = 3; j = 4.0; } (); + assert(i == 3); + assert(j == 4.0); + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref2.C new file mode 100644 index 000000000..15f1d9034 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ref2.C @@ -0,0 +1,13 @@ +// PR c++/49598 +// { dg-options -std=c++0x } +// { dg-do run } + +int +main() +{ + int i = 10; + int& ir = i; + + if ([=]{ return ir; }() != 10) + return 1; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-std-function.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-std-function.C new file mode 100644 index 000000000..26c09fdb1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-std-function.C @@ -0,0 +1,22 @@ +// Test using std::function wrapper. +// { dg-do run } +// { dg-options -std=c++0x } + +#include <functional> + +typedef std::function<int()> FN; + +template<typename T> +FN f(T fn) +{ + return [fn]{return fn(2);}; +} + +int main() +{ + auto fn = f([](int i){return i*21;}); + + if (fn() != 42) + return 1; + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template.C new file mode 100644 index 000000000..b4db3b881 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template.C @@ -0,0 +1,41 @@ +// { dg-options -std=c++0x } +// { dg-do run } + +extern "C" void abort(); + +template <class T> +auto apply (T t) -> decltype (t()) +{ + return t(); +} + +template <class T> +T f(T t) +{ + T t2 = t; + if (t != [=]()->T { return t; }()) + abort (); + if (t != [=] { return t; }()) + abort (); + if (t != [=] { return t2; }()) + abort (); + if (t != [&] { return t; }()) + abort (); + if (t != apply([=]{return t;})) + abort (); + + int i; + [&] (int a) { return a+i+t; } (0); + [&] (int a) -> decltype(a) { return a+i+t; } (0); + [&] (int a) -> decltype(i) { return a+i+t; } (0); + [&] (int a) -> decltype(t) { return a+i+t; } (0); + [&] (int a) -> decltype(a+i) { return a+i+t; } (0); + [&] (int a) -> decltype(a+t) { return a+i+t; } (0); + [&] (int a) -> decltype(i+t) { return a+i+t; } (0); + [&] (int a) -> decltype(a+i+t) { return a+i+t; } (0); +} + +int main() +{ + f(0xbeef); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template2.C new file mode 100644 index 000000000..12ffde724 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template2.C @@ -0,0 +1,20 @@ +// PR c++/47049 +// { dg-options -std=c++0x } + +enum { E = 0, F = 1 }; +template <int N, int M = ((N == 1) ? F : E)> class S {}; +template <int N> +struct T +{ + static void + foo (S<N> *p) + { + S<N> u; + [&u] ()->bool {} (); + } +}; + +int main() +{ + T<0>().foo(0); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this.C new file mode 100644 index 000000000..ed2747654 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this.C @@ -0,0 +1,13 @@ +// Test that implicit 'this' capture works, but that it's still an rvalue. +// { dg-options -std=c++0x } + +struct A +{ + int i; + void f() + { + [=] { i = 0; }; + [&] { i = 0; }; + [=] { this = 0; }; // { dg-error "lvalue" } + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this2.C new file mode 100644 index 000000000..04fe474c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this2.C @@ -0,0 +1,17 @@ +// PR c++/43856 +// Test for implicit 'this' capture via rewriting. +// { dg-options "-std=c++0x" } + +struct S1 { + int operator()(int); + int i; + void g(); + void f() { + [=]() { + i; + g(); + S1::g(); + operator()(42); + }; + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C new file mode 100644 index 000000000..de0d357f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C @@ -0,0 +1,14 @@ +// PR c++/45520 +// { dg-options -std=c++0x } + +struct M { + int i; +}; + +struct S { + M m; + + void f() { + auto lambda=[&](decltype(m.i) & i) { }; + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this4.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this4.C new file mode 100644 index 000000000..29cd2a97b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this4.C @@ -0,0 +1,13 @@ +// PR c++/48523 +// { dg-options -std=c++0x } + +template<typename> +struct X +{ + bool b; + + void f() + { + [this]{ return b; }; + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-type.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-type.C new file mode 100644 index 000000000..3b2a2a76a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-type.C @@ -0,0 +1,74 @@ +// Every id-expression that is a use (_basic.def.odr_ 3.2) of an entity +// captured by copy is transformed into an access to the corresponding +// unnamed data member of the closure type. +//... +// Every occurrence of decltype((x)) where x is a possibly parenthesized +// id-expression that names an entity of automatic storage duration is +// treated as if x were transformed into an access to a corresponding data +// member of the closure type that would have been declared if x were a use +// of the denoted entity. + +// So, other appearances of 'x' within decltype do not refer to the closure +// member, because they are not "use"s in the sense of 3.2. + +// { dg-options -std=c++0x } + +template<class T, class U> +struct same_type; +template <class T> +struct same_type<T,T> { }; + +int main() +{ + int i; + [=] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int const&>(); + i+1; + same_type<decltype((i)),int const&>(); + same_type<decltype(i),int>(); + }; + [=] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int const&>(); + same_type<decltype(i),int>(); + }; + [=] () mutable { + same_type<decltype(i),int>(); + same_type<decltype((i)),int &>(); + same_type<decltype(i),int>(); + }; + [&] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int &>(); + same_type<decltype(i),int>(); + }; + [i] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int const&>(); + }; + [&,i] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int const&>(); + }; + [i] () mutable { + same_type<decltype(i),int>(); + same_type<decltype((i)),int &>(); + }; + [&,i] () mutable { + same_type<decltype(i),int>(); + same_type<decltype((i)),int &>(); + }; + [&i] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int &>(); + }; + [=,&i] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int &>(); + }; + [] { + same_type<decltype(i),int>(); + same_type<decltype((i)),int const&>(); // { dg-error "" "not captured" } + }; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C new file mode 100644 index 000000000..33ba7b0a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C @@ -0,0 +1,7 @@ +// 5.1.2/2: A lambda-expression shall not appear in an unevaluated operand. +// { dg-options "-std=c++0x" } + +template <class T> +struct A { }; +A<decltype([]{ return 1; }())> a; // { dg-error "lambda.*unevaluated context" } + diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use.C new file mode 100644 index 000000000..b1d6c300c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use.C @@ -0,0 +1,12 @@ +// { dg-options -std=c++0x } + +int main(int argc, char** argv) +{ + int i; + int &ir = i; + const int ci = 0; + const int &cir = ci; + + [] { sizeof (argc); sizeof (i); sizeof (ir); sizeof (ci); sizeof (cir); }; + [] { int ia[ci]; }; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C new file mode 100644 index 000000000..695a0b432 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-use2.C @@ -0,0 +1,11 @@ +// PR c++/50224 +// { dg-options "-std=c++0x -Wunused-parameter" } + +struct T; + +void m(T& t) // ERROR here +{ + [&]{ + t; // ``t`` is referenced here + }; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic1.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic1.C new file mode 100644 index 000000000..f17b33618 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-variadic1.C @@ -0,0 +1,15 @@ +// PR c++/49672 +// { dg-options -std=c++0x } + +template<typename ... Args> +static void foo() +{ + [](Args..., int x) { + x; + }; +} + +int main() +{ + foo(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn1.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn1.C new file mode 100644 index 000000000..b384d5cff --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn1.C @@ -0,0 +1,8 @@ +// PR c++/41920 +// { dg-options "-std=c++0x -Wall -Wextra" } + +int foo(int i) +{ + auto bar = [=](){ return i; }; + return bar(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn2.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn2.C new file mode 100644 index 000000000..ce5e7c450 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn2.C @@ -0,0 +1,7 @@ +// PR c++/42370 +// { dg-options "-std=c++0x -Wall" } + +void foo() +{ + []{ return 0; }(); +} // { dg-bogus "no return statement" } diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn3.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn3.C new file mode 100644 index 000000000..77f35bc46 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-warn3.C @@ -0,0 +1,12 @@ +// PR c++/49482 +// { dg-options "-std=c++0x -Wunused-but-set-parameter" } + +template<class T> +void f() { + []( bool b ){ return b; }; +} + +int main() +{ + f<int>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/linkage2.C b/gcc/testsuite/g++.dg/cpp0x/linkage2.C new file mode 100644 index 000000000..f41c21a77 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/linkage2.C @@ -0,0 +1,33 @@ +// DR 743: A type without linkage shall not be used as the type of a +// variable or function with linkage, unless +// o the variable or function has extern "C" linkage (7.5 [dcl.link]), or +// o the variable or function is not used (3.2 [basic.def.odr]) or is +// defined in the same translation unit. + +// { dg-options -std=c++0x } + +template <typename T> struct B { + void g(T){} + void h(T); // { dg-error "never defined" } + friend void i(B, T){} + static T t1; // { dg-error "never defined" } + static T t2; +}; + +template <typename T> T B<T>::t2 = { }; + +enum {} e1; // OK, defined +extern enum {} e2; // { dg-error "never defined" } +extern "C" enum {} e3; // OK, extern "C" + +void f() { + struct A { int x; }; // no linkage + A a = {1}; + B<A> ba; // declares B<A>::g(A) and B<A>::h(A) + ba.t1 = a; // error, B<T>::t never defined + ba.t2 = a; // OK + ba.g(a); // OK + ba.h(a); // error, B<T>::h never defined + i(ba, a); // OK + e1+e2+e3; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/long_long.C b/gcc/testsuite/g++.dg/cpp0x/long_long.C new file mode 100644 index 000000000..3ef710df4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/long_long.C @@ -0,0 +1,6 @@ +// { dg-options "-std=c++0x -pedantic" } + +void foo() +{ + long long x = 17; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/move1.C b/gcc/testsuite/g++.dg/cpp0x/move1.C new file mode 100644 index 000000000..12e363a8c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/move1.C @@ -0,0 +1,15 @@ +// { dg-options "-std=c++0x -pedantic-errors" } + +#include <utility> + +class A { }; + +static void g ( A && ) { } + +template < class T > class B { +public: + void f ( ) { + A a; + g ( std :: move ( a ) ); + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/named.C b/gcc/testsuite/g++.dg/cpp0x/named.C new file mode 100644 index 000000000..ef1a2fb6f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/named.C @@ -0,0 +1,40 @@ +// { dg-options "--std=c++0x" } +// { dg-do link } + +template<typename _Tp> +inline _Tp&& +movel(_Tp& __t) +{ return static_cast<_Tp&&>(__t); } + +struct S {}; +struct T +{ + T(S && s_) : s(movel(s_)) {} + S && get() { return movel(s); } + operator S&&() { return movel(s); } + S && s; +}; + +void named(S const &) {} +void named(S&&); + +void unnamed(S const &); +void unnamed(S&&) {} + +void f(S && p) +{ + S && s(movel(p)); + T t(movel(s)); + + named(s); // variable reference + named(p); // parameter reference + named(t.s); // class member access + + unnamed(t.get()); // function return + unnamed(t); // implicit conversion + unnamed(static_cast<S&&>(s)); // cast to rvalue +} + +int main() +{ +} diff --git a/gcc/testsuite/g++.dg/cpp0x/named_refs.C b/gcc/testsuite/g++.dg/cpp0x/named_refs.C new file mode 100644 index 000000000..697867e11 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/named_refs.C @@ -0,0 +1,28 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test: Named rvalue references are treated as lvalues. + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; + +struct A {}; + +one foo(const A&) {return one();} +two foo(A&&) {return two();} + +int test1(A&& a) +{ + sa<sizeof(foo(a)) == 1 * sizeof(long)> t1; + return 0; +} + +int main() +{ + return test1(A()); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept01.C b/gcc/testsuite/g++.dg/cpp0x/noexcept01.C new file mode 100644 index 000000000..f314684ea --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept01.C @@ -0,0 +1,83 @@ +// Test for noexcept-expression +// { dg-options "-std=c++0x -O2" } + +#include <typeinfo> + +#define SA(X) static_assert(X, #X) + +void f(); +void g() throw(); +SA(noexcept(g())); +SA(!noexcept(f())); +SA(!noexcept(throw 1)); +SA(noexcept(42)); + +struct A +{ + virtual ~A(); +}; + +struct B: public A +{ + virtual ~B(); +}; + +A* ap; + +struct C { }; +C* cp; + +SA (noexcept (dynamic_cast<B*>(ap))); +SA (!noexcept (dynamic_cast<B&>(*ap))); +SA (!noexcept (typeid (*ap))); +SA (noexcept (typeid (*cp))); + +SA (!noexcept (true ? 1 : throw 1)); +SA (!noexcept (true || true ? 1 : throw 1)); + +SA (noexcept (C())); + +struct D +{ + D() throw(); +}; + +SA (noexcept (D())); + +struct E +{ + E() throw(); + ~E(); +}; + +SA (!noexcept (E())); + +struct F +{ + virtual void f(); +}; + +SA (noexcept (F())); + +struct G +{ + G() = default; + ~G() = default; +}; + +SA (noexcept (G())); + +template <class T, bool b> +void tf() +{ + SA (noexcept (T()) == b); +} + +template void tf<int,true>(); +template void tf<E, false>(); + +// Make sure that noexcept uses the declared exception-specification, not +// any knowledge we might have about whether or not the function really +// throws. +void h() { } +SA(!noexcept(h())); diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept02.C b/gcc/testsuite/g++.dg/cpp0x/noexcept02.C new file mode 100644 index 000000000..ffbb09192 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept02.C @@ -0,0 +1,54 @@ +// Test for noexcept-specification +// { dg-options "-std=c++0x" } + +#define SA(X) static_assert(X, #X) + +void f(); +void f() noexcept(false); +void f() noexcept(1 == 0); +void f(); + +SA(!noexcept(f())); + +void g() throw (int); // { dg-error "previous declaration" } +void g() noexcept(false); // { dg-error "different exception" } +void g(); + +void h() throw(); +void h() noexcept; +void h() throw(); +void h() noexcept; + +template <class T> +void g (T) noexcept(noexcept(T())); // { dg-error "previous declaration" } +template <class T> +void g (T) noexcept(noexcept(T(0))); // { dg-error "different exception" } + +template <class T> +void f (T) noexcept(noexcept(T()) && noexcept(T())); +template <class T> +void f (T) noexcept(noexcept(T()) && noexcept(T())); +template <class T> +void f2(T a) noexcept (noexcept (f (a))); + +struct A { A(); }; +SA(noexcept(f(1))); +SA(!noexcept(f(A()))); +SA(noexcept(f2(1))); +SA(!noexcept(f2(A()))); + +template <class... Ts> +void f3(Ts... ts) noexcept (noexcept (f(ts...))); + +SA(noexcept(f3(1))); +SA(!noexcept(f3(A()))); + +template <class T1, class T2> +void f (T1, T2) noexcept(noexcept(T1(), T2())); + +struct B { }; + +SA(noexcept(f3(1,B()))); +SA(!noexcept(f3(1,A()))); +SA(!noexcept(f3(A(),1))); +SA(!noexcept(f3(A(),A()))); diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept03.C b/gcc/testsuite/g++.dg/cpp0x/noexcept03.C new file mode 100644 index 000000000..54e04f3d0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept03.C @@ -0,0 +1,51 @@ +// Runtime test for noexcept-specification. +// { dg-options "-std=c++0x -Wnoexcept" } +// { dg-do run } + +#include <exception> +#include <cstdlib> + +void my_terminate () +{ + std::exit (0); +} + +void my_unexpected () +{ + throw; +} + +void g() { throw 1; } +void (*p)() = g; +void f () noexcept (false) +{ + p(); +} + +template <class T> +void f(T) noexcept (noexcept (T())) // { dg-warning "false" } +{ + p(); +} + +template <class T> +void f2(T a) noexcept (noexcept (f (a))) +{ + f(a); +} + +struct A { A() { } }; // { dg-warning "does not throw" } + +int main() +{ + // noexcept(false) allows throw. + try { f(); } catch (int) { } + // noexcept(noexcept(A())) == noexcept(false). + try { f(A()); } catch (int) { } + try { f2(A()); } catch (int) { } + + std::set_terminate (my_terminate); + // noexcept(noexcept(int())) == noexcept(true). + try { f2(1); } catch (...) { } + return 1; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept04.C b/gcc/testsuite/g++.dg/cpp0x/noexcept04.C new file mode 100644 index 000000000..8df818610 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept04.C @@ -0,0 +1,31 @@ +// Make sure that we call terminate when a noexcept spec is violated. +// The function pointers are there to make sure that +// the compiler doesn't get clever about optimizing the calls based on +// knowledge about the called functions. + +// { dg-options "-std=c++0x" } +// { dg-do run } + +#include <exception> +#include <cstdlib> + +void my_terminate () +{ + std::exit (0); +} + +void g() { throw 1; } +void (*p1)() = g; +void f() noexcept { p1(); } +void (*p2)() = f; +void h() { p2(); } + +int main() +{ + std::set_terminate (my_terminate); + + try { h(); } + catch (int) { } + + return 1; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept05.C b/gcc/testsuite/g++.dg/cpp0x/noexcept05.C new file mode 100644 index 000000000..6acea4327 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept05.C @@ -0,0 +1,19 @@ +// Make sure that we force an LSDA for a noexcept spec so +// that the personality routine will call terminate. Also check that we +// optimize away the EH cleanup for var because the personality routine +// will call terminate before unwinding: there should not be an EH region +// (i.e. LEHB/LEHE labels) around the call to g(). + +// { dg-final { scan-assembler-not "_ZSt9terminatev" } } +// { dg-final { scan-assembler-not "EHB" } } +// { dg-final { scan-assembler "LSDA" } } + +// { dg-options "-std=c++0x" } + +struct A { ~A(); }; +void g(); +void f() noexcept +{ + A var; + g(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept06.C b/gcc/testsuite/g++.dg/cpp0x/noexcept06.C new file mode 100644 index 000000000..3babdffda --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept06.C @@ -0,0 +1,30 @@ +// Test that checking of a nothrow specification uses the one on the +// definition. +// { dg-options "-std=c++0x" } +// { dg-do run } + +#include <exception> +#include <cstdlib> + +void my_unexpected () +{ + std::abort (); +} +void my_terminate () +{ + std::exit (0); +} + +void f() throw(); +void f() noexcept +{ + throw 1; +} + +int main() +{ + std::set_unexpected (my_unexpected); + std::set_terminate (my_terminate); + f(); + return 1; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept07.C b/gcc/testsuite/g++.dg/cpp0x/noexcept07.C new file mode 100644 index 000000000..0a5773fc8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept07.C @@ -0,0 +1,25 @@ +// Test that checking of a nothrow specification uses the one on the +// definition. +// { dg-options "-std=c++0x" } +// { dg-do run } + +#include <exception> +#include <cstdlib> + +void my_unexpected () +{ + std::exit (0); +} + +void f() noexcept; +void f() throw() +{ + throw 1; +} + +int main() +{ + std::set_unexpected (my_unexpected); + f(); + return 1; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept08.C b/gcc/testsuite/g++.dg/cpp0x/noexcept08.C new file mode 100644 index 000000000..1df85efff --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept08.C @@ -0,0 +1,56 @@ +// { dg-options "-std=c++0x" } +// { dg-prune-output "overriding" } + +struct A +{ + virtual void f(); + virtual void g() throw(); + virtual void h() noexcept; + virtual void i() noexcept(false); + virtual void j() throw(int); +}; + +struct B: A +{ + void f() noexcept; + void g() noexcept; + void h() noexcept; + void i() noexcept; + void j() noexcept; +}; + +struct C: A +{ + void f() throw(); + void g() throw(); + void h() throw(); + void i() throw(); + void j() throw(); +}; + +struct D: A +{ + void f() noexcept(false); + void g() noexcept(false); // { dg-error "looser" } + void h() noexcept(false); // { dg-error "looser" } + void i() noexcept(false); + void j() noexcept(false); // { dg-error "looser" } +}; + +struct E: A +{ + void f() throw(int); + void g() throw(int); // { dg-error "looser" } + void h() throw(int); // { dg-error "looser" } + void i() throw(int); + void j() throw(int); +}; + +struct F: A +{ + void f(); + void g(); // { dg-error "looser" } + void h(); // { dg-error "looser" } + void i(); + void j(); // { dg-error "looser" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept09.C b/gcc/testsuite/g++.dg/cpp0x/noexcept09.C new file mode 100644 index 000000000..2a4525cbd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept09.C @@ -0,0 +1,14 @@ +// Test that -Wnoexcept works with templates +// { dg-options "-std=c++0x -Wnoexcept" } + +template <class T> +T f (T t) { return t; } // { dg-warning "does not throw" } + +#define SA(X) static_assert(X, #X) + +SA (!noexcept(f(1))); // { dg-warning "noexcept" } + +int main() +{ + f(1); // Use f(int) so it gets instantiated +} diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept10.C b/gcc/testsuite/g++.dg/cpp0x/noexcept10.C new file mode 100644 index 000000000..058a387d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept10.C @@ -0,0 +1,27 @@ +// PR c++/49082 +// { dg-options -std=c++0x } + +namespace std { template <class T> T&& declval() noexcept; } + +struct Base +{ + Base(const Base&) noexcept(false); + Base(Base&&) noexcept(false); + ~Base() noexcept(false); +}; + +struct Derived +: Base +{ + // Derived(const Derived&) = default; + // Derived(Derived&&) = default; +}; + +static_assert(!noexcept(Base(std::declval<const Base&>())), "Error"); +static_assert(!noexcept(Derived(std::declval<const Derived&>())), "Error"); // Error + +static_assert(!noexcept(Base(std::declval<Base&&>())), "Error"); +static_assert(!noexcept(Derived(std::declval<Derived&&>())), "Error"); // Error + +static_assert(!noexcept(std::declval<Base&>().~Base()), "Error"); // OK +static_assert(!noexcept(std::declval<Derived&>().~Derived()), "Error"); // Error diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept11.C b/gcc/testsuite/g++.dg/cpp0x/noexcept11.C new file mode 100644 index 000000000..eba2c4080 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept11.C @@ -0,0 +1,4 @@ +// PR c++/50309 +// { dg-options -std=c++0x } + +void foo () noexcept () { } // { dg-error "expected" } diff --git a/gcc/testsuite/g++.dg/cpp0x/nolinkage1.C b/gcc/testsuite/g++.dg/cpp0x/nolinkage1.C new file mode 100644 index 000000000..b69b6ddc4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nolinkage1.C @@ -0,0 +1,22 @@ +// DR 757 allows using types without linkage in declarations with linkage. +// Test that this doesn't lead to link-time collisions. + +// { dg-additional-sources "nolinkage1a.cc" } +// { dg-do link } +// { dg-options -std=c++0x } + +#include "nolinkage1.h" + +typedef struct { int i; } *AP; + +void f(AP) { } + +A<AP> a; + +static void g() +{ + struct B { }; + A<B> a; +} + +int main() { g(); f(0); } diff --git a/gcc/testsuite/g++.dg/cpp0x/nolinkage1.h b/gcc/testsuite/g++.dg/cpp0x/nolinkage1.h new file mode 100644 index 000000000..3cb5f63b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nolinkage1.h @@ -0,0 +1,8 @@ +template <class T> +struct A +{ + A(); +}; + +template <class T> +A<T>::A() { } diff --git a/gcc/testsuite/g++.dg/cpp0x/nolinkage1a.cc b/gcc/testsuite/g++.dg/cpp0x/nolinkage1a.cc new file mode 100644 index 000000000..f8528f3e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nolinkage1a.cc @@ -0,0 +1,15 @@ +#include "nolinkage1.h" + +typedef struct { double d; } *BP; + +void f(BP) { } + +A<BP> b; + +static void g() +{ + struct B { }; + A<B> a; +} + +int dummy() { g(); f(0); } diff --git a/gcc/testsuite/g++.dg/cpp0x/not_special.C b/gcc/testsuite/g++.dg/cpp0x/not_special.C new file mode 100644 index 000000000..6d73bd086 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/not_special.C @@ -0,0 +1,52 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test that move constructor and move assignement are special. +// That is, their presence should inhibit compiler generated +// copy ctor or assignment. + +// { dg-options "-std=c++0x" } + +#include <assert.h> + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; + +int copy = 0; +int assign = 0; + +struct base +{ + base() {} + base(const base&) {++copy;} + base& operator=(const base&) {++assign; return *this;} +}; + +struct derived + : base +{ + derived() {} + derived(derived&&) {} // { dg-error "argument 1" } + derived& operator=(derived&&) {return *this;} // { dg-error "argument 1" } +}; + +int test1() +{ + derived d; + derived d2(static_cast<derived&&>(d)); // should not call base::(const base&) + assert(copy == 0); + derived d3(d); // { dg-error "lvalue" } + assert(copy == 1); + d2 = static_cast<derived&&>(d); // should not call base::operator= + assert(assign == 0); + d3 = d; // { dg-error "lvalue" } + assert(assign == 1); + return 0; +} + +int main() +{ + return test1(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr01.C b/gcc/testsuite/g++.dg/cpp0x/nullptr01.C new file mode 100644 index 000000000..de3860c9e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr01.C @@ -0,0 +1,10 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test assignment to pointer + +char* const cp1 = nullptr; +char* const cp2 = __null; +char* const cp3 = 0; +decltype(nullptr) mynull = 0; +char* const cp4 = mynull; diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr02.C b/gcc/testsuite/g++.dg/cpp0x/nullptr02.C new file mode 100644 index 000000000..80977cb2f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr02.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test assignment to nullptr_t + +typedef decltype(nullptr) nullptr_t; + +const nullptr_t np1 = nullptr; +const nullptr_t np2 = __null; +const nullptr_t np3 = 0; +const nullptr_t np4 = np1; +const nullptr_t np5 = np2; +const nullptr_t np6 = np3; +const nullptr_t np7 = np4; +const nullptr_t np8 = np5; +const nullptr_t np9 = np6; diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr03.C b/gcc/testsuite/g++.dg/cpp0x/nullptr03.C new file mode 100644 index 000000000..b6df89637 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr03.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test assignment to int + +const int n1 = nullptr; // { dg-error "cannot convert " } +decltype(nullptr) mynull = 0; +const int n2 = mynull; // { dg-error "cannot convert " } + diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr04.C b/gcc/testsuite/g++.dg/cpp0x/nullptr04.C new file mode 100644 index 000000000..be581bcb6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr04.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test cast to int + +__extension__ typedef __INTPTR_TYPE__ intptr_t; + +const int n4 = static_cast<const int>(nullptr); // { dg-error "invalid static_cast " } +const short int n5 = reinterpret_cast<short int>(nullptr); // { dg-error "loses precision" } +const intptr_t n6 = reinterpret_cast<intptr_t>(nullptr); +const intptr_t n7 = (intptr_t)nullptr; + +decltype(nullptr) mynull = 0; +const int n8 = static_cast<const int>(mynull); // { dg-error "invalid static_cast " } +const short int n9 = reinterpret_cast<short int>(mynull); // { dg-error "loses precision" } +const intptr_t n10 = reinterpret_cast<intptr_t>(mynull); +const intptr_t n11 = (intptr_t)mynull; diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr05.C b/gcc/testsuite/g++.dg/cpp0x/nullptr05.C new file mode 100644 index 000000000..22a8b51c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr05.C @@ -0,0 +1,14 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test assignment to method pointer + +class F { }; + +typedef void (F::*pmf)(); + +const pmf pmf1 = nullptr; +const pmf pmf2 = __null; +const pmf pmf3 = 0; +decltype(nullptr) mynull = 0; +const pmf pmf4 = mynull; diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr06.C b/gcc/testsuite/g++.dg/cpp0x/nullptr06.C new file mode 100644 index 000000000..c50bb9bc1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr06.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test compare to pointer + +#define assert_true(b) do { char c[2 * bool(b) - 1]; } while(0) + +char* const cp1 = nullptr; + +void fun() +{ + assert_true(cp1 == nullptr); + decltype(nullptr) mynull = 0; + assert_true(cp1 == mynull); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr07.C b/gcc/testsuite/g++.dg/cpp0x/nullptr07.C new file mode 100644 index 000000000..64d442be3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr07.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test compare to int + +void fun() +{ + int n = 0; + if( n == nullptr ); // { dg-error "invalid operands of types " } + const int m = 1; + if( m == nullptr ); // { dg-error "invalid operands of types " } + decltype(nullptr) mynull = 0; + if( n == mynull ); // { dg-error "invalid operands of types " } + if( m == mynull ); // { dg-error "invalid operands of types " } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr08.C b/gcc/testsuite/g++.dg/cpp0x/nullptr08.C new file mode 100644 index 000000000..1e5db278d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr08.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test conversion to bool + +#define assert_true(b) do { char c[2 * bool(b) - 1]; } while(0) + +void fun() +{ + assert_true(nullptr ? false : true); + decltype(nullptr) mynull = 0; + assert_true(mynull ? false : true); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr09.C b/gcc/testsuite/g++.dg/cpp0x/nullptr09.C new file mode 100644 index 000000000..b35a3c320 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr09.C @@ -0,0 +1,11 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test compare to literal 0 + +void fun() +{ + if( nullptr == 0 ); + decltype(nullptr) mynull = 0; + if( mynull == 0 ); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr10.C b/gcc/testsuite/g++.dg/cpp0x/nullptr10.C new file mode 100644 index 000000000..fa32267ec --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr10.C @@ -0,0 +1,14 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test arithmetic operations + +void fun() +{ + nullptr = 0; // { dg-error "lvalue required as left operand" } + nullptr + 2; // { dg-error "invalid operands of types " } + decltype(nullptr) mynull = 0; + mynull = 1; // { dg-error "cannot convert" } + mynull = 0; + mynull + 2; // { dg-error "invalid operands of types " } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr11.C b/gcc/testsuite/g++.dg/cpp0x/nullptr11.C new file mode 100644 index 000000000..5907816a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr11.C @@ -0,0 +1,40 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test relational operators + +#define assert_true(b) do { char c[2 * bool(b) - 1]; } while(0) +#define assert_false(b) do { char c[1 - 2 * bool(b)]; } while(0) + +void fun() +{ + assert_true(nullptr == nullptr); + assert_false(nullptr != nullptr); + assert_false(nullptr < nullptr); + assert_false(nullptr > nullptr); + assert_true(nullptr <= nullptr); + assert_true(nullptr >= nullptr); + + decltype(nullptr) mynull = 0; + + assert_true(mynull == nullptr); + assert_false(mynull != nullptr); + assert_false(mynull < nullptr); + assert_false(mynull > nullptr); + assert_true(mynull <= nullptr); + assert_true(mynull >= nullptr); + + assert_true(nullptr == mynull); + assert_false(nullptr != mynull); + assert_false(nullptr < mynull); + assert_false(nullptr > mynull); + assert_true(nullptr <= mynull); + assert_true(nullptr >= mynull); + + assert_true(mynull == mynull); + assert_false(mynull != mynull); + assert_false(mynull < mynull); + assert_false(mynull > mynull); + assert_true(mynull <= mynull); + assert_true(mynull >= mynull); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr12.C b/gcc/testsuite/g++.dg/cpp0x/nullptr12.C new file mode 100644 index 000000000..1713259f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr12.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test sizeof + +static_assert(sizeof(nullptr) == sizeof(void*), "sizeof(nullptr) is wrong"); +const decltype(nullptr) mynull = 0; +static_assert(sizeof(mynull) == sizeof(void*), "sizeof(nullptr) is wrong"); diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr13.C b/gcc/testsuite/g++.dg/cpp0x/nullptr13.C new file mode 100644 index 000000000..a9377584c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr13.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test typeid + +#include <typeinfo> + +#define assert_true(b) do { char c[2 * bool(b) - 1]; } while(0) + +void fun() +{ + typeid(nullptr); + const decltype(nullptr) mynull = 0; + typeid(mynull); + assert_true(typeid(nullptr) == typeid(mynull)); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr14.C b/gcc/testsuite/g++.dg/cpp0x/nullptr14.C new file mode 100644 index 000000000..4c4627b54 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr14.C @@ -0,0 +1,25 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test overload preference char*/int + +template <typename T, typename U> struct tType_equal; +template <typename T> struct tType_equal<T, T> { typedef void type; }; + +template <typename T, typename U> +inline typename tType_equal<T, U>::type +type_equal(U) { } + +char* f( char* ); +int f( int ); +long int f( long int ); + +void test_f() +{ + // Overloading cases + // + type_equal<char*>(f(nullptr)); + type_equal<int>(f(0)); + decltype(nullptr) mynull = 0; + type_equal<char*>(f(mynull)); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr15.C b/gcc/testsuite/g++.dg/cpp0x/nullptr15.C new file mode 100644 index 000000000..e02fd5592 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr15.C @@ -0,0 +1,26 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test template deduction + +template <typename T, typename U> struct tType_equal; +template <typename T> struct tType_equal<T, T> { typedef void type; }; + +template <typename T, typename U> +inline typename tType_equal<T, U>::type +type_equal(U) { } + +template<typename T> T* g( T* t ); // { dg-message "note" } + +void test_g() +{ + // Deduction to nullptr_t, no deduction to pointer type + // + g(nullptr); // { dg-error "no matching function for call to " } + // { dg-message "candidate" "candidate note" { target *-*-* } 19 } + type_equal<float*>(g((float*)nullptr)); + decltype(nullptr) mynull = 0; + g(mynull); // { dg-error "no matching function for call to " } + // { dg-message "candidate" "candidate note" { target *-*-* } 23 } + type_equal<float*>(g((float*)mynull)); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr16.C b/gcc/testsuite/g++.dg/cpp0x/nullptr16.C new file mode 100644 index 000000000..0ec0b6a12 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr16.C @@ -0,0 +1,25 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test template deduction + +typedef decltype(nullptr) nullptr_t; + +template <typename T, typename U> struct tType_equal; +template <typename T> struct tType_equal<T, T> { typedef void type; }; + +template <typename T, typename U> +inline typename tType_equal<T, U>::type +type_equal(U) { } + +template<typename T> T h( T t ); + +void test_h() +{ + type_equal<int>(h(0)); + type_equal<nullptr_t>(h(nullptr)); + type_equal<float*>(h((float*)nullptr)); + nullptr_t mynull = 0; + type_equal<nullptr_t>(h(mynull)); + type_equal<float*>(h((float*)mynull)); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr17.C b/gcc/testsuite/g++.dg/cpp0x/nullptr17.C new file mode 100644 index 000000000..2e580557b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr17.C @@ -0,0 +1,23 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test that bool is a better overload match than int + +template <typename T, typename U> struct tType_equal; +template <typename T> struct tType_equal<T, T> { typedef void type; }; + +template <typename T, typename U> +inline typename tType_equal<T, U>::type +type_equal(U) { } + +int i( int ); +long int i( long int ); +bool i( bool ); + +void test_i() +{ + // Overload to bool, not int + type_equal<bool>(i(nullptr)); + decltype(nullptr) mynull = 0; + type_equal<bool>(i(mynull)); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr18.C b/gcc/testsuite/g++.dg/cpp0x/nullptr18.C new file mode 100644 index 000000000..b8fa38c71 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr18.C @@ -0,0 +1,21 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test overload of pointer versus bool when applied on a nullptr_t + +template <typename T, typename U> struct tType_equal; +template <typename T> struct tType_equal<T, T> { typedef void type; }; + +template <typename T, typename U> +inline typename tType_equal<T, U>::type +type_equal(U) { } + +char* j( char* ); +bool j( bool ); + +void test_j() +{ + type_equal<char*>(j(nullptr)); + decltype(nullptr) mynull = 0; + type_equal<char*>(j(mynull)); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr19.C b/gcc/testsuite/g++.dg/cpp0x/nullptr19.C new file mode 100644 index 000000000..cf30f1c23 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr19.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +// Test overload of pointer versus nullptr_t when applied on a literal 0/__null + +typedef decltype(nullptr) nullptr_t; + +char* k( char* ); /* { dg-message "note" } { dg-message "note" } */ +nullptr_t k( nullptr_t ); /* { dg-message "note" } { dg-message "note" } */ + +void test_k() +{ + k(0); /* { dg-error "is ambiguous" } */ + // { dg-message "candidate" "candidate note" { target *-*-* } 13 } + k(__null); /* { dg-error "is ambiguous" } */ + // { dg-message "candidate" "candidate note" { target *-*-* } 15 } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr20.C b/gcc/testsuite/g++.dg/cpp0x/nullptr20.C new file mode 100644 index 000000000..3e5840677 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr20.C @@ -0,0 +1,20 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } + +// Test passing to ellipisis + +#include <cstdio> +#include <cstring> + +int main() +{ + char buf1[64]; + char buf2[64]; + char buf3[64]; + + std::sprintf(buf1, "%p", (void*)0); + std::sprintf(buf2, "%p", nullptr); + decltype(nullptr) mynull = 0; + std::sprintf(buf3, "%p", nullptr); + return std::strcmp(buf1, buf2) != 0 || std::strcmp(buf1, buf3) != 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr21.C b/gcc/testsuite/g++.dg/cpp0x/nullptr21.C new file mode 100644 index 000000000..c30cb3c8b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr21.C @@ -0,0 +1,44 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } + +// Test throw and catch + +#include <cstdio> + +typedef decltype(nullptr) nullptr_t; + +int main() +{ + try { + throw nullptr; + } catch (void*) { + printf("Test 1 Fail"); + } catch (bool) { + printf("Test 1 Fail"); + } catch (int) { + printf("Test 1 Fail"); + } catch (long int) { + printf("Test 1 Fail"); + } catch (nullptr_t) { + printf("Test 1 OK"); + } catch (...) { + printf("Test 1 Fail"); + } // { dg-output "Test 1 OK" } + + nullptr_t mynull = 0; + try { + throw mynull; + } catch (void*) { + printf("Test 2 Fail"); + } catch (bool) { + printf("Test 2 Fail"); + } catch (int) { + printf("Test 2 Fail"); + } catch (long int) { + printf("Test 2 Fail"); + } catch (nullptr_t) { + printf("Test 2 OK"); + } catch (...) { + printf("Test 2 Fail"); + } // { dg-output "Test 2 OK" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr22.C b/gcc/testsuite/g++.dg/cpp0x/nullptr22.C new file mode 100644 index 000000000..d800f9869 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr22.C @@ -0,0 +1,20 @@ +// { dg-do compile } +// { dg-options "-std=c++0x -Wall -Wformat=2 -Wstrict-null-sentinel" } + +// Test various warnings + +void f1(const char*, ...) __attribute__((format(printf, 1, 2))); +void f2(const char*) __attribute__((nonnull)); +void f3(const char*, ...) __attribute__((sentinel)); + +void f() +{ + f1("%p", nullptr); + f2(nullptr); // { dg-warning "null argument where non-null required " } + f3("x", "y", __null); // { dg-warning "missing sentinel in function call" } + f3("x", "y", nullptr); + decltype(nullptr) mynull = 0; + f1("%p", mynull); + f2(mynull); // { dg-warning "null argument where non-null required " } + f3("x", "y", mynull); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/nullptr28.C b/gcc/testsuite/g++.dg/cpp0x/nullptr28.C new file mode 100644 index 000000000..4cc790d31 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nullptr28.C @@ -0,0 +1,17 @@ +// { dg-do run } +// { dg-options "-std=c++0x -pedantic-errors" } + +typedef decltype(nullptr) nullptr_t; + +int i; +nullptr_t n; +const nullptr_t& f() { ++i; return n; } + +nullptr_t g() { return f(); } + +int main() +{ + g(); + if (i != 1) + __builtin_abort (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/overload-conv-1.C b/gcc/testsuite/g++.dg/cpp0x/overload-conv-1.C new file mode 100644 index 000000000..778111283 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/overload-conv-1.C @@ -0,0 +1,29 @@ +// { dg-options "--std=c++0x" } +// { dg-do link } + +struct S {}; + +struct T +{ + operator S() { return S(); } +}; + +struct U +{ + operator S&() { return *static_cast<S*>(0); } +}; + +void f(const S&); +void f(S&&) {} + +void g(const S&) {} +void g(S&&); + +int main() +{ + T t; + f(t); + + U u; + g(u); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/overload-conv-2.C b/gcc/testsuite/g++.dg/cpp0x/overload-conv-2.C new file mode 100644 index 000000000..0e622bcac --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/overload-conv-2.C @@ -0,0 +1,17 @@ +// { dg-options "--std=c++0x" } +// { dg-do link } + +struct T {}; +struct S +{ + S(T const &) {} +}; + +void f(const S&); +void f(S&&) {} + +int main() +{ + T t; + f(t); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/overload.C b/gcc/testsuite/g++.dg/cpp0x/overload.C new file mode 100644 index 000000000..3782d4a20 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/overload.C @@ -0,0 +1,708 @@ +// { dg-options "--std=c++0x" } +// { dg-do link } +// Generated by overload.py + +template<typename _Tp> +inline _Tp&& +movel(_Tp& __t) +{ return static_cast<_Tp&&>(__t); } + +struct S{}; + +S l; // lvalue (l) +S const cl = l; // const lvalue (cl) +S r() { return l; } // rvalue (r) +S const cr() { return l; } // const rvalue (cr) +S & nl = l; // named lvalue reference (nl) +S const & ncl = l; // named const lvalue reference (ncl) +S && nr = movel(l); // named rvalue reference (nr) +S const && ncr = movel(l); // named const rvalue reference (ncr) +S & ul() { return l; } // unnamed lvalue reference (ul) +S const & ucl() { return l; } // unnamed const lvalue reference (ucl) +S && ur() { return movel(l); } // unnamed rvalue reference (ur) +S const && ucr() { return movel(l); } // unnamed const rvalue reference (ucr) + +void l0001(const S&&) {} + +void l0010(S&&) {} + +void l0011(S&&) {} +void l0011(const S&&); + +void l0100(const S&) {} + +void l0101(const S&) {} +void l0101(const S&&); + +void l0110(const S&) {} +void l0110(S&&); + +void l0111(const S&) {} +void l0111(S&&); +void l0111(const S&&); + +void l1000(S&) {} + +void l1001(S&) {} +void l1001(const S&&); + +void l1010(S&) {} +void l1010(S&&); + +void l1011(S&) {} +void l1011(S&&); +void l1011(const S&&); + +void l1100(S&) {} +void l1100(const S&); + +void l1101(S&) {} +void l1101(const S&); +void l1101(const S&&); + +void l1110(S&) {} +void l1110(const S&); +void l1110(S&&); + +void l1111(S&) {} +void l1111(const S&); +void l1111(S&&); +void l1111(const S&&); + +void cl0001(const S&&) {} + +void cl0011(S&&); +void cl0011(const S&&) {} + +void cl0100(const S&) {} + +void cl0101(const S&) {} +void cl0101(const S&&); + +void cl0110(const S&) {} +void cl0110(S&&); + +void cl0111(const S&) {} +void cl0111(S&&); +void cl0111(const S&&); + +void cl1001(S&); +void cl1001(const S&&) {} + +void cl1011(S&); +void cl1011(S&&); +void cl1011(const S&&) {} + +void cl1100(S&); +void cl1100(const S&) {} + +void cl1101(S&); +void cl1101(const S&) {} +void cl1101(const S&&); + +void cl1110(S&); +void cl1110(const S&) {} +void cl1110(S&&); + +void cl1111(S&); +void cl1111(const S&) {} +void cl1111(S&&); +void cl1111(const S&&); + +void r0001(const S&&) {} + +void r0010(S&&) {} + +void r0011(S&&) {} +void r0011(const S&&); + +void r0100(const S&) {} + +void r0101(const S&); +void r0101(const S&&) {} + +void r0110(const S&); +void r0110(S&&) {} + +void r0111(const S&); +void r0111(S&&) {} +void r0111(const S&&); + +void r1001(S&); +void r1001(const S&&) {} + +void r1010(S&); +void r1010(S&&) {} + +void r1011(S&); +void r1011(S&&) {} +void r1011(const S&&); + +void r1100(S&); +void r1100(const S&) {} + +void r1101(S&); +void r1101(const S&); +void r1101(const S&&) {} + +void r1110(S&); +void r1110(const S&); +void r1110(S&&) {} + +void r1111(S&); +void r1111(const S&); +void r1111(S&&) {} +void r1111(const S&&); + +void cr0001(const S&&) {} + +void cr0011(S&&); +void cr0011(const S&&) {} + +void cr0100(const S&) {} + +void cr0101(const S&); +void cr0101(const S&&) {} + +void cr0110(const S&) {} +void cr0110(S&&); + +void cr0111(const S&); +void cr0111(S&&); +void cr0111(const S&&) {} + +void cr1001(S&); +void cr1001(const S&&) {} + +void cr1011(S&); +void cr1011(S&&); +void cr1011(const S&&) {} + +void cr1100(S&); +void cr1100(const S&) {} + +void cr1101(S&); +void cr1101(const S&); +void cr1101(const S&&) {} + +void cr1110(S&); +void cr1110(const S&) {} +void cr1110(S&&); + +void cr1111(S&); +void cr1111(const S&); +void cr1111(S&&); +void cr1111(const S&&) {} + +void nl0001(const S&&) {} + +void nl0010(S&&) {} + +void nl0011(S&&) {} +void nl0011(const S&&); + +void nl0100(const S&) {} + +void nl0101(const S&) {} +void nl0101(const S&&); + +void nl0110(const S&) {} +void nl0110(S&&); + +void nl0111(const S&) {} +void nl0111(S&&); +void nl0111(const S&&); + +void nl1000(S&) {} + +void nl1001(S&) {} +void nl1001(const S&&); + +void nl1010(S&) {} +void nl1010(S&&); + +void nl1011(S&) {} +void nl1011(S&&); +void nl1011(const S&&); + +void nl1100(S&) {} +void nl1100(const S&); + +void nl1101(S&) {} +void nl1101(const S&); +void nl1101(const S&&); + +void nl1110(S&) {} +void nl1110(const S&); +void nl1110(S&&); + +void nl1111(S&) {} +void nl1111(const S&); +void nl1111(S&&); +void nl1111(const S&&); + +void ncl0001(const S&&) {} + +void ncl0011(S&&); +void ncl0011(const S&&) {} + +void ncl0100(const S&) {} + +void ncl0101(const S&) {} +void ncl0101(const S&&); + +void ncl0110(const S&) {} +void ncl0110(S&&); + +void ncl0111(const S&) {} +void ncl0111(S&&); +void ncl0111(const S&&); + +void ncl1001(S&); +void ncl1001(const S&&) {} + +void ncl1011(S&); +void ncl1011(S&&); +void ncl1011(const S&&) {} + +void ncl1100(S&); +void ncl1100(const S&) {} + +void ncl1101(S&); +void ncl1101(const S&) {} +void ncl1101(const S&&); + +void ncl1110(S&); +void ncl1110(const S&) {} +void ncl1110(S&&); + +void ncl1111(S&); +void ncl1111(const S&) {} +void ncl1111(S&&); +void ncl1111(const S&&); + +void nr0001(const S&&) {} + +void nr0010(S&&) {} + +void nr0011(S&&) {} +void nr0011(const S&&); + +void nr0100(const S&) {} + +void nr0101(const S&) {} +void nr0101(const S&&); + +void nr0110(const S&) {} +void nr0110(S&&); + +void nr0111(const S&) {} +void nr0111(S&&); +void nr0111(const S&&); + +void nr1000(S&) {} + +void nr1001(S&) {} +void nr1001(const S&&); + +void nr1010(S&) {} +void nr1010(S&&); + +void nr1011(S&) {} +void nr1011(S&&); +void nr1011(const S&&); + +void nr1100(S&) {} +void nr1100(const S&); + +void nr1101(S&) {} +void nr1101(const S&); +void nr1101(const S&&); + +void nr1110(S&) {} +void nr1110(const S&); +void nr1110(S&&); + +void nr1111(S&) {} +void nr1111(const S&); +void nr1111(S&&); +void nr1111(const S&&); + +void ncr0001(const S&&) {} + +void ncr0011(S&&); +void ncr0011(const S&&) {} + +void ncr0100(const S&) {} + +void ncr0101(const S&) {} +void ncr0101(const S&&); + +void ncr0110(const S&) {} +void ncr0110(S&&); + +void ncr0111(const S&) {} +void ncr0111(S&&); +void ncr0111(const S&&); + +void ncr1001(S&); +void ncr1001(const S&&) {} + +void ncr1011(S&); +void ncr1011(S&&); +void ncr1011(const S&&) {} + +void ncr1100(S&); +void ncr1100(const S&) {} + +void ncr1101(S&); +void ncr1101(const S&) {} +void ncr1101(const S&&); + +void ncr1110(S&); +void ncr1110(const S&) {} +void ncr1110(S&&); + +void ncr1111(S&); +void ncr1111(const S&) {} +void ncr1111(S&&); +void ncr1111(const S&&); + +void ul0001(const S&&) {} + +void ul0010(S&&) {} + +void ul0011(S&&) {} +void ul0011(const S&&); + +void ul0100(const S&) {} + +void ul0101(const S&) {} +void ul0101(const S&&); + +void ul0110(const S&) {} +void ul0110(S&&); + +void ul0111(const S&) {} +void ul0111(S&&); +void ul0111(const S&&); + +void ul1000(S&) {} + +void ul1001(S&) {} +void ul1001(const S&&); + +void ul1010(S&) {} +void ul1010(S&&); + +void ul1011(S&) {} +void ul1011(S&&); +void ul1011(const S&&); + +void ul1100(S&) {} +void ul1100(const S&); + +void ul1101(S&) {} +void ul1101(const S&); +void ul1101(const S&&); + +void ul1110(S&) {} +void ul1110(const S&); +void ul1110(S&&); + +void ul1111(S&) {} +void ul1111(const S&); +void ul1111(S&&); +void ul1111(const S&&); + +void ucl0001(const S&&) {} + +void ucl0011(S&&); +void ucl0011(const S&&) {} + +void ucl0100(const S&) {} + +void ucl0101(const S&) {} +void ucl0101(const S&&); + +void ucl0110(const S&) {} +void ucl0110(S&&); + +void ucl0111(const S&) {} +void ucl0111(S&&); +void ucl0111(const S&&); + +void ucl1001(S&); +void ucl1001(const S&&) {} + +void ucl1011(S&); +void ucl1011(S&&); +void ucl1011(const S&&) {} + +void ucl1100(S&); +void ucl1100(const S&) {} + +void ucl1101(S&); +void ucl1101(const S&) {} +void ucl1101(const S&&); + +void ucl1110(S&); +void ucl1110(const S&) {} +void ucl1110(S&&); + +void ucl1111(S&); +void ucl1111(const S&) {} +void ucl1111(S&&); +void ucl1111(const S&&); + +void ur0001(const S&&) {} + +void ur0010(S&&) {} + +void ur0011(S&&) {} +void ur0011(const S&&); + +void ur0100(const S&) {} + +void ur0101(const S&); +void ur0101(const S&&) {} + +void ur0110(const S&); +void ur0110(S&&) {} + +void ur0111(const S&); +void ur0111(S&&) {} +void ur0111(const S&&); + +void ur1001(S&); +void ur1001(const S&&) {} + +void ur1010(S&); +void ur1010(S&&) {} + +void ur1011(S&); +void ur1011(S&&) {} +void ur1011(const S&&); + +void ur1100(S&); +void ur1100(const S&) {} + +void ur1101(S&); +void ur1101(const S&); +void ur1101(const S&&) {} + +void ur1110(S&); +void ur1110(const S&); +void ur1110(S&&) {} + +void ur1111(S&); +void ur1111(const S&); +void ur1111(S&&) {} +void ur1111(const S&&); + +void ucr0001(const S&&) {} + +void ucr0011(S&&); +void ucr0011(const S&&) {} + +void ucr0100(const S&) {} + +void ucr0101(const S&); +void ucr0101(const S&&) {} + +void ucr0110(const S&) {} +void ucr0110(S&&); + +void ucr0111(const S&); +void ucr0111(S&&); +void ucr0111(const S&&) {} + +void ucr1001(S&); +void ucr1001(const S&&) {} + +void ucr1011(S&); +void ucr1011(S&&); +void ucr1011(const S&&) {} + +void ucr1100(S&); +void ucr1100(const S&) {} + +void ucr1101(S&); +void ucr1101(const S&); +void ucr1101(const S&&) {} + +void ucr1110(S&); +void ucr1110(const S&) {} +void ucr1110(S&&); + +void ucr1111(S&); +void ucr1111(const S&); +void ucr1111(S&&); +void ucr1111(const S&&) {} + + +int main() +{ + //l0001(l); + //l0010(l); + //l0011(l); + l0100(l); + l0101(l); + l0110(l); + l0111(l); + l1000(l); + l1001(l); + l1010(l); + l1011(l); + l1100(l); + l1101(l); + l1110(l); + l1111(l); + //cl0001(cl); + //cl0011(cl); + cl0100(cl); + cl0101(cl); + cl0110(cl); + cl0111(cl); + //cl1001(cl); + //cl1011(cl); + cl1100(cl); + cl1101(cl); + cl1110(cl); + cl1111(cl); + r0001(r()); + r0010(r()); + r0011(r()); + r0100(r()); + r0101(r()); + r0110(r()); + r0111(r()); + r1001(r()); + r1010(r()); + r1011(r()); + r1100(r()); + r1101(r()); + r1110(r()); + r1111(r()); + cr0001(cr()); + cr0011(cr()); + cr0100(cr()); + cr0101(cr()); + cr0110(cr()); + cr0111(cr()); + cr1001(cr()); + cr1011(cr()); + cr1100(cr()); + cr1101(cr()); + cr1110(cr()); + cr1111(cr()); + //nl0001(nl); + //nl0010(nl); + //nl0011(nl); + nl0100(nl); + nl0101(nl); + nl0110(nl); + nl0111(nl); + nl1000(nl); + nl1001(nl); + nl1010(nl); + nl1011(nl); + nl1100(nl); + nl1101(nl); + nl1110(nl); + nl1111(nl); + //ncl0001(ncl); + //ncl0011(ncl); + ncl0100(ncl); + ncl0101(ncl); + ncl0110(ncl); + ncl0111(ncl); + //ncl1001(ncl); + //ncl1011(ncl); + ncl1100(ncl); + ncl1101(ncl); + ncl1110(ncl); + ncl1111(ncl); + //nr0001(nr); + //nr0010(nr); + //nr0011(nr); + nr0100(nr); + nr0101(nr); + nr0110(nr); + nr0111(nr); + nr1000(nr); + nr1001(nr); + nr1010(nr); + nr1011(nr); + nr1100(nr); + nr1101(nr); + nr1110(nr); + nr1111(nr); + //ncr0001(ncr); + //ncr0011(ncr); + ncr0100(ncr); + ncr0101(ncr); + ncr0110(ncr); + ncr0111(ncr); + //ncr1001(ncr); + //ncr1011(ncr); + ncr1100(ncr); + ncr1101(ncr); + ncr1110(ncr); + ncr1111(ncr); + //ul0001(ul()); + //ul0010(ul()); + //ul0011(ul()); + ul0100(ul()); + ul0101(ul()); + ul0110(ul()); + ul0111(ul()); + ul1000(ul()); + ul1001(ul()); + ul1010(ul()); + ul1011(ul()); + ul1100(ul()); + ul1101(ul()); + ul1110(ul()); + ul1111(ul()); + //ucl0001(ucl()); + //ucl0011(ucl()); + ucl0100(ucl()); + ucl0101(ucl()); + ucl0110(ucl()); + ucl0111(ucl()); + //ucl1001(ucl()); + //ucl1011(ucl()); + ucl1100(ucl()); + ucl1101(ucl()); + ucl1110(ucl()); + ucl1111(ucl()); + ur0001(ur()); + ur0010(ur()); + ur0011(ur()); + ur0100(ur()); + ur0101(ur()); + ur0110(ur()); + ur0111(ur()); + ur1001(ur()); + ur1010(ur()); + ur1011(ur()); + ur1100(ur()); + ur1101(ur()); + ur1110(ur()); + ur1111(ur()); + ucr0001(ucr()); + ucr0011(ucr()); + ucr0100(ucr()); + ucr0101(ucr()); + ucr0110(ucr()); + ucr0111(ucr()); + ucr1001(ucr()); + ucr1011(ucr()); + ucr1100(ucr()); + ucr1101(ucr()); + ucr1110(ucr()); + ucr1111(ucr()); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/overloadn.C b/gcc/testsuite/g++.dg/cpp0x/overloadn.C new file mode 100644 index 000000000..a42707fe4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/overloadn.C @@ -0,0 +1,708 @@ +// { dg-options "--std=c++0x" } +// { dg-do link } +// Generated by overload.py + +template<typename _Tp> +inline _Tp&& +movel(_Tp& __t) +{ return static_cast<_Tp&&>(__t); } + +struct S{}; + +S l; // lvalue (l) +S const cl = l; // const lvalue (cl) +S r() { return l; } // rvalue (r) +S const cr() { return l; } // const rvalue (cr) +S & nl = l; // named lvalue reference (nl) +S const & ncl = l; // named const lvalue reference (ncl) +S && nr = movel(l); // named rvalue reference (nr) +S const && ncr = movel(l); // named const rvalue reference (ncr) +S & ul() { return l; } // unnamed lvalue reference (ul) +S const & ucl() { return l; } // unnamed const lvalue reference (ucl) +S && ur() { return movel(l); } // unnamed rvalue reference (ur) +S const && ucr() { return movel(l); } // unnamed const rvalue reference (ucr) + +void l0001(const S&&) {} // { dg-message "" } + +void l0010(S&&) {} // { dg-message "" } + +void l0011(S&&) {} // { dg-message "" } +void l0011(const S&&); + +void l0100(const S&) {} + +void l0101(const S&) {} +void l0101(const S&&); + +void l0110(const S&) {} +void l0110(S&&); + +void l0111(const S&) {} +void l0111(S&&); +void l0111(const S&&); + +void l1000(S&) {} + +void l1001(S&) {} +void l1001(const S&&); + +void l1010(S&) {} +void l1010(S&&); + +void l1011(S&) {} +void l1011(S&&); +void l1011(const S&&); + +void l1100(S&) {} +void l1100(const S&); + +void l1101(S&) {} +void l1101(const S&); +void l1101(const S&&); + +void l1110(S&) {} +void l1110(const S&); +void l1110(S&&); + +void l1111(S&) {} +void l1111(const S&); +void l1111(S&&); +void l1111(const S&&); + +void cl0001(const S&&) {} // { dg-message "" } + +void cl0011(S&&); +void cl0011(const S&&) {} // { dg-message "" } + +void cl0100(const S&) {} + +void cl0101(const S&) {} +void cl0101(const S&&); + +void cl0110(const S&) {} +void cl0110(S&&); + +void cl0111(const S&) {} +void cl0111(S&&); +void cl0111(const S&&); + +void cl1001(S&); +void cl1001(const S&&) {} // { dg-message "" } + +void cl1011(S&); +void cl1011(S&&); +void cl1011(const S&&) {} // { dg-message "" } + +void cl1100(S&); +void cl1100(const S&) {} + +void cl1101(S&); +void cl1101(const S&) {} +void cl1101(const S&&); + +void cl1110(S&); +void cl1110(const S&) {} +void cl1110(S&&); + +void cl1111(S&); +void cl1111(const S&) {} +void cl1111(S&&); +void cl1111(const S&&); + +void r0001(const S&&) {} + +void r0010(S&&) {} + +void r0011(S&&) {} +void r0011(const S&&); + +void r0100(const S&) {} + +void r0101(const S&); +void r0101(const S&&) {} + +void r0110(const S&); +void r0110(S&&) {} + +void r0111(const S&); +void r0111(S&&) {} +void r0111(const S&&); + +void r1001(S&); +void r1001(const S&&) {} + +void r1010(S&); +void r1010(S&&) {} + +void r1011(S&); +void r1011(S&&) {} +void r1011(const S&&); + +void r1100(S&); +void r1100(const S&) {} + +void r1101(S&); +void r1101(const S&); +void r1101(const S&&) {} + +void r1110(S&); +void r1110(const S&); +void r1110(S&&) {} + +void r1111(S&); +void r1111(const S&); +void r1111(S&&) {} +void r1111(const S&&); + +void cr0001(const S&&) {} + +void cr0011(S&&); +void cr0011(const S&&) {} + +void cr0100(const S&) {} + +void cr0101(const S&); +void cr0101(const S&&) {} + +void cr0110(const S&) {} +void cr0110(S&&); + +void cr0111(const S&); +void cr0111(S&&); +void cr0111(const S&&) {} + +void cr1001(S&); +void cr1001(const S&&) {} + +void cr1011(S&); +void cr1011(S&&); +void cr1011(const S&&) {} + +void cr1100(S&); +void cr1100(const S&) {} + +void cr1101(S&); +void cr1101(const S&); +void cr1101(const S&&) {} + +void cr1110(S&); +void cr1110(const S&) {} +void cr1110(S&&); + +void cr1111(S&); +void cr1111(const S&); +void cr1111(S&&); +void cr1111(const S&&) {} + +void nl0001(const S&&) {} // { dg-message "" } + +void nl0010(S&&) {} // { dg-message "" } + +void nl0011(S&&) {} // { dg-message "" } +void nl0011(const S&&); + +void nl0100(const S&) {} + +void nl0101(const S&) {} +void nl0101(const S&&); + +void nl0110(const S&) {} +void nl0110(S&&); + +void nl0111(const S&) {} +void nl0111(S&&); +void nl0111(const S&&); + +void nl1000(S&) {} + +void nl1001(S&) {} +void nl1001(const S&&); + +void nl1010(S&) {} +void nl1010(S&&); + +void nl1011(S&) {} +void nl1011(S&&); +void nl1011(const S&&); + +void nl1100(S&) {} +void nl1100(const S&); + +void nl1101(S&) {} +void nl1101(const S&); +void nl1101(const S&&); + +void nl1110(S&) {} +void nl1110(const S&); +void nl1110(S&&); + +void nl1111(S&) {} +void nl1111(const S&); +void nl1111(S&&); +void nl1111(const S&&); + +void ncl0001(const S&&) {} // { dg-message "" } + +void ncl0011(S&&); +void ncl0011(const S&&) {} // { dg-message "" } + +void ncl0100(const S&) {} + +void ncl0101(const S&) {} +void ncl0101(const S&&); + +void ncl0110(const S&) {} +void ncl0110(S&&); + +void ncl0111(const S&) {} +void ncl0111(S&&); +void ncl0111(const S&&); + +void ncl1001(S&); +void ncl1001(const S&&) {} // { dg-message "" } + +void ncl1011(S&); +void ncl1011(S&&); +void ncl1011(const S&&) {} // { dg-message "" } + +void ncl1100(S&); +void ncl1100(const S&) {} + +void ncl1101(S&); +void ncl1101(const S&) {} +void ncl1101(const S&&); + +void ncl1110(S&); +void ncl1110(const S&) {} +void ncl1110(S&&); + +void ncl1111(S&); +void ncl1111(const S&) {} +void ncl1111(S&&); +void ncl1111(const S&&); + +void nr0001(const S&&) {} // { dg-message "" } + +void nr0010(S&&) {} // { dg-message "" } + +void nr0011(S&&) {} // { dg-message "" } +void nr0011(const S&&); + +void nr0100(const S&) {} + +void nr0101(const S&) {} +void nr0101(const S&&); + +void nr0110(const S&) {} +void nr0110(S&&); + +void nr0111(const S&) {} +void nr0111(S&&); +void nr0111(const S&&); + +void nr1000(S&) {} + +void nr1001(S&) {} +void nr1001(const S&&); + +void nr1010(S&) {} +void nr1010(S&&); + +void nr1011(S&) {} +void nr1011(S&&); +void nr1011(const S&&); + +void nr1100(S&) {} +void nr1100(const S&); + +void nr1101(S&) {} +void nr1101(const S&); +void nr1101(const S&&); + +void nr1110(S&) {} +void nr1110(const S&); +void nr1110(S&&); + +void nr1111(S&) {} +void nr1111(const S&); +void nr1111(S&&); +void nr1111(const S&&); + +void ncr0001(const S&&) {} // { dg-message "" } + +void ncr0011(S&&); +void ncr0011(const S&&) {} // { dg-message "" } + +void ncr0100(const S&) {} + +void ncr0101(const S&) {} +void ncr0101(const S&&); + +void ncr0110(const S&) {} +void ncr0110(S&&); + +void ncr0111(const S&) {} +void ncr0111(S&&); +void ncr0111(const S&&); + +void ncr1001(S&); +void ncr1001(const S&&) {} // { dg-message "" } + +void ncr1011(S&); +void ncr1011(S&&); +void ncr1011(const S&&) {} // { dg-message "" } + +void ncr1100(S&); +void ncr1100(const S&) {} + +void ncr1101(S&); +void ncr1101(const S&) {} +void ncr1101(const S&&); + +void ncr1110(S&); +void ncr1110(const S&) {} +void ncr1110(S&&); + +void ncr1111(S&); +void ncr1111(const S&) {} +void ncr1111(S&&); +void ncr1111(const S&&); + +void ul0001(const S&&) {} // { dg-message "" } + +void ul0010(S&&) {} // { dg-message "" } + +void ul0011(S&&) {} // { dg-message "" } +void ul0011(const S&&); + +void ul0100(const S&) {} + +void ul0101(const S&) {} +void ul0101(const S&&); + +void ul0110(const S&) {} +void ul0110(S&&); + +void ul0111(const S&) {} +void ul0111(S&&); +void ul0111(const S&&); + +void ul1000(S&) {} + +void ul1001(S&) {} +void ul1001(const S&&); + +void ul1010(S&) {} +void ul1010(S&&); + +void ul1011(S&) {} +void ul1011(S&&); +void ul1011(const S&&); + +void ul1100(S&) {} +void ul1100(const S&); + +void ul1101(S&) {} +void ul1101(const S&); +void ul1101(const S&&); + +void ul1110(S&) {} +void ul1110(const S&); +void ul1110(S&&); + +void ul1111(S&) {} +void ul1111(const S&); +void ul1111(S&&); +void ul1111(const S&&); + +void ucl0001(const S&&) {} // { dg-message "" } + +void ucl0011(S&&); +void ucl0011(const S&&) {} // { dg-message "" } + +void ucl0100(const S&) {} + +void ucl0101(const S&) {} +void ucl0101(const S&&); + +void ucl0110(const S&) {} +void ucl0110(S&&); + +void ucl0111(const S&) {} +void ucl0111(S&&); +void ucl0111(const S&&); + +void ucl1001(S&); +void ucl1001(const S&&) {} // { dg-message "" } + +void ucl1011(S&); +void ucl1011(S&&); +void ucl1011(const S&&) {} // { dg-message "" } + +void ucl1100(S&); +void ucl1100(const S&) {} + +void ucl1101(S&); +void ucl1101(const S&) {} +void ucl1101(const S&&); + +void ucl1110(S&); +void ucl1110(const S&) {} +void ucl1110(S&&); + +void ucl1111(S&); +void ucl1111(const S&) {} +void ucl1111(S&&); +void ucl1111(const S&&); + +void ur0001(const S&&) {} + +void ur0010(S&&) {} + +void ur0011(S&&) {} +void ur0011(const S&&); + +void ur0100(const S&) {} + +void ur0101(const S&); +void ur0101(const S&&) {} + +void ur0110(const S&); +void ur0110(S&&) {} + +void ur0111(const S&); +void ur0111(S&&) {} +void ur0111(const S&&); + +void ur1001(S&); +void ur1001(const S&&) {} + +void ur1010(S&); +void ur1010(S&&) {} + +void ur1011(S&); +void ur1011(S&&) {} +void ur1011(const S&&); + +void ur1100(S&); +void ur1100(const S&) {} + +void ur1101(S&); +void ur1101(const S&); +void ur1101(const S&&) {} + +void ur1110(S&); +void ur1110(const S&); +void ur1110(S&&) {} + +void ur1111(S&); +void ur1111(const S&); +void ur1111(S&&) {} +void ur1111(const S&&); + +void ucr0001(const S&&) {} + +void ucr0011(S&&); +void ucr0011(const S&&) {} + +void ucr0100(const S&) {} + +void ucr0101(const S&); +void ucr0101(const S&&) {} + +void ucr0110(const S&) {} +void ucr0110(S&&); + +void ucr0111(const S&); +void ucr0111(S&&); +void ucr0111(const S&&) {} + +void ucr1001(S&); +void ucr1001(const S&&) {} + +void ucr1011(S&); +void ucr1011(S&&); +void ucr1011(const S&&) {} + +void ucr1100(S&); +void ucr1100(const S&) {} + +void ucr1101(S&); +void ucr1101(const S&); +void ucr1101(const S&&) {} + +void ucr1110(S&); +void ucr1110(const S&) {} +void ucr1110(S&&); + +void ucr1111(S&); +void ucr1111(const S&); +void ucr1111(S&&); +void ucr1111(const S&&) {} + + +int main() +{ + l0001(l); // { dg-error "lvalue" } + l0010(l); // { dg-error "lvalue" } + l0011(l); // { dg-error "lvalue" } + l0100(l); + l0101(l); + l0110(l); + l0111(l); + l1000(l); + l1001(l); + l1010(l); + l1011(l); + l1100(l); + l1101(l); + l1110(l); + l1111(l); + cl0001(cl); // { dg-error "lvalue" } + cl0011(cl); // { dg-error "lvalue" } + cl0100(cl); + cl0101(cl); + cl0110(cl); + cl0111(cl); + cl1001(cl); // { dg-error "lvalue" } + cl1011(cl); // { dg-error "lvalue" } + cl1100(cl); + cl1101(cl); + cl1110(cl); + cl1111(cl); + r0001(r()); + r0010(r()); + r0011(r()); + r0100(r()); + r0101(r()); + r0110(r()); + r0111(r()); + r1001(r()); + r1010(r()); + r1011(r()); + r1100(r()); + r1101(r()); + r1110(r()); + r1111(r()); + cr0001(cr()); + cr0011(cr()); + cr0100(cr()); + cr0101(cr()); + cr0110(cr()); + cr0111(cr()); + cr1001(cr()); + cr1011(cr()); + cr1100(cr()); + cr1101(cr()); + cr1110(cr()); + cr1111(cr()); + nl0001(nl); // { dg-error "lvalue" } + nl0010(nl); // { dg-error "lvalue" } + nl0011(nl); // { dg-error "lvalue" } + nl0100(nl); + nl0101(nl); + nl0110(nl); + nl0111(nl); + nl1000(nl); + nl1001(nl); + nl1010(nl); + nl1011(nl); + nl1100(nl); + nl1101(nl); + nl1110(nl); + nl1111(nl); + ncl0001(ncl); // { dg-error "lvalue" } + ncl0011(ncl); // { dg-error "lvalue" } + ncl0100(ncl); + ncl0101(ncl); + ncl0110(ncl); + ncl0111(ncl); + ncl1001(ncl); // { dg-error "lvalue" } + ncl1011(ncl); // { dg-error "lvalue" } + ncl1100(ncl); + ncl1101(ncl); + ncl1110(ncl); + ncl1111(ncl); + nr0001(nr); // { dg-error "lvalue" } + nr0010(nr); // { dg-error "lvalue" } + nr0011(nr); // { dg-error "lvalue" } + nr0100(nr); + nr0101(nr); + nr0110(nr); + nr0111(nr); + nr1000(nr); + nr1001(nr); + nr1010(nr); + nr1011(nr); + nr1100(nr); + nr1101(nr); + nr1110(nr); + nr1111(nr); + ncr0001(ncr); // { dg-error "lvalue" } + ncr0011(ncr); // { dg-error "lvalue" } + ncr0100(ncr); + ncr0101(ncr); + ncr0110(ncr); + ncr0111(ncr); + ncr1001(ncr); // { dg-error "lvalue" } + ncr1011(ncr); // { dg-error "lvalue" } + ncr1100(ncr); + ncr1101(ncr); + ncr1110(ncr); + ncr1111(ncr); + ul0001(ul()); // { dg-error "lvalue" } + ul0010(ul()); // { dg-error "lvalue" } + ul0011(ul()); // { dg-error "lvalue" } + ul0100(ul()); + ul0101(ul()); + ul0110(ul()); + ul0111(ul()); + ul1000(ul()); + ul1001(ul()); + ul1010(ul()); + ul1011(ul()); + ul1100(ul()); + ul1101(ul()); + ul1110(ul()); + ul1111(ul()); + ucl0001(ucl()); // { dg-error "lvalue" } + ucl0011(ucl()); // { dg-error "lvalue" } + ucl0100(ucl()); + ucl0101(ucl()); + ucl0110(ucl()); + ucl0111(ucl()); + ucl1001(ucl()); // { dg-error "lvalue" } + ucl1011(ucl()); // { dg-error "lvalue" } + ucl1100(ucl()); + ucl1101(ucl()); + ucl1110(ucl()); + ucl1111(ucl()); + ur0001(ur()); + ur0010(ur()); + ur0011(ur()); + ur0100(ur()); + ur0101(ur()); + ur0110(ur()); + ur0111(ur()); + ur1001(ur()); + ur1010(ur()); + ur1011(ur()); + ur1100(ur()); + ur1101(ur()); + ur1110(ur()); + ur1111(ur()); + ucr0001(ucr()); + ucr0011(ucr()); + ucr0100(ucr()); + ucr0101(ucr()); + ucr0110(ucr()); + ucr0111(ucr()); + ucr1001(ucr()); + ucr1011(ucr()); + ucr1100(ucr()); + ucr1101(ucr()); + ucr1110(ucr()); + ucr1111(ucr()); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/parse1.C b/gcc/testsuite/g++.dg/cpp0x/parse1.C new file mode 100644 index 000000000..41811853c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/parse1.C @@ -0,0 +1,5 @@ +// PR c++/43509 +// { dg-options "-std=c++0x" } + +typedef int B; // { dg-error "" } +B::B() {} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr31431-2.C b/gcc/testsuite/g++.dg/cpp0x/pr31431-2.C new file mode 100644 index 000000000..15efbc5d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr31431-2.C @@ -0,0 +1,8 @@ +// { dg-options "-std=gnu++0x" } +template<typename, typename..., typename> void foo(); // { dg-message "note" } + +void bar() +{ + foo<int>(); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 6 } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr31431.C b/gcc/testsuite/g++.dg/cpp0x/pr31431.C new file mode 100644 index 000000000..36f341f3d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr31431.C @@ -0,0 +1,8 @@ +// { dg-options "-std=gnu++0x" } +template<typename..., typename> void foo(); // { dg-message "note" } + +void bar() +{ + foo<int>(); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 6 } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr31432.C b/gcc/testsuite/g++.dg/cpp0x/pr31432.C new file mode 100644 index 000000000..8016ee69d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr31432.C @@ -0,0 +1,8 @@ +// { dg-options "-std=gnu++0x" } +template<typename..., typename> struct A // { dg-error "parameter pack" } +{ + static int i; +}; + +A<int, int> a; // { dg-error "mismatch|expected|invalid type" } +A<char,int> b; // { dg-error "mismatch|expected|invalid type" } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr31434.C b/gcc/testsuite/g++.dg/cpp0x/pr31434.C new file mode 100644 index 000000000..97ad079ab --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr31434.C @@ -0,0 +1,12 @@ +// { dg-options "-std=gnu++0x" } +template<typename... T> int foo(const T&) // { dg-error "not expanded with|T" } +{ + union { T t; }; // { dg-error "not expanded with|T" } + return t; +} + +void bar() +{ + foo(0); // { dg-error "no matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 10 } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr31437.C b/gcc/testsuite/g++.dg/cpp0x/pr31437.C new file mode 100644 index 000000000..0b64f7273 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr31437.C @@ -0,0 +1,10 @@ +// { dg-options "-std=gnu++0x" } +template <typename... T> struct A // { dg-error "candidates|A" } +{ + A(T* p) { // { dg-error "parameter packs|T" } + (A<T...>*)(p); + } +}; + +A<int> a(0); // { dg-error "no matching" } +// { dg-message "candidate" "candidate note" { target *-*-* } 9 } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr31438.C b/gcc/testsuite/g++.dg/cpp0x/pr31438.C new file mode 100644 index 000000000..74738830a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr31438.C @@ -0,0 +1,9 @@ +// { dg-options "-std=gnu++0x" } + +template<typename> struct A; +template<typename T, typename... U> struct A<T(U)> // { dg-error "parameter packs|U" } +{ + template<typename X> A(X); +}; + +A<void(int)> a(0); // { dg-error "incomplete type" } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr31439.C b/gcc/testsuite/g++.dg/cpp0x/pr31439.C new file mode 100644 index 000000000..9d22b56c2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr31439.C @@ -0,0 +1,8 @@ +// { dg-options "-std=c++0x" } +template<typename...> struct A; // { dg-error "declaration" } + +template<char> struct A<> {}; // { dg-error "not used in partial specialization|anonymous" } + +template<typename T, typename... U> struct A<T, U...> : A<U...> {}; // { dg-error "incomplete type" } + +A<int> a; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr31442.C b/gcc/testsuite/g++.dg/cpp0x/pr31442.C new file mode 100644 index 000000000..f4e411c45 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr31442.C @@ -0,0 +1,9 @@ +// { dg-options "-std=gnu++0x" } +template<typename... T, T = 0> struct A {}; // { dg-error "parameter packs|T|the end|parameter packs|anonymous" } + +struct B +{ + template <template <typename...> class C> B(C<int>); +}; + +B b = A<int>(); // { dg-error "mismatch|expected" } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr31443.C b/gcc/testsuite/g++.dg/cpp0x/pr31443.C new file mode 100644 index 000000000..1eb9d318d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr31443.C @@ -0,0 +1,11 @@ +// { dg-options "-std=gnu++0x" } + +template<int, typename... T> struct A +{ + template<int N> void foo(A<N,T>); // { dg-error "parameter packs|T" } +}; + +void bar() +{ + A<0,int>().foo(A<0,int>()); // { dg-error "no member named" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr31444.C b/gcc/testsuite/g++.dg/cpp0x/pr31444.C new file mode 100644 index 000000000..b1f86fe7a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr31444.C @@ -0,0 +1,10 @@ +// { dg-options "-std=gnu++0x" } +template<typename... T> struct A +{ + template<int> void foo(A<T>); // { dg-error "not expanded|T" } +}; + +void bar() +{ + A<int>().foo<0>(A<int>()); // { dg-error "no member named" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr31445.C b/gcc/testsuite/g++.dg/cpp0x/pr31445.C new file mode 100644 index 000000000..b3f2b5b09 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr31445.C @@ -0,0 +1,8 @@ +// { dg-options "-std=gnu++0x" } +template <typename... T> struct A +{ + void foo(T...); + A(T... t) { foo(t); } // { dg-error "parameter packs|t" } +}; + +A<int> a(0); diff --git a/gcc/testsuite/g++.dg/cpp0x/pr31993.C b/gcc/testsuite/g++.dg/cpp0x/pr31993.C new file mode 100644 index 000000000..94fb9ccda --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr31993.C @@ -0,0 +1,9 @@ +// { dg-options "-std=c++0x" } + +template<typename...> struct A; + +template<template<int> class... T> struct A<T<0>...> +{ + template<int> struct B {}; + B<0> b; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr32114.C b/gcc/testsuite/g++.dg/cpp0x/pr32114.C new file mode 100644 index 000000000..e78dfdf1d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr32114.C @@ -0,0 +1,7 @@ +// { dg-options "-std=c++0x" } +template<typename ...T> struct A +{ + typedef typename T::X Y; // { dg-error "not expanded|T" } +}; + +A<int> a; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr32115.C b/gcc/testsuite/g++.dg/cpp0x/pr32115.C new file mode 100644 index 000000000..a721eed4e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr32115.C @@ -0,0 +1,4 @@ +// { dg-options "-std=c++0x" } +template<typename ...T, int = 0> struct A {}; // { dg-error "end of" } + +A<int> a; // { dg-error "mismatch|expected|invalid" } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr32125.C b/gcc/testsuite/g++.dg/cpp0x/pr32125.C new file mode 100644 index 000000000..210a29c08 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr32125.C @@ -0,0 +1,8 @@ +// { dg-options "-std=c++0x" } +template<typename...> struct A; + +template<typename...T> struct A<T*> // { dg-error "not expanded|T" } +{ + A(); + A(T); +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr32126.C b/gcc/testsuite/g++.dg/cpp0x/pr32126.C new file mode 100644 index 000000000..c525cca68 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr32126.C @@ -0,0 +1,10 @@ +// { dg-options "-std=c++0x" } +template<typename...> struct A; + +template<typename...T> struct A<T> // { dg-error "not expanded|T|" } +{ + static int i; +}; + +A<char> a; // { dg-error "incomplete" } +A<int> b; // { dg-error "incomplete" } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr32127.C b/gcc/testsuite/g++.dg/cpp0x/pr32127.C new file mode 100644 index 000000000..8e4bc0050 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr32127.C @@ -0,0 +1,7 @@ +// { dg-options "-std=c++0x" } +template<typename...T> struct A +{ + static T i; // { dg-error "parameter packs|T" } +}; + +int j = A<int>::i; // { dg-error "not a member" } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr32128.C b/gcc/testsuite/g++.dg/cpp0x/pr32128.C new file mode 100644 index 000000000..5876dbec4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr32128.C @@ -0,0 +1,7 @@ +// { dg-options "-std=c++0x" } +template<typename...> struct A; + +template<typename...T, typename...U> + struct A<T..., U...> {}; // { dg-error "must be at the end" } + +A<int> a; // { dg-error "incomplete" } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr32252.C b/gcc/testsuite/g++.dg/cpp0x/pr32252.C new file mode 100644 index 000000000..543dc8873 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr32252.C @@ -0,0 +1,8 @@ +// { dg-options "-std=c++0x" } +int x[5]; + +template<int M, int N, int (&... p)[N]> struct A; + +template<int M> struct A<M,5,x> {}; + +A<0,5,x> a; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr32253.C b/gcc/testsuite/g++.dg/cpp0x/pr32253.C new file mode 100644 index 000000000..d8f7b03b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr32253.C @@ -0,0 +1,9 @@ +// { dg-options "-std=c++0x" } +template<void (*... fp)()> struct A +{ + A() { fp(); } // { dg-error "not expanded|fp" } +}; + +void foo(); + +A<foo> a; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr32566.C b/gcc/testsuite/g++.dg/cpp0x/pr32566.C new file mode 100644 index 000000000..f6e7a5b54 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr32566.C @@ -0,0 +1,4 @@ +// { dg-options "-std=c++0x" } +template<int...> struct A; + +template<template<int> class... T> struct A<T...> {}; // { dg-error "mismatch|expected" } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr33839.C b/gcc/testsuite/g++.dg/cpp0x/pr33839.C new file mode 100644 index 000000000..0a6610ac9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr33839.C @@ -0,0 +1,8 @@ +// { dg-options -std=c++0x } +template<int> struct A; + +void foo() +{ + __decltype A<0>; // { dg-error "invalid declarator|expected" } + __decltype (A<0>); // { dg-error "must be an expression" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr33930.C b/gcc/testsuite/g++.dg/cpp0x/pr33930.C new file mode 100644 index 000000000..d1e6fa56b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr33930.C @@ -0,0 +1,10 @@ +// { dg-options "-std=c++0x" } +typedef const int* type; + +float& foo( const type& ggg ); +int& foo( type&& ggg ); + +void bar( int* someptr ) +{ + int& x = foo( someptr ); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr33955.C b/gcc/testsuite/g++.dg/cpp0x/pr33955.C new file mode 100644 index 000000000..cde92dedf --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr33955.C @@ -0,0 +1,39 @@ +// { dg-options "-std=c++0x" } +template<typename T> +struct uncvref +{ + typedef T type; +}; + +template<typename... Args> +struct args +{ + static const int size = sizeof...(Args); +}; + +template<typename G, typename E, typename S, typename V, long GN = G::size, long EN = E::size> +struct apply_args; + +template<typename... G, typename... E, typename S, typename V, long N> +struct apply_args<args<G...>, args<E...>, S, V, N, N> +{ + typedef args< + typename G::template apply<typename uncvref<E>::type, S, V>::type... + > type; +}; + +struct or_ +{ + template<typename E, typename S, typename V> + struct apply { + typedef typename E::type type; + }; +}; + +template<typename T> +struct identity +{ + typedef T type; +}; + +apply_args<args<or_>, args<identity<int>>, float, double> a1; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr33996.C b/gcc/testsuite/g++.dg/cpp0x/pr33996.C new file mode 100644 index 000000000..07590f06f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr33996.C @@ -0,0 +1,52 @@ +// { dg-options "-std=c++0x" } + +#define BUG +struct type +{ + type() { } + type(const type&) { } + +private: + type(type&&); +}; + +template<typename _Tp> + struct identity + { + typedef _Tp type; + }; + +template<typename _Tp> + inline _Tp&& + forward(typename identity<_Tp>::type&& __t) + { return __t; } + +struct vec +{ + template<typename _Args> + void + bar(_Args&& __args) +#ifdef BUG + ; +#else + { + type(forward<_Args>(__args)); + } +#endif +}; + +#ifdef BUG +template<typename _Args> + void + vec::bar(_Args&& __args) + { + type(forward<_Args>(__args)); + } +#endif + +int main() +{ + vec v; + type c; + v.bar(c); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr34054.C b/gcc/testsuite/g++.dg/cpp0x/pr34054.C new file mode 100644 index 000000000..cfc6c4bdc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr34054.C @@ -0,0 +1,5 @@ +// PR c++/34054 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template<typename... T> T foo() {} // { dg-error "not expanded|T" } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr34056.C b/gcc/testsuite/g++.dg/cpp0x/pr34056.C new file mode 100644 index 000000000..0e5246b6a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr34056.C @@ -0,0 +1,10 @@ +// PR c++/34056 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template<typename... T> struct A +{ + void foo (T *) { ++p; } // { dg-error "not expanded|T" } + void bar (T **) { } // { dg-error "not expanded|T" } + T *p; // { dg-error "not expanded|T" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr34057.C b/gcc/testsuite/g++.dg/cpp0x/pr34057.C new file mode 100644 index 000000000..38da5ff50 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr34057.C @@ -0,0 +1,8 @@ +// PR c++/34057 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <typename... T> struct A +{ + typedef T X __attribute__ ((vector_size (8))); // { dg-error "not expanded|T" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr34058.C b/gcc/testsuite/g++.dg/cpp0x/pr34058.C new file mode 100644 index 000000000..0cf1faec7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr34058.C @@ -0,0 +1,10 @@ +// PR c++/34058 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <typename...T> struct A +{ + typedef T X; // { dg-error "not expanded|T" } +}; + +A<int> a; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr34060.C b/gcc/testsuite/g++.dg/cpp0x/pr34060.C new file mode 100644 index 000000000..8e0d321b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr34060.C @@ -0,0 +1,11 @@ +// PR c++/34060 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <int> struct A +{ + template <typename... > struct B {}; + template <typename... T> struct B <int, T *> {}; // { dg-error "not expanded|T" } +}; + +A<0>::B<int>b; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr34061.C b/gcc/testsuite/g++.dg/cpp0x/pr34061.C new file mode 100644 index 000000000..7d6e71d0e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr34061.C @@ -0,0 +1,5 @@ +// PR c++/34061 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template<template<int> class ...T> struct A : T<0> {}; // { dg-error "not expanded|T" } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr38646.C b/gcc/testsuite/g++.dg/cpp0x/pr38646.C new file mode 100644 index 000000000..f15fc8c29 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr38646.C @@ -0,0 +1,12 @@ +/* PR c++/38646 */ +/* { dg-do compile } */ +/* { dg-options "-std=c++0x" } */ + +template<int...> struct A; + +template<int... N> struct A<N..., N...> /* { dg-error "must be at the end" } */ +{ + template<typename> struct B; + + template<typename T> struct B<T*> {}; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr38795.C b/gcc/testsuite/g++.dg/cpp0x/pr38795.C new file mode 100644 index 000000000..54fb361d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr38795.C @@ -0,0 +1,13 @@ +// PR c++/38795 +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template<typename... T> int foo(int i) +{ + return *reinterpret_cast<T*>(i); // { dg-error "not expanded with|T" } +} + +void bar(int i) +{ + foo<int>(i); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr39639.C b/gcc/testsuite/g++.dg/cpp0x/pr39639.C new file mode 100644 index 000000000..4fd8b56fd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr39639.C @@ -0,0 +1,20 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/39639 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <class... Types> +struct S + : S<...Types>, // { dg-error "expected parameter pack before '...'" } + S<...Types...>, // { dg-error "expected parameter pack before '...'" } + S<...> // { dg-error "expected parameter pack before '...'" } +{ + static int f () { return 1;} +}; + +int +main () +{ + return S<void>::f (); +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/pr42844-2.C b/gcc/testsuite/g++.dg/cpp0x/pr42844-2.C new file mode 100644 index 000000000..4425aacf6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr42844-2.C @@ -0,0 +1,42 @@ +// PR c++/42844 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +struct A // { dg-message "user-provided default constructor" } +{ + int i; + A() = default; // { dg-message "not user-provided" } +}; + +struct Base +{ + Base() {} +}; + +struct Derived : Base // { dg-message "user-provided default constructor" } +{ + int i; + Derived() = default; // { dg-message "not user-provided" } +}; + +struct Derived2 : Base // { dg-message "user-provided default constructor" } +{ + int i; + Derived2() = default; // { dg-message "not user-provided" } + Derived2( Derived2 const& ) = default; +}; + +struct Derived3 : Base // { dg-message "user-provided default constructor" } +{ + int i; + Derived3( Derived3 const& ) = default; + Derived3() = default; // { dg-message "not user-provided" } +}; + +void f() +{ + const A a; // { dg-error "uninitialized const" } + const Derived d; // { dg-error "uninitialized const" } + const Derived2 d2; // { dg-error "uninitialized const" } + const Derived3 d3; // { dg-error "uninitialized const" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr45908.C b/gcc/testsuite/g++.dg/cpp0x/pr45908.C new file mode 100644 index 000000000..3a8508890 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr45908.C @@ -0,0 +1,18 @@ +// PR c++/45908 +// Testcase by Jonathan Wakely <redi@gcc.gnu.org> + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +struct vector { + struct iterator { }; + struct const_iterator { }; + iterator begin(); + const_iterator begin() const; +}; + +class block { + vector v; + auto end() const -> decltype(v.begin()) + { return v.begin(); } // { dg-error "could not convert" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr47416.C b/gcc/testsuite/g++.dg/cpp0x/pr47416.C new file mode 100644 index 000000000..a11368a50 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr47416.C @@ -0,0 +1,225 @@ +// PR c++/47416 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +namespace std +{ + template < typename _Tp, _Tp __v > struct integral_constant + { + static const _Tp value = __v; + }; + typedef integral_constant < bool, false > false_type; + template < typename > struct is_array:false_type + { + }; + template < typename > struct is_function:false_type + { + }; + template < typename _Tp > struct remove_const + { + typedef _Tp type; + }; + template < typename _Tp > struct remove_volatile + { + typedef _Tp type; + }; + template < typename _Tp > struct remove_cv + { + typedef typename remove_const < typename remove_volatile < + _Tp >::type >::type type; + }; + template < typename > struct remove_reference + { + }; + template < typename _Tp > struct remove_reference <_Tp & > + { + typedef _Tp type; + }; + template < typename _Up, bool = is_array < _Up >::value, bool = + is_function < _Up >::value > struct __decay_selector; + template < typename _Up > struct __decay_selector <_Up, false, false > + { + typedef typename remove_cv < _Up >::type __type; + }; + template < typename _Tp > class decay + { + typedef typename remove_reference < _Tp >::type __remove_type; + public:typedef typename __decay_selector < + __remove_type >::__type type; + }; + template < typename _Tp > struct __strip_reference_wrapper + { + typedef _Tp __type; + }; + template < typename _Tp > struct __decay_and_strip + { + typedef typename __strip_reference_wrapper < typename decay < + _Tp >::type >::__type __type; + }; + template < typename _Tp > _Tp forward (typename remove_reference < + _Tp >::type &) + { + } + template < class _T1, class _T2 > struct pair + { + _T1 first; + _T2 second; + constexpr pair (_T1, _T2 &):first (), second (__b) // { dg-error "was not declared in this scope" } + { + } + }; + template < class _T1, + class _T2 > pair < typename __decay_and_strip < _T1 >::__type, + typename __decay_and_strip < _T2 >::__type > make_pair (_T1 && __x, _T2 + && __y) + { + typedef typename __decay_and_strip < _T1 >::__type __ds_type1; + typedef typename __decay_and_strip < _T2 >::__type __ds_type2; + typedef pair < __ds_type1, __ds_type2 > __pair_type; + __pair_type (forward < _T1 > (__x), std::forward < _T2 > (__y)); + } +} + +typedef long size_t; +namespace std +{ + template < typename > class allocator; + template < class > struct char_traits; + template < typename _CharT, typename = char_traits < _CharT >, typename = + allocator < _CharT > >class basic_string; + typedef basic_string < char >string; +} +namespace __gnu_cxx +{ + template < bool > class __pool; + template < template < bool > class, bool > struct __common_pool + { + }; + template < template < bool > class, bool > struct __common_pool_base; + template < template < bool > class _PoolTp > + struct __common_pool_base <_PoolTp, true >:__common_pool < _PoolTp, true > + { + }; + template < template < bool > class _PoolTp, + bool _Thread > struct __common_pool_policy:__common_pool_base < _PoolTp, + _Thread > + { + template < typename, template < bool > class _PoolTp1 = + _PoolTp, bool _Thread1 = _Thread > struct _M_rebind + { + typedef __common_pool_policy < _PoolTp1, _Thread1 > other; + }; + }; + template < typename _Tp > class __mt_alloc_base + { + }; +template < typename _Tp, typename _Poolp = __common_pool_policy < __pool, true > >class __mt_alloc:public __mt_alloc_base < + _Tp + > + { + public:size_t size_type; + typedef _Tp value_type; + template < typename _Tp1, typename _Poolp1 = _Poolp > struct rebind + { + typedef typename _Poolp1::template _M_rebind < _Tp1 >::other pol_type; + typedef __mt_alloc < _Tp1, pol_type > other; + }; + }; +} + +namespace std +{ + template < typename _Tp > class allocator:public __gnu_cxx::__mt_alloc < + _Tp > + { + }; + template < typename, typename > struct unary_function + { + }; + template < typename, typename, typename > struct binary_function + { + }; + template < typename _Tp > struct equal_to:binary_function < _Tp, _Tp, bool > + { + }; +} + +namespace boost +{ + template < class > struct hash; + template < class K, class T, class = hash < K >, class = + std::equal_to < K >, class = + std::allocator < std::pair < const K, T > >>class unordered_map; + template < >struct hash <std::string >:std::unary_function < std::string, + size_t > + { + }; + namespace unordered_detail + { + template < class Alloc, class T > struct rebind_wrap + { + typedef typename Alloc::template rebind < T >::other type; + }; + } + namespace unordered_detail + { + size_t default_bucket_count; + template < class, class > struct map_extractor; + struct ungrouped + { + }; + template < class T > class hash_table:T::buckets, T::buffered_functions + { + }; + template < class, class, class H, class P, class A, class, class G > struct types + { + typedef H hasher; + typedef P key_equal; + typedef A value_allocator; + }; + template < class T > class hash_unique_table:T + { + public:typedef typename T::hasher hasher; + typedef typename T::key_equal key_equal; + typedef typename T::value_allocator value_allocator; + typedef typename T::table table; + hash_unique_table (size_t n, hasher, key_equal, + value_allocator & a):table (n, a) // { dg-error "is not a direct base" } + { + } + }; + template < class K, class H, class P, class A > struct map:types < K, + typename A::value_type, H, P, A, map_extractor < K, + typename A::value_type >, ungrouped > + { + typedef hash_unique_table < map < K, H, P, A > >impl; + typedef hash_table < map < K, H, P, A > >table; + }; + } + template < class K, class T, class H, class P, class A > class unordered_map + { + typedef std::pair < const K, T > value_type; + typedef H hasher; + typedef P key_equal; + typedef A allocator_type; + typedef typename unordered_detail::rebind_wrap < allocator_type, + value_type >::type value_allocator; + typedef boost::unordered_detail::map < K, H, P, value_allocator > types; + typedef typename types::impl table; + typedef size_t size_type; + private:table table_; + public: unordered_map (size_type n = boost::unordered_detail::default_bucket_count, + hasher hf = hasher (), key_equal eql = key_equal (), + allocator_type a = allocator_type ()):table_ (n, hf, eql, a) // { dg-message "instantiated" } + { + } + }; +}; + +void +foo (const int &a) +{ + typedef boost::unordered_map < std::string, int >Name2Port; + Name2Port b; // { dg-message "instantiated" } + std::make_pair (a, b); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr47476.C b/gcc/testsuite/g++.dg/cpp0x/pr47476.C new file mode 100644 index 000000000..1f6f09ccc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr47476.C @@ -0,0 +1,10 @@ +// PR c++/47476 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +int +foo (int a, int b) +{ + const bool c ((a != 0) == (b != 26)); + return c; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr48522.C b/gcc/testsuite/g++.dg/cpp0x/pr48522.C new file mode 100644 index 000000000..1543d8a28 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr48522.C @@ -0,0 +1,24 @@ +// { dg-options "-std=c++0x" } + +template <typename T> +struct Handle +{ + Handle(T& t); +}; + +template<class T> +struct Class { + struct Struct {} data; + void f(); + void g(); +}; + +template<class T> +void Class<T>::f() { + Handle< decltype((data)) > handle(data); +} + +template<class T> +void Class<T>::g() { + Handle< decltype((data)) > handle(data); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr50491.C b/gcc/testsuite/g++.dg/cpp0x/pr50491.C new file mode 100644 index 000000000..48e7a1f74 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr50491.C @@ -0,0 +1,17 @@ +// { dg-options "-std=c++0x" } + +struct GrandParent { + void *get(); +}; + +template<class OBJ> +struct Parent : public GrandParent{ +}; + +template<typename T> +struct Child : public Parent<T> { + using GrandParent::get; + void Foo() { + void* ex = get(); + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr50901.C b/gcc/testsuite/g++.dg/cpp0x/pr50901.C new file mode 100644 index 000000000..439c15cc1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr50901.C @@ -0,0 +1,9 @@ +// { dg-options "-std=c++0x" } + +template<class T> int foo(int a) +{ + const unsigned b = a < 0 ? -a : a; + return 0; +} + +int i = foo<float>(1); diff --git a/gcc/testsuite/g++.dg/cpp0x/pr51150.C b/gcc/testsuite/g++.dg/cpp0x/pr51150.C new file mode 100644 index 000000000..37eb166b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr51150.C @@ -0,0 +1,20 @@ +// PR c++/51150 +// { dg-options "-std=c++0x" } + +struct Clock { + double Now(); +}; +template <class T> void Foo(Clock* clock) { + const int now = clock->Now(); +} + +template void Foo<float>(Clock*); + +template <class T> void Boo(int val) { + const int now1 = (double)(val); + const int now2 = const_cast<double>(val); // { dg-error "invalid" } + const int now3 = static_cast<double>(val); + const int now4 = reinterpret_cast<double>(val); // { dg-error "invalid" } +} + +template void Boo<float>(int); diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for1.C b/gcc/testsuite/g++.dg/cpp0x/range-for1.C new file mode 100644 index 000000000..49e2ecd0b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for1.C @@ -0,0 +1,17 @@ +// Test for range-based for loop +// Test the loop with an array + +// { dg-do run } +// { dg-options "-std=c++0x" } + +extern "C" void abort(); + +int main() +{ + int a[] = {1,2,3,4}; + int sum = 0; + for (int x : a) + sum += x; + if (sum != 10) + abort(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for10.C b/gcc/testsuite/g++.dg/cpp0x/range-for10.C new file mode 100644 index 000000000..662074890 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for10.C @@ -0,0 +1,18 @@ +// PR c++/47388 +// { dg-do compile } +// { dg-options "-fno-for-scope -std=c++0x" } + +template <int> +void +foo () +{ + int a[] = { 1, 2, 3, 4 }; + for (int i : a) + ; +} + +void +bar () +{ + foo <0> (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for2.C b/gcc/testsuite/g++.dg/cpp0x/range-for2.C new file mode 100644 index 000000000..bfab37673 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for2.C @@ -0,0 +1,41 @@ +// Test for range-based for loop +// Test the loop with a custom iterator +// with begin/end in an associated namespace + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +struct iterator +{ + int x; + iterator(int v) :x(v) {} + iterator &operator ++() { ++x; return *this; } + int operator *() { return x; } + bool operator != (const iterator &o) { return x != o.x; } +}; + +namespace foo +{ + struct container + { + int min, max; + container(int a, int b) :min(a), max(b) {} + }; + + iterator begin(container &c) + { + return iterator(c.min); + } + + iterator end(container &c) + { + return iterator(c.max + 1); + } +} + +int main() +{ + foo::container c(1,4); + for (iterator it : c) + ; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for3.C b/gcc/testsuite/g++.dg/cpp0x/range-for3.C new file mode 100644 index 000000000..947f01ced --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for3.C @@ -0,0 +1,42 @@ +// Test for range-based for loop +// Test the loop with a custom iterator +// with begin/end in std + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +struct iterator +{ + int x; + iterator(int v) :x(v) {} + iterator &operator ++() { ++x; return *this; } + int operator *() { return x; } + bool operator != (const iterator &o) { return x != o.x; } +}; + +struct container +{ + int min, max; + container(int a, int b) :min(a), max(b) {} +}; + +namespace std +{ + iterator begin(container &c) + { + return iterator(c.min); + } + + iterator end(container &c) + { + return iterator(c.max + 1); + } +} + +int main() +{ + container c(1,4); + for (iterator it : c) + { + } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for4.C b/gcc/testsuite/g++.dg/cpp0x/range-for4.C new file mode 100644 index 000000000..afbcf14b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for4.C @@ -0,0 +1,116 @@ +// Test for range-based for loop with templates + +// { dg-do run } +// { dg-options "-std=c++0x" } + +/* Preliminary declarations */ +namespace pre +{ + struct iterator + { + int x; + iterator (int v) :x(v) {} + iterator &operator ++() { ++x; return *this; } + int operator *() { return x; } + bool operator != (const iterator &o) { return x != o.x; } + }; + + struct container + { + int min, max; + container(int a, int b) :min(a), max(b) {} + }; + + iterator begin(const container &c) + { + return iterator(c.min); + } + + iterator end(const container &c) + { + return iterator(c.max); + } + +} //namespace pre + +using pre::container; +extern "C" void abort(void); + +container run_me_just_once() +{ + static bool run = false; + if (run) + abort(); + run = true; + return container(1,2); +} + +/* Template with dependent expression. */ +template<typename T> int test1(const T &r) +{ + int t = 0; + for (int i : r) + t += i; + return t; +} + +/* Template with non-dependent expression and dependent declaration. */ +template<typename T> int test2(const container &r) +{ + int t = 0; + for (T i : r) + t += i; + return t; +} + +/* Template with non-dependent expression (array) and dependent declaration. */ +template<typename T> int test2(const int (&r)[4]) +{ + int t = 0; + for (T i : r) + t += i; + return t; +} + +/* Template with non-dependent expression and auto declaration. */ +template<typename T> int test3(const container &r) +{ + int t = 0; + for (auto i : r) + t += i; + return t; +} + +/* Template with non-dependent expression (array) and auto declaration. */ +template<typename T> int test3(const int (&r)[4]) +{ + int t = 0; + for (auto i : r) + t += i; + return t; +} + +int main () +{ + container c(1,5); + int a[4] = {5,6,7,8}; + + for (auto x : run_me_just_once()) + ; + + if (test1 (c) != 10) + abort(); + if (test1 (a) != 26) + abort(); + + if (test2<int> (c) != 10) + abort(); + if (test2<int> (a) != 26) + abort(); + + if (test3<int> (c) != 10) + abort(); + if (test3<int> (a) != 26) + abort(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for5.C b/gcc/testsuite/g++.dg/cpp0x/range-for5.C new file mode 100644 index 000000000..9c97ad5fa --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for5.C @@ -0,0 +1,54 @@ +// Test for errors in range-based for loops + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +struct container +{ +}; + +int *begin(const container &c) +{ + return 0; +} + +int end(const container &c) //Ops! wrong type +{ + return 0; +} + + +struct Implicit +{ + Implicit(int x) + {} +}; +struct Explicit +{ + explicit Explicit(int x) + {} +}; + +void test1() +{ + container c; + for (int x : c) // { dg-error "inconsistent|conversion" } + ; + + int a[2] = {1,2}; + for (Implicit x : a) + ; + for (Explicit x : a) // { dg-error "conversion" } + ; + for (const Implicit &x : a) + ; + for (Implicit &&x : a) + ; + + //Check the correct scopes + int i; + for (int i : a) + { + int i; + } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for6.C b/gcc/testsuite/g++.dg/cpp0x/range-for6.C new file mode 100644 index 000000000..775507f8d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for6.C @@ -0,0 +1,29 @@ +// Test for range-based for loop +// Test the loop with an initializer_list + +// { dg-do run } +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +extern "C" void abort(); + +template<typename T> T foo() +{ + T sum = 0; + for (T x : {T(1),T(2),T(3),T(4)}) + sum += x; + if (sum != T(10)) + abort(); +} + +int main() +{ + int sum = 0; + for (int x : {1,2,3,4}) + sum += x; + if (sum != 10) + abort(); + + foo<int>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for7.C b/gcc/testsuite/g++.dg/cpp0x/range-for7.C new file mode 100644 index 000000000..ad89dc201 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for7.C @@ -0,0 +1,117 @@ +// PR c++/46056 +// Check that range-based for loop calls destructors +// when required +// { dg-options "-std=c++0x" } +// { dg-do run } +extern "C" void abort(); + +int value_counter = 0, it_counter = 0, seq_counter = 0; + +struct Int +{ + int x; + Int(int v) + :x(v) + { + ++value_counter; + } + Int(const Int &o) + :x(o.x) + { + ++value_counter; + } + ~Int() + { + --value_counter; + } +}; + +struct iterator +{ + int x; + iterator(int v) + :x(v) + { + ++it_counter; + } + iterator(const iterator &o) + :x(o.x) + { + ++it_counter; + } + ~iterator() + { + --it_counter; + } + iterator &operator ++() { ++x; return *this; } + int operator *() { return x; } + bool operator != (const iterator &o) { return x != o.x; } +}; + +struct container +{ + int min, max; + container(int a, int b) :min(a), max(b) + { + ++seq_counter; + } + container(const container &) = delete; + ~container() + { + --seq_counter; + } +}; + +iterator begin(container &c) +{ + return iterator(c.min); +} + +iterator end(container &c) +{ + return iterator(c.max + 1); +} + +int main() +{ + for (Int x : container(0, 10)) + { + if (value_counter != 1) abort(); + if (it_counter != 2) abort(); + if (seq_counter != 1) abort(); + } + if (value_counter != 0) abort(); + if (it_counter != 0) abort(); + if (seq_counter != 0) abort(); + + try + { + for (Int x : container(0, 10)) + { + if (value_counter != 1) abort(); + if (it_counter != 2) abort(); + if (seq_counter != 1) abort(); + } + if (value_counter != 0) abort(); + if (it_counter != 0) abort(); + if (seq_counter != 0) abort(); + + for (Int x : container(0, 10)) + { + if (value_counter != 1) abort(); + if (it_counter != 2) abort(); + if (seq_counter != 1) abort(); + + if (x.x == 5) + throw 0; + } + } + catch (int) + { + if (value_counter != 0) abort(); + if (it_counter != 0) abort(); + if (seq_counter != 0) abort(); + } + + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for8.C b/gcc/testsuite/g++.dg/cpp0x/range-for8.C new file mode 100644 index 000000000..641dfe052 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for8.C @@ -0,0 +1,16 @@ +// Test for range-based for loop when the declarator declares +// a new type + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +#include <initializer_list> + +void test() +{ + for (struct S { } *x : { (S*)0, (S*)0 } ) + ; + + for (struct S { } x : { S(), S() } ) + ; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for9.C b/gcc/testsuite/g++.dg/cpp0x/range-for9.C new file mode 100644 index 000000000..96e9cb61f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/range-for9.C @@ -0,0 +1,11 @@ +// Test for range-based for loop error in C++98 mode + +// { dg-do compile } +// { dg-options "-std=c++98" } + +void test() +{ + int a[] = {0,1,2}; + for (int x : a) // { dg-error "range-based-for" } + ; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/reference_collapsing.C b/gcc/testsuite/g++.dg/cpp0x/reference_collapsing.C new file mode 100644 index 000000000..5b682e304 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/reference_collapsing.C @@ -0,0 +1,175 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test the reference collapsing rules. Note that there are recent differences +// for how cv-qualifications are applied to reference types. 7.1.3, 14.3.1 + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +template <class T, T v> +struct integral_constant +{ + static const T value = v; + typedef T value_type; + typedef integral_constant<T, v> type; +}; + +typedef integral_constant<bool, true> true_type; +typedef integral_constant<bool, false> false_type; + +template <class T> struct is_lvalue_reference : public integral_constant<bool, false> {}; +template <class T> struct is_lvalue_reference<T&> : public integral_constant<bool, true> {}; + +template <class T> struct is_rvalue_reference : public integral_constant<bool, false> {}; +template <class T> struct is_rvalue_reference<T&&> : public integral_constant<bool, true> {}; + +template <class T> struct remove_reference {typedef T type;}; +template <class T> struct remove_reference<T&> {typedef T type;}; +template <class T> struct remove_reference<T&&> {typedef T type;}; + +template <class T> struct is_const : public integral_constant<bool, false> {}; +template <class T> struct is_const<T const> : public integral_constant<bool, true> {}; + +template <class T> struct is_volatile : public integral_constant<bool, false> {}; +template <class T> struct is_volatile<T volatile> : public integral_constant<bool, true> {}; + +struct A {}; + +typedef A& Alref; +typedef const A& cAlref; +typedef volatile A& vAlref; +typedef const volatile A& cvAlref; + +typedef A&& Arref; +typedef const A&& cArref; +typedef volatile A&& vArref; +typedef const volatile A&& cvArref; + +template <class T, bool is_lvalue_ref, bool is_rvalue_ref, bool s_const, bool s_volatile> +void test() +{ + sa<is_lvalue_reference<T>::value == is_lvalue_ref> t1; + sa<is_rvalue_reference<T>::value == is_rvalue_ref> t2; + sa<is_const <typename remove_reference<T>::type>::value == s_const> t3; + sa<is_volatile<typename remove_reference<T>::type>::value == s_volatile> t4; + sa<is_const <typename remove_reference<const T>::type>::value == s_const > t5; + sa<is_volatile<typename remove_reference< volatile T>::type>::value == s_volatile> t6; +} + +int main() +{ + // sanity check + test< A&, true, false, false, false>(); + test<const A&, true, false, true, false>(); + test< volatile A&, true, false, false, true>(); + test<const volatile A&, true, false, true, true>(); + test< A&&, false, true, false, false>(); + test<const A&&, false, true, true, false>(); + test< volatile A&&, false, true, false, true>(); + test<const volatile A&&, false, true, true, true>(); + +// lvalue reference test + + // Alref + test< Alref&, true, false, false, false>(); + test<const Alref&, true, false, false, false>(); + test< volatile Alref&, true, false, false, false>(); + test<const volatile Alref&, true, false, false, false>(); + + // cAlref + test< cAlref&, true, false, true, false>(); + test<const cAlref&, true, false, true, false>(); + test< volatile cAlref&, true, false, true, false>(); + test<const volatile cAlref&, true, false, true, false>(); + + // vAlref + test< vAlref&, true, false, false, true>(); + test<const vAlref&, true, false, false, true>(); + test< volatile vAlref&, true, false, false, true>(); + test<const volatile vAlref&, true, false, false, true>(); + + // cvAlref + test< cvAlref&, true, false, true, true>(); + test<const cvAlref&, true, false, true, true>(); + test< volatile cvAlref&, true, false, true, true>(); + test<const volatile cvAlref&, true, false, true, true>(); + + // Arref + test< Arref&, true, false, false, false>(); + test<const Arref&, true, false, false, false>(); + test< volatile Arref&, true, false, false, false>(); + test<const volatile Arref&, true, false, false, false>(); + + // cArref + test< cArref&, true, false, true, false>(); + test<const cArref&, true, false, true, false>(); + test< volatile cArref&, true, false, true, false>(); + test<const volatile cArref&, true, false, true, false>(); + + // vArref + test< vArref&, true, false, false, true>(); + test<const vArref&, true, false, false, true>(); + test< volatile vArref&, true, false, false, true>(); + test<const volatile vArref&, true, false, false, true>(); + + // vArref + test< cvArref&, true, false, true, true>(); + test<const cvArref&, true, false, true, true>(); + test< volatile cvArref&, true, false, true, true>(); + test<const volatile cvArref&, true, false, true, true>(); + +// rvalue reference test + + // Alref + test< Alref&&, true, false, false, false>(); + test<const Alref&&, true, false, false, false>(); + test< volatile Alref&&, true, false, false, false>(); + test<const volatile Alref&&, true, false, false, false>(); + + // cAlref + test< cAlref&&, true, false, true, false>(); + test<const cAlref&&, true, false, true, false>(); + test< volatile cAlref&&, true, false, true, false>(); + test<const volatile cAlref&&, true, false, true, false>(); + + // vAlref + test< vAlref&&, true, false, false, true>(); + test<const vAlref&&, true, false, false, true>(); + test< volatile vAlref&&, true, false, false, true>(); + test<const volatile vAlref&&, true, false, false, true>(); + + // cvAlref + test< cvAlref&&, true, false, true, true>(); + test<const cvAlref&&, true, false, true, true>(); + test< volatile cvAlref&&, true, false, true, true>(); + test<const volatile cvAlref&&, true, false, true, true>(); + + // Arref + test< Arref&&, false, true, false, false>(); + test<const Arref&&, false, true, false, false>(); + test< volatile Arref&&, false, true, false, false>(); + test<const volatile Arref&&, false, true, false, false>(); + + // cArref + test< cArref&&, false, true, true, false>(); + test<const cArref&&, false, true, true, false>(); + test< volatile cArref&&, false, true, true, false>(); + test<const volatile cArref&&, false, true, true, false>(); + + // vArref + test< vArref&&, false, true, false, true>(); + test<const vArref&&, false, true, false, true>(); + test< volatile vArref&&, false, true, false, true>(); + test<const volatile vArref&&, false, true, false, true>(); + + // cvArref + test< cvArref&&, false, true, true, true>(); + test<const cvArref&&, false, true, true, true>(); + test< volatile cvArref&&, false, true, true, true>(); + test<const volatile cvArref&&, false, true, true, true>(); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/49290.C b/gcc/testsuite/g++.dg/cpp0x/regress/49290.C new file mode 100644 index 000000000..71e46c579 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/49290.C @@ -0,0 +1,12 @@ +typedef unsigned T; +struct S +{ + T foo (void); + static unsigned s1[16]; +}; +T +S::foo () +{ + T u = *(T *) (s1 + 10); + return u; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/README b/gcc/testsuite/g++.dg/cpp0x/regress/README new file mode 100644 index 000000000..5c3402e74 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/README @@ -0,0 +1,3 @@ +This directory contains tests that were passing in C++98 mode but failing +in C++0x mode; it should be replaced by an improvement to the test harness +to run all tests in both modes. diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/abi-empty7.C b/gcc/testsuite/g++.dg/cpp0x/regress/abi-empty7.C new file mode 100644 index 000000000..adc71278d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/abi-empty7.C @@ -0,0 +1,20 @@ +// Copy of abi/empty7.C. +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target ilp32 } +// { dg-options "-fabi-version=0 -std=c++0x" } + +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/cpp0x/regress/array1.C b/gcc/testsuite/g++.dg/cpp0x/regress/array1.C new file mode 100644 index 000000000..629ab4103 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/array1.C @@ -0,0 +1,16 @@ +// PR c++/47808 +// { dg-options -std=c++0x } + +template <typename T> +inline T abs (T const & x) { return x; } + +template <typename T> +void f (T) +{ + typedef int ai[(abs(0.1) > 0) ? 1 : -1]; +} + +int main() +{ + f(1); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/bitfield-err1.C b/gcc/testsuite/g++.dg/cpp0x/regress/bitfield-err1.C new file mode 100644 index 000000000..a2e9d47b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/bitfield-err1.C @@ -0,0 +1,9 @@ +// PR c++/46282 +// { dg-options -std=c++0x } + +template<int> +class A +{ + A : i() {} // { dg-message "" } + int i; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/call1.C b/gcc/testsuite/g++.dg/cpp0x/regress/call1.C new file mode 100644 index 000000000..833318b05 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/call1.C @@ -0,0 +1,13 @@ +// PR c++/48500 +// { dg-options -std=c++0x } + +struct linked_ptr { +}; +template <typename T> linked_ptr make_linked_ptr(T* ptr); +struct Concrete; +struct NewedClass { + NewedClass(const Concrete& req){} +}; +template<typename ArgT> void AddObjToChange(const ArgT& req) { + linked_ptr p = make_linked_ptr(new NewedClass(req)); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/condition1.C b/gcc/testsuite/g++.dg/cpp0x/regress/condition1.C new file mode 100644 index 000000000..0346764f7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/condition1.C @@ -0,0 +1,80 @@ +// PR c++/47950 +// { dg-options -std=c++0x } + +template <typename T> struct empty +{ + // allow success case to build (not relevant to bug) + operator bool() { return true; } +}; + +template <typename T> struct from_int +{ + from_int(int) {} + + // allow success case to build (not relevant to bug) + operator bool() { return true; } +}; + +template <typename T> +from_int<T> via_function(T v) +{ + return from_int<T>(v); +} + +template <typename T> +void f() +{ + // ********* this section compiles *********** + + // these plain initializers work fine + from_int<int> a = 7; + from_int<int> b = from_int<int>(7); + empty<int> c = empty<int>(); + from_int<T> ta = 7; + from_int<T> tb = from_int<T>(7); + empty<T> tc = empty<T>(); + + // these dependent condition decls work fine + if (empty<T> x = empty<T>()) + ; + if (from_int<T> x = 7) + ; + if (from_int<T> x = from_int<T>(7)) + ; + if (from_int<T> x = via_function(T())) + ; + + // this non-dependent condition decl using conversion works fine + if (from_int<int> x = 7) + ; + + // these non-dependent condition decls using conversion or braced- + // initialization work fine (in c++0x mode only course) + #if __GXX_EXPERIMENTAL_CXX0X__ + if (empty<int> x {}) + ; + if (from_int<int> x {7}) + ; + #endif + + // ********** this section fails in C++0x *********** + + // the following non-dependent condition decls cause an assertion + // failure in + // + // tsubst_copy_and_build, at cp/pt.c:13370 + // + // in C++0x mode + // + if (empty<int> x = empty<int>()) + ; + if (from_int<int> x = from_int<int>(7)) + ; + if (from_int<int> x = via_function(7)) + ; +} + +int main() +{ + f<int>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/debug-debug7.C b/gcc/testsuite/g++.dg/cpp0x/regress/debug-debug7.C new file mode 100644 index 000000000..ea8f1eb2e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/debug-debug7.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// { dg-options -std=c++0x } + +void f (int); + +int +main() { + + int a = 4; + int b = 5; // { dg-message "not const" } + int (*x)[b] = new int[a][b]; // { dg-error "not usable" } + + x[2][1] = 7; + + for (int i = 0; i < a; ++i) + for (int j = 0; j < b; ++j) + f (x[i][j]); + delete [] x; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/enum1.C b/gcc/testsuite/g++.dg/cpp0x/regress/enum1.C new file mode 100644 index 000000000..6e29f9ea9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/enum1.C @@ -0,0 +1,8 @@ +// PR c++/47482 +// { dg-options -std=c++0x } + +template<class> +struct K +{ + enum { A = sizeof"A", B = +A }; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/error-recovery1.C b/gcc/testsuite/g++.dg/cpp0x/regress/error-recovery1.C new file mode 100644 index 000000000..2094d3e3e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/error-recovery1.C @@ -0,0 +1,9 @@ +// PR c++/48212 +// { dg-options -std=c++0x } + +template < bool > void +foo () +{ + const bool b =; // { dg-error "" } + foo < b > (); // { dg-error "constant expression" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/ext-cond1.C b/gcc/testsuite/g++.dg/cpp0x/regress/ext-cond1.C new file mode 100644 index 000000000..dc9814ebd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/ext-cond1.C @@ -0,0 +1,4 @@ +// PR c++/12515 +// { dg-do compile } +// { dg-options "-std=gnu++0x" } +template<int> void foo() { 0 ?: 0; } diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/ext-label10.C b/gcc/testsuite/g++.dg/cpp0x/regress/ext-label10.C new file mode 100644 index 000000000..652d94af0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/ext-label10.C @@ -0,0 +1,17 @@ +// PR c++/33836 +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template<int N> struct A +{ + enum { M = && N }; // { dg-error "referenced outside|cannot appear in|not an integer constant" } +}; + +A<0> a; + +void foo () +{ + __label__ P; + enum { O = && P }; // { dg-error "cannot appear in|not an integer constant" } + P:; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/isnan.C b/gcc/testsuite/g++.dg/cpp0x/regress/isnan.C new file mode 100644 index 000000000..40d07e5de --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/isnan.C @@ -0,0 +1,9 @@ +// PR c++/48369 +// { dg-options -std=gnu++0x } + +extern "C" int isnan (double); + +void f(double d) +{ + bool b = isnan(d); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/no-elide1.C b/gcc/testsuite/g++.dg/cpp0x/regress/no-elide1.C new file mode 100644 index 000000000..50df95016 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/no-elide1.C @@ -0,0 +1,14 @@ +// PR c++/47503 +// { dg-options "-std=c++0x -fno-elide-constructors" } + +struct A +{ + int i; + A (); +}; + +struct B +{ + A a; + B (A &aa) : a (aa) { } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/non-const1.C b/gcc/testsuite/g++.dg/cpp0x/regress/non-const1.C new file mode 100644 index 000000000..7fc66a7ae --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/non-const1.C @@ -0,0 +1,9 @@ +// PR c++/48015 +// { dg-options -std=c++0x } + +template <typename T> T f(T); +template <typename T> void g() +{ + int const c = f (1); + int i = c - 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/parse-ambig5.C b/gcc/testsuite/g++.dg/cpp0x/regress/parse-ambig5.C new file mode 100644 index 000000000..9be2f9258 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/parse-ambig5.C @@ -0,0 +1,8 @@ +// PR c++/41786 +// { dg-options -std=c++0x } + +struct A { A(int, char const*); }; +int main() { + int i = 0, *b = &i; + A a(int(b[i]), "hello"); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/ptrmem1.C b/gcc/testsuite/g++.dg/cpp0x/regress/ptrmem1.C new file mode 100644 index 000000000..873000b9c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/ptrmem1.C @@ -0,0 +1,9 @@ +// PR c++/49298 +// { dg-options -std=c++0x } + +template <class T, int T::*> struct B { }; +template <class T> struct A +{ + int i; + B<A,&A::i> b; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/regress1.C b/gcc/testsuite/g++.dg/cpp0x/regress/regress1.C new file mode 100644 index 000000000..a6fe3999c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/regress1.C @@ -0,0 +1,10 @@ +// PR c++/46903 +// This isn't C++0x code, but it was breaking in C++0x mode. +// { dg-options -std=c++0x } + +struct A {}; +struct B { + void *(*a)(); +}; +template <typename T> void *CreateA() {} +B b = {CreateA<A>}; diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/regress2.C b/gcc/testsuite/g++.dg/cpp0x/regress/regress2.C new file mode 100644 index 000000000..470ee1c4c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/regress2.C @@ -0,0 +1,13 @@ +// PR c++/46552 +// { dg-options -std=c++0x } + +struct S +{ + int x; +}; + +template < typename > +void f( void ) +{ + &S::x; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/regress3.C b/gcc/testsuite/g++.dg/cpp0x/regress/regress3.C new file mode 100644 index 000000000..ffbb97f6b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/regress3.C @@ -0,0 +1,13 @@ +// PR c++/47511 +// { dg-options -std=c++0x } + +namespace N { + template <typename T> bool g( T ) { + return true; + } + struct A { }; +} +template <class T> void f(const T&) { + N::A x; + g(x) ; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/regress5.C b/gcc/testsuite/g++.dg/cpp0x/regress/regress5.C new file mode 100644 index 000000000..b1935912d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/regress5.C @@ -0,0 +1,16 @@ +// { dg-options -std=c++0x } + +struct A +{ + int i; + A(int); +}; + +struct B +{ + virtual void f(); + A ar[3]; +}; + +extern B b; +B b2(b); diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/template-const1.C b/gcc/testsuite/g++.dg/cpp0x/regress/template-const1.C new file mode 100644 index 000000000..32db1f831 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/template-const1.C @@ -0,0 +1,9 @@ +// PR c++/47897 +// { dg-options -std=c++0x } + +template < typename T, T N > +struct S +{ + static const T value = N; + typedef S< T, value + 1 > next; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/template-const2.C b/gcc/testsuite/g++.dg/cpp0x/regress/template-const2.C new file mode 100644 index 000000000..25354b3a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/template-const2.C @@ -0,0 +1,14 @@ +// PR c++/48707 +// { dg-options -std=c++0x } + +struct A { + static int a(); +}; + +template<typename X> +struct B: A { + static int const b; +}; + +template<typename X> +int const B<X>::b=B<X>::a(); diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/template-function1.C b/gcc/testsuite/g++.dg/cpp0x/regress/template-function1.C new file mode 100644 index 000000000..66cbd4ba1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/template-function1.C @@ -0,0 +1,29 @@ +// PR c++/38647 +// { dg-do compile } +// { dg-options "-std=c++0x" } +// { dg-prune-output "note" } + +template<const char *, int> struct A {}; +const char func[] = "abc"; +template<int N> struct A<func, N> {}; // { dg-error "cannot appear|is invalid|not a valid|constant expression" } + +char a1[1]; +A<a1, 0> a; + +template<const char *, int> struct B {}; +template<int N> struct B<__FUNCTION__, N> {}; // { dg-error "cannot appear|is invalid|is not a valid|constant expression" } + +char b1[1]; +B<b1, 0> b; + +template<const char *, int> struct C {}; +template<int N> struct C<__PRETTY_FUNCTION__, N> {}; // { dg-error "cannot appear|is invalid|is not a valid|constant expression" } + +char c1[1]; +C<c1, 0> c; + +template<const char *, int> struct D {}; +template<int N> struct D<__func__, N> {}; // { dg-error "cannot appear|is invalid|is not a valid|function scope|constant expression" } + +char d1[1]; +D<d1, 0> d; diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/value-dep1.C b/gcc/testsuite/g++.dg/cpp0x/regress/value-dep1.C new file mode 100644 index 000000000..112389d4a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/value-dep1.C @@ -0,0 +1,7 @@ +// PR c++/48265 +// { dg-options -std=c++0x } + +template < int > struct S +{ + S () { const int i = i; i; }; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-bitfield.C b/gcc/testsuite/g++.dg/cpp0x/rv-bitfield.C new file mode 100644 index 000000000..ed866f9e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-bitfield.C @@ -0,0 +1,12 @@ +// { dg-options -std=c++0x } + +struct A +{ + int i : 1; +}; + +int main() +{ + A a; + static_cast<int&&>(a.i); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-bitfield2.C b/gcc/testsuite/g++.dg/cpp0x/rv-bitfield2.C new file mode 100644 index 000000000..e054151b0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-bitfield2.C @@ -0,0 +1,17 @@ +// PR c++/51868 +// { dg-options -std=c++0x } + +struct A { + A() {} + A(const A&) {} + A(A&&) {} +}; + +struct B { + A a; + int f : 1; +}; + +B func() { + return B(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-cast.C b/gcc/testsuite/g++.dg/cpp0x/rv-cast.C new file mode 100644 index 000000000..48b7c13ba --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-cast.C @@ -0,0 +1,6 @@ +// { dg-options "-std=c++0x" } + +void f(int i) +{ + int&& r = static_cast<int&&>(i); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-cast2.C b/gcc/testsuite/g++.dg/cpp0x/rv-cast2.C new file mode 100644 index 000000000..94ee4ca84 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-cast2.C @@ -0,0 +1,21 @@ +// Test for const_cast to reference (5.2.11/4). +// { dg-options -std=c++0x } + +template <class T> T&& xval(); +template <class T> T& lval(); +template <class T> T prval(); + +struct A { }; + +int main() +{ + const_cast<int&>(lval<int>()); + const_cast<int&>(xval<int>()); // { dg-error "" } + const_cast<int&>(prval<int>()); // { dg-error "" } + const_cast<int&&>(lval<int>()); + const_cast<int&&>(xval<int>()); + const_cast<int&&>(prval<int>()); // { dg-error "" } + const_cast<A&&>(lval<A>()); + const_cast<A&&>(xval<A>()); + const_cast<A&&>(prval<A>()); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-cast3.C b/gcc/testsuite/g++.dg/cpp0x/rv-cast3.C new file mode 100644 index 000000000..e7d5b6d34 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-cast3.C @@ -0,0 +1,18 @@ +// PR c++/51406 +// { dg-do run } +// { dg-options "-std=c++0x" } + +extern "C" int printf(const char *,...); +extern "C" void abort(); + +struct A { int a; A() : a(1) {} }; +struct B { int b; B() : b(2) {} }; +struct X : A, B {}; + +int main() { + X x; + int a=static_cast<A&&>(x).a; + int b=static_cast<B&&>(x).b; + // printf ("%d %d\n", a, b); + if (a!=1 || b!=2) abort(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-cast4.C b/gcc/testsuite/g++.dg/cpp0x/rv-cast4.C new file mode 100644 index 000000000..8f4a56bf9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-cast4.C @@ -0,0 +1,13 @@ +// PR c++/51161 +// { dg-options "-std=c++0x" } + +struct A{}; +struct B : A{}; +struct C : A{}; +struct D : B, C{}; + +int main() +{ + D d; + static_cast<A &&>(d); // { dg-error "ambiguous" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-deduce.C b/gcc/testsuite/g++.dg/cpp0x/rv-deduce.C new file mode 100644 index 000000000..043543631 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-deduce.C @@ -0,0 +1,8 @@ +// PR c++/36816, core issue 873 +// { dg-options -std=c++0x } + +template <class T> void h (T&&) { } + +void (*pf)(int&) = &h; +template <> void h(char&); +template void h(double&); diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-deduce2.C b/gcc/testsuite/g++.dg/cpp0x/rv-deduce2.C new file mode 100644 index 000000000..160296f64 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-deduce2.C @@ -0,0 +1,18 @@ +// PR c++/48313 +// { dg-options -std=c++0x } + +template<typename F> +void f(F&&) { } + +void g() { } + +template<typename T> void h() { } + +int main() +{ + f( g ); // OK + void (&p)() = h<int>; + f( p ); // OK + f( h<int> ); // ??? +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-lvalue-req.C b/gcc/testsuite/g++.dg/cpp0x/rv-lvalue-req.C new file mode 100644 index 000000000..a8f424df0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-lvalue-req.C @@ -0,0 +1,12 @@ +// { dg-options -std=c++0x } + +template <class T> T&& declval(); + +int main() +{ + &declval<int>(); // { dg-error "xvalue" } + declval<int>() = declval<int>(); // { dg-error "xvalue" } + declval<int>()++; // { dg-error "xvalue" } + --declval<int>(); // { dg-error "xvalue" } + declval<int>() += 1; // { dg-error "xvalue" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-reinterpret.C b/gcc/testsuite/g++.dg/cpp0x/rv-reinterpret.C new file mode 100644 index 000000000..5b6e4c3d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-reinterpret.C @@ -0,0 +1,11 @@ +// { dg-options -std=c++0x } +// { dg-do run } + +void f(int &); +void f(int &&ir) { ir = 42; } +int main() +{ + int x; + f(reinterpret_cast<int&&>(x)); + return (x != 42); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-restrict.C b/gcc/testsuite/g++.dg/cpp0x/rv-restrict.C new file mode 100644 index 000000000..569ee5bb6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-restrict.C @@ -0,0 +1,6 @@ +// PR c++/45401 +// { dg-options -std=c++0x } + +typedef int &__restrict restrictLvref; +typedef restrictLvref &&rvrefToRestrictLvref; +typedef restrictLvref rvrefToRestrictLvref; diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-return.C b/gcc/testsuite/g++.dg/cpp0x/rv-return.C new file mode 100644 index 000000000..e52101fea --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-return.C @@ -0,0 +1,18 @@ +// PR c++/41815 +// { dg-options -std=c++0x } + +template<typename T, typename U> struct same_type; +template<typename T> struct same_type<T, T> {}; + +int const f() { return 0; } + +int &&r = f(); // binding "int&&" to "int" should succeed +same_type<decltype(f()), int const> s1; +same_type<decltype(0,f()), int> s2; + +template <class T> +T const g() { return 0; } + +int &&r2 = g<int>(); +same_type<decltype(g<int>()), int const> s3; +same_type<decltype(0,g<int>()), int> s4; diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C b/gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C new file mode 100644 index 000000000..2765b5f3c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C @@ -0,0 +1,33 @@ +// { dg-options "-std=c++0x" } +// PR c++/33235 +#include <cassert> + +int move_construct = 0; +int move_assign = 0; + +struct base2 +{ + base2() {} + base2(base2&&) {++move_construct;} // { dg-error "argument 1" } + base2& operator=(base2&&) {++move_assign; return *this;} // { dg-error "argument 1" } +}; + +int test2() +{ + base2 b; + base2 b2(b); // { dg-error "lvalue" } + assert(move_construct == 0); + base2 b3(static_cast<base2&&>(b)); + base2 b4 = static_cast<base2&&>(b); + assert(move_construct == 2); + b = b2; // { dg-error "lvalue" } + assert(move_assign == 0); + b = static_cast<base2&&>(b2); + assert(move_assign == 1); +} + +int main() +{ + test2(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv10.C b/gcc/testsuite/g++.dg/cpp0x/rv10.C new file mode 100644 index 000000000..5e78b1dbb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv10.C @@ -0,0 +1,15 @@ +// { dg-options "-std=gnu++0x" } + +struct A +{ + A() = default; + A(const A&) = delete; +}; + +A&& f(); +void h(A&&); +void g() +{ + A&& arr = f(); + h(f()); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv1n.C b/gcc/testsuite/g++.dg/cpp0x/rv1n.C new file mode 100644 index 000000000..5224d3eb7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv1n.C @@ -0,0 +1,169 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; +struct three {char x[3];}; +struct four {char x[4];}; +struct five {char x[5];}; +struct six {char x[6];}; +struct seven {char x[7];}; +struct eight {char x[8];}; + +struct A +{ + A(); + A(const volatile A&&); // { dg-error "argument 1" } +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 1 at a time + +one sink_1_1( A&); // { dg-error "" } + +int test1_1() +{ + A a; + const A ca = a; // { dg-error "cannot bind" } + volatile A va; + const volatile A cva = a; // { dg-error "cannot bind" } + sink_1_1(ca); // { dg-error "invalid initialization" } + sink_1_1(va); // { dg-error "invalid initialization" } + sink_1_1(cva); // { dg-error "invalid initialization" } + sink_1_1(source()); // { dg-error "invalid initialization" } + sink_1_1(c_source()); // { dg-error "invalid initialization" } + sink_1_1(v_source()); // { dg-error "invalid initialization" } + sink_1_1(cv_source()); // { dg-error "invalid initialization" } + return 0; +} + +two sink_1_2(const A&); // { dg-error "" } + +int test1_2() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_1_2(va); // { dg-error "invalid initialization" } + sink_1_2(cva); // { dg-error "invalid initialization" } + sink_1_2(v_source()); // { dg-error "invalid initialization" } + sink_1_2(cv_source()); // { dg-error "invalid initialization" } + return 0; +} + +three sink_1_3(volatile A&); // { dg-error "" } + +int test1_3() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_1_3(ca); // { dg-error "invalid initialization" } + sink_1_3(cva); // { dg-error "invalid initialization" } + sink_1_3(source()); // { dg-error "invalid initialization" } + sink_1_3(c_source()); // { dg-error "invalid initialization" } + sink_1_3(v_source()); // { dg-error "invalid initialization" } + sink_1_3(cv_source()); // { dg-error "invalid initialization" } + return 0; +} + +four sink_1_4(const volatile A&); // { dg-error "" } + +int test1_4() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_1_4(source()); // { dg-error "invalid initialization" } + sink_1_4(c_source()); // { dg-error "invalid initialization" } + sink_1_4(v_source()); // { dg-error "invalid initialization" } + sink_1_4(cv_source()); // { dg-error "invalid initialization" } + return 0; +} + +five sink_1_5( A&&); // { dg-error "" } + +int test1_5() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_1_5(a); // { dg-error "lvalue" } + sink_1_5(ca); // { dg-error "invalid initialization" } + sink_1_5(va); // { dg-error "invalid initialization" } + sink_1_5(cva); // { dg-error "invalid initialization" } + sink_1_5(c_source()); // { dg-error "invalid initialization" } + sink_1_5(v_source()); // { dg-error "invalid initialization" } + sink_1_5(cv_source()); // { dg-error "invalid initialization" } + return 0; +} + +six sink_1_6(const A&&); // { dg-error "" } + +int test1_6() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_1_6(a); // { dg-error "lvalue" } + sink_1_6(ca); // { dg-error "lvalue" } + sink_1_6(va); // { dg-error "invalid initialization" } + sink_1_6(cva); // { dg-error "invalid initialization" } + sink_1_6(v_source()); // { dg-error "invalid initialization" } + sink_1_6(cv_source()); // { dg-error "invalid initialization" } + return 0; +} + +seven sink_1_7(volatile A&&); // { dg-error "" } + +int test1_7() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_1_7(a); // { dg-error "lvalue" } + sink_1_7(ca); // { dg-error "invalid initialization" } + sink_1_7(va); // { dg-error "lvalue" } + sink_1_7(cva); // { dg-error "invalid initialization" } + sink_1_7(c_source()); // { dg-error "invalid initialization" } + sink_1_7(cv_source()); // { dg-error "invalid initialization" } + return 0; +} + +eight sink_1_8(const volatile A&&); // { dg-error "" } + +int test1_8() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_1_8(a); // { dg-error "lvalue" } + sink_1_8(ca); // { dg-error "lvalue" } + sink_1_8(va); // { dg-error "lvalue" } + sink_1_8(cva); // { dg-error "lvalue" } + return 0; +} + +int main() +{ + return test1_1() + test1_2() + test1_3() + test1_5() + + test1_6() + test1_7(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv1p.C b/gcc/testsuite/g++.dg/cpp0x/rv1p.C new file mode 100644 index 000000000..abe5de0b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv1p.C @@ -0,0 +1,145 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; +struct three {long x[3];}; +struct four {long x[4];}; +struct five {long x[5];}; +struct six {long x[6];}; +struct seven {long x[7];}; +struct eight {long x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 1 at a time + +one sink_1_1( A&); + +int test1_1() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_1_1(a)) == 1 * sizeof(long)> t1; + return 0; +} + +two sink_1_2(const A&); + +int test1_2() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_1_2(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_1_2(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_1_2(source())) == 2 * sizeof(long)> t5; + sa<sizeof(sink_1_2(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +three sink_1_3(volatile A&); + +int test1_3() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_1_3(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_1_3(va)) == 3 * sizeof(long)> t3; + return 0; +} + +four sink_1_4(const volatile A&); + +int test1_4() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_1_4(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_1_4(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_1_4(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_1_4(cva)) == 4 * sizeof(long)> t4; + return 0; +} + +five sink_1_5( A&&); + +int test1_5() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_1_5(source())) == 5 * sizeof(long)> t5; + return 0; +} + +six sink_1_6(const A&&); + +int test1_6() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_1_6(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_1_6(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +seven sink_1_7(volatile A&&); + +int test1_7() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_1_7(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_1_7(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +eight sink_1_8(const volatile A&&); + +int test1_8() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_1_8(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_1_8(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_1_8(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_1_8(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +int main() +{ + return test1_1() + test1_2() + test1_3() + test1_4() + + test1_5() + test1_6() + test1_7() + test1_8(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv2n.C b/gcc/testsuite/g++.dg/cpp0x/rv2n.C new file mode 100644 index 000000000..2b3a9c06a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv2n.C @@ -0,0 +1,544 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; +struct three {char x[3];}; +struct four {char x[4];}; +struct five {char x[5];}; +struct six {char x[6];}; +struct seven {char x[7];}; +struct eight {char x[8];}; + +struct A +{ + A(); + A(const volatile A&&); // { dg-error "argument 1" } +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 2 at a time + +one sink_2_12( A&); // { dg-message "note|argument" } +two sink_2_12(const A&); // { dg-message "note|argument" } + +int test2_12() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_12(va); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 42 } + sink_2_12(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 44 } + sink_2_12(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 46 } + sink_2_12(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 48 } + return 0; +} + +one sink_2_13( A&); // { dg-message "note|argument" } +three sink_2_13(volatile A&); // { dg-message "note|argument" } + +int test2_13() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_13(ca); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 62 } + sink_2_13(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 64 } + sink_2_13(source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 66 } + sink_2_13(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 68 } + sink_2_13(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 70 } + sink_2_13(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 72 } + return 0; +} + +one sink_2_14( A&); // { dg-message "note|argument" } +four sink_2_14(const volatile A&); // { dg-message "note|argument" } + +int test2_14() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_14(source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 86 } + sink_2_14(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 88 } + sink_2_14(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 90 } + sink_2_14(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 92 } + return 0; +} + +one sink_2_15( A&); // { dg-message "note|argument" } +five sink_2_15( A&&); // { dg-message "note|argument" } + +int test2_15() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_15(ca); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 106 } + sink_2_15(va); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 108 } + sink_2_15(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 110 } + sink_2_15(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 112 } + sink_2_15(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 114 } + sink_2_15(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 116 } + return 0; +} + +one sink_2_16( A&); // { dg-message "note|argument" } +six sink_2_16(const A&&); // { dg-message "note|argument" } + +int test2_16() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_16(ca); // { dg-error "lvalue" } + sink_2_16(va); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 131 } + sink_2_16(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 133 } + sink_2_16(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 135 } + sink_2_16(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 137 } + return 0; +} + +one sink_2_17( A&); // { dg-message "note|argument" } +seven sink_2_17(volatile A&&); // { dg-message "note|argument" } + +int test2_17() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_17(ca); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 151 } + sink_2_17(va); // { dg-error "lvalue" } + sink_2_17(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 154 } + sink_2_17(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 156 } + sink_2_17(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 158 } + return 0; +} + +one sink_2_18( A&); +eight sink_2_18(const volatile A&&); // { dg-error "argument" } + +int test2_18() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_18(ca); // { dg-error "lvalue" } + sink_2_18(va); // { dg-error "lvalue" } + sink_2_18(cva); // { dg-error "lvalue" } +} + +two sink_2_23(const A&); // { dg-message "note|argument" } +three sink_2_23(volatile A&); // { dg-message "note|argument" } + +int test2_23() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_23(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 186 } + sink_2_23(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 188 } + sink_2_23(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 190 } + sink_2_23(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 192 } + return 0; +} + +two sink_2_24(const A&); // { dg-message "note|argument" } +four sink_2_24(const volatile A&); // { dg-message "note|argument" } + +int test2_24() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_24(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 206 } + sink_2_24(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 208 } + return 0; +} + +three sink_2_34(volatile A&); // { dg-message "three sink_2_34|no known conversion" } +four sink_2_34(const volatile A&); // { dg-message "note|argument" } + +int test2_34() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_34(source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 222 } + sink_2_34(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 224 } + sink_2_34(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 226 } + sink_2_34(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 228 } + return 0; +} + +two sink_2_25(const A&); // { dg-message "two sink_2_25|no known conversion" } +five sink_2_25( A&&); // { dg-message "note|argument" } + +int test2_25() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_25(va); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 242 } + sink_2_25(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 244 } + sink_2_25(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 246 } + sink_2_25(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 248 } + return 0; +} + +two sink_2_26(const A&); // { dg-message "two sink_2_26|no known conversion" } +six sink_2_26(const A&&); // { dg-message "note|argument" } + +int test2_26() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_26(va); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 262 } + sink_2_26(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 264 } + sink_2_26(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 266 } + sink_2_26(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 268 } + return 0; +} + +two sink_2_27(const A&); // { dg-message "two sink_2_27|no known conversion" } +seven sink_2_27(volatile A&&); // { dg-message "note|argument" } + +int test2_27() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_27(va); // { dg-error "lvalue" } + sink_2_27(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 283 } + sink_2_27(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 285 } + return 0; +} + +two sink_2_28(const A&); +eight sink_2_28(const volatile A&&); // { dg-error "argument" } + +int test2_28() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_28(va); // { dg-error "lvalue" } + sink_2_28(cva); // { dg-error "lvalue" } +} + +three sink_2_35(volatile A&); // { dg-message "three sink_2_35|no known conversion" } +five sink_2_35( A&&); // { dg-message "note|argument" } + +int test2_35() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_35(ca); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 312 } + sink_2_35(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 314 } + sink_2_35(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 316 } + sink_2_35(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 318 } + sink_2_35(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 320 } + return 0; +} + +three sink_2_36(volatile A&); // { dg-message "three sink_2_36|no known conversion" } +six sink_2_36(const A&&); // { dg-message "note|argument" } + +int test2_36() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_36(ca); // { dg-error "lvalue" } + sink_2_36(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 335 } + sink_2_36(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 337 } + sink_2_36(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 339 } + return 0; +} + +three sink_2_37(volatile A&); // { dg-message "three sink_2_37|no known conversion" } +seven sink_2_37(volatile A&&); // { dg-message "note|argument" } + +int test2_37() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_37(ca); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 353 } + sink_2_37(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 355 } + sink_2_37(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 357 } + sink_2_37(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 359 } + return 0; +} + +three sink_2_38(volatile A&); +eight sink_2_38(const volatile A&&); // { dg-error "argument" } + +int test2_38() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_38(ca); // { dg-error "lvalue" } + sink_2_38(cva); // { dg-error "lvalue" } +} + +four sink_2_45(const volatile A&); // { dg-message "note" } +five sink_2_45( A&&); // { dg-message "note|argument" } + +int test2_45() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_45(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 386 } + sink_2_45(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 388 } + sink_2_45(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 390 } + return 0; +} + +four sink_2_46(const volatile A&); // { dg-message "note" } +six sink_2_46(const A&&); // { dg-message "note|argument" } + +int test2_46() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_46(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 404 } + sink_2_46(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 406 } + return 0; +} + +four sink_2_47(const volatile A&); // { dg-message "note" } +seven sink_2_47(volatile A&&); // { dg-message "note|argument" } + +int test2_47() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_47(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 420 } + sink_2_47(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 422 } + return 0; +} + +five sink_2_56( A&&); // { dg-message "note|argument" } +six sink_2_56(const A&&); // { dg-message "note|argument" } + +int test2_56() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_56(a); // { dg-error "lvalue" } + sink_2_56(ca); // { dg-error "lvalue" } + sink_2_56(va); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 438 } + sink_2_56(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 440 } + sink_2_56(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 442 } + sink_2_56(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 444 } + return 0; +} + +five sink_2_57( A&&); // { dg-message "note|argument" } +seven sink_2_57(volatile A&&); // { dg-message "note|argument" } + +int test2_57() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_57(a); // { dg-error "lvalue" } + sink_2_57(va); // { dg-error "lvalue" } + sink_2_57(ca); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 460 } + sink_2_57(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 462 } + sink_2_57(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 464 } + sink_2_57(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 466 } + return 0; +} + +five sink_2_58( A&&); // { dg-error "argument" } +eight sink_2_58(const volatile A&&); // { dg-error "argument" } + +int test2_58() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_58(a); // { dg-error "lvalue" } + sink_2_58(ca); // { dg-error "lvalue" } + sink_2_58(va); // { dg-error "lvalue" } + sink_2_58(cva); // { dg-error "lvalue" } +} + +six sink_2_67(const A&&); // { dg-message "note|argument" } +seven sink_2_67(volatile A&&); // { dg-message "note|argument" } + +int test2_67() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_67(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 495 } + sink_2_67(ca); // { dg-error "lvalue" } + sink_2_67(va); // { dg-error "lvalue" } + sink_2_67(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 499 } + sink_2_67(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 501 } + sink_2_67(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 503 } + return 0; +} + +six sink_2_68(const A&&); // { dg-error "argument" } +eight sink_2_68(const volatile A&&); // { dg-error "argument" } + +int test2_68() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_68(a); // { dg-error "lvalue" } + sink_2_68(ca); // { dg-error "lvalue" } + sink_2_68(va); // { dg-error "lvalue" } + sink_2_68(cva); // { dg-error "lvalue" } +} + +seven sink_2_78(volatile A&&); // { dg-error "argument" } +eight sink_2_78(const volatile A&&); // { dg-error "argument" } + +int test2_78() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_2_78(a); // { dg-error "lvalue" } + sink_2_78(ca); // { dg-error "lvalue" } + sink_2_78(va); // { dg-error "lvalue" } + sink_2_78(cva); // { dg-error "lvalue" } +} + +int main() +{ + return test2_12() + test2_13() + test2_15() + test2_16() + + test2_17() + test2_23() + test2_25() + test2_26() + + test2_27() + test2_35() + test2_36() + test2_37() + + test2_56() + test2_57() + test2_67(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv2p.C b/gcc/testsuite/g++.dg/cpp0x/rv2p.C new file mode 100644 index 000000000..722d1b8d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv2p.C @@ -0,0 +1,507 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; +struct three {long x[3];}; +struct four {long x[4];}; +struct five {long x[5];}; +struct six {long x[6];}; +struct seven {long x[7];}; +struct eight {long x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 2 at a time + +one sink_2_12( A&); +two sink_2_12(const A&); + +int test2_12() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_12(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_2_12(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_2_12(source())) == 2 * sizeof(long)> t5; + sa<sizeof(sink_2_12(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +one sink_2_13( A&); +three sink_2_13(volatile A&); + +int test2_13() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_13(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_2_13(va)) == 3 * sizeof(long)> t3; + return 0; +} + +one sink_2_14( A&); +four sink_2_14(const volatile A&); + +int test2_14() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_14(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_2_14(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_2_14(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_2_14(cva)) == 4 * sizeof(long)> t4; + return 0; +} + +one sink_2_15( A&); +five sink_2_15( A&&); + +int test2_15() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_15(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_2_15(source())) == 5 * sizeof(long)> t5; + return 0; +} + +one sink_2_16( A&); +six sink_2_16(const A&&); + +int test2_16() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_16(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_2_16(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_2_16(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_2_17( A&); +seven sink_2_17(volatile A&&); + +int test2_17() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_17(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_2_17(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_2_17(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_2_18( A&); +eight sink_2_18(const volatile A&&); + +int test2_18() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_18(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_2_18(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_2_18(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_2_18(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_2_18(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_2_23(const A&); +three sink_2_23(volatile A&); + +int test2_23() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_23(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_2_23(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_2_23(source())) == 2 * sizeof(long)> t5; + sa<sizeof(sink_2_23(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +two sink_2_24(const A&); +four sink_2_24(const volatile A&); + +int test2_24() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_24(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_2_24(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_2_24(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_2_24(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_2_24(source())) == 2 * sizeof(long)> t5; + sa<sizeof(sink_2_24(c_source())) == 2 * sizeof(long)> t6; +// sa<sizeof(sink_2_24(v_source())) == 4 * sizeof(long)> t7; +// sa<sizeof(sink_2_24(cv_source())) == 4 * sizeof(long)> t8; + return 0; +} + +two sink_2_25(const A&); +five sink_2_25( A&&); + +int test2_25() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_25(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_2_25(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_2_25(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_2_25(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +two sink_2_26(const A&); +six sink_2_26(const A&&); + +int test2_26() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_26(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_2_26(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_2_26(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_2_26(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +two sink_2_27(const A&); +seven sink_2_27(volatile A&&); + +int test2_27() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_27(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_2_27(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_2_27(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_2_27(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_2_27(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_2_28(const A&); +eight sink_2_28(const volatile A&&); + +int test2_28() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_28(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_2_28(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_2_28(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_2_28(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_2_28(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_2_28(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_2_34(volatile A&); +four sink_2_34(const volatile A&); + +int test2_34() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_34(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_2_34(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_2_34(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_2_34(cva)) == 4 * sizeof(long)> t4; +// sa<sizeof(sink_2_34(source())) == 4 * sizeof(long)> t5; +// sa<sizeof(sink_2_34(c_source())) == 4 * sizeof(long)> t6; +// sa<sizeof(sink_2_34(v_source())) == 4 * sizeof(long)> t7; +// sa<sizeof(sink_2_34(cv_source())) == 4 * sizeof(long)> t8; + return 0; +} + +three sink_2_35(volatile A&); +five sink_2_35( A&&); + +int test2_35() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_35(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_2_35(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_2_35(source())) == 5 * sizeof(long)> t5; + return 0; +} + +three sink_2_36(volatile A&); +six sink_2_36(const A&&); + +int test2_36() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_36(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_2_36(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_2_36(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_2_36(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +three sink_2_37(volatile A&); +seven sink_2_37(volatile A&&); + +int test2_37() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_37(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_2_37(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_2_37(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_2_37(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +three sink_2_38(volatile A&); +eight sink_2_38(const volatile A&&); + +int test2_38() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_38(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_2_38(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_2_38(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_2_38(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_2_38(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_2_38(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +four sink_2_45(const volatile A&); +five sink_2_45( A&&); + +int test2_45() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_45(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_2_45(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_2_45(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_2_45(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_2_45(source())) == 5 * sizeof(long)> t5; +// sa<sizeof(sink_2_45(c_source())) == 4 * sizeof(long)> t6; +// sa<sizeof(sink_2_45(v_source())) == 4 * sizeof(long)> t7; +// sa<sizeof(sink_2_45(cv_source())) == 4 * sizeof(long)> t8; + return 0; +} + +four sink_2_46(const volatile A&); +six sink_2_46(const A&&); + +int test2_46() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_46(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_2_46(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_2_46(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_2_46(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_2_46(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_2_46(c_source())) == 6 * sizeof(long)> t6; +// sa<sizeof(sink_2_46(v_source())) == 4 * sizeof(long)> t7; +// sa<sizeof(sink_2_46(cv_source())) == 4 * sizeof(long)> t8; + return 0; +} + +four sink_2_47(const volatile A&); +seven sink_2_47(volatile A&&); + +int test2_47() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_47(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_2_47(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_2_47(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_2_47(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_2_47(source())) == 7 * sizeof(long)> t5; +// sa<sizeof(sink_2_47(c_source())) == 4 * sizeof(long)> t6; + sa<sizeof(sink_2_47(v_source())) == 7 * sizeof(long)> t7; +// sa<sizeof(sink_2_47(cv_source())) == 4 * sizeof(long)> t8; + return 0; +} + +four sink_2_48(const volatile A&); +eight sink_2_48(const volatile A&&); + +int test2_48() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_48(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_2_48(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_2_48(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_2_48(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_2_48(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_2_48(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_2_48(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_2_48(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +five sink_2_56( A&&); +six sink_2_56(const A&&); + +int test2_56() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_56(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_2_56(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +five sink_2_57( A&&); +seven sink_2_57(volatile A&&); + +int test2_57() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_57(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_2_57(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +five sink_2_58( A&&); +eight sink_2_58(const volatile A&&); + +int test2_58() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_58(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_2_58(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_2_58(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_2_58(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +six sink_2_67(const A&&); +seven sink_2_67(volatile A&&); + +int test2_67() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_67(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_2_67(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +six sink_2_68(const A&&); +eight sink_2_68(const volatile A&&); + +int test2_68() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_68(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_2_68(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_2_68(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_2_68(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +seven sink_2_78(volatile A&&); +eight sink_2_78(const volatile A&&); + +int test2_78() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_2_78(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_2_78(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_2_78(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_2_78(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +int main() +{ + return test2_12() + test2_13() + test2_14() + test2_15() + + test2_16() + test2_17() + test2_18() + test2_23() + + test2_24() + test2_25() + test2_26() + test2_27() + + test2_28() + test2_34() + test2_35() + test2_36() + + test2_37() + test2_38() + test2_45() + test2_46() + + test2_47() + test2_48() + test2_56() + test2_57() + + test2_58() + test2_67() + test2_68() + test2_78(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv3n.C b/gcc/testsuite/g++.dg/cpp0x/rv3n.C new file mode 100644 index 000000000..637716f9b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv3n.C @@ -0,0 +1,951 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; +struct three {char x[3];}; +struct four {char x[4];}; +struct five {char x[5];}; +struct six {char x[6];}; +struct seven {char x[7];}; +struct eight {char x[8];}; + +struct A +{ + A(); + A(const volatile A&&); // { dg-error "argument 1" } +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 3 at a time + +one sink_3_123( A&); // { dg-message "one sink_3_123|no known conversion" } +two sink_3_123(const A&); // { dg-message "two sink_3_123|no known conversion" } +three sink_3_123(volatile A&); // { dg-message "three sink_3_123|no known conversion" } + +int test3_123() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_123(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 43 } + sink_3_123(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 45 } + sink_3_123(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 47 } + return 0; +} + +one sink_3_125( A&); // { dg-message "one sink_3_125|no known conversion" } +two sink_3_125(const A&); // { dg-message "two sink_3_125|no known conversion" } +five sink_3_125( A&&); // { dg-message "five sink_3_125|no known conversion" } + +one sink_3_124( A&); // { dg-message "one sink_3_124|no known conversion" } +two sink_3_124(const A&); // { dg-message "two sink_3_124|no known conversion" } +four sink_3_124(const volatile A&); // { dg-message "four sink_3_124|no known conversion" } + +int test3_124() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_124(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 66 } + sink_3_124(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 68 } + return 0; +} + +int test3_125() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_125(va); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 79 } + sink_3_125(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 81 } + sink_3_125(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 83 } + sink_3_125(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 85 } + return 0; +} + +one sink_3_126( A&); // { dg-message "one sink_3_126|no known conversion" } +two sink_3_126(const A&); // { dg-message "two sink_3_126|no known conversion" } +six sink_3_126(const A&&); // { dg-message "six sink_3_126|no known conversion" } + +int test3_126() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_126(va); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 100 } + sink_3_126(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 102 } + sink_3_126(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 104 } + sink_3_126(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 106 } + return 0; +} + +one sink_3_127( A&); // { dg-message "one sink_3_127|no known conversion" } +two sink_3_127(const A&); // { dg-message "two sink_3_127|no known conversion" } +seven sink_3_127(volatile A&&); // { dg-message "seven sink_3_127|no known conversion" } + +int test3_127() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_127(va); // { dg-error "lvalue" } + sink_3_127(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 122 } + sink_3_127(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 124 } + return 0; +} + +one sink_3_128( A&); +two sink_3_128(const A&); +eight sink_3_128(const volatile A&&); // { dg-message "" } + +int test3_128() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + + sink_3_128(va); // { dg-error "lvalue" } + sink_3_128(cva); // { dg-error "lvalue" } +} + +one sink_3_134( A&); // { dg-message "one sink_3_134|no known conversion" } +three sink_3_134(volatile A&); // { dg-message "three sink_3_134|no known conversion" } +four sink_3_134(const volatile A&); // { dg-message "four sink_3_134|no known conversion" } + +int test3_134() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_134(source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 154 } + sink_3_134(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 156 } + sink_3_134(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 158 } + sink_3_134(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 160 } + return 0; +} + +one sink_3_135( A&); // { dg-message "one sink_3_135|no known conversion" } +three sink_3_135(volatile A&); // { dg-message "three sink_3_135|no known conversion" } +five sink_3_135( A&&); // { dg-message "five sink_3_135|no known conversion" } + +int test3_135() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_135(ca); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 175 } + sink_3_135(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 177 } + sink_3_135(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 179 } + sink_3_135(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 181 } + sink_3_135(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 183 } + return 0; +} + +one sink_3_136( A&); // { dg-message "one sink_3_136|no known conversion" } +three sink_3_136(volatile A&); // { dg-message "note" } +six sink_3_136(const A&&); // { dg-message "" } + +int test3_136() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_136(ca); // { dg-error "lvalue" } + sink_3_136(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 199 } + sink_3_136(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 201 } + sink_3_136(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 203 } + return 0; +} + +one sink_3_137( A&); // { dg-message "one sink_3_137|no known conversion" } +three sink_3_137(volatile A&); // { dg-message "note" } +seven sink_3_137(volatile A&&); // { dg-message "note" } + +int test3_137() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_137(ca); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 218 } + sink_3_137(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 220 } + sink_3_137(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 222 } + sink_3_137(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 224 } + return 0; +} + +one sink_3_138( A&); +three sink_3_138(volatile A&); +eight sink_3_138(const volatile A&&); // { dg-message "" } + +int test3_138() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_138(ca); // { dg-error "lvalue" } + sink_3_138(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_3_145( A&); // { dg-message "one sink_3_145|no known conversion" } +four sink_3_145(const volatile A&); // { dg-message "note" } +five sink_3_145( A&&); // { dg-message "note" } + +int test3_145() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_145(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 254 } + sink_3_145(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 256 } + sink_3_145(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 258 } + return 0; +} + +one sink_3_146( A&); // { dg-message "one sink_3_146|no known conversion" } +four sink_3_146(const volatile A&); // { dg-message "note" } +six sink_3_146(const A&&); // { dg-message "note" } + +int test3_146() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_146(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 273 } + sink_3_146(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 275 } + return 0; +} + +one sink_3_147( A&); // { dg-message "one sink_3_147|no known conversion" } +four sink_3_147(const volatile A&); // { dg-message "note" } +seven sink_3_147(volatile A&&); // { dg-message "note" } + +int test3_147() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_147(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 290 } + sink_3_147(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 292 } + return 0; +} + +one sink_3_156( A&); // { dg-message "one sink_3_156|no known conversion" } +five sink_3_156( A&&); // { dg-message "note" } +six sink_3_156(const A&&); // { dg-message "" } + +int test3_156() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_156(ca); // { dg-error "lvalue" } + sink_3_156(va); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 308 } + sink_3_156(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 310 } + sink_3_156(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 312 } + sink_3_156(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 314 } + return 0; +} + +one sink_3_157( A&); // { dg-message "one sink_3_157|no known conversion" } +five sink_3_157( A&&); // { dg-message "note" } +seven sink_3_157(volatile A&&); // { dg-message "" } + +int test3_157() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_157(ca); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 329 } + sink_3_157(va); // { dg-error "lvalue" } + sink_3_157(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 332 } + sink_3_157(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 334 } + sink_3_157(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 336 } + return 0; +} + +one sink_3_158( A&); +five sink_3_158( A&&); +eight sink_3_158(const volatile A&&); // { dg-message "" } + +int test3_158() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_158(ca); // { dg-error "lvalue" } + sink_3_158(va); // { dg-error "lvalue" } + sink_3_158(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_3_167( A&); // { dg-message "one sink_3_167|no known conversion" } +six sink_3_167(const A&&); // { dg-message "" } +seven sink_3_167(volatile A&&); // { dg-message "" } + +int test3_167() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_167(ca); // { dg-error "lvalue" } + sink_3_167(va); // { dg-error "lvalue" } + sink_3_167(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 369 } + sink_3_167(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 371 } + sink_3_167(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 373 } + return 0; +} + +one sink_3_168( A&); +six sink_3_168(const A&&); // { dg-message "" } +eight sink_3_168(const volatile A&&); // { dg-message "" } + +int test3_168() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_168(ca); // { dg-error "lvalue" } + sink_3_168(va); // { dg-error "lvalue" } + sink_3_168(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_3_178( A&); +seven sink_3_178(volatile A&&); // { dg-message "" } +eight sink_3_178(const volatile A&&); // { dg-message "" } + +int test3_178() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_178(ca); // { dg-error "lvalue" } + sink_3_178(va); // { dg-error "lvalue" } + sink_3_178(cva); // { dg-error "lvalue" } + return 0; +} + +two sink_3_234(const A&); // { dg-message "two sink_3_234|no known conversion" } +three sink_3_234(volatile A&); // { dg-message "note" } +four sink_3_234(const volatile A&); // { dg-message "note" } + +int test3_234() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_234(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 420 } + sink_3_234(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 422 } + sink_3_234(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 424 } + return 0; +} + +two sink_3_235(const A&); // { dg-message "two sink_3_235|no known conversion" } +three sink_3_235(volatile A&); // { dg-message "note" } +five sink_3_235( A&&); // { dg-message "note" } + +int test3_235() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_235(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 439 } + sink_3_235(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 441 } + sink_3_235(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 443 } + sink_3_235(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 445 } + return 0; +} + +two sink_3_236(const A&); // { dg-message "two sink_3_236|no known conversion" } +three sink_3_236(volatile A&); // { dg-message "note" } +six sink_3_236(const A&&); // { dg-message "note" } + +int test3_236() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_236(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 460 } + sink_3_236(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 462 } + sink_3_236(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 464 } + sink_3_236(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 466 } + return 0; +} + +two sink_3_237(const A&); // { dg-message "two sink_3_237|no known conversion" } +three sink_3_237(volatile A&); // { dg-message "note" } +seven sink_3_237(volatile A&&); // { dg-message "note" } + +int test3_237() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_237(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 481 } + sink_3_237(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 483 } + sink_3_237(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 485 } + return 0; +} + +two sink_3_238(const A&); // { dg-message "two sink_3_238|no known conversion" } +three sink_3_238(volatile A&); // { dg-message "three sink_3_238|no known conversion" } +eight sink_3_238(const volatile A&&); // { dg-message "eight sink_3_238|no known conversion" } + +int test3_238() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_238(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 500 } + sink_3_238(cva); // { dg-error "lvalue" } + return 0; +} + +two sink_3_245(const A&); // { dg-message "two sink_3_245|no known conversion" } +four sink_3_245(const volatile A&); // { dg-message "four sink_3_245|no known conversion" } +five sink_3_245( A&&); // { dg-message "five sink_3_245|no known conversion" } + +int test3_245() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_245(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 516 } + sink_3_245(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 518 } + return 0; +} + +two sink_3_246(const A&); // { dg-message "two sink_3_246|no known conversion" } +four sink_3_246(const volatile A&); // { dg-message "four sink_3_246|no known conversion" } +six sink_3_246(const A&&); // { dg-message "six sink_3_246|no known conversion" } + +int test3_246() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_246(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 533 } + sink_3_246(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 535 } + return 0; +} + +two sink_3_247(const A&); // { dg-message "two sink_3_247|no known conversion" } +four sink_3_247(const volatile A&); // { dg-message "four sink_3_247|no known conversion" } +seven sink_3_247(volatile A&&); // { dg-message "seven sink_3_247|no known conversion" } + +int test3_247() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_247(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 550 } + return 0; +} + +two sink_3_256(const A&); // { dg-message "two sink_3_256|no known conversion" } +five sink_3_256( A&&); // { dg-message "five sink_3_256|no known conversion" } +six sink_3_256(const A&&); // { dg-message "six sink_3_256|no known conversion" } + +int test3_256() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_256(va); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 565 } + sink_3_256(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 567 } + sink_3_256(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 569 } + sink_3_256(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 571 } + return 0; +} + +two sink_3_257(const A&); // { dg-message "two sink_3_257|no known conversion" } +five sink_3_257( A&&); // { dg-message "five sink_3_257|no known conversion" } +seven sink_3_257(volatile A&&); // { dg-message "seven sink_3_257|no known conversion" } + +int test3_257() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_257(va); // { dg-error "lvalue" } + sink_3_257(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 587 } + sink_3_257(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 589 } + return 0; +} + +two sink_3_258(const A&); +five sink_3_258( A&&); +eight sink_3_258(const volatile A&&); // { dg-message "" } + +int test3_258() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_258(va); // { dg-error "lvalue" } + sink_3_258(cva); // { dg-error "lvalue" } + return 0; +} + +two sink_3_267(const A&); // { dg-message "two sink_3_267|no known conversion" } +six sink_3_267(const A&&); // { dg-message "six sink_3_267|no known conversion" } +seven sink_3_267(volatile A&&); // { dg-message "seven sink_3_267|no known conversion" } + +int test3_267() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_267(va); // { dg-error "lvalue" } + sink_3_267(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 620 } + sink_3_267(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 622 } + sink_3_267(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 624 } + return 0; +} + +two sink_3_268(const A&); +six sink_3_268(const A&&); +eight sink_3_268(const volatile A&&); // { dg-message "" } + +int test3_268() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_268(va); // { dg-error "lvalue" } + sink_3_268(cva); // { dg-error "lvalue" } + return 0; +} + +two sink_3_278(const A&); +seven sink_3_278(volatile A&&); // { dg-message "" } +eight sink_3_278(const volatile A&&); // { dg-message "" } + +int test3_278() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_278(va); // { dg-error "lvalue" } + sink_3_278(cva); // { dg-error "lvalue" } + return 0; +} + +three sink_3_345(volatile A&); // { dg-message "three sink_3_345|no known conversion" } +four sink_3_345(const volatile A&); // { dg-message "four sink_3_345|no known conversion" } +five sink_3_345( A&&); // { dg-message "five sink_3_345|no known conversion" } + +int test3_345() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_345(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 669 } + sink_3_345(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 671 } + sink_3_345(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 673 } + return 0; +} + +three sink_3_346(volatile A&); // { dg-message "three sink_3_346|no known conversion" } +four sink_3_346(const volatile A&); // { dg-message "four sink_3_346|no known conversion" } +six sink_3_346(const A&&); // { dg-message "six sink_3_346|no known conversion" } + +int test3_346() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_346(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 688 } + sink_3_346(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 690 } + return 0; +} + +three sink_3_347(volatile A&); // { dg-message "three sink_3_347|no known conversion" } +four sink_3_347(const volatile A&); // { dg-message "four sink_3_347|no known conversion" } +seven sink_3_347(volatile A&&); // { dg-message "seven sink_3_347|no known conversion" } + +int test3_347() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_347(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 705 } + sink_3_347(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 707 } + return 0; +} + +three sink_3_356(volatile A&); // { dg-message "three sink_3_356|no known conversion" } +five sink_3_356( A&&); // { dg-message "five sink_3_356|no known conversion" } +six sink_3_356(const A&&); // { dg-message "six sink_3_356|no known conversion" } + +int test3_356() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_356(ca); // { dg-error "lvalue" } + sink_3_356(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 723 } + sink_3_356(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 725 } + sink_3_356(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 727 } + return 0; +} + +three sink_3_357(volatile A&); // { dg-message "three sink_3_357|no known conversion" } +five sink_3_357( A&&); // { dg-message "five sink_3_357|no known conversion" } +seven sink_3_357(volatile A&&); // { dg-message "seven sink_3_357|no known conversion" } + +int test3_357() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_357(ca); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 742 } + sink_3_357(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 744 } + sink_3_357(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 746 } + sink_3_357(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 748 } + return 0; +} + +three sink_3_358(volatile A&); +five sink_3_358( A&&); +eight sink_3_358(const volatile A&&); // { dg-message "" } + +int test3_358() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_358(ca); // { dg-error "lvalue" } + sink_3_358(cva); // { dg-error "lvalue" } + return 0; +} + +three sink_3_367(volatile A&); // { dg-message "three sink_3_367|no known conversion" } +six sink_3_367(const A&&); // { dg-message "six sink_3_367|no known conversion" } +seven sink_3_367(volatile A&&); // { dg-message "seven sink_3_367|no known conversion" } + +int test3_367() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_367(ca); // { dg-error "lvalue" } + sink_3_367(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 779 } + sink_3_367(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 781 } + sink_3_367(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 783 } + return 0; +} + +three sink_3_368(volatile A&); +six sink_3_368(const A&&); // { dg-message "" } +eight sink_3_368(const volatile A&&); // { dg-message "" } + +int test3_368() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_368(ca); // { dg-error "lvalue" } + sink_3_368(cva); // { dg-error "lvalue" } + return 0; +} + +three sink_3_378(volatile A&); +seven sink_3_378(volatile A&&); +eight sink_3_378(const volatile A&&); // { dg-message "" } + +int test3_378() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_378(ca); // { dg-error "lvalue" } + sink_3_378(cva); // { dg-error "lvalue" } + return 0; +} + +four sink_3_456(const volatile A&); // { dg-message "note" } +five sink_3_456( A&&); // { dg-message "note" } +six sink_3_456(const A&&); // { dg-message "note" } + +int test3_456() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_456(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 828 } + sink_3_456(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 830 } + return 0; +} + +four sink_3_457(const volatile A&); // { dg-message "note" } +five sink_3_457( A&&); // { dg-message "note" } +seven sink_3_457(volatile A&&); // { dg-message "note" } + +int test3_457() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_457(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 845 } + sink_3_457(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 847 } + return 0; +} + +four sink_3_467(const volatile A&); // { dg-message "note" } +six sink_3_467(const A&&); // { dg-message "note" } +seven sink_3_467(volatile A&&); // { dg-message "note" } + +int test3_467() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_467(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 862 } + sink_3_467(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 864 } + return 0; +} + +five sink_3_567( A&&); // { dg-message "five sink_3_567|no known conversion" } +six sink_3_567(const A&&); // { dg-message "six sink_3_567|no known conversion" } +seven sink_3_567(volatile A&&); // { dg-message "seven sink_3_567|no known conversion" } + +int test3_567() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_567(a); // { dg-error "lvalue" } + sink_3_567(ca); // { dg-error "lvalue" } + sink_3_567(va); // { dg-error "lvalue" } + sink_3_567(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 882 } + sink_3_567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 884 } + return 0; +} + +five sink_3_568( A&&); // { dg-message "" } +six sink_3_568(const A&&); // { dg-message "" } +eight sink_3_568(const volatile A&&); // { dg-message "" } + +int test3_568() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_568(a); // { dg-error "lvalue" } + sink_3_568(ca); // { dg-error "lvalue" } + sink_3_568(va); // { dg-error "lvalue" } + sink_3_568(cva); // { dg-error "lvalue" } + return 0; +} + +five sink_3_578( A&&); // { dg-message "" } +seven sink_3_578(volatile A&&); // { dg-message "" } +eight sink_3_578(const volatile A&&); // { dg-message "" } + +int test3_578() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_578(a); // { dg-error "lvalue" } + sink_3_578(ca); // { dg-error "lvalue" } + sink_3_578(va); // { dg-error "lvalue" } + sink_3_578(cva); // { dg-error "lvalue" } + return 0; +} + +six sink_3_678(const A&&); // { dg-message "six sink_3_678|no known conversion" } +seven sink_3_678(volatile A&&); // { dg-message "seven sink_3_678|no known conversion" } +eight sink_3_678(const volatile A&&); // { dg-message "eight sink_3_678|no known conversion" } + +int test3_678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_3_678(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 933 } + sink_3_678(ca); // { dg-error "lvalue" } + sink_3_678(va); // { dg-error "lvalue" } + sink_3_678(cva); // { dg-error "lvalue" } + sink_3_678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 938 } + return 0; +} + +int main() +{ + return test3_123() + test3_125() + test3_126() + test3_127() + + test3_135() + test3_136() + test3_137() + test3_156() + + test3_157() + test3_167() + test3_234() + test3_235() + + test3_236() + test3_237() + test3_238() + test3_256() + + test3_257() + test3_267() + test3_356() + test3_357() + + test3_367() + test3_467() + test3_567() + test3_678(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv3p.C b/gcc/testsuite/g++.dg/cpp0x/rv3p.C new file mode 100644 index 000000000..fad89e1d9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv3p.C @@ -0,0 +1,1070 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; +struct three {long x[3];}; +struct four {long x[4];}; +struct five {long x[5];}; +struct six {long x[6];}; +struct seven {long x[7];}; +struct eight {long x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 3 at a time + +one sink_3_123( A&); +two sink_3_123(const A&); +three sink_3_123(volatile A&); + +int test3_123() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_123(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_123(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_123(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_123(source())) == 2 * sizeof(long)> t5; + sa<sizeof(sink_3_123(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +one sink_3_124( A&); +two sink_3_124(const A&); +four sink_3_124(const volatile A&); + +int test3_124() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_124(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_124(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_124(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_124(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_124(source())) == 2 * sizeof(long)> t5; + sa<sizeof(sink_3_124(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +one sink_3_125( A&); +two sink_3_125(const A&); +five sink_3_125( A&&); + +int test3_125() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_125(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_125(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_125(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_125(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +one sink_3_126( A&); +two sink_3_126(const A&); +six sink_3_126(const A&&); + +int test3_126() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_126(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_126(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_126(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_126(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_3_127( A&); +two sink_3_127(const A&); +seven sink_3_127(volatile A&&); + +int test3_127() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_127(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_127(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_127(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_127(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_3_127(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_3_128( A&); +two sink_3_128(const A&); +eight sink_3_128(const volatile A&&); + +int test3_128() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_128(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_128(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_128(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_3_128(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_128(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_128(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_3_134( A&); +three sink_3_134(volatile A&); +four sink_3_134(const volatile A&); + +int test3_134() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_134(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_134(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_134(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_134(cva)) == 4 * sizeof(long)> t4; + return 0; +} + +one sink_3_135( A&); +three sink_3_135(volatile A&); +five sink_3_135( A&&); + +int test3_135() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_135(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_135(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_135(source())) == 5 * sizeof(long)> t5; + return 0; +} + +one sink_3_136( A&); +three sink_3_136(volatile A&); +six sink_3_136(const A&&); + +int test3_136() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_136(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_136(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_136(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_136(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_3_137( A&); +three sink_3_137(volatile A&); +seven sink_3_137(volatile A&&); + +int test3_137() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_137(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_137(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_137(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_137(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_3_138( A&); +three sink_3_138(volatile A&); +eight sink_3_138(const volatile A&&); + +int test3_138() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_138(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_138(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_138(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_3_138(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_138(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_138(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_3_145( A&); +four sink_3_145(const volatile A&); +five sink_3_145( A&&); + +int test3_145() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_145(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_145(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_145(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_145(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_145(source())) == 5 * sizeof(long)> t5; + return 0; +} + +one sink_3_146( A&); +four sink_3_146(const volatile A&); +six sink_3_146(const A&&); + +int test3_146() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_146(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_146(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_146(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_146(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_146(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_146(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_3_147( A&); +four sink_3_147(const volatile A&); +seven sink_3_147(volatile A&&); + +int test3_147() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_147(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_147(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_147(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_147(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_147(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_147(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_3_148( A&); +four sink_3_148(const volatile A&); +eight sink_3_148(const volatile A&&); + +int test3_148() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_148(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_148(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_148(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_148(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_148(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_3_148(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_148(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_148(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_3_156( A&); +five sink_3_156( A&&); +six sink_3_156(const A&&); + +int test3_156() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_156(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_156(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_156(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_3_157( A&); +five sink_3_157( A&&); +seven sink_3_157(volatile A&&); + +int test3_157() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_157(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_157(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_157(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_3_158( A&); +five sink_3_158( A&&); +eight sink_3_158(const volatile A&&); + +int test3_158() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_158(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_158(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_158(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_158(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_158(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_3_167( A&); +six sink_3_167(const A&&); +seven sink_3_167(volatile A&&); + +int test3_167() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_167(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_167(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_167(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_3_168( A&); +six sink_3_168(const A&&); +eight sink_3_168(const volatile A&&); + +int test3_168() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_168(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_168(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_168(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_168(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_168(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_3_178( A&); +seven sink_3_178(volatile A&&); +eight sink_3_178(const volatile A&&); + +int test3_178() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_178(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_3_178(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_178(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_178(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_3_178(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_3_234(const A&); +three sink_3_234(volatile A&); +four sink_3_234(const volatile A&); + +int test3_234() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_234(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_234(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_234(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_234(source())) == 2 * sizeof(long)> t5; + sa<sizeof(sink_3_234(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +two sink_3_235(const A&); +three sink_3_235(volatile A&); +five sink_3_235( A&&); + +int test3_235() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_235(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_235(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_235(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_235(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +two sink_3_236(const A&); +three sink_3_236(volatile A&); +six sink_3_236(const A&&); + +int test3_236() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_236(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_236(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_236(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_236(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +two sink_3_237(const A&); +three sink_3_237(volatile A&); +seven sink_3_237(volatile A&&); + +int test3_237() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_237(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_237(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_237(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_237(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_3_237(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_3_238(const A&); +three sink_3_238(volatile A&); +eight sink_3_238(const volatile A&&); + +int test3_238() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_238(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_238(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_238(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_3_238(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_238(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_238(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_3_245(const A&); +four sink_3_245(const volatile A&); +five sink_3_245( A&&); + +int test3_245() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_245(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_245(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_245(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_245(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_245(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_245(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +two sink_3_246(const A&); +four sink_3_246(const volatile A&); +six sink_3_246(const A&&); + +int test3_246() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_246(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_246(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_246(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_246(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_246(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_246(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +two sink_3_247(const A&); +four sink_3_247(const volatile A&); +seven sink_3_247(volatile A&&); + +int test3_247() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_247(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_247(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_247(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_247(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_247(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_247(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_3_247(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_3_248(const A&); +four sink_3_248(const volatile A&); +eight sink_3_248(const volatile A&&); + +int test3_248() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_248(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_248(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_248(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_248(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_248(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_3_248(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_248(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_248(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_3_256(const A&); +five sink_3_256( A&&); +six sink_3_256(const A&&); + +int test3_256() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_256(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_256(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_256(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_256(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +two sink_3_257(const A&); +five sink_3_257( A&&); +seven sink_3_257(volatile A&&); + +int test3_257() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_257(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_257(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_257(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_257(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_3_257(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_3_258(const A&); +five sink_3_258( A&&); +eight sink_3_258(const volatile A&&); + +int test3_258() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_258(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_258(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_258(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_258(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_258(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_258(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_3_267(const A&); +six sink_3_267(const A&&); +seven sink_3_267(volatile A&&); + +int test3_267() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_267(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_267(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_267(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_267(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_3_268(const A&); +six sink_3_268(const A&&); +eight sink_3_268(const volatile A&&); + +int test3_268() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_268(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_268(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_268(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_268(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_268(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_268(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_3_278(const A&); +seven sink_3_278(volatile A&&); +eight sink_3_278(const volatile A&&); + +int test3_278() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_278(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_3_278(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_3_278(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_278(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_278(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_3_278(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_3_345(volatile A&); +four sink_3_345(const volatile A&); +five sink_3_345( A&&); + +int test3_345() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_345(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_345(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_345(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_345(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_345(source())) == 5 * sizeof(long)> t5; + return 0; +} + +three sink_3_346(volatile A&); +four sink_3_346(const volatile A&); +six sink_3_346(const A&&); + +int test3_346() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_346(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_346(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_346(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_346(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_346(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_346(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +three sink_3_347(volatile A&); +four sink_3_347(const volatile A&); +seven sink_3_347(volatile A&&); + +int test3_347() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_347(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_347(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_347(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_347(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_347(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_347(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +three sink_3_348(volatile A&); +four sink_3_348(const volatile A&); +eight sink_3_348(const volatile A&&); + +int test3_348() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_348(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_348(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_348(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_348(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_348(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_3_348(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_348(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_348(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_3_356(volatile A&); +five sink_3_356( A&&); +six sink_3_356(const A&&); + +int test3_356() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_356(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_356(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_356(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_356(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +three sink_3_357(volatile A&); +five sink_3_357( A&&); +seven sink_3_357(volatile A&&); + +int test3_357() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_357(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_357(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_357(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_357(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +three sink_3_358(volatile A&); +five sink_3_358( A&&); +eight sink_3_358(const volatile A&&); + +int test3_358() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_358(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_358(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_358(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_358(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_358(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_358(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_3_367(volatile A&); +six sink_3_367(const A&&); +seven sink_3_367(volatile A&&); + +int test3_367() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_367(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_367(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_367(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_367(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +three sink_3_368(volatile A&); +six sink_3_368(const A&&); +eight sink_3_368(const volatile A&&); + +int test3_368() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_368(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_368(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_368(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_368(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_368(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_368(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_3_378(volatile A&); +seven sink_3_378(volatile A&&); +eight sink_3_378(const volatile A&&); + +int test3_378() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_378(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_3_378(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_3_378(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_378(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_378(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_3_378(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +four sink_3_456(const volatile A&); +five sink_3_456( A&&); +six sink_3_456(const A&&); + +int test3_456() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_456(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_3_456(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_456(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_456(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_456(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_456(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +four sink_3_457(const volatile A&); +five sink_3_457( A&&); +seven sink_3_457(volatile A&&); + +int test3_457() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_457(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_3_457(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_457(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_457(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_457(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_457(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +four sink_3_458(const volatile A&); +five sink_3_458( A&&); +eight sink_3_458(const volatile A&&); + +int test3_458() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_458(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_3_458(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_458(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_458(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_458(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_458(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_458(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_458(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +four sink_3_467(const volatile A&); +six sink_3_467(const A&&); +seven sink_3_467(volatile A&&); + +int test3_467() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_467(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_3_467(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_467(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_467(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_467(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_467(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +four sink_3_468(const volatile A&); +six sink_3_468(const A&&); +eight sink_3_468(const volatile A&&); + +int test3_468() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_468(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_3_468(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_468(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_468(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_468(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_3_468(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_468(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_468(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +four sink_3_478(const volatile A&); +seven sink_3_478(volatile A&&); +eight sink_3_478(const volatile A&&); + +int test3_478() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_478(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_3_478(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_3_478(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_3_478(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_3_478(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_3_478(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_478(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_3_478(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +five sink_3_567( A&&); +six sink_3_567(const A&&); +seven sink_3_567(volatile A&&); + +int test3_567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +five sink_3_568( A&&); +six sink_3_568(const A&&); +eight sink_3_568(const volatile A&&); + +int test3_568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_3_568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +five sink_3_578( A&&); +seven sink_3_578(volatile A&&); +eight sink_3_578(const volatile A&&); + +int test3_578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_3_578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_3_578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_3_578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +six sink_3_678(const A&&); +seven sink_3_678(volatile A&&); +eight sink_3_678(const volatile A&&); + +int test3_678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_3_678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_3_678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_3_678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +int main() +{ + return test3_123() + test3_124() + test3_125() + test3_126() + + test3_127() + test3_128() + test3_134() + test3_135() + + test3_136() + test3_137() + test3_138() + test3_145() + + test3_146() + test3_147() + test3_148() + test3_156() + + test3_157() + test3_158() + test3_167() + test3_168() + + test3_178() + test3_234() + test3_235() + test3_236() + + test3_237() + test3_238() + test3_245() + test3_246() + + test3_247() + test3_248() + test3_256() + test3_257() + + test3_258() + test3_267() + test3_268() + test3_278() + + test3_345() + test3_346() + test3_347() + test3_348() + + test3_356() + test3_357() + test3_358() + test3_367() + + test3_368() + test3_378() + test3_456() + test3_457() + + test3_458() + test3_467() + test3_468() + test3_478() + + test3_567() + test3_568() + test3_578() + test3_678(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv4n.C b/gcc/testsuite/g++.dg/cpp0x/rv4n.C new file mode 100644 index 000000000..daff30798 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv4n.C @@ -0,0 +1,1072 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; +struct three {char x[3];}; +struct four {char x[4];}; +struct five {char x[5];}; +struct six {char x[6];}; +struct seven {char x[7];}; +struct eight {char x[8];}; + +struct A +{ + A(); + A(const volatile A&&); // { dg-error "argument 1" } +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 4 at a time + +one sink_4_1234( A&); // { dg-message "one sink_4_1234|no known conversion" } +two sink_4_1234(const A&); // { dg-message "note" } +three sink_4_1234(volatile A&); // { dg-message "note" } +four sink_4_1234(const volatile A&); // { dg-message "note" } + +int test4_1234() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1234(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 44 } + sink_4_1234(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 46 } + return 0; +} + +one sink_4_1235( A&); // { dg-message "one sink_4_1235|no known conversion" } +two sink_4_1235(const A&); // { dg-message "note" } +three sink_4_1235(volatile A&); // { dg-message "note" } +five sink_4_1235( A&&); // { dg-message "note" } + +int test4_1235() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1235(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 62 } + sink_4_1235(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 64 } + sink_4_1235(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 66 } + return 0; +} + +one sink_4_1236( A&); // { dg-message "one sink_4_1236|no known conversion" } +two sink_4_1236(const A&); // { dg-message "note" } +three sink_4_1236(volatile A&); // { dg-message "note" } +six sink_4_1236(const A&&); // { dg-message "note" } + +int test4_1236() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1236(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 82 } + sink_4_1236(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 84 } + sink_4_1236(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 86 } + return 0; +} + +one sink_4_1237( A&); // { dg-message "one sink_4_1237|no known conversion" } +two sink_4_1237(const A&); // { dg-message "note" } +three sink_4_1237(volatile A&); // { dg-message "note" } +seven sink_4_1237(volatile A&&); // { dg-message "note" } + +int test4_1237() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1237(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 102 } + sink_4_1237(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 104 } + return 0; +} + +one sink_4_1238( A&); +two sink_4_1238(const A&); +three sink_4_1238(volatile A&); +eight sink_4_1238(const volatile A&&); // { dg-message "" } + +int test4_1238() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1238(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_4_1245( A&); // { dg-message "one sink_4_1245|no known conversion" } +two sink_4_1245(const A&); // { dg-message "note" } +four sink_4_1245(const volatile A&); // { dg-message "note" } +five sink_4_1245( A&&); // { dg-message "note" } + +int test4_1245() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1245(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 135 } + sink_4_1245(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 137 } + return 0; +} + +one sink_4_1246( A&); // { dg-message "one sink_4_1246|no known conversion" } +two sink_4_1246(const A&); // { dg-message "note" } +four sink_4_1246(const volatile A&); // { dg-message "note" } +six sink_4_1246(const A&&); // { dg-message "note" } + +int test4_1246() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1246(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 153 } + sink_4_1246(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 155 } + return 0; +} + +one sink_4_1247( A&); // { dg-message "one sink_4_1247|no known conversion" } +two sink_4_1247(const A&); // { dg-message "note" } +four sink_4_1247(const volatile A&); // { dg-message "note" } +seven sink_4_1247(volatile A&&); // { dg-message "note" } + +int test4_1247() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1247(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 171 } + return 0; +} + +one sink_4_1256( A&); // { dg-message "one sink_4_1256|no known conversion" } +two sink_4_1256(const A&); // { dg-message "note" } +five sink_4_1256( A&&); // { dg-message "note" } +six sink_4_1256(const A&&); // { dg-message "note" } + +int test4_1256() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1256(va); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 187 } + sink_4_1256(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 189 } + sink_4_1256(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 191 } + sink_4_1256(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 193 } + return 0; +} + +one sink_4_1257( A&); // { dg-message "one sink_4_1257|no known conversion" } +two sink_4_1257(const A&); // { dg-message "note" } +five sink_4_1257( A&&); // { dg-message "note" } +seven sink_4_1257(volatile A&&); // { dg-message "" } + +int test4_1257() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1257(va); // { dg-error "lvalue" } + sink_4_1257(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 210 } + sink_4_1257(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 212 } + return 0; +} + +one sink_4_1258( A&); +two sink_4_1258(const A&); +five sink_4_1258( A&&); +eight sink_4_1258(const volatile A&&); // { dg-message "" } + +int test4_1258() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1258(va); // { dg-error "lvalue" } + sink_4_1258(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_4_1267( A&); // { dg-message "one sink_4_1267|no known conversion" } +two sink_4_1267(const A&); // { dg-message "note" } +six sink_4_1267(const A&&); // { dg-message "note" } +seven sink_4_1267(volatile A&&); // { dg-message "" } + +int test4_1267() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1267(va); // { dg-error "lvalue" } + sink_4_1267(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 245 } + sink_4_1267(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 247 } + sink_4_1267(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 249 } + return 0; +} + +one sink_4_1268( A&); +two sink_4_1268(const A&); +six sink_4_1268(const A&&); +eight sink_4_1268(const volatile A&&); // { dg-message "" } + +int test4_1268() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1268(va); // { dg-error "lvalue" } + sink_4_1268(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_4_1278( A&); +two sink_4_1278(const A&); +seven sink_4_1278(volatile A&&); // { dg-message "" } +eight sink_4_1278(const volatile A&&); // { dg-message "" } + +int test4_1278() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1278(va); // { dg-error "lvalue" } + sink_4_1278(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_4_1345( A&); // { dg-message "one sink_4_1345|no known conversion" } +three sink_4_1345(volatile A&); // { dg-message "note" } +four sink_4_1345(const volatile A&); // { dg-message "note" } +five sink_4_1345( A&&); // { dg-message "note" } + +int test4_1345() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1345(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 297 } + sink_4_1345(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 299 } + sink_4_1345(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 301 } + return 0; +} + +one sink_4_1346( A&); // { dg-message "one sink_4_1346|no known conversion" } +three sink_4_1346(volatile A&); // { dg-message "note" } +four sink_4_1346(const volatile A&); // { dg-message "note" } +six sink_4_1346(const A&&); // { dg-message "note" } + +int test4_1346() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1346(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 317 } + sink_4_1346(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 319 } + return 0; +} + +one sink_4_1347( A&); // { dg-message "one sink_4_1347|no known conversion" } +three sink_4_1347(volatile A&); // { dg-message "note" } +four sink_4_1347(const volatile A&); // { dg-message "note" } +seven sink_4_1347(volatile A&&); // { dg-message "note" } + +int test4_1347() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1347(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 335 } + sink_4_1347(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 337 } + return 0; +} + +one sink_4_1356( A&); // { dg-message "one sink_4_1356|no known conversion" } +three sink_4_1356(volatile A&); // { dg-message "note" } +five sink_4_1356( A&&); // { dg-message "note" } +six sink_4_1356(const A&&); // { dg-message "" } + +int test4_1356() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1356(ca); // { dg-error "lvalue" } + sink_4_1356(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 354 } + sink_4_1356(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 356 } + sink_4_1356(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 358 } + return 0; +} + +one sink_4_1357( A&); // { dg-message "one sink_4_1357|no known conversion" } +three sink_4_1357(volatile A&); // { dg-message "note" } +five sink_4_1357( A&&); // { dg-message "note" } +seven sink_4_1357(volatile A&&); // { dg-message "note" } + +int test4_1357() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1357(ca); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 374 } + sink_4_1357(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 376 } + sink_4_1357(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 378 } + sink_4_1357(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 380 } + return 0; +} + +one sink_4_1358( A&); +three sink_4_1358(volatile A&); +five sink_4_1358( A&&); +eight sink_4_1358(const volatile A&&); // { dg-message "" } + +int test4_1358() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1358(ca); // { dg-error "lvalue" } + sink_4_1358(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_4_1367( A&); // { dg-message "one sink_4_1367|no known conversion" } +three sink_4_1367(volatile A&); // { dg-message "note" } +six sink_4_1367(const A&&); // { dg-message "" } +seven sink_4_1367(volatile A&&); // { dg-message "note" } + +int test4_1367() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1367(ca); // { dg-error "lvalue" } + sink_4_1367(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 413 } + sink_4_1367(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 415 } + sink_4_1367(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 417 } + return 0; +} + +one sink_4_1368( A&); +three sink_4_1368(volatile A&); +six sink_4_1368(const A&&); // { dg-message "" } +eight sink_4_1368(const volatile A&&); // { dg-message "" } + +int test4_1368() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1368(ca); // { dg-error "lvalue" } + sink_4_1368(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_4_1378( A&); +three sink_4_1378(volatile A&); +seven sink_4_1378(volatile A&&); +eight sink_4_1378(const volatile A&&); // { dg-message "" } + +int test4_1378() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1378(ca); // { dg-error "lvalue" } + sink_4_1378(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_4_1456( A&); // { dg-message "one sink_4_1456|no known conversion" } +four sink_4_1456(const volatile A&); // { dg-message "note" } +five sink_4_1456( A&&); // { dg-message "note" } +six sink_4_1456(const A&&); // { dg-message "note" } + +int test4_1456() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1456(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 465 } + sink_4_1456(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 467 } + return 0; +} + +one sink_4_1457( A&); // { dg-message "one sink_4_1457|no known conversion" } +four sink_4_1457(const volatile A&); // { dg-message "note" } +five sink_4_1457( A&&); // { dg-message "note" } +seven sink_4_1457(volatile A&&); // { dg-message "note" } + +int test4_1457() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1457(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 483 } + sink_4_1457(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 485 } + return 0; +} + +one sink_4_1467( A&); // { dg-message "one sink_4_1467|no known conversion" } +four sink_4_1467(const volatile A&); // { dg-message "note" } +six sink_4_1467(const A&&); // { dg-message "note" } +seven sink_4_1467(volatile A&&); // { dg-message "note" } + +int test4_1467() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1467(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 501 } + sink_4_1467(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 503 } + return 0; +} + +one sink_4_1567( A&); // { dg-message "one sink_4_1567|no known conversion" } +five sink_4_1567( A&&); // { dg-message "note" } +six sink_4_1567(const A&&); // { dg-message "" } +seven sink_4_1567(volatile A&&); // { dg-message "" } + +int test4_1567() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1567(ca); // { dg-error "lvalue" } + sink_4_1567(va); // { dg-error "lvalue" } + sink_4_1567(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 521 } + sink_4_1567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 523 } + return 0; +} + +one sink_4_1568( A&); +five sink_4_1568( A&&); +six sink_4_1568(const A&&); // { dg-message "" } +eight sink_4_1568(const volatile A&&); // { dg-message "" } + +int test4_1568() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1568(ca); // { dg-error "lvalue" } + sink_4_1568(va); // { dg-error "lvalue" } + sink_4_1568(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_4_1578( A&); +five sink_4_1578( A&&); +seven sink_4_1578(volatile A&&); // { dg-message "" } +eight sink_4_1578(const volatile A&&); // { dg-message "" } + +int test4_1578() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1578(ca); // { dg-error "lvalue" } + sink_4_1578(va); // { dg-error "lvalue" } + sink_4_1578(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_4_1678( A&); +six sink_4_1678(const A&&); // { dg-message "" } +seven sink_4_1678(volatile A&&); // { dg-message "" } +eight sink_4_1678(const volatile A&&); // { dg-message "" } + +int test4_1678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_1678(ca); // { dg-error "lvalue" } + sink_4_1678(va); // { dg-error "lvalue" } + sink_4_1678(cva); // { dg-error "lvalue" } + sink_4_1678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 576 } + return 0; +} + +two sink_4_2345(const A&); // { dg-message "two sink_4_2345|no known conversion" } +three sink_4_2345(volatile A&); // { dg-message "note" } +four sink_4_2345(const volatile A&); // { dg-message "note" } +five sink_4_2345( A&&); // { dg-message "note" } + +int test4_2345() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_2345(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 592 } + sink_4_2345(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 594 } + sink_4_2345(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 596 } + return 0; +} + +two sink_4_2346(const A&); // { dg-message "two sink_4_2346|no known conversion" } +three sink_4_2346(volatile A&); // { dg-message "note" } +four sink_4_2346(const volatile A&); // { dg-message "note" } +six sink_4_2346(const A&&); // { dg-message "note" } + +int test4_2346() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_2346(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 612 } + sink_4_2346(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 614 } + sink_4_2346(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 616 } + return 0; +} + +two sink_4_2347(const A&); // { dg-message "two sink_4_2347|no known conversion" } +three sink_4_2347(volatile A&); // { dg-message "note" } +four sink_4_2347(const volatile A&); // { dg-message "note" } +seven sink_4_2347(volatile A&&); // { dg-message "note" } + +int test4_2347() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_2347(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 632 } + sink_4_2347(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 634 } + return 0; +} + +two sink_4_2348(const A&); // { dg-message "note" } +three sink_4_2348(volatile A&); // { dg-message "note" } +four sink_4_2348(const volatile A&); // { dg-message "note" } +eight sink_4_2348(const volatile A&&); // { dg-message "note" } + +int test4_2348() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_2348(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 650 } + return 0; +} + +two sink_4_2356(const A&); // { dg-message "two sink_4_2356|no known conversion" } +three sink_4_2356(volatile A&); // { dg-message "note" } +five sink_4_2356( A&&); // { dg-message "note" } +six sink_4_2356(const A&&); // { dg-message "note" } + +int test4_2356() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_2356(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 666 } + sink_4_2356(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 668 } + sink_4_2356(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 670 } + sink_4_2356(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 672 } + return 0; +} + +two sink_4_2357(const A&); // { dg-message "two sink_4_2357|no known conversion" } +three sink_4_2357(volatile A&); // { dg-message "note" } +five sink_4_2357( A&&); // { dg-message "note" } +seven sink_4_2357(volatile A&&); // { dg-message "note" } + +int test4_2357() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_2357(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 688 } + sink_4_2357(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 690 } + sink_4_2357(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 692 } + return 0; +} + +two sink_4_2358(const A&); // { dg-message "note" } +three sink_4_2358(volatile A&); // { dg-message "note" } +five sink_4_2358( A&&); // { dg-message "note" } +eight sink_4_2358(const volatile A&&); // { dg-message "" } + +int test4_2358() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_2358(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 708 } + sink_4_2358(cva); // { dg-error "lvalue" } + return 0; +} + +two sink_4_2367(const A&); // { dg-message "two sink_4_2367|no known conversion" } +three sink_4_2367(volatile A&); // { dg-message "note" } +six sink_4_2367(const A&&); // { dg-message "note" } +seven sink_4_2367(volatile A&&); // { dg-message "note" } + +int test4_2367() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_2367(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 725 } + sink_4_2367(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 727 } + sink_4_2367(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 729 } + sink_4_2367(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 731 } + return 0; +} + +two sink_4_2368(const A&); // { dg-message "note" } +three sink_4_2368(volatile A&); // { dg-message "note" } +six sink_4_2368(const A&&); // { dg-message "note" } +eight sink_4_2368(const volatile A&&); // { dg-message "" } + +int test4_2368() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_2368(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 747 } + sink_4_2368(cva); // { dg-error "lvalue" } + return 0; +} + +two sink_4_2378(const A&); // { dg-message "note" } +three sink_4_2378(volatile A&); // { dg-message "note" } +seven sink_4_2378(volatile A&&); // { dg-message "note" } +eight sink_4_2378(const volatile A&&); // { dg-message "" } + +int test4_2378() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_2378(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 764 } + sink_4_2378(cva); // { dg-error "lvalue" } + return 0; +} + +two sink_4_2456(const A&); // { dg-message "two sink_4_2456|no known conversion" } +four sink_4_2456(const volatile A&); // { dg-message "note" } +five sink_4_2456( A&&); // { dg-message "note" } +six sink_4_2456(const A&&); // { dg-message "note" } + +int test4_2456() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_2456(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 781 } + sink_4_2456(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 783 } + return 0; +} + +two sink_4_2457(const A&); // { dg-message "two sink_4_2457|no known conversion" } +four sink_4_2457(const volatile A&); // { dg-message "note" } +five sink_4_2457( A&&); // { dg-message "note" } +seven sink_4_2457(volatile A&&); // { dg-message "note" } + +int test4_2457() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_2457(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 799 } + return 0; +} + +two sink_4_2467(const A&); // { dg-message "two sink_4_2467|no known conversion" } +four sink_4_2467(const volatile A&); // { dg-message "note" } +six sink_4_2467(const A&&); // { dg-message "note" } +seven sink_4_2467(volatile A&&); // { dg-message "note" } + +int test4_2467() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_2467(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 815 } + sink_4_2467(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 817 } + return 0; +} + +two sink_4_2567(const A&); // { dg-message "two sink_4_2567|no known conversion" } +five sink_4_2567( A&&); // { dg-message "note" } +six sink_4_2567(const A&&); // { dg-message "note" } +seven sink_4_2567(volatile A&&); // { dg-message "" } + +int test4_2567() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_2567(va); // { dg-error "lvalue" } + sink_4_2567(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 834 } + sink_4_2567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 836 } + return 0; +} + +two sink_4_2568(const A&); +five sink_4_2568( A&&); +six sink_4_2568(const A&&); +eight sink_4_2568(const volatile A&&); // { dg-message "" } + +int test4_2568() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_2568(va); // { dg-error "lvalue" } + sink_4_2568(cva); // { dg-error "lvalue" } + return 0; +} + +two sink_4_2578(const A&); +five sink_4_2578( A&&); +seven sink_4_2578(volatile A&&); // { dg-message "" } +eight sink_4_2578(const volatile A&&); // { dg-message "" } + +int test4_2578() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_2578(va); // { dg-error "lvalue" } + sink_4_2578(cva); // { dg-error "lvalue" } + return 0; +} + +two sink_4_2678(const A&); // { dg-message "note" } +six sink_4_2678(const A&&); // { dg-message "note" } +seven sink_4_2678(volatile A&&); // { dg-message "" } +eight sink_4_2678(const volatile A&&); // { dg-message "" } + +int test4_2678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_2678(va); // { dg-error "lvalue" } + sink_4_2678(cva); // { dg-error "lvalue" } + sink_4_2678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 886 } + return 0; +} + +three sink_4_3456(volatile A&); // { dg-message "three sink_4_3456|no known conversion" } +four sink_4_3456(const volatile A&); // { dg-message "note" } +five sink_4_3456( A&&); // { dg-message "note" } +six sink_4_3456(const A&&); // { dg-message "note" } + +int test4_3456() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_3456(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 902 } + sink_4_3456(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 904 } + return 0; +} + +three sink_4_3457(volatile A&); // { dg-message "three sink_4_3457|no known conversion" } +four sink_4_3457(const volatile A&); // { dg-message "note" } +five sink_4_3457( A&&); // { dg-message "note" } +seven sink_4_3457(volatile A&&); // { dg-message "note" } + +int test4_3457() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_3457(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 920 } + sink_4_3457(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 922 } + return 0; +} + +three sink_4_3467(volatile A&); // { dg-message "three sink_4_3467|no known conversion" } +four sink_4_3467(const volatile A&); // { dg-message "note" } +six sink_4_3467(const A&&); // { dg-message "note" } +seven sink_4_3467(volatile A&&); // { dg-message "note" } + +int test4_3467() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_3467(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 938 } + sink_4_3467(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 940 } + return 0; +} + +three sink_4_3567(volatile A&); // { dg-message "three sink_4_3567|no known conversion" } +five sink_4_3567( A&&); // { dg-message "note" } +six sink_4_3567(const A&&); // { dg-message "" } +seven sink_4_3567(volatile A&&); // { dg-message "note" } + +int test4_3567() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_3567(ca); // { dg-error "lvalue" } + sink_4_3567(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 957 } + sink_4_3567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 959 } + return 0; +} + +three sink_4_3568(volatile A&); +five sink_4_3568( A&&); +six sink_4_3568(const A&&); // { dg-message "" } +eight sink_4_3568(const volatile A&&); // { dg-message "" } + +int test4_3568() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_3568(ca); // { dg-error "lvalue" } + sink_4_3568(cva); // { dg-error "lvalue" } + return 0; +} + +three sink_4_3578(volatile A&); +five sink_4_3578( A&&); +seven sink_4_3578(volatile A&&); +eight sink_4_3578(const volatile A&&); // { dg-message "" } + +int test4_3578() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_3578(ca); // { dg-error "lvalue" } + sink_4_3578(cva); // { dg-error "lvalue" } + return 0; +} + +three sink_4_3678(volatile A&); +six sink_4_3678(const A&&); // { dg-message "" } +seven sink_4_3678(volatile A&&); // { dg-message "note" } +eight sink_4_3678(const volatile A&&); // { dg-message "" } + +int test4_3678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_3678(ca); // { dg-error "lvalue" } + sink_4_3678(cva); // { dg-error "lvalue" } + sink_4_3678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 1009 } + return 0; +} + +four sink_4_4567(const volatile A&); // { dg-message "note" } +five sink_4_4567( A&&); // { dg-message "note" } +six sink_4_4567(const A&&); // { dg-message "note" } +seven sink_4_4567(volatile A&&); // { dg-message "note" } + +int test4_4567() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_4567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 1025 } + return 0; +} + +four sink_4_4678(const volatile A&); +six sink_4_4678(const A&&); // { dg-message "note" } +seven sink_4_4678(volatile A&&); // { dg-message "note" } +eight sink_4_4678(const volatile A&&); // { dg-message "note" } + +int test4_4678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_4678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 1041 } + return 0; +} + +five sink_4_5678( A&&); // { dg-message "" } +six sink_4_5678(const A&&); // { dg-message "" } +seven sink_4_5678(volatile A&&); // { dg-message "" } +eight sink_4_5678(const volatile A&&); // { dg-message "" } + +int test4_5678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_4_5678(a); // { dg-error "lvalue" } + sink_4_5678(ca); // { dg-error "lvalue" } + sink_4_5678(va); // { dg-error "lvalue" } + sink_4_5678(cva); // { dg-error "lvalue" } + return 0; +} + +int main() +{ + return test4_1235() + test4_1236() + test4_1237() + test4_1256() + test4_1257() + + test4_1267() + test4_1356() + test4_1357() + test4_1467() + test4_1567() + + test4_1678() + test4_2345() + test4_2346() + test4_2347() + test4_2348() + + test4_2356() + test4_2357() + test4_2358() + test4_2367() + test4_2368() + + test4_2378() + test4_2467() + test4_2567() + test4_2678() + test4_3467() + + test4_3567() + test4_3678() + test4_4678(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv4p.C b/gcc/testsuite/g++.dg/cpp0x/rv4p.C new file mode 100644 index 000000000..134ca13e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv4p.C @@ -0,0 +1,1448 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; +struct three {long x[3];}; +struct four {long x[4];}; +struct five {long x[5];}; +struct six {long x[6];}; +struct seven {long x[7];}; +struct eight {long x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 4 at a time + +one sink_4_1234( A&); +two sink_4_1234(const A&); +three sink_4_1234(volatile A&); +four sink_4_1234(const volatile A&); + +int test4_1234() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1234(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1234(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1234(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1234(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1234(source())) == 2 * sizeof(long)> t5; + sa<sizeof(sink_4_1234(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +one sink_4_1235( A&); +two sink_4_1235(const A&); +three sink_4_1235(volatile A&); +five sink_4_1235( A&&); + +int test4_1235() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1235(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1235(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1235(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1235(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1235(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +one sink_4_1236( A&); +two sink_4_1236(const A&); +three sink_4_1236(volatile A&); +six sink_4_1236(const A&&); + +int test4_1236() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1236(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1236(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1236(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1236(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_1236(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_4_1237( A&); +two sink_4_1237(const A&); +three sink_4_1237(volatile A&); +seven sink_4_1237(volatile A&&); + +int test4_1237() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1237(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1237(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1237(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1237(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_1237(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_4_1237(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1238( A&); +two sink_4_1238(const A&); +three sink_4_1238(volatile A&); +eight sink_4_1238(const volatile A&&); + +int test4_1238() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1238(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1238(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1238(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1238(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_4_1238(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1238(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1238(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1245( A&); +two sink_4_1245(const A&); +four sink_4_1245(const volatile A&); +five sink_4_1245( A&&); + +int test4_1245() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1245(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1245(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1245(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1245(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1245(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1245(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +one sink_4_1246( A&); +two sink_4_1246(const A&); +four sink_4_1246(const volatile A&); +six sink_4_1246(const A&&); + +int test4_1246() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1246(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1246(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1246(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1246(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1246(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_1246(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_4_1247( A&); +two sink_4_1247(const A&); +four sink_4_1247(const volatile A&); +seven sink_4_1247(volatile A&&); + +int test4_1247() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1247(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1247(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1247(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1247(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1247(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_1247(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_4_1247(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1248( A&); +two sink_4_1248(const A&); +four sink_4_1248(const volatile A&); +eight sink_4_1248(const volatile A&&); + +int test4_1248() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1248(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1248(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1248(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1248(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1248(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_4_1248(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1248(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1248(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1256( A&); +two sink_4_1256(const A&); +five sink_4_1256( A&&); +six sink_4_1256(const A&&); + +int test4_1256() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1256(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1256(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1256(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1256(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_4_1257( A&); +two sink_4_1257(const A&); +five sink_4_1257( A&&); +seven sink_4_1257(volatile A&&); + +int test4_1257() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1257(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1257(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1257(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1257(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_4_1257(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1258( A&); +two sink_4_1258(const A&); +five sink_4_1258( A&&); +eight sink_4_1258(const volatile A&&); + +int test4_1258() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1258(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1258(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1258(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1258(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1258(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1258(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1267( A&); +two sink_4_1267(const A&); +six sink_4_1267(const A&&); +seven sink_4_1267(volatile A&&); + +int test4_1267() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1267(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1267(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1267(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_1267(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1268( A&); +two sink_4_1268(const A&); +six sink_4_1268(const A&&); +eight sink_4_1268(const volatile A&&); + +int test4_1268() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1268(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1268(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1268(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_1268(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_1268(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1268(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1278( A&); +two sink_4_1278(const A&); +seven sink_4_1278(volatile A&&); +eight sink_4_1278(const volatile A&&); + +int test4_1278() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1278(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1278(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_1278(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_1278(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1278(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_1278(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1345( A&); +three sink_4_1345(volatile A&); +four sink_4_1345(const volatile A&); +five sink_4_1345( A&&); + +int test4_1345() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1345(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1345(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1345(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1345(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1345(source())) == 5 * sizeof(long)> t5; + return 0; +} + +one sink_4_1346( A&); +three sink_4_1346(volatile A&); +four sink_4_1346(const volatile A&); +six sink_4_1346(const A&&); + +int test4_1346() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1346(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1346(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1346(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1346(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1346(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_1346(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_4_1347( A&); +three sink_4_1347(volatile A&); +four sink_4_1347(const volatile A&); +seven sink_4_1347(volatile A&&); + +int test4_1347() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1347(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1347(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1347(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1347(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1347(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_1347(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1348( A&); +three sink_4_1348(volatile A&); +four sink_4_1348(const volatile A&); +eight sink_4_1348(const volatile A&&); + +int test4_1348() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1348(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1348(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1348(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1348(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1348(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_4_1348(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1348(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1348(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1356( A&); +three sink_4_1356(volatile A&); +five sink_4_1356( A&&); +six sink_4_1356(const A&&); + +int test4_1356() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1356(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1356(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1356(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1356(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_4_1357( A&); +three sink_4_1357(volatile A&); +five sink_4_1357( A&&); +seven sink_4_1357(volatile A&&); + +int test4_1357() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1357(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1357(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1357(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1357(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1358( A&); +three sink_4_1358(volatile A&); +five sink_4_1358( A&&); +eight sink_4_1358(const volatile A&&); + +int test4_1358() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1358(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1358(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1358(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1358(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1358(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1358(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1367( A&); +three sink_4_1367(volatile A&); +six sink_4_1367(const A&&); +seven sink_4_1367(volatile A&&); + +int test4_1367() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1367(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1367(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1367(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_1367(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1368( A&); +three sink_4_1368(volatile A&); +six sink_4_1368(const A&&); +eight sink_4_1368(const volatile A&&); + +int test4_1368() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1368(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1368(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1368(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_1368(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_1368(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1368(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1378( A&); +three sink_4_1378(volatile A&); +seven sink_4_1378(volatile A&&); +eight sink_4_1378(const volatile A&&); + +int test4_1378() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1378(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1378(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_1378(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_1378(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1378(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_1378(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1456( A&); +four sink_4_1456(const volatile A&); +five sink_4_1456( A&&); +six sink_4_1456(const A&&); + +int test4_1456() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1456(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1456(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1456(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1456(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1456(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1456(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_4_1457( A&); +four sink_4_1457(const volatile A&); +five sink_4_1457( A&&); +seven sink_4_1457(volatile A&&); + +int test4_1457() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1457(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1457(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1457(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1457(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1457(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1457(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1458( A&); +four sink_4_1458(const volatile A&); +five sink_4_1458( A&&); +eight sink_4_1458(const volatile A&&); + +int test4_1458() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1458(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1458(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1458(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1458(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1458(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1458(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1458(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1458(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1467( A&); +four sink_4_1467(const volatile A&); +six sink_4_1467(const A&&); +seven sink_4_1467(volatile A&&); + +int test4_1467() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1467(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1467(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1467(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1467(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1467(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_1467(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1468( A&); +four sink_4_1468(const volatile A&); +six sink_4_1468(const A&&); +eight sink_4_1468(const volatile A&&); + +int test4_1468() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1468(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1468(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1468(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1468(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1468(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_1468(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_1468(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1468(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1478( A&); +four sink_4_1478(const volatile A&); +seven sink_4_1478(volatile A&&); +eight sink_4_1478(const volatile A&&); + +int test4_1478() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1478(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1478(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_1478(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_1478(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_1478(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_1478(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1478(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_1478(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1567( A&); +five sink_4_1567( A&&); +six sink_4_1567(const A&&); +seven sink_4_1567(volatile A&&); + +int test4_1567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1567(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_1567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_4_1568( A&); +five sink_4_1568( A&&); +six sink_4_1568(const A&&); +eight sink_4_1568(const volatile A&&); + +int test4_1568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1568(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_1568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_1568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1578( A&); +five sink_4_1578( A&&); +seven sink_4_1578(volatile A&&); +eight sink_4_1578(const volatile A&&); + +int test4_1578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1578(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_1578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_1578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_1578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_4_1678( A&); +six sink_4_1678(const A&&); +seven sink_4_1678(volatile A&&); +eight sink_4_1678(const volatile A&&); + +int test4_1678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_1678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_4_1678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_1678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_1678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2345(const A&); +three sink_4_2345(volatile A&); +four sink_4_2345(const volatile A&); +five sink_4_2345( A&&); + +int test4_2345() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2345(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2345(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2345(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2345(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2345(c_source())) == 2 * sizeof(long)> t6; + return 0; +} + +two sink_4_2346(const A&); +three sink_4_2346(volatile A&); +four sink_4_2346(const volatile A&); +six sink_4_2346(const A&&); + +int test4_2346() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2346(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2346(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2346(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2346(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_2346(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +two sink_4_2347(const A&); +three sink_4_2347(volatile A&); +four sink_4_2347(const volatile A&); +seven sink_4_2347(volatile A&&); + +int test4_2347() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2347(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2347(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2347(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2347(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_2347(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_4_2347(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_4_2348(const A&); +three sink_4_2348(volatile A&); +four sink_4_2348(const volatile A&); +eight sink_4_2348(const volatile A&&); + +int test4_2348() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2348(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2348(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2348(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2348(source())) == 8 * sizeof(long)> t5; + sa<sizeof(sink_4_2348(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_2348(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_2348(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2356(const A&); +three sink_4_2356(volatile A&); +five sink_4_2356( A&&); +six sink_4_2356(const A&&); + +int test4_2356() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2356(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2356(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2356(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2356(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +two sink_4_2357(const A&); +three sink_4_2357(volatile A&); +five sink_4_2357( A&&); +seven sink_4_2357(volatile A&&); + +int test4_2357() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2357(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2357(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2357(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2357(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_4_2357(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_4_2358(const A&); +three sink_4_2358(volatile A&); +five sink_4_2358( A&&); +eight sink_4_2358(const volatile A&&); + +int test4_2358() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2358(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2358(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2358(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2358(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_2358(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_2358(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2367(const A&); +three sink_4_2367(volatile A&); +six sink_4_2367(const A&&); +seven sink_4_2367(volatile A&&); + +int test4_2367() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2367(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2367(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2367(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_2367(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_4_2368(const A&); +three sink_4_2368(volatile A&); +six sink_4_2368(const A&&); +eight sink_4_2368(const volatile A&&); + +int test4_2368() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2368(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2368(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2368(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_2368(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_2368(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_2368(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2378(const A&); +three sink_4_2378(volatile A&); +seven sink_4_2378(volatile A&&); +eight sink_4_2378(const volatile A&&); + +int test4_2378() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2378(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2378(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_2378(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_2378(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_2378(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_2378(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2456(const A&); +four sink_4_2456(const volatile A&); +five sink_4_2456( A&&); +six sink_4_2456(const A&&); + +int test4_2456() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2456(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2456(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2456(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_2456(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2456(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2456(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +two sink_4_2457(const A&); +four sink_4_2457(const volatile A&); +five sink_4_2457( A&&); +seven sink_4_2457(volatile A&&); + +int test4_2457() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2457(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2457(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2457(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_2457(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2457(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2457(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_4_2457(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_4_2458(const A&); +four sink_4_2458(const volatile A&); +five sink_4_2458( A&&); +eight sink_4_2458(const volatile A&&); + +int test4_2458() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2458(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2458(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2458(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_2458(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2458(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2458(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_2458(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_2458(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2467(const A&); +four sink_4_2467(const volatile A&); +six sink_4_2467(const A&&); +seven sink_4_2467(volatile A&&); + +int test4_2467() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2467(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2467(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2467(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_2467(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2467(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_2467(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_4_2468(const A&); +four sink_4_2468(const volatile A&); +six sink_4_2468(const A&&); +eight sink_4_2468(const volatile A&&); + +int test4_2468() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2468(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2468(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2468(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_2468(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2468(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_2468(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_2468(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_2468(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2478(const A&); +four sink_4_2478(const volatile A&); +seven sink_4_2478(volatile A&&); +eight sink_4_2478(const volatile A&&); + +int test4_2478() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2478(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2478(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2478(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_2478(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_2478(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_2478(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_2478(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_2478(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2567(const A&); +five sink_4_2567( A&&); +six sink_4_2567(const A&&); +seven sink_4_2567(volatile A&&); + +int test4_2567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2567(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2567(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_2567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_4_2568(const A&); +five sink_4_2568( A&&); +six sink_4_2568(const A&&); +eight sink_4_2568(const volatile A&&); + +int test4_2568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2568(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2568(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_2568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_2568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2578(const A&); +five sink_4_2578( A&&); +seven sink_4_2578(volatile A&&); +eight sink_4_2578(const volatile A&&); + +int test4_2578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2578(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2578(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_2578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_2578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_2578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_4_2678(const A&); +six sink_4_2678(const A&&); +seven sink_4_2678(volatile A&&); +eight sink_4_2678(const volatile A&&); + +int test4_2678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_2678(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_4_2678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_4_2678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_2678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_2678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_4_3456(volatile A&); +four sink_4_3456(const volatile A&); +five sink_4_3456( A&&); +six sink_4_3456(const A&&); + +int test4_3456() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3456(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3456(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_3456(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3456(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_3456(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_3456(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +three sink_4_3457(volatile A&); +four sink_4_3457(const volatile A&); +five sink_4_3457( A&&); +seven sink_4_3457(volatile A&&); + +int test4_3457() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3457(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3457(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_3457(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3457(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_3457(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_3457(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +three sink_4_3458(volatile A&); +four sink_4_3458(const volatile A&); +five sink_4_3458( A&&); +eight sink_4_3458(const volatile A&&); + +int test4_3458() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3458(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3458(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_3458(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3458(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_3458(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_3458(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_3458(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_3458(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_4_3467(volatile A&); +four sink_4_3467(const volatile A&); +six sink_4_3467(const A&&); +seven sink_4_3467(volatile A&&); + +int test4_3467() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3467(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3467(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_3467(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3467(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_3467(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_3467(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +three sink_4_3468(volatile A&); +four sink_4_3468(const volatile A&); +six sink_4_3468(const A&&); +eight sink_4_3468(const volatile A&&); + +int test4_3468() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3468(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3468(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_3468(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3468(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_3468(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_4_3468(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_3468(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_3468(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_4_3478(volatile A&); +four sink_4_3478(const volatile A&); +seven sink_4_3478(volatile A&&); +eight sink_4_3478(const volatile A&&); + +int test4_3478() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3478(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3478(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_3478(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3478(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_3478(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_4_3478(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_3478(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_3478(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_4_3567(volatile A&); +five sink_4_3567( A&&); +six sink_4_3567(const A&&); +seven sink_4_3567(volatile A&&); + +int test4_3567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3567(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3567(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_3567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_3567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +three sink_4_3568(volatile A&); +five sink_4_3568( A&&); +six sink_4_3568(const A&&); +eight sink_4_3568(const volatile A&&); + +int test4_3568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3568(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3568(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_3568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_3568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_3568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_4_3578(volatile A&); +five sink_4_3578( A&&); +seven sink_4_3578(volatile A&&); +eight sink_4_3578(const volatile A&&); + +int test4_3578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3578(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3578(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_3578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_3578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_3578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_4_3678(volatile A&); +six sink_4_3678(const A&&); +seven sink_4_3678(volatile A&&); +eight sink_4_3678(const volatile A&&); + +int test4_3678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_3678(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_4_3678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_4_3678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_3678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_3678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +four sink_4_4567(const volatile A&); +five sink_4_4567( A&&); +six sink_4_4567(const A&&); +seven sink_4_4567(volatile A&&); + +int test4_4567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_4567(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_4_4567(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_4567(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_4567(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_4567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_4567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_4567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +four sink_4_4568(const volatile A&); +five sink_4_4568( A&&); +six sink_4_4568(const A&&); +eight sink_4_4568(const volatile A&&); + +int test4_4568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_4568(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_4_4568(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_4568(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_4568(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_4568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_4568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_4568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_4_4568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +four sink_4_4578(const volatile A&); +five sink_4_4578( A&&); +seven sink_4_4578(volatile A&&); +eight sink_4_4578(const volatile A&&); + +int test4_4578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_4578(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_4_4578(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_4578(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_4578(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_4578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_4578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_4_4578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_4578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +four sink_4_4678(const volatile A&); +six sink_4_4678(const A&&); +seven sink_4_4678(volatile A&&); +eight sink_4_4678(const volatile A&&); + +int test4_4678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_4678(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_4_4678(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_4_4678(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_4_4678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_4_4678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_4678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_4678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +five sink_4_5678( A&&); +six sink_4_5678(const A&&); +seven sink_4_5678(volatile A&&); +eight sink_4_5678(const volatile A&&); + +int test4_5678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_4_5678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_4_5678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_4_5678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_4_5678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +int main() +{ + return test4_1234() + test4_1235() + test4_1236() + test4_1237() + test4_1238() + + test4_1245() + test4_1246() + test4_1247() + test4_1248() + test4_1256() + + test4_1257() + test4_1258() + test4_1267() + test4_1268() + test4_1278() + + test4_1345() + test4_1346() + test4_1347() + test4_1348() + test4_1356() + + test4_1357() + test4_1358() + test4_1367() + test4_1368() + test4_1378() + + test4_1456() + test4_1457() + test4_1458() + test4_1467() + test4_1468() + + test4_1478() + test4_1567() + test4_1568() + test4_1578() + test4_1678() + + test4_2345() + test4_2346() + test4_2347() + test4_2348() + test4_2356() + + test4_2357() + test4_2358() + test4_2367() + test4_2368() + test4_2378() + + test4_2456() + test4_2457() + test4_2458() + test4_2467() + test4_2468() + + test4_2478() + test4_2567() + test4_2568() + test4_2578() + test4_2678() + + test4_3456() + test4_3457() + test4_3458() + test4_3467() + test4_3468() + + test4_3478() + test4_3567() + test4_3568() + test4_3578() + test4_3678() + + test4_4567() + test4_4568() + test4_4578() + test4_4678() + test4_5678(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv5n.C b/gcc/testsuite/g++.dg/cpp0x/rv5n.C new file mode 100644 index 000000000..660a68986 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv5n.C @@ -0,0 +1,806 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; +struct three {char x[3];}; +struct four {char x[4];}; +struct five {char x[5];}; +struct six {char x[6];}; +struct seven {char x[7];}; +struct eight {char x[8];}; + +struct A +{ + A(); + A(const volatile A&&); // { dg-error "argument 1" } +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 5 at a time + +one sink_5_12345( A&); // { dg-message "one sink_5_12345|no known conversion" } +two sink_5_12345(const A&); // { dg-message "note" } +three sink_5_12345(volatile A&); // { dg-message "note" } +four sink_5_12345(const volatile A&); // { dg-message "note" } +five sink_5_12345( A&&); // { dg-message "note" } + +int test5_12345() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_12345(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 45 } + sink_5_12345(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 47 } + return 0; +} + +one sink_5_12346( A&); // { dg-message "one sink_5_12346|no known conversion" } +two sink_5_12346(const A&); // { dg-message "note" } +three sink_5_12346(volatile A&); // { dg-message "note" } +four sink_5_12346(const volatile A&); // { dg-message "note" } +six sink_5_12346(const A&&); // { dg-message "note" } + +int test5_12346() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_12346(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 64 } + sink_5_12346(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 66 } + return 0; +} + +one sink_5_12347( A&); // { dg-message "one sink_5_12347|no known conversion" } +two sink_5_12347(const A&); // { dg-message "note" } +three sink_5_12347(volatile A&); // { dg-message "note" } +four sink_5_12347(const volatile A&); // { dg-message "note" } +seven sink_5_12347(volatile A&&); // { dg-message "note" } + +int test5_12347() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_12347(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 83 } + return 0; +} + +one sink_5_12356( A&); // { dg-message "one sink_5_12356|no known conversion" } +two sink_5_12356(const A&); // { dg-message "note" } +three sink_5_12356(volatile A&); // { dg-message "note" } +five sink_5_12356( A&&); // { dg-message "note" } +six sink_5_12356(const A&&); // { dg-message "note" } + +int test5_12356() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_12356(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 100 } + sink_5_12356(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 102 } + sink_5_12356(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 104 } + return 0; +} + +one sink_5_12357( A&); // { dg-message "one sink_5_12357|no known conversion" } +two sink_5_12357(const A&); // { dg-message "note" } +three sink_5_12357(volatile A&); // { dg-message "note" } +five sink_5_12357( A&&); // { dg-message "note" } +seven sink_5_12357(volatile A&&); // { dg-message "note" } + +int test5_12357() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_12357(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 121 } + sink_5_12357(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 123 } + return 0; +} + +one sink_5_12358( A&); +two sink_5_12358(const A&); +three sink_5_12358(volatile A&); +five sink_5_12358( A&&); +eight sink_5_12358(const volatile A&&); // { dg-message "" } + +int test5_12358() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_12358(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_5_12367( A&); // { dg-message "one sink_5_12367|no known conversion" } +two sink_5_12367(const A&); // { dg-message "note" } +three sink_5_12367(volatile A&); // { dg-message "note" } +six sink_5_12367(const A&&); // { dg-message "note" } +seven sink_5_12367(volatile A&&); // { dg-message "note" } + +int test5_12367() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_12367(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 156 } + sink_5_12367(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 158 } + sink_5_12367(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 160 } + return 0; +} + +one sink_5_12368( A&); +two sink_5_12368(const A&); +three sink_5_12368(volatile A&); +six sink_5_12368(const A&&); +eight sink_5_12368(const volatile A&&); // { dg-message "" } + +int test5_12368() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_12368(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_5_12378( A&); +two sink_5_12378(const A&); +three sink_5_12378(volatile A&); +seven sink_5_12378(volatile A&&); +eight sink_5_12378(const volatile A&&); // { dg-message "" } + +int test5_12378() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_12378(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_5_12456( A&); // { dg-message "one sink_5_12456|no known conversion" } +two sink_5_12456(const A&); // { dg-message "note" } +four sink_5_12456(const volatile A&); // { dg-message "note" } +five sink_5_12456( A&&); // { dg-message "note" } +six sink_5_12456(const A&&); // { dg-message "note" } + +int test5_12456() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_12456(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 209 } + sink_5_12456(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 211 } + return 0; +} + +one sink_5_12457( A&); // { dg-message "one sink_5_12457|no known conversion" } +two sink_5_12457(const A&); // { dg-message "note" } +four sink_5_12457(const volatile A&); // { dg-message "note" } +five sink_5_12457( A&&); // { dg-message "note" } +seven sink_5_12457(volatile A&&); // { dg-message "note" } + +int test5_12457() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_12457(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 228 } + return 0; +} + +one sink_5_12467( A&); // { dg-message "one sink_5_12467|no known conversion" } +two sink_5_12467(const A&); // { dg-message "note" } +four sink_5_12467(const volatile A&); // { dg-message "note" } +six sink_5_12467(const A&&); // { dg-message "note" } +seven sink_5_12467(volatile A&&); // { dg-message "note" } + +int test5_12467() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_12467(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 245 } + sink_5_12467(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 247 } + return 0; +} + +one sink_5_12567( A&); // { dg-message "one sink_5_12567|no known conversion" } +two sink_5_12567(const A&); // { dg-message "note" } +five sink_5_12567( A&&); // { dg-message "note" } +six sink_5_12567(const A&&); // { dg-message "note" } +seven sink_5_12567(volatile A&&); // { dg-message "" } + +int test5_12567() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_12567(va); // { dg-error "lvalue" } + sink_5_12567(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 265 } + sink_5_12567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 267 } + return 0; +} + +one sink_5_12568( A&); +two sink_5_12568(const A&); +five sink_5_12568( A&&); +six sink_5_12568(const A&&); +eight sink_5_12568(const volatile A&&); // { dg-message "" } + +int test5_12568() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_12568(va); // { dg-error "lvalue" } + sink_5_12568(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_5_12578( A&); +two sink_5_12578(const A&); +five sink_5_12578( A&&); +seven sink_5_12578(volatile A&&); // { dg-message "" } +eight sink_5_12578(const volatile A&&); // { dg-message "" } + +int test5_12578() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_12578(va); // { dg-error "lvalue" } + sink_5_12578(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_5_12678( A&); +two sink_5_12678(const A&); // { dg-message "note" } +six sink_5_12678(const A&&); // { dg-message "note" } +seven sink_5_12678(volatile A&&); // { dg-message "" } +eight sink_5_12678(const volatile A&&); // { dg-message "" } + +int test5_12678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_12678(va); // { dg-error "lvalue" } + sink_5_12678(cva); // { dg-error "lvalue" } + sink_5_12678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 320 } + return 0; +} + +one sink_5_13456( A&); // { dg-message "one sink_5_13456|no known conversion" } +three sink_5_13456(volatile A&); // { dg-message "note" } +four sink_5_13456(const volatile A&); // { dg-message "note" } +five sink_5_13456( A&&); // { dg-message "note" } +six sink_5_13456(const A&&); // { dg-message "note" } + +int test5_13456() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_13456(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 337 } + sink_5_13456(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 339 } + return 0; +} + +one sink_5_13457( A&); // { dg-message "one sink_5_13457|no known conversion" } +three sink_5_13457(volatile A&); // { dg-message "note" } +four sink_5_13457(const volatile A&); // { dg-message "note" } +five sink_5_13457( A&&); // { dg-message "note" } +seven sink_5_13457(volatile A&&); // { dg-message "note" } + +int test5_13457() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_13457(c_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 356 } + sink_5_13457(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 358 } + return 0; +} + +one sink_5_13467( A&); // { dg-message "one sink_5_13467|no known conversion" } +three sink_5_13467(volatile A&); // { dg-message "note" } +four sink_5_13467(const volatile A&); // { dg-message "note" } +six sink_5_13467(const A&&); // { dg-message "note" } +seven sink_5_13467(volatile A&&); // { dg-message "note" } + +int test5_13467() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_13467(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 375 } + sink_5_13467(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 377 } + return 0; +} + +one sink_5_13567( A&); // { dg-message "one sink_5_13567|no known conversion" } +three sink_5_13567(volatile A&); // { dg-message "note" } +five sink_5_13567( A&&); // { dg-message "note" } +six sink_5_13567(const A&&); // { dg-message "" } +seven sink_5_13567(volatile A&&); // { dg-message "note" } + +int test5_13567() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_13567(ca); // { dg-error "lvalue" } + sink_5_13567(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 395 } + sink_5_13567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 397 } + return 0; +} + +one sink_5_13568( A&); +three sink_5_13568(volatile A&); +five sink_5_13568( A&&); +six sink_5_13568(const A&&); // { dg-message "" } +eight sink_5_13568(const volatile A&&); // { dg-message "" } + +int test5_13568() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_13568(ca); // { dg-error "lvalue" } + sink_5_13568(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_5_13578( A&); +three sink_5_13578(volatile A&); +five sink_5_13578( A&&); +seven sink_5_13578(volatile A&&); +eight sink_5_13578(const volatile A&&); // { dg-message "" } + +int test5_13578() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_13578(ca); // { dg-error "lvalue" } + sink_5_13578(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_5_13678( A&); +three sink_5_13678(volatile A&); +six sink_5_13678(const A&&); // { dg-message "" } +seven sink_5_13678(volatile A&&); // { dg-message "note" } +eight sink_5_13678(const volatile A&&); // { dg-message "" } + +int test5_13678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_13678(ca); // { dg-error "lvalue" } + sink_5_13678(cva); // { dg-error "lvalue" } + sink_5_13678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 450 } + return 0; +} + +one sink_5_14567( A&); // { dg-message "one sink_5_14567|no known conversion" } +four sink_5_14567(const volatile A&); // { dg-message "note" } +five sink_5_14567( A&&); // { dg-message "note" } +six sink_5_14567(const A&&); // { dg-message "note" } +seven sink_5_14567(volatile A&&); // { dg-message "note" } + +int test5_14567() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_14567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 467 } + return 0; +} + +one sink_5_14678( A&); +four sink_5_14678(const volatile A&); +six sink_5_14678(const A&&); // { dg-message "note" } +seven sink_5_14678(volatile A&&); // { dg-message "note" } +eight sink_5_14678(const volatile A&&); // { dg-message "note" } + +int test5_14678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_14678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 484 } + return 0; +} + +one sink_5_15678( A&); +five sink_5_15678( A&&); +six sink_5_15678(const A&&); // { dg-message "" } +seven sink_5_15678(volatile A&&); // { dg-message "" } +eight sink_5_15678(const volatile A&&); // { dg-message "" } + +int test5_15678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_15678(ca); // { dg-error "lvalue" } + sink_5_15678(va); // { dg-error "lvalue" } + sink_5_15678(cva); // { dg-error "lvalue" } + return 0; +} + +two sink_5_23456(const A&); // { dg-message "two sink_5_23456|no known conversion" } +three sink_5_23456(volatile A&); // { dg-message "note" } +four sink_5_23456(const volatile A&); // { dg-message "note" } +five sink_5_23456( A&&); // { dg-message "note" } +six sink_5_23456(const A&&); // { dg-message "note" } + +int test5_23456() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_23456(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 519 } + sink_5_23456(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 521 } + sink_5_23456(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 523 } + return 0; +} + +two sink_5_23457(const A&); // { dg-message "two sink_5_23457|no known conversion" } +three sink_5_23457(volatile A&); // { dg-message "note" } +four sink_5_23457(const volatile A&); // { dg-message "note" } +five sink_5_23457( A&&); // { dg-message "note" } +seven sink_5_23457(volatile A&&); // { dg-message "note" } + +int test5_23457() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_23457(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 540 } + sink_5_23457(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 542 } + return 0; +} + +two sink_5_23458(const A&); // { dg-message "note" } +three sink_5_23458(volatile A&); // { dg-message "note" } +four sink_5_23458(const volatile A&); // { dg-message "note" } +five sink_5_23458( A&&); // { dg-message "note" } +eight sink_5_23458(const volatile A&&); // { dg-message "note" } + +int test5_23458() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_23458(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 559 } + return 0; +} + +two sink_5_23467(const A&); // { dg-message "two sink_5_23467|no known conversion" } +three sink_5_23467(volatile A&); // { dg-message "note" } +four sink_5_23467(const volatile A&); // { dg-message "note" } +six sink_5_23467(const A&&); // { dg-message "note" } +seven sink_5_23467(volatile A&&); // { dg-message "note" } + +int test5_23467() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_23467(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 576 } + sink_5_23467(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 578 } + sink_5_23467(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 580 } + return 0; +} + +two sink_5_23468(const A&); // { dg-message "note" } +three sink_5_23468(volatile A&); // { dg-message "note" } +four sink_5_23468(const volatile A&); // { dg-message "note" } +six sink_5_23468(const A&&); // { dg-message "note" } +eight sink_5_23468(const volatile A&&); // { dg-message "note" } + +int test5_23468() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_23468(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 597 } + return 0; +} + +two sink_5_23478(const A&); // { dg-message "note" } +three sink_5_23478(volatile A&); // { dg-message "note" } +four sink_5_23478(const volatile A&); // { dg-message "note" } +seven sink_5_23478(volatile A&&); // { dg-message "note" } +eight sink_5_23478(const volatile A&&); // { dg-message "note" } + +int test5_23478() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_23478(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 614 } + return 0; +} + +two sink_5_23567(const A&); // { dg-message "two sink_5_23567|no known conversion" } +three sink_5_23567(volatile A&); // { dg-message "note" } +five sink_5_23567( A&&); // { dg-message "note" } +six sink_5_23567(const A&&); // { dg-message "note" } +seven sink_5_23567(volatile A&&); // { dg-message "note" } + +int test5_23567() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_23567(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 631 } + sink_5_23567(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 633 } + sink_5_23567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 635 } + return 0; +} + +two sink_5_23568(const A&); // { dg-message "note" } +three sink_5_23568(volatile A&); // { dg-message "note" } +five sink_5_23568( A&&); // { dg-message "note" } +six sink_5_23568(const A&&); // { dg-message "note" } +eight sink_5_23568(const volatile A&&); // { dg-message "" } + +int test5_23568() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_23568(cva); // { dg-error "lvalue" } + sink_5_23568(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 653 } + return 0; +} + +two sink_5_23578(const A&); // { dg-message "note" } +three sink_5_23578(volatile A&); // { dg-message "note" } +five sink_5_23578( A&&); // { dg-message "note" } +seven sink_5_23578(volatile A&&); // { dg-message "note" } +eight sink_5_23578(const volatile A&&); // { dg-message "" } + +int test5_23578() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_23578(cva); // { dg-error "lvalue" } + sink_5_23578(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 671 } + return 0; +} + +two sink_5_23678(const A&); // { dg-message "note" } +three sink_5_23678(volatile A&); // { dg-message "note" } +six sink_5_23678(const A&&); // { dg-message "note" } +seven sink_5_23678(volatile A&&); // { dg-message "note" } +eight sink_5_23678(const volatile A&&); // { dg-message "" } + +int test5_23678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_23678(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 688 } + sink_5_23678(cva); // { dg-error "lvalue" } + sink_5_23678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 691 } + return 0; +} + +two sink_5_24567(const A&); // { dg-message "two sink_5_24567|no known conversion" } +four sink_5_24567(const volatile A&); // { dg-message "note" } +five sink_5_24567( A&&); // { dg-message "note" } +six sink_5_24567(const A&&); // { dg-message "note" } +seven sink_5_24567(volatile A&&); // { dg-message "note" } + +int test5_24567() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_24567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 708 } + return 0; +} + +two sink_5_24678(const A&); // { dg-message "note" } +four sink_5_24678(const volatile A&); +six sink_5_24678(const A&&); // { dg-message "note" } +seven sink_5_24678(volatile A&&); // { dg-message "note" } +eight sink_5_24678(const volatile A&&); // { dg-message "note" } + +int test5_24678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_24678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 725 } + return 0; +} + +two sink_5_25678(const A&); +five sink_5_25678( A&&); +six sink_5_25678(const A&&); +seven sink_5_25678(volatile A&&); // { dg-message "" } +eight sink_5_25678(const volatile A&&); // { dg-message "" } + +int test5_25678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_25678(va); // { dg-error "lvalue" } + sink_5_25678(cva); // { dg-error "lvalue" } + return 0; +} + +three sink_5_34567(volatile A&); // { dg-message "three sink_5_34567|no known conversion" } +four sink_5_34567(const volatile A&); // { dg-message "note" } +five sink_5_34567( A&&); // { dg-message "note" } +six sink_5_34567(const A&&); // { dg-message "note" } +seven sink_5_34567(volatile A&&); // { dg-message "note" } + +int test5_34567() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_34567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 759 } + return 0; +} + +three sink_5_34678(volatile A&); +four sink_5_34678(const volatile A&); +six sink_5_34678(const A&&); // { dg-message "note" } +seven sink_5_34678(volatile A&&); // { dg-message "note" } +eight sink_5_34678(const volatile A&&); // { dg-message "note" } + +int test5_34678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_34678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 776 } + return 0; +} + +three sink_5_35678(volatile A&); +five sink_5_35678( A&&); +six sink_5_35678(const A&&); // { dg-message "" } +seven sink_5_35678(volatile A&&); +eight sink_5_35678(const volatile A&&); // { dg-message "" } + +int test5_35678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_5_35678(ca); // { dg-error "lvalue" } + sink_5_35678(cva); // { dg-error "lvalue" } + return 0; +} + +int main() +{ + return test5_12356() + test5_12357() + test5_12367() + test5_12467() + + test5_12567() + test5_12678() + test5_13467() + test5_13567() + + test5_13678() + test5_13678() + test5_23456() + test5_23457() + + test5_23458() + test5_23467() + test5_23468() + test5_23478() + + test5_23567() + test5_23568() + test5_23578() + test5_23678() + + test5_24678() + test5_34678(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv5p.C b/gcc/testsuite/g++.dg/cpp0x/rv5p.C new file mode 100644 index 000000000..b8ab54588 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv5p.C @@ -0,0 +1,1256 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; +struct three {long x[3];}; +struct four {long x[4];}; +struct five {long x[5];}; +struct six {long x[6];}; +struct seven {long x[7];}; +struct eight {long x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 5 at a time + +one sink_5_12345( A&); +two sink_5_12345(const A&); +three sink_5_12345(volatile A&); +four sink_5_12345(const volatile A&); +five sink_5_12345( A&&); + +int test5_12345() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12345(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12345(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12345(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12345(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12345(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12345(c_source())) == 2* sizeof(long)> t6; + return 0; +} + +one sink_5_12346( A&); +two sink_5_12346(const A&); +three sink_5_12346(volatile A&); +four sink_5_12346(const volatile A&); +six sink_5_12346(const A&&); + +int test5_12346() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12346(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12346(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12346(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12346(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12346(source())) == 6* sizeof(long)> t5; + sa<sizeof(sink_5_12346(c_source())) == 6* sizeof(long)> t6; + return 0; +} + +one sink_5_12347( A&); +two sink_5_12347(const A&); +three sink_5_12347(volatile A&); +four sink_5_12347(const volatile A&); +seven sink_5_12347(volatile A&&); + +int test5_12347() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12347(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12347(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12347(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12347(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12347(source())) == 7* sizeof(long)> t5; + sa<sizeof(sink_5_12347(c_source())) == 2* sizeof(long)> t6; + sa<sizeof(sink_5_12347(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_12348( A&); +two sink_5_12348(const A&); +three sink_5_12348(volatile A&); +four sink_5_12348(const volatile A&); +eight sink_5_12348(const volatile A&&); + +int test5_12348() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12348(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12348(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12348(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12348(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12348(source())) == 8* sizeof(long)> t5; + sa<sizeof(sink_5_12348(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_12348(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_12348(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_12356( A&); +two sink_5_12356(const A&); +three sink_5_12356(volatile A&); +five sink_5_12356( A&&); +six sink_5_12356(const A&&); + +int test5_12356() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12356(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12356(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12356(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12356(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12356(c_source())) == 6* sizeof(long)> t6; + return 0; +} + +one sink_5_12357( A&); +two sink_5_12357(const A&); +three sink_5_12357(volatile A&); +five sink_5_12357( A&&); +seven sink_5_12357(volatile A&&); + +int test5_12357() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12357(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12357(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12357(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12357(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12357(c_source())) == 2* sizeof(long)> t6; + sa<sizeof(sink_5_12357(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_12358( A&); +two sink_5_12358(const A&); +three sink_5_12358(volatile A&); +five sink_5_12358( A&&); +eight sink_5_12358(const volatile A&&); + +int test5_12358() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12358(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12358(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12358(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12358(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12358(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_12358(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_12358(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_12367( A&); +two sink_5_12367(const A&); +three sink_5_12367(volatile A&); +six sink_5_12367(const A&&); +seven sink_5_12367(volatile A&&); + +int test5_12367() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12367(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12367(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12367(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12367(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_12367(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_12368( A&); +two sink_5_12368(const A&); +three sink_5_12368(volatile A&); +six sink_5_12368(const A&&); +eight sink_5_12368(const volatile A&&); + +int test5_12368() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12368(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12368(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12368(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12368(source())) == 6* sizeof(long)> t5; + sa<sizeof(sink_5_12368(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_12368(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_12368(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_12378( A&); +two sink_5_12378(const A&); +three sink_5_12378(volatile A&); +seven sink_5_12378(volatile A&&); +eight sink_5_12378(const volatile A&&); + +int test5_12378() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12378(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12378(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12378(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_12378(source())) == 7* sizeof(long)> t5; + sa<sizeof(sink_5_12378(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_12378(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_12378(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_12456( A&); +two sink_5_12456(const A&); +four sink_5_12456(const volatile A&); +five sink_5_12456( A&&); +six sink_5_12456(const A&&); + +int test5_12456() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12456(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12456(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12456(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_12456(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12456(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12456(c_source())) == 6* sizeof(long)> t6; + return 0; +} + +one sink_5_12457( A&); +two sink_5_12457(const A&); +four sink_5_12457(const volatile A&); +five sink_5_12457( A&&); +seven sink_5_12457(volatile A&&); + +int test5_12457() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12457(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12457(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12457(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_12457(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12457(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12457(c_source())) == 2* sizeof(long)> t6; + sa<sizeof(sink_5_12457(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_12458( A&); +two sink_5_12458(const A&); +four sink_5_12458(const volatile A&); +five sink_5_12458( A&&); +eight sink_5_12458(const volatile A&&); + +int test5_12458() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12458(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12458(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12458(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_12458(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12458(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12458(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_12458(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_12458(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_12467( A&); +two sink_5_12467(const A&); +four sink_5_12467(const volatile A&); +six sink_5_12467(const A&&); +seven sink_5_12467(volatile A&&); + +int test5_12467() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12467(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12467(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12467(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_12467(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12467(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_12467(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_12468( A&); +two sink_5_12468(const A&); +four sink_5_12468(const volatile A&); +six sink_5_12468(const A&&); +eight sink_5_12468(const volatile A&&); + +int test5_12468() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12468(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12468(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12468(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_12468(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12468(source())) == 6* sizeof(long)> t5; + sa<sizeof(sink_5_12468(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_12468(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_12468(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_12478( A&); +two sink_5_12478(const A&); +four sink_5_12478(const volatile A&); +seven sink_5_12478(volatile A&&); +eight sink_5_12478(const volatile A&&); + +int test5_12478() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12478(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12478(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12478(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_12478(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_12478(source())) == 7* sizeof(long)> t5; + sa<sizeof(sink_5_12478(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_12478(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_12478(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_12567( A&); +two sink_5_12567(const A&); +five sink_5_12567( A&&); +six sink_5_12567(const A&&); +seven sink_5_12567(volatile A&&); + +int test5_12567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12567(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12567(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12567(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12567(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_12567(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_12568( A&); +two sink_5_12568(const A&); +five sink_5_12568( A&&); +six sink_5_12568(const A&&); +eight sink_5_12568(const volatile A&&); + +int test5_12568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12568(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12568(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12568(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12568(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_12568(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_12568(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_12578( A&); +two sink_5_12578(const A&); +five sink_5_12578( A&&); +seven sink_5_12578(volatile A&&); +eight sink_5_12578(const volatile A&&); + +int test5_12578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12578(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12578(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12578(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_12578(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_12578(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_12578(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_12678( A&); +two sink_5_12678(const A&); +six sink_5_12678(const A&&); +seven sink_5_12678(volatile A&&); +eight sink_5_12678(const volatile A&&); + +int test5_12678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_12678(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_12678(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_12678(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_12678(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_12678(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_13456( A&); +three sink_5_13456(volatile A&); +four sink_5_13456(const volatile A&); +five sink_5_13456( A&&); +six sink_5_13456(const A&&); + +int test5_13456() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13456(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13456(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_13456(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13456(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_13456(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_13456(c_source())) == 6* sizeof(long)> t6; + return 0; +} + +one sink_5_13457( A&); +three sink_5_13457(volatile A&); +four sink_5_13457(const volatile A&); +five sink_5_13457( A&&); +seven sink_5_13457(volatile A&&); + +int test5_13457() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13457(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13457(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_13457(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13457(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_13457(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_13457(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_13458( A&); +three sink_5_13458(volatile A&); +four sink_5_13458(const volatile A&); +five sink_5_13458( A&&); +eight sink_5_13458(const volatile A&&); + +int test5_13458() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13458(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13458(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_13458(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13458(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_13458(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_13458(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_13458(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_13458(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_13467( A&); +three sink_5_13467(volatile A&); +four sink_5_13467(const volatile A&); +six sink_5_13467(const A&&); +seven sink_5_13467(volatile A&&); + +int test5_13467() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13467(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13467(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_13467(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13467(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_13467(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_13467(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_13468( A&); +three sink_5_13468(volatile A&); +four sink_5_13468(const volatile A&); +six sink_5_13468(const A&&); +eight sink_5_13468(const volatile A&&); + +int test5_13468() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13468(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13468(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_13468(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13468(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_13468(source())) == 6* sizeof(long)> t5; + sa<sizeof(sink_5_13468(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_13468(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_13468(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_13478( A&); +three sink_5_13478(volatile A&); +four sink_5_13478(const volatile A&); +seven sink_5_13478(volatile A&&); +eight sink_5_13478(const volatile A&&); + +int test5_13478() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13478(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13478(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_13478(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13478(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_13478(source())) == 7* sizeof(long)> t5; + sa<sizeof(sink_5_13478(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_13478(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_13478(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_13567( A&); +three sink_5_13567(volatile A&); +five sink_5_13567( A&&); +six sink_5_13567(const A&&); +seven sink_5_13567(volatile A&&); + +int test5_13567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13567(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13567(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13567(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_13567(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_13567(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_13568( A&); +three sink_5_13568(volatile A&); +five sink_5_13568( A&&); +six sink_5_13568(const A&&); +eight sink_5_13568(const volatile A&&); + +int test5_13568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13568(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13568(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13568(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_13568(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_13568(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_13568(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_13578( A&); +three sink_5_13578(volatile A&); +five sink_5_13578( A&&); +seven sink_5_13578(volatile A&&); +eight sink_5_13578(const volatile A&&); + +int test5_13578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13578(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13578(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13578(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_13578(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_13578(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_13578(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_13678( A&); +three sink_5_13678(volatile A&); +six sink_5_13678(const A&&); +seven sink_5_13678(volatile A&&); +eight sink_5_13678(const volatile A&&); + +int test5_13678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_13678(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_13678(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_13678(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_13678(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_13678(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_14567( A&); +four sink_5_14567(const volatile A&); +five sink_5_14567( A&&); +six sink_5_14567(const A&&); +seven sink_5_14567(volatile A&&); + +int test5_14567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_14567(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_14567(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_14567(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_14567(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_14567(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_14567(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_14567(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +one sink_5_14568( A&); +four sink_5_14568(const volatile A&); +five sink_5_14568( A&&); +six sink_5_14568(const A&&); +eight sink_5_14568(const volatile A&&); + +int test5_14568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_14568(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_14568(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_14568(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_14568(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_14568(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_14568(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_14568(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_14568(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_14578( A&); +four sink_5_14578(const volatile A&); +five sink_5_14578( A&&); +seven sink_5_14578(volatile A&&); +eight sink_5_14578(const volatile A&&); + +int test5_14578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_14578(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_14578(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_14578(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_14578(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_14578(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_14578(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_14578(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_14578(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_14678( A&); +four sink_5_14678(const volatile A&); +six sink_5_14678(const A&&); +seven sink_5_14678(volatile A&&); +eight sink_5_14678(const volatile A&&); + +int test5_14678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_14678(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_14678(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_14678(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_14678(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_14678(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_14678(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_14678(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +one sink_5_15678( A&); +five sink_5_15678( A&&); +six sink_5_15678(const A&&); +seven sink_5_15678(volatile A&&); +eight sink_5_15678(const volatile A&&); + +int test5_15678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_15678(a)) == 1* sizeof(long)> t1; + sa<sizeof(sink_5_15678(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_15678(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_15678(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_15678(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_23456(const A&); +three sink_5_23456(volatile A&); +four sink_5_23456(const volatile A&); +five sink_5_23456( A&&); +six sink_5_23456(const A&&); + +int test5_23456() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23456(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23456(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23456(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_23456(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_23456(c_source())) == 6* sizeof(long)> t6; + return 0; +} + +two sink_5_23457(const A&); +three sink_5_23457(volatile A&); +four sink_5_23457(const volatile A&); +five sink_5_23457( A&&); +seven sink_5_23457(volatile A&&); + +int test5_23457() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23457(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23457(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23457(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_23457(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_23457(c_source())) == 2* sizeof(long)> t6; + sa<sizeof(sink_5_23457(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +two sink_5_23458(const A&); +three sink_5_23458(volatile A&); +four sink_5_23458(const volatile A&); +five sink_5_23458( A&&); +eight sink_5_23458(const volatile A&&); + +int test5_23458() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23458(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23458(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23458(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_23458(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_23458(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_23458(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_23458(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_23467(const A&); +three sink_5_23467(volatile A&); +four sink_5_23467(const volatile A&); +six sink_5_23467(const A&&); +seven sink_5_23467(volatile A&&); + +int test5_23467() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23467(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23467(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23467(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_23467(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_23467(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +two sink_5_23468(const A&); +three sink_5_23468(volatile A&); +four sink_5_23468(const volatile A&); +six sink_5_23468(const A&&); +eight sink_5_23468(const volatile A&&); + +int test5_23468() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23468(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23468(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23468(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_23468(source())) == 6* sizeof(long)> t5; + sa<sizeof(sink_5_23468(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_23468(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_23468(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_23478(const A&); +three sink_5_23478(volatile A&); +four sink_5_23478(const volatile A&); +seven sink_5_23478(volatile A&&); +eight sink_5_23478(const volatile A&&); + +int test5_23478() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23478(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23478(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23478(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_23478(source())) == 7* sizeof(long)> t5; + sa<sizeof(sink_5_23478(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_23478(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_23478(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_23567(const A&); +three sink_5_23567(volatile A&); +five sink_5_23567( A&&); +six sink_5_23567(const A&&); +seven sink_5_23567(volatile A&&); + +int test5_23567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23567(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23567(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23567(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_23567(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_23567(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +two sink_5_23568(const A&); +three sink_5_23568(volatile A&); +five sink_5_23568( A&&); +six sink_5_23568(const A&&); +eight sink_5_23568(const volatile A&&); + +int test5_23568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23568(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23568(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23568(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_23568(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_23568(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_23568(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_23578(const A&); +three sink_5_23578(volatile A&); +five sink_5_23578( A&&); +seven sink_5_23578(volatile A&&); +eight sink_5_23578(const volatile A&&); + +int test5_23578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23578(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23578(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23578(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_23578(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_23578(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_23578(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_23678(const A&); +three sink_5_23678(volatile A&); +six sink_5_23678(const A&&); +seven sink_5_23678(volatile A&&); +eight sink_5_23678(const volatile A&&); + +int test5_23678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_23678(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_23678(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_23678(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_23678(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_23678(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_24567(const A&); +four sink_5_24567(const volatile A&); +five sink_5_24567( A&&); +six sink_5_24567(const A&&); +seven sink_5_24567(volatile A&&); + +int test5_24567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_24567(a)) == 2* sizeof(long)> t1; + sa<sizeof(sink_5_24567(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_24567(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_24567(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_24567(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_24567(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_24567(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +two sink_5_24568(const A&); +four sink_5_24568(const volatile A&); +five sink_5_24568( A&&); +six sink_5_24568(const A&&); +eight sink_5_24568(const volatile A&&); + +int test5_24568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_24568(a)) == 2* sizeof(long)> t1; + sa<sizeof(sink_5_24568(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_24568(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_24568(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_24568(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_24568(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_24568(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_24568(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_24578(const A&); +four sink_5_24578(const volatile A&); +five sink_5_24578( A&&); +seven sink_5_24578(volatile A&&); +eight sink_5_24578(const volatile A&&); + +int test5_24578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_24578(a)) == 2* sizeof(long)> t1; + sa<sizeof(sink_5_24578(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_24578(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_24578(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_24578(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_24578(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_24578(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_24578(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_24678(const A&); +four sink_5_24678(const volatile A&); +six sink_5_24678(const A&&); +seven sink_5_24678(volatile A&&); +eight sink_5_24678(const volatile A&&); + +int test5_24678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_24678(a)) == 2* sizeof(long)> t1; + sa<sizeof(sink_5_24678(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_24678(va)) == 4* sizeof(long)> t3; + sa<sizeof(sink_5_24678(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_24678(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_24678(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_24678(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +two sink_5_25678(const A&); +five sink_5_25678( A&&); +six sink_5_25678(const A&&); +seven sink_5_25678(volatile A&&); +eight sink_5_25678(const volatile A&&); + +int test5_25678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_25678(a)) == 2* sizeof(long)> t1; + sa<sizeof(sink_5_25678(ca)) == 2* sizeof(long)> t2; + sa<sizeof(sink_5_25678(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_25678(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_25678(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_25678(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +three sink_5_34567(volatile A&); +four sink_5_34567(const volatile A&); +five sink_5_34567( A&&); +six sink_5_34567(const A&&); +seven sink_5_34567(volatile A&&); + +int test5_34567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_34567(a)) == 3* sizeof(long)> t1; + sa<sizeof(sink_5_34567(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_34567(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_34567(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_34567(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_34567(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_34567(v_source())) == 7* sizeof(long)> t7; + return 0; +} + +three sink_5_34568(volatile A&); +four sink_5_34568(const volatile A&); +five sink_5_34568( A&&); +six sink_5_34568(const A&&); +eight sink_5_34568(const volatile A&&); + +int test5_34568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_34568(a)) == 3* sizeof(long)> t1; + sa<sizeof(sink_5_34568(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_34568(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_34568(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_34568(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_34568(c_source())) == 6* sizeof(long)> t6; + sa<sizeof(sink_5_34568(v_source())) == 8* sizeof(long)> t7; + sa<sizeof(sink_5_34568(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +three sink_5_34578(volatile A&); +four sink_5_34578(const volatile A&); +five sink_5_34578( A&&); +seven sink_5_34578(volatile A&&); +eight sink_5_34578(const volatile A&&); + +int test5_34578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_34578(a)) == 3* sizeof(long)> t1; + sa<sizeof(sink_5_34578(ca)) == 4* sizeof(long)> t2; + sa<sizeof(sink_5_34578(va)) == 3* sizeof(long)> t3; + sa<sizeof(sink_5_34578(cva)) == 4* sizeof(long)> t4; + sa<sizeof(sink_5_34578(source())) == 5* sizeof(long)> t5; + sa<sizeof(sink_5_34578(c_source())) == 8* sizeof(long)> t6; + sa<sizeof(sink_5_34578(v_source())) == 7* sizeof(long)> t7; + sa<sizeof(sink_5_34578(cv_source())) == 8* sizeof(long)> t8; + return 0; +} + +three sink_5_34678(volatile A&); +four sink_5_34678(const volatile A&); +six sink_5_34678(const A&&); +seven sink_5_34678(volatile A&&); +eight sink_5_34678(const volatile A&&); + +int test5_34678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_34678(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_5_34678(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_5_34678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_5_34678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_5_34678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_5_34678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_5_34678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_5_35678(volatile A&); +five sink_5_35678( A&&); +six sink_5_35678(const A&&); +seven sink_5_35678(volatile A&&); +eight sink_5_35678(const volatile A&&); + +int test5_35678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_35678(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_5_35678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_5_35678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_5_35678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_5_35678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_5_35678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +four sink_5_45678(const volatile A&); +five sink_5_45678( A&&); +six sink_5_45678(const A&&); +seven sink_5_45678(volatile A&&); +eight sink_5_45678(const volatile A&&); + +int test5_45678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_5_45678(a)) == 4 * sizeof(long)> t1; + sa<sizeof(sink_5_45678(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_5_45678(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_5_45678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_5_45678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_5_45678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_5_45678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_5_45678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +int main() +{ + return test5_12345() + test5_12346() + test5_12347() + test5_12348() + + test5_12356() + test5_12357() + test5_12358() + test5_12367() + + test5_12368() + test5_12378() + test5_12456() + test5_12457() + + test5_12458() + test5_12467() + test5_12468() + test5_12478() + + test5_12567() + test5_12568() + test5_12578() + test5_12678() + + test5_13456() + test5_13457() + test5_13458() + test5_13467() + + test5_13468() + test5_13478() + test5_13567() + test5_13568() + + test5_13578() + test5_13678() + test5_14567() + test5_14568() + + test5_14578() + test5_14678() + test5_15678() + test5_23456() + + test5_23457() + test5_23458() + test5_23467() + test5_23468() + + test5_23478() + test5_23567() + test5_23568() + test5_23578() + + test5_23678() + test5_24567() + test5_24568() + test5_24578() + + test5_24678() + test5_25678() + test5_34567() + test5_34568() + + test5_34578() + test5_34678() + test5_35678() + test5_45678(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv6n.C b/gcc/testsuite/g++.dg/cpp0x/rv6n.C new file mode 100644 index 000000000..d0fdbb7e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv6n.C @@ -0,0 +1,372 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; +struct three {char x[3];}; +struct four {char x[4];}; +struct five {char x[5];}; +struct six {char x[6];}; +struct seven {char x[7];}; +struct eight {char x[8];}; + +struct A +{ + A(); + A(const volatile A&&); // { dg-error "argument 1" } +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 6 at a time + +one sink_6_123456( A&); // { dg-message "one sink_6_123456|no known conversion" } +two sink_6_123456(const A&); // { dg-message "note" } +three sink_6_123456(volatile A&); // { dg-message "note" } +four sink_6_123456(const volatile A&); // { dg-message "note" } +five sink_6_123456( A&&); // { dg-message "note" } +six sink_6_123456(const A&&); // { dg-message "note" } + +int test6_123456() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_6_123456(v_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 46 } + sink_6_123456(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 48 } + return 0; +} + +one sink_6_123457( A&); // { dg-message "one sink_6_123457|no known conversion" } +two sink_6_123457(const A&); // { dg-message "note" } +three sink_6_123457(volatile A&); // { dg-message "note" } +four sink_6_123457(const volatile A&); // { dg-message "note" } +five sink_6_123457( A&&); // { dg-message "note" } +seven sink_6_123457(volatile A&&); // { dg-message "note" } + +int test6_123457() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_6_123457(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 66 } + return 0; +} + +two sink_6_235678(const A&); // { dg-message "note" } +three sink_6_235678(volatile A&); // { dg-message "note" } +five sink_6_235678( A&&); // { dg-message "note" } +six sink_6_235678(const A&&); // { dg-message "note" } +seven sink_6_235678(volatile A&&); // { dg-message "note" } +eight sink_6_235678(const volatile A&&); // { dg-message "" } + +int test6_235678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_6_235678(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 84 } + sink_6_235678(cva); // { dg-error "lvalue" } + return 0; +} + +two sink_6_234678(const A&); // { dg-message "note" } +three sink_6_234678(volatile A&); // { dg-message "note" } +four sink_6_234678(const volatile A&); // { dg-message "note" } +six sink_6_234678(const A&&); // { dg-message "note" } +seven sink_6_234678(volatile A&&); // { dg-message "note" } +eight sink_6_234678(const volatile A&&); // { dg-message "note" } + +int test6_234678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_6_234678(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 103 } + sink_6_234678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 105 } + return 0; +} + +two sink_6_234578(const A&); // { dg-message "note" } +three sink_6_234578(volatile A&); // { dg-message "note" } +four sink_6_234578(const volatile A&); // { dg-message "note" } +five sink_6_234578( A&&); // { dg-message "note" } +seven sink_6_234578(volatile A&&); // { dg-message "note" } +eight sink_6_234578(const volatile A&&); // { dg-message "note" } + +int test6_234578() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_6_234578(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 123 } + return 0; +} + +two sink_6_234568(const A&); // { dg-message "note" } +three sink_6_234568(volatile A&); // { dg-message "note" } +four sink_6_234568(const volatile A&); // { dg-message "note" } +five sink_6_234568( A&&); // { dg-message "note" } +six sink_6_234568(const A&&); // { dg-message "note" } +eight sink_6_234568(const volatile A&&); // { dg-message "note" } + +int test6_234568() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_6_234568(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 141 } + return 0; +} + +two sink_6_234567(const A&); // { dg-message "two sink_6_234567|no known conversion" } +three sink_6_234567(volatile A&); // { dg-message "note" } +four sink_6_234567(const volatile A&); // { dg-message "note" } +five sink_6_234567( A&&); // { dg-message "note" } +six sink_6_234567(const A&&); // { dg-message "note" } +seven sink_6_234567(volatile A&&); // { dg-message "note" } + +int test6_234567() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_6_234567(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 159 } + sink_6_234567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 161 } + return 0; +} + +one sink_6_134678( A&); +three sink_6_134678(volatile A&); +four sink_6_134678(const volatile A&); +six sink_6_134678(const A&&); // { dg-message "note" } +seven sink_6_134678(volatile A&&); // { dg-message "note" } +eight sink_6_134678(const volatile A&&); // { dg-message "note" } + +int test6_134678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_6_134678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 179 } + return 0; +} + +one sink_6_124678( A&); +two sink_6_124678(const A&); // { dg-message "note" } +four sink_6_124678(const volatile A&); +six sink_6_124678(const A&&); // { dg-message "note" } +seven sink_6_124678(volatile A&&); // { dg-message "note" } +eight sink_6_124678(const volatile A&&); // { dg-message "note" } + +int test6_124678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_6_124678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 197 } + return 0; +} + +one sink_6_123678( A&); +two sink_6_123678(const A&); // { dg-message "note" } +three sink_6_123678(volatile A&); +six sink_6_123678(const A&&); // { dg-message "note" } +seven sink_6_123678(volatile A&&); // { dg-message "note" } +eight sink_6_123678(const volatile A&&); // { dg-message "" } + +int test6_123678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_6_123678(cva); // { dg-error "lvalue" } + sink_6_123678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 216 } + return 0; +} + +one sink_6_123567( A&); // { dg-message "one sink_6_123567|no known conversion" } +two sink_6_123567(const A&); // { dg-message "note" } +three sink_6_123567(volatile A&); // { dg-message "note" } +five sink_6_123567( A&&); // { dg-message "note" } +six sink_6_123567(const A&&); // { dg-message "note" } +seven sink_6_123567(volatile A&&); // { dg-message "note" } + +int test6_123567() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_6_123567(cva); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 234 } + sink_6_123567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 236 } + return 0; +} + +one sink_6_123568( A&); +two sink_6_123568(const A&); +three sink_6_123568(volatile A&); +five sink_6_123568( A&&); +six sink_6_123568(const A&&); +eight sink_6_123568(const volatile A&&); // { dg-message "" } + +int test6_123568() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_6_123568(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_6_123578( A&); +two sink_6_123578(const A&); +three sink_6_123578(volatile A&); +five sink_6_123578( A&&); +seven sink_6_123578(volatile A&&); +eight sink_6_123578(const volatile A&&); // { dg-message "" } + +int test6_123578() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_6_123578(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_6_123467( A&); // { dg-message "one sink_6_123467|no known conversion" } +two sink_6_123467(const A&); // { dg-message "note" } +three sink_6_123467(volatile A&); // { dg-message "note" } +four sink_6_123467(const volatile A&); // { dg-message "note" } +six sink_6_123467(const A&&); // { dg-message "note" } +seven sink_6_123467(volatile A&&); // { dg-message "note" } + +int test6_123467() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_6_123467(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 288 } + sink_6_123467(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 290 } + return 0; +} + +one sink_6_124567( A&); // { dg-message "one sink_6_124567|no known conversion" } +two sink_6_124567(const A&); // { dg-message "note" } +four sink_6_124567(const volatile A&); // { dg-message "note" } +five sink_6_124567( A&&); // { dg-message "note" } +six sink_6_124567(const A&&); // { dg-message "note" } +seven sink_6_124567(volatile A&&); // { dg-message "note" } + +int test6_124567() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_6_124567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 308 } + return 0; +} + +one sink_6_125678( A&); +two sink_6_125678(const A&); +five sink_6_125678( A&&); +six sink_6_125678(const A&&); +seven sink_6_125678(volatile A&&); // { dg-message "" } +eight sink_6_125678(const volatile A&&); // { dg-message "" } + +int test6_125678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_6_125678(va); // { dg-error "lvalue" } + sink_6_125678(cva); // { dg-error "lvalue" } + return 0; +} + +one sink_6_134567( A&); // { dg-message "one sink_6_134567|no known conversion" } +three sink_6_134567(volatile A&); // { dg-message "note" } +four sink_6_134567(const volatile A&); // { dg-message "note" } +five sink_6_134567( A&&); // { dg-message "note" } +six sink_6_134567(const A&&); // { dg-message "note" } +seven sink_6_134567(volatile A&&); // { dg-message "note" } + +int test6_134567() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_6_134567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 344 } + return 0; +} + +one sink_6_135678( A&); +three sink_6_135678(volatile A&); +five sink_6_135678( A&&); +six sink_6_135678(const A&&); // { dg-message "" } +seven sink_6_135678(volatile A&&); +eight sink_6_135678(const volatile A&&); // { dg-message "" } + +int test6_135678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_6_135678(ca); // { dg-error "lvalue" } + sink_6_135678(cva); // { dg-error "lvalue" } + return 0; +} + +int main() +{ + return test6_235678() + test6_234678() + test6_234578() + test6_234568() + + test6_234567() + test6_134678() + test6_124678() + test6_123678() + + test6_123567(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv6p.C b/gcc/testsuite/g++.dg/cpp0x/rv6p.C new file mode 100644 index 000000000..4b78ef70b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv6p.C @@ -0,0 +1,687 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; +struct three {long x[3];}; +struct four {long x[4];}; +struct five {long x[5];}; +struct six {long x[6];}; +struct seven {long x[7];}; +struct eight {long x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 6 at a time + +one sink_6_123456( A&); +two sink_6_123456(const A&); +three sink_6_123456(volatile A&); +four sink_6_123456(const volatile A&); +five sink_6_123456( A&&); +six sink_6_123456(const A&&); + +int test6_123456() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123456(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123456(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123456(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123456(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_123456(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_123456(c_source())) == 6 * sizeof(long)> t6; + return 0; +} + +one sink_6_123457( A&); +two sink_6_123457(const A&); +three sink_6_123457(volatile A&); +four sink_6_123457(const volatile A&); +five sink_6_123457( A&&); +seven sink_6_123457(volatile A&&); + +int test6_123457() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123457(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123457(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123457(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123457(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_123457(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_123457(c_source())) == 2 * sizeof(long)> t6; + sa<sizeof(sink_6_123457(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_6_123458( A&); +two sink_6_123458(const A&); +three sink_6_123458(volatile A&); +four sink_6_123458(const volatile A&); +five sink_6_123458( A&&); +eight sink_6_123458(const volatile A&&); + +int test6_123458() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123458(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123458(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123458(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123458(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_123458(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_123458(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_6_123458(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_6_123458(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_123467( A&); +two sink_6_123467(const A&); +three sink_6_123467(volatile A&); +four sink_6_123467(const volatile A&); +six sink_6_123467(const A&&); +seven sink_6_123467(volatile A&&); + +int test6_123467() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123467(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123467(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123467(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123467(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_123467(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_123467(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_6_123468( A&); +two sink_6_123468(const A&); +three sink_6_123468(volatile A&); +four sink_6_123468(const volatile A&); +six sink_6_123468(const A&&); +eight sink_6_123468(const volatile A&&); + +int test6_123468() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123468(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123468(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123468(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123468(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_123468(source())) == 6 * sizeof(long)> t5; + sa<sizeof(sink_6_123468(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_123468(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_6_123468(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_123478( A&); +two sink_6_123478(const A&); +three sink_6_123478(volatile A&); +four sink_6_123478(const volatile A&); +seven sink_6_123478(volatile A&&); +eight sink_6_123478(const volatile A&&); + +int test6_123478() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123478(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123478(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123478(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123478(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_123478(source())) == 7 * sizeof(long)> t5; + sa<sizeof(sink_6_123478(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_6_123478(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_123478(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_123567( A&); +two sink_6_123567(const A&); +three sink_6_123567(volatile A&); +five sink_6_123567( A&&); +six sink_6_123567(const A&&); +seven sink_6_123567(volatile A&&); + +int test6_123567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123567(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123567(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123567(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_123567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_123567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_6_123568( A&); +two sink_6_123568(const A&); +three sink_6_123568(volatile A&); +five sink_6_123568( A&&); +six sink_6_123568(const A&&); +eight sink_6_123568(const volatile A&&); + +int test6_123568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123568(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123568(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123568(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_123568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_123568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_6_123568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_123578( A&); +two sink_6_123578(const A&); +three sink_6_123578(volatile A&); +five sink_6_123578( A&&); +seven sink_6_123578(volatile A&&); +eight sink_6_123578(const volatile A&&); + +int test6_123578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123578(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123578(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123578(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_123578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_6_123578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_123578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_123678( A&); +two sink_6_123678(const A&); +three sink_6_123678(volatile A&); +six sink_6_123678(const A&&); +seven sink_6_123678(volatile A&&); +eight sink_6_123678(const volatile A&&); + +int test6_123678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_123678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_123678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_123678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_123678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_123678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_123678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_124567( A&); +two sink_6_124567(const A&); +four sink_6_124567(const volatile A&); +five sink_6_124567( A&&); +six sink_6_124567(const A&&); +seven sink_6_124567(volatile A&&); + +int test6_124567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_124567(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_124567(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_124567(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_6_124567(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_124567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_124567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_124567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_6_124568( A&); +two sink_6_124568(const A&); +four sink_6_124568(const volatile A&); +five sink_6_124568( A&&); +six sink_6_124568(const A&&); +eight sink_6_124568(const volatile A&&); + +int test6_124568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_124568(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_124568(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_124568(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_6_124568(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_124568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_124568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_124568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_6_124568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_124578( A&); +two sink_6_124578(const A&); +four sink_6_124578(const volatile A&); +five sink_6_124578( A&&); +seven sink_6_124578(volatile A&&); +eight sink_6_124578(const volatile A&&); + +int test6_124578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_124578(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_124578(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_124578(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_6_124578(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_124578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_124578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_6_124578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_124578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_124678( A&); +two sink_6_124678(const A&); +four sink_6_124678(const volatile A&); +six sink_6_124678(const A&&); +seven sink_6_124678(volatile A&&); +eight sink_6_124678(const volatile A&&); + +int test6_124678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_124678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_124678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_124678(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_6_124678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_124678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_124678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_124678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_125678( A&); +two sink_6_125678(const A&); +five sink_6_125678( A&&); +six sink_6_125678(const A&&); +seven sink_6_125678(volatile A&&); +eight sink_6_125678(const volatile A&&); + +int test6_125678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_125678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_125678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_125678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_125678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_125678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_125678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_134567( A&); +three sink_6_134567(volatile A&); +four sink_6_134567(const volatile A&); +five sink_6_134567( A&&); +six sink_6_134567(const A&&); +seven sink_6_134567(volatile A&&); + +int test6_134567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_134567(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_134567(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_6_134567(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_134567(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_134567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_134567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_134567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_6_134568( A&); +three sink_6_134568(volatile A&); +four sink_6_134568(const volatile A&); +five sink_6_134568( A&&); +six sink_6_134568(const A&&); +eight sink_6_134568(const volatile A&&); + +int test6_134568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_134568(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_134568(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_6_134568(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_134568(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_134568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_134568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_134568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_6_134568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_134578( A&); +three sink_6_134578(volatile A&); +four sink_6_134578(const volatile A&); +five sink_6_134578( A&&); +seven sink_6_134578(volatile A&&); +eight sink_6_134578(const volatile A&&); + +int test6_134578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_134578(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_134578(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_6_134578(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_134578(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_134578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_134578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_6_134578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_134578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_134678( A&); +three sink_6_134678(volatile A&); +four sink_6_134678(const volatile A&); +six sink_6_134678(const A&&); +seven sink_6_134678(volatile A&&); +eight sink_6_134678(const volatile A&&); + +int test6_134678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_134678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_134678(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_6_134678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_134678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_134678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_134678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_134678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_135678( A&); +three sink_6_135678(volatile A&); +five sink_6_135678( A&&); +six sink_6_135678(const A&&); +seven sink_6_135678(volatile A&&); +eight sink_6_135678(const volatile A&&); + +int test6_135678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_135678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_135678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_135678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_135678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_135678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_135678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_6_145678( A&); +four sink_6_145678(const volatile A&); +five sink_6_145678( A&&); +six sink_6_145678(const A&&); +seven sink_6_145678(volatile A&&); +eight sink_6_145678(const volatile A&&); + +int test6_145678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_145678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_6_145678(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_6_145678(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_6_145678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_145678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_145678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_145678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_145678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_6_234567(const A&); +three sink_6_234567(volatile A&); +four sink_6_234567(const volatile A&); +five sink_6_234567( A&&); +six sink_6_234567(const A&&); +seven sink_6_234567(volatile A&&); + +int test6_234567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_234567(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_234567(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_234567(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_234567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_234567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_234567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +two sink_6_234568(const A&); +three sink_6_234568(volatile A&); +four sink_6_234568(const volatile A&); +five sink_6_234568( A&&); +six sink_6_234568(const A&&); +eight sink_6_234568(const volatile A&&); + +int test6_234568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_234568(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_234568(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_234568(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_234568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_234568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_234568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_6_234568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_6_234578(const A&); +three sink_6_234578(volatile A&); +four sink_6_234578(const volatile A&); +five sink_6_234578( A&&); +seven sink_6_234578(volatile A&&); +eight sink_6_234578(const volatile A&&); + +int test6_234578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_234578(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_234578(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_234578(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_234578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_234578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_6_234578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_234578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_6_234678(const A&); +three sink_6_234678(volatile A&); +four sink_6_234678(const volatile A&); +six sink_6_234678(const A&&); +seven sink_6_234678(volatile A&&); +eight sink_6_234678(const volatile A&&); + +int test6_234678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_234678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_234678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_234678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_234678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_234678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_234678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_6_235678(const A&); +three sink_6_235678(volatile A&); +five sink_6_235678( A&&); +six sink_6_235678(const A&&); +seven sink_6_235678(volatile A&&); +eight sink_6_235678(const volatile A&&); + +int test6_235678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_235678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_235678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_235678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_235678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_235678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_235678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_6_245678(const A&); +four sink_6_245678(const volatile A&); +five sink_6_245678( A&&); +six sink_6_245678(const A&&); +seven sink_6_245678(volatile A&&); +eight sink_6_245678(const volatile A&&); + +int test6_245678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_245678(a)) == 2 * sizeof(long)> t1; + sa<sizeof(sink_6_245678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_6_245678(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_6_245678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_245678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_245678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_245678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_245678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +three sink_6_345678(volatile A&); +four sink_6_345678(const volatile A&); +five sink_6_345678( A&&); +six sink_6_345678(const A&&); +seven sink_6_345678(volatile A&&); +eight sink_6_345678(const volatile A&&); + +int test6_345678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_6_345678(a)) == 3 * sizeof(long)> t1; + sa<sizeof(sink_6_345678(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_6_345678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_6_345678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_6_345678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_6_345678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_6_345678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_6_345678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +int main() +{ + return test6_123456() + test6_123457() + test6_123458() + test6_123467() + + test6_123468() + test6_123478() + test6_123567() + test6_123568() + + test6_123578() + test6_123678() + test6_124567() + test6_124568() + + test6_124578() + test6_124678() + test6_125678() + test6_134567() + + test6_134568() + test6_134578() + test6_134678() + test6_135678() + + test6_145678() + test6_234567() + test6_234568() + test6_234578() + + test6_234678() + test6_235678() + test6_245678() + test6_345678(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv7n.C b/gcc/testsuite/g++.dg/cpp0x/rv7n.C new file mode 100644 index 000000000..6071e0568 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv7n.C @@ -0,0 +1,111 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {char x[1];}; +struct two {char x[2];}; +struct three {char x[3];}; +struct four {char x[4];}; +struct five {char x[5];}; +struct six {char x[6];}; +struct seven {char x[7];}; +struct eight {char x[8];}; + +struct A +{ + A(); + A(const volatile A&&); // { dg-error "argument 1" } +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 7 at a time + +one sink_7_1234567( A&); // { dg-message "one sink_7_1234567|no known conversion" } +two sink_7_1234567(const A&); // { dg-message "note" } +three sink_7_1234567(volatile A&); // { dg-message "note" } +four sink_7_1234567(const volatile A&); // { dg-message "note" } +five sink_7_1234567( A&&); // { dg-message "note" } +six sink_7_1234567(const A&&); // { dg-message "note" } +seven sink_7_1234567(volatile A&&); // { dg-message "note" } + +int test7_1234567() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_7_1234567(cv_source()); // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 47 } + return 0; +} + +one sink_7_1235678( A&); +two sink_7_1235678(const A&); +three sink_7_1235678(volatile A&); +five sink_7_1235678( A&&); +six sink_7_1235678(const A&&); +seven sink_7_1235678(volatile A&&); +eight sink_7_1235678(const volatile A&&); // { dg-message "" } + +int test7_1235678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_7_1235678(cva); // { dg-error "lvalue" } + return 0; +} + +two sink_7_2345678(const A&); // { dg-message "note" } +three sink_7_2345678(volatile A&); // { dg-message "note" } +four sink_7_2345678(const volatile A&); // { dg-message "note" } +five sink_7_2345678( A&&); // { dg-message "note" } +six sink_7_2345678(const A&&); // { dg-message "note" } +seven sink_7_2345678(volatile A&&); // { dg-message "note" } +eight sink_7_2345678(const volatile A&&); // { dg-message "note" } + +int test7_2345678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_7_2345678(a); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 84 } + return 0; +} + +one sink_7_1234678( A&); +two sink_7_1234678(const A&); // { dg-message "note" } +three sink_7_1234678(volatile A&); +four sink_7_1234678(const volatile A&); +six sink_7_1234678(const A&&); // { dg-message "note" } +seven sink_7_1234678(volatile A&&); // { dg-message "note" } +eight sink_7_1234678(const volatile A&&); // { dg-message "note" } + +int test7_1234678() +{ + A a; + const A ca = a; // { dg-error "lvalue" } + volatile A va; + const volatile A cva = a; // { dg-error "lvalue" } + sink_7_1234678(source()); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 103 } + return 0; +} + +int main() +{ + return test7_2345678() + test7_1234678(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv7p.C b/gcc/testsuite/g++.dg/cpp0x/rv7p.C new file mode 100644 index 000000000..94aa07b93 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv7p.C @@ -0,0 +1,233 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; +struct three {long x[3];}; +struct four {long x[4];}; +struct five {long x[5];}; +struct six {long x[6];}; +struct seven {long x[7];}; +struct eight {long x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 7 at a time + +one sink_7_1234567( A&); +two sink_7_1234567(const A&); +three sink_7_1234567(volatile A&); +four sink_7_1234567(const volatile A&); +five sink_7_1234567( A&&); +six sink_7_1234567(const A&&); +seven sink_7_1234567(volatile A&&); + +int test7_1234567() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_7_1234567(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_7_1234567(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_7_1234567(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_7_1234567(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_7_1234567(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_7_1234567(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_7_1234567(v_source())) == 7 * sizeof(long)> t7; + return 0; +} + +one sink_7_1234568( A&); +two sink_7_1234568(const A&); +three sink_7_1234568(volatile A&); +four sink_7_1234568(const volatile A&); +five sink_7_1234568( A&&); +six sink_7_1234568(const A&&); +eight sink_7_1234568(const volatile A&&); + +int test7_1234568() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_7_1234568(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_7_1234568(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_7_1234568(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_7_1234568(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_7_1234568(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_7_1234568(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_7_1234568(v_source())) == 8 * sizeof(long)> t7; + sa<sizeof(sink_7_1234568(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_7_1234578( A&); +two sink_7_1234578(const A&); +three sink_7_1234578(volatile A&); +four sink_7_1234578(const volatile A&); +five sink_7_1234578( A&&); +seven sink_7_1234578(volatile A&&); +eight sink_7_1234578(const volatile A&&); + +int test7_1234578() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_7_1234578(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_7_1234578(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_7_1234578(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_7_1234578(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_7_1234578(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_7_1234578(c_source())) == 8 * sizeof(long)> t6; + sa<sizeof(sink_7_1234578(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_7_1234578(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_7_1234678( A&); +two sink_7_1234678(const A&); +three sink_7_1234678(volatile A&); +four sink_7_1234678(const volatile A&); +six sink_7_1234678(const A&&); +seven sink_7_1234678(volatile A&&); +eight sink_7_1234678(const volatile A&&); + +int test7_1234678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_7_1234678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_7_1234678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_7_1234678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_7_1234678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_7_1234678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_7_1234678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_7_1234678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_7_1235678( A&); +two sink_7_1235678(const A&); +three sink_7_1235678(volatile A&); +five sink_7_1235678( A&&); +six sink_7_1235678(const A&&); +seven sink_7_1235678(volatile A&&); +eight sink_7_1235678(const volatile A&&); + +int test7_1235678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_7_1235678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_7_1235678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_7_1235678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_7_1235678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_7_1235678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_7_1235678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_7_1235678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_7_1245678( A&); +two sink_7_1245678(const A&); +four sink_7_1245678(const volatile A&); +five sink_7_1245678( A&&); +six sink_7_1245678(const A&&); +seven sink_7_1245678(volatile A&&); +eight sink_7_1245678(const volatile A&&); + +int test7_1245678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_7_1245678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_7_1245678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_7_1245678(va)) == 4 * sizeof(long)> t3; + sa<sizeof(sink_7_1245678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_7_1245678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_7_1245678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_7_1245678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_7_1245678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +one sink_7_1345678( A&); +three sink_7_1345678(volatile A&); +four sink_7_1345678(const volatile A&); +five sink_7_1345678( A&&); +six sink_7_1345678(const A&&); +seven sink_7_1345678(volatile A&&); +eight sink_7_1345678(const volatile A&&); + +int test7_1345678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_7_1345678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_7_1345678(ca)) == 4 * sizeof(long)> t2; + sa<sizeof(sink_7_1345678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_7_1345678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_7_1345678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_7_1345678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_7_1345678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_7_1345678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +two sink_7_2345678(const A&); +three sink_7_2345678(volatile A&); +four sink_7_2345678(const volatile A&); +five sink_7_2345678( A&&); +six sink_7_2345678(const A&&); +seven sink_7_2345678(volatile A&&); +eight sink_7_2345678(const volatile A&&); + +int test7_2345678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_7_2345678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_7_2345678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_7_2345678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_7_2345678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_7_2345678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_7_2345678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_7_2345678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +int main() +{ + return test7_1234567() + test7_1234568() + test7_1234578() + test7_1234678() + + test7_1235678() + test7_1245678() + test7_1345678() + test7_2345678(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv8p.C b/gcc/testsuite/g++.dg/cpp0x/rv8p.C new file mode 100644 index 000000000..fb9ec4ce7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv8p.C @@ -0,0 +1,62 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test overload resolution among reference types + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; +struct three {long x[3];}; +struct four {long x[4];}; +struct five {long x[5];}; +struct six {long x[6];}; +struct seven {long x[7];}; +struct eight {long x[8];}; + +struct A +{ + A(); + A(const volatile A&&); +}; + + A source(); +const A c_source(); + volatile A v_source(); +const volatile A cv_source(); + +// 8 at a time + +one sink_8_12345678( A&); +two sink_8_12345678(const A&); +three sink_8_12345678(volatile A&); +four sink_8_12345678(const volatile A&); +five sink_8_12345678( A&&); +six sink_8_12345678(const A&&); +seven sink_8_12345678(volatile A&&); +eight sink_8_12345678(const volatile A&&); + +int test8_12345678() +{ + A a; + const A ca; + volatile A va; + const volatile A cva; + sa<sizeof(sink_8_12345678(a)) == 1 * sizeof(long)> t1; + sa<sizeof(sink_8_12345678(ca)) == 2 * sizeof(long)> t2; + sa<sizeof(sink_8_12345678(va)) == 3 * sizeof(long)> t3; + sa<sizeof(sink_8_12345678(cva)) == 4 * sizeof(long)> t4; + sa<sizeof(sink_8_12345678(source())) == 5 * sizeof(long)> t5; + sa<sizeof(sink_8_12345678(c_source())) == 6 * sizeof(long)> t6; + sa<sizeof(sink_8_12345678(v_source())) == 7 * sizeof(long)> t7; + sa<sizeof(sink_8_12345678(cv_source())) == 8 * sizeof(long)> t8; + return 0; +} + +int main() +{ + return test8_12345678(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rv9p.C b/gcc/testsuite/g++.dg/cpp0x/rv9p.C new file mode 100644 index 000000000..ec08a8248 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv9p.C @@ -0,0 +1,22 @@ +// PR c++/36744 +// { dg-options "-std=c++0x" } +// { dg-do run } + +struct S +{ + S(): i(2) {} + S(S const&s): i(s.i) {} + int i; +}; + +void f(S x) { x.i = 0; } + +extern "C" void abort (void); +int main() +{ + S y; + f(static_cast<S&&>(y)); + if (y.i != 2) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/rvo.C b/gcc/testsuite/g++.dg/cpp0x/rvo.C new file mode 100644 index 000000000..d4459af64 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rvo.C @@ -0,0 +1,25 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } +// Contributed by Sylvain Pion +static int rvalue_constructions = 0; + +struct A { + A () { } + A (const A&) { } + A (A&&) { ++rvalue_constructions; } + ~A () { } +}; + +A f() { return A(); } + +extern "C" { + void abort(void); +} + +int main() +{ + A c = f(); + + if (rvalue_constructions != 0) + abort(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/scoped_enum.C b/gcc/testsuite/g++.dg/cpp0x/scoped_enum.C new file mode 100644 index 000000000..c52a3fe76 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/scoped_enum.C @@ -0,0 +1,76 @@ +// { dg-options "-std=c++0x" } +enum class Color1 { + Red, + Green, + Blue +}; + +enum struct Color2 { + Red, // { dg-error "previously declared here" } + Orange, + Yellow, + Green, + Blue, + Indigo = Green + 2, + Violet, + Red // { dg-error "redefinition" } +}; + +enum Color { + Red, Green, Blue +}; + +enum class Color3 { + Red +}; + +enum Color color; +enum Color3 color3; + +void f(int); +void f2(Color3); + +void g() +{ + int i = 0; + f(color); // okay: unscoped enum + f(color3); // { dg-error "cannot convert" } + f2(color); // { dg-error "cannot convert" } + f2(color3); + f2(i); // { dg-error "cannot convert" } + i = color3; // { dg-error "cannot convert" } + color3 = i; // { dg-error "cannot convert" } + f(static_cast<int>(color3)); // okay + + int a[5]; + a[color3]; // { dg-error "array subscript is not an integer" } + + bool b = color3; // { dg-error "cannot convert" } +} + +void h() +{ + Color1 c1 = Color1::Red; + Color2 c2 = Color1::Red; // { dg-error "cannot convert" } + c2 = Color1::Red; // { dg-error "cannot convert" } + + c2 = Color2::Red; + int c3 = Color::Red; +} + +template<typename T, T value> +struct constant { }; + +template<typename T> +int& sfinae(constant<T, T::Green>*); + +float& sfinae(void*); + +void sfinae_test() +{ + int& test1 = sfinae((constant<Color1, Color1::Green>*)0); + int& test2 = sfinae((constant<Color2, Color2::Green>*)0); + float& test3 = sfinae((constant<Color1, Color1::Red>*)0); + int& test4 = sfinae((constant<Color, Green>*)0); + float& test5 = sfinae((constant<Color, Red>*)0); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/scoped_enum2.C b/gcc/testsuite/g++.dg/cpp0x/scoped_enum2.C new file mode 100644 index 000000000..e87b36a27 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/scoped_enum2.C @@ -0,0 +1,11 @@ +// { dg-options -std=c++0x } + +enum class E { e = 10 }; +enum E2 { e2 = 10 }; + +struct C { + int arr[E::e]; // { dg-error "non-integral type" } + int arr2[E2::e2]; // OK + int i: E::e; // { dg-error "non-integral type" } + int i2: E2::e2; // OK +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/scoped_enum_98.C b/gcc/testsuite/g++.dg/cpp0x/scoped_enum_98.C new file mode 100644 index 000000000..8c24e86ba --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/scoped_enum_98.C @@ -0,0 +1,4 @@ +// { dg-do compile } +// { dg-options "-std=c++98" } +enum class E1 { e1 }; // { dg-warning "scoped enums" } +enum E2 : char { e2 }; // { dg-warning "scoped enums" } diff --git a/gcc/testsuite/g++.dg/cpp0x/scoped_enum_examples.C b/gcc/testsuite/g++.dg/cpp0x/scoped_enum_examples.C new file mode 100644 index 000000000..67c3fcbeb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/scoped_enum_examples.C @@ -0,0 +1,27 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } +enum class Col { red, yellow, green }; + +int x = Col::red; // { dg-error "cannot convert" } +Col y = Col::red; + +void f() +{ + if (y) { } // { dg-error "could not convert" } +} + +enum direction { left='l', right='r' }; +void g() { + // OK + direction d; + // OK + d = left; + // OK + d = direction::right; +} +enum class altitude { high='h', low='l' }; +void h() { + altitude a; + a = high; // { dg-error "not declared in this scope" } + a = altitude::low; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae1.C b/gcc/testsuite/g++.dg/cpp0x/sfinae1.C new file mode 100644 index 000000000..292d8ae04 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae1.C @@ -0,0 +1,11 @@ +// { dg-options "-std=c++0x" } + +template< typename T_VECTOR > +void f(const T_VECTOR &a, decltype(a[0]) t = 0); +template< typename T > +void f(const T &a, decltype(a*1) t = 0); + +int main() { + int c; + f(c); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae10.C b/gcc/testsuite/g++.dg/cpp0x/sfinae10.C new file mode 100644 index 000000000..72dbce080 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae10.C @@ -0,0 +1,16 @@ +// PR c++/48452 +// { dg-options -std=c++0x } +namespace std { + template <class T> T&& declval(); +} + +template<class T, class... Args> +decltype(T(std::declval<Args>()...), char()) f(int); + +template<class, class...> +char (&f(...))[2]; + +struct B {}; + +static_assert(sizeof(f<B, void, int>(0)) != 1, "Error"); // b +static_assert(sizeof(f<void, int, int>(0)) != 1, "Error"); // c diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae11.C b/gcc/testsuite/g++.dg/cpp0x/sfinae11.C new file mode 100644 index 000000000..a3ffc34f9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae11.C @@ -0,0 +1,56 @@ +// PR c++/48468 +// { dg-options -std=c++0x } +// { dg-prune-output "note" } + +template<class T> +T&& declval() noexcept; + +template< class T > +inline void f1( T& x ) noexcept( noexcept( declval<T&>().foo() ) ) +{ + x.foo(); +} + +template< class T, + bool Noexcept = noexcept( declval<T&>().foo() ) +> +inline void f2( T& x ) noexcept( Noexcept ) +{ + x.foo(); +} + +// a common and trivial mistake +template< class T > +inline void f3( T& x ) noexcept( declval<T&>().foo() ) +{ + x.foo(); +} + +struct X +{ + void foo(); +}; + +struct Y +{ + void foo() noexcept; +}; + +struct Z {}; + +int main() +{ + X x; Y y; Z z; + + static_assert( !noexcept( f1(x) ), "OK." ); + static_assert( !noexcept( f2(x) ), "OK." ); + // static_assert( !noexcept( f3(x) ), "shall be ill-formed(OK)." ); + + static_assert( noexcept( f1(y) ), "OK." ); + static_assert( noexcept( f2(y) ), "OK." ); + // static_assert( noexcept( f3(y) ), "shall be ill-formed(OK)." ); + + static_assert( noexcept( f1(z) ), "shall be ill-formed." ); // { dg-error "no match" } + static_assert( noexcept( f2(z) ), "shall be ill-formed." ); // { dg-error "no match" } + static_assert( !noexcept( f3(z) ), "shall be ill-formed." ); // { dg-error "no match" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae2.C b/gcc/testsuite/g++.dg/cpp0x/sfinae2.C new file mode 100644 index 000000000..b9ef70d99 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae2.C @@ -0,0 +1,39 @@ +// PR c++/44967 +// { dg-options -std=c++0x } + +template <typename T> T&& declval(); + +template<typename T1, typename T2, typename... Args> +struct has_construct +{ + typedef char one; + typedef struct {char _m[2]; } two; + + template<typename U1, typename U2, typename... Args2> + static decltype(declval<U1>().construct(declval<U2*>(), declval<Args2>()...), one()) test(int); + template<typename, typename, typename...> + static two test(...); + + static const bool value = sizeof(test<T1, T2, Args...>(0)) == 1; +}; + + +struct A0 +{}; + +struct A1 +{ + void construct(int*, int); +}; + +template<typename _Tp> +struct A2 +{ + template<typename _Tp1, typename... _Args> + void construct(_Tp1*, _Args&&...) {} +}; + +#define SA(X) static_assert(X,#X) +SA((!has_construct<A0, int, int>::value)); // ok +SA((has_construct<A1, int, int>::value)); // bang +SA((has_construct<A2<int>, int>::value)); // bang diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae22.C b/gcc/testsuite/g++.dg/cpp0x/sfinae22.C new file mode 100644 index 000000000..2b9351a97 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae22.C @@ -0,0 +1,23 @@ +// PR c++/48745 +// { dg-options -std=c++0x } + +template<class T> +struct add_rval_ref { + typedef T&& type; +}; + +template<> +struct add_rval_ref<void> { + typedef void type; +}; + +template<class T> +typename add_rval_ref<T>::type create(); + +template<class T, class... Args> +decltype(T{create<Args>()...}, char()) f(int); + +template<class, class...> +char (&f(...))[2]; + +static_assert(sizeof(f<int, void>(0)) != 1, "Error"); // { dg-bogus "void value" "" { xfail *-*-* } } diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae23.C b/gcc/testsuite/g++.dg/cpp0x/sfinae23.C new file mode 100644 index 000000000..4e2ea88b1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae23.C @@ -0,0 +1,28 @@ +// PR c++/48647 +// { dg-options -std=c++0x } + +template< class T > +T&& declval(); + +template< class T, class U > +decltype( true ? declval<T>() : declval<U>() ) test( int ); + +template< class T, class U > +void test( ... ); + + +template< class T, class U > +struct is_same { + static const bool value = false; +}; + +template< class T > +struct is_same<T, T> { + static const bool value = true; +}; + +#define SA(X) static_assert ((X),#X) + +typedef decltype( test<int*, double*>(0) ) void_expected; +SA ((is_same<void_expected, void>::value)); +SA ((!is_same<void_expected, void*>::value)); diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae26.C b/gcc/testsuite/g++.dg/cpp0x/sfinae26.C new file mode 100644 index 000000000..6a4f679ce --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae26.C @@ -0,0 +1,40 @@ +// PR c++/49229 +// { dg-options -std=c++0x } + +extern void* enabler; + +template<bool, class = void> +struct enable_if {}; + +template<class T> +struct enable_if<true, T> { + typedef T type; +}; + +template<class... Bn> +struct and_; + +template<class B1> +struct and_<B1> : B1 {}; + +template<class, class> +struct is_same { + static constexpr bool value = false; +}; + +template<class T> +struct is_same<T, T> { + static constexpr bool value = true; +}; + +template<class... T> +struct S { + template<class... U, + typename enable_if<and_<is_same<T, U>...>::value>::type*& = enabler + > + S(U...){} // # +}; + +S<bool> s(0); // { dg-error "no match" } + +// { dg-prune-output "note" } diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae27.C b/gcc/testsuite/g++.dg/cpp0x/sfinae27.C new file mode 100644 index 000000000..93327ba9c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae27.C @@ -0,0 +1,20 @@ +// PR c++/50157 +// { dg-options -std=c++0x } + +template<class T> +T val(); + +template<class T, class Arg, class = + decltype(::new T(val<Arg>())) +> +auto test(int) -> char; + +template<class, class> +auto test(...) -> char (&)[2]; + +struct P { + explicit operator bool(); // (#13) +}; + +typedef decltype(test<bool, P>(0)) type; // OK +typedef decltype(test<float, P>(0)) type2; // Error (#17) diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae3.C b/gcc/testsuite/g++.dg/cpp0x/sfinae3.C new file mode 100644 index 000000000..8582ba777 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae3.C @@ -0,0 +1,56 @@ +// { dg-options -std=c++0x } + +namespace std { template <class T> T&& declval(); } + +template<typename _Tp, typename... _Args> + class is_constructible_mini + { + typedef char __one; + typedef struct { char __arr[2]; } __two; + + template<typename _Tp1, typename... _Args1> + static decltype(::new _Tp1(std::declval<_Args1>()...), __one()) + __test(int); + + template<typename, typename...> + static __two __test(...); + + public: + static const bool value = sizeof(__test<_Tp, _Args...>(0)) == 1; + }; + +/* +template<typename _Tp> + class is_constructible_mini<_Tp> + { + typedef char __one; + typedef struct { char __arr[2]; } __two; + + template<typename _Tp1> + static decltype(::new _Tp1, __one()) __test(int); + + template<typename> + static __two __test(...); + + public: + static const bool value + = sizeof(__test<typename std::remove_cv<_Tp>::type>(0)) == 1; + }; +*/ + +struct A +{ + A(int); +}; + +struct B { }; + +static_assert( is_constructible_mini<A, int>::value, ""); +static_assert( is_constructible_mini<A, A>::value, ""); +static_assert( !is_constructible_mini<A, int, double>::value, ""); + +static_assert( !is_constructible_mini<A>::value, ""); // doesn't compile without the + // partial specialization + +static_assert( is_constructible_mini<B>::value, ""); +static_assert( is_constructible_mini<const B>::value, ""); diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae4.C b/gcc/testsuite/g++.dg/cpp0x/sfinae4.C new file mode 100644 index 000000000..b66483124 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae4.C @@ -0,0 +1,23 @@ +// { dg-options -std=c++0x } + +namespace std { template <class T> T&& declval(); } + +template<typename _Tp, typename... _Args> + class is_constructible_mini + { + typedef char __one; + typedef struct { char __arr[2]; } __two; + + template<typename _Tp1, typename... _Args1> + static decltype(::new _Tp1(std::declval<_Args1>()...), __one()) + __test(int); + + template<typename, typename...> + static __two __test(...); + + public: + static const bool value = sizeof(__test<_Tp, _Args...>(0)) == 1; + }; + +static_assert( !is_constructible_mini<int[], int>::value, ""); +static_assert( !is_constructible_mini<void, int>::value, ""); diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae5.C b/gcc/testsuite/g++.dg/cpp0x/sfinae5.C new file mode 100644 index 000000000..8474fb314 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae5.C @@ -0,0 +1,16 @@ +// { dg-options -std=c++0x } + +template<class T> +T&& create(); + +template <class T, class U, + class = decltype(create<T>() = create<U>()) + > +char test(int); + +template <class, class> +double test(...); + +int main() { + test<int[], int[]>(0); // #1 +} diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae6.C b/gcc/testsuite/g++.dg/cpp0x/sfinae6.C new file mode 100644 index 000000000..401d5362d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae6.C @@ -0,0 +1,31 @@ +// PR c++/48113 +// { dg-options -std=c++0x } + +template<typename T> T declval(); + +struct tuple { }; + +struct F1 +{ + void operator()(tuple, int); +}; + +typedef void (*F2)(tuple, int); + +template<typename F, typename T> +struct Bind +{ + template<typename A, + typename R = decltype( F()(declval<T&>(), A()) )> + R f(A); + + template<typename A, + typename R = decltype( F()(declval<volatile T&>(), A()) )> + R f(A) volatile; +}; + +int main() +{ + Bind<F1, tuple>().f(0); // OK + Bind<F2, tuple>().f(0); // ERROR, should be OK +} diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae7.C b/gcc/testsuite/g++.dg/cpp0x/sfinae7.C new file mode 100644 index 000000000..0a95a9644 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae7.C @@ -0,0 +1,20 @@ +// { dg-options -std=c++0x } + +struct A +{ + void f(); + void f(int); + typedef int g; +}; + +template <class T> decltype (T::f) f(); +template <class T> void f(); + +template <class T> decltype (T::g) g(); +template <class T> void g(); + +int main() +{ + f<A>(); + g<A>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/static_assert1.C b/gcc/testsuite/g++.dg/cpp0x/static_assert1.C new file mode 100644 index 000000000..a54617598 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/static_assert1.C @@ -0,0 +1,14 @@ +// { dg-options "-std=c++0x" } +void foo() +{ + static_assert(1, "okay"); + static_assert (0 == 1, "zero is never equal to one"); // { dg-error "never equal" } +} + +class X { + static_assert(1, "okay"); + static_assert (0 == 1, "zero is never equal to one"); // { dg-error "never equal" } +}; + +static_assert(1, "okay"); +static_assert (0 == 1, "zero is never equal to one"); // { dg-error "never equal" } diff --git a/gcc/testsuite/g++.dg/cpp0x/static_assert2.C b/gcc/testsuite/g++.dg/cpp0x/static_assert2.C new file mode 100644 index 000000000..3e74bb1b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/static_assert2.C @@ -0,0 +1,35 @@ +// { dg-options "-std=c++0x" } +template<int I> +struct accept_evens { + static_assert( I % 2 == 0, "I must be an even number"); // { dg-error "even number" } +}; + +template<int I> +struct accept_evens_ok { + static_assert( I % 2 == 0, "I must be an even number"); +}; + +template<int I> +void accept_odds() { + static_assert( I % 2 == 1, "I must be an odd number"); // { dg-error "odd number" } +} + +template<int I> +void accept_odds_ok() { + static_assert( I % 2 == 1, "I must be an odd number"); +} + +void f() +{ + accept_odds<1>(); + accept_odds<2>(); + accept_odds<3>(); + accept_odds_ok<5>(); + accept_odds_ok<7>(); +} + +accept_evens<0> ok0; +accept_evens<1> error1; +accept_evens<2> ok2; +accept_evens_ok<4> ok4; +accept_evens_ok<6> ok6; diff --git a/gcc/testsuite/g++.dg/cpp0x/static_assert3.C b/gcc/testsuite/g++.dg/cpp0x/static_assert3.C new file mode 100644 index 000000000..1ff2ffc94 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/static_assert3.C @@ -0,0 +1,4 @@ +// { dg-options "-std=c++0x" } +static_assert(7 / 0, "X"); // { dg-error "non-constant condition" } +// { dg-warning "division by zero" "" { target *-*-* } 2 } +// { dg-error "7 / 0.. is not a constant expression" "" { target *-*-* } 2 } diff --git a/gcc/testsuite/g++.dg/cpp0x/static_assert4.C b/gcc/testsuite/g++.dg/cpp0x/static_assert4.C new file mode 100644 index 000000000..b0818873f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/static_assert4.C @@ -0,0 +1,15 @@ +// { dg-options "-std=c++0x --param ggc-min-heapsize=0 --param ggc-min-expand=0 " } +// PR C++/30033 +// Make sure that the static assert does not crash the GC. + +template <class T> +struct default_delete +{ + void + operator() (T * ptr) const + { + static_assert (sizeof (T) > 0, "Can't delete pointer to incomplete type"); + } +}; + + diff --git a/gcc/testsuite/g++.dg/cpp0x/std-layout1.C b/gcc/testsuite/g++.dg/cpp0x/std-layout1.C new file mode 100644 index 000000000..bdad82111 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/std-layout1.C @@ -0,0 +1,91 @@ +// { dg-options "-std=c++0x" } + +// [basic.types]/10: +// Scalar types, standard-layout class types (Clause 9), arrays of such +// types and cv-qualified versions of these types (3.9.3) are collectively +// called standard-layout types. + +// [class]/7: +// A standard-layout class is a class that: +// * has no non-static data members of type non-standard-layout class (or +// array of such types) or reference, +// * has no virtual functions (10.3) and no virtual base classes (10.1), +// * has the same access control (Clause 11) for all non-static data members, +// * has no non-standard-layout base classes, +// * either has no non-static data members in the most-derived class and at +// most one base class with non-static data members, or has no base classes +// with non-static data members, and +// * has no base classes of the same type as the first non-static data member. + +#include <type_traits> + +#define TRY(expr) static_assert (expr, #expr) +#define YES(type) TRY(std::is_standard_layout<type>::value); \ + TRY(std::is_standard_layout<type[]>::value); \ + TRY(std::is_standard_layout<const volatile type>::value); +#define NO(type) TRY(!std::is_standard_layout<type>::value); \ + TRY(!std::is_standard_layout<type[]>::value); \ + TRY(!std::is_standard_layout<const volatile type>::value); +#define NONPOD(type) TRY(!std::is_pod<type>::value); \ + TRY(!std::is_pod<type[]>::value); \ + TRY(!std::is_pod<const volatile type>::value); + +struct A; + +YES(int); +YES(__complex int); +YES(void *); +YES(int A::*); +typedef int (A::*pmf)(); +YES(pmf); + +struct A { ~A(); }; +YES(A); +NONPOD(A); +struct F: public A { int i; }; +YES(F); +NONPOD(F); +struct G: public A { A a; }; +NO(G); +struct M { A a; }; +YES(M); + +class B +{ + int i; + __complex int c; + void *p; + double ar[4]; + int A::* pm; + int (A::*pmf)(); +}; +YES(B); +struct D: public B { }; +YES(D); +struct E: public B { int q; }; +NO(E); +struct D2: public B { }; +YES(D2); +struct I: public D, public D2 { }; +NO(I); + +struct C +{ + int i; +private: + int j; +}; +NO(C); +struct H: public C { }; +NO(H); +struct N { C c; }; +NO(N); + +struct J { virtual void f(); }; +struct J2: J { }; +NO(J); +NO(J2); +struct K { }; +struct L: virtual K {}; +YES(K); +NO(L); diff --git a/gcc/testsuite/g++.dg/cpp0x/syntax-err1.C b/gcc/testsuite/g++.dg/cpp0x/syntax-err1.C new file mode 100644 index 000000000..ce1c9eea5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/syntax-err1.C @@ -0,0 +1,8 @@ +// PR c++/47198 +// { dg-options -std=c++0x } + +struct S +{ + template < int > sometype foo (); // { dg-error "sometype. does not name a type" } + S () = default; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/temp-constructor-bug.C b/gcc/testsuite/g++.dg/cpp0x/temp-constructor-bug.C new file mode 100644 index 000000000..a06720702 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/temp-constructor-bug.C @@ -0,0 +1,15 @@ +// { dg-options "--std=c++0x" } + +struct S { }; + +struct T +{ + S s; +}; + +void f(T const &); + +void g() +{ + f((T){S()}); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/temp-va-arg-bug.C b/gcc/testsuite/g++.dg/cpp0x/temp-va-arg-bug.C new file mode 100644 index 000000000..085915f90 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/temp-va-arg-bug.C @@ -0,0 +1,11 @@ +// { dg-options "--std=c++0x" } +// { dg-options "-Wno-abi --std=c++0x" { target arm_eabi } } +#include <stdarg.h> + +struct S { }; +void f(S const &); + +void g(va_list args) +{ + f(va_arg(args, S)); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/temp_default1.C b/gcc/testsuite/g++.dg/cpp0x/temp_default1.C new file mode 100644 index 000000000..dfa2cfb7b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/temp_default1.C @@ -0,0 +1,32 @@ +// { dg-options "-std=c++0x" } + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> { + static const bool value = true; +}; + +template<typename T = int> void f() +{ + static_assert(is_same<T, int>::value, + "T can only be instantiated with an int"); +} + +template<typename T = int, typename U> +void f(U) +{ + static_assert(is_same<T, int>::value, + "T can only be instantiated with an int"); +} + +void g() +{ + float pi = 3.14159; + f(); + f(pi); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/temp_default2.C b/gcc/testsuite/g++.dg/cpp0x/temp_default2.C new file mode 100644 index 000000000..fa2bb6aed --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/temp_default2.C @@ -0,0 +1,14 @@ +// { dg-options "-std=c++0x" } + +template <class T, class U = double> +void f(T t = 0, U u = 0); // { dg-message "note" } + +void g() +{ + f(1, 'c'); // f<int,char>(1,'c') + f(1); // f<int,double>(1,0) + f(); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 10 } + f<int>(); // f<int,double>(0,0) + f<int,char>(); // f<int,char>(0,0) +} diff --git a/gcc/testsuite/g++.dg/cpp0x/temp_default3.C b/gcc/testsuite/g++.dg/cpp0x/temp_default3.C new file mode 100644 index 000000000..f71fe0f43 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/temp_default3.C @@ -0,0 +1,16 @@ +// { dg-options "-std=c++0x" } + +template<typename T, typename U = typename T::value_type> +void f(T); + +void f(...); + +struct X { + typedef int value_type; +}; + +void g() +{ + f(X()); // okay + f(17); // okay? +} diff --git a/gcc/testsuite/g++.dg/cpp0x/temp_default4.C b/gcc/testsuite/g++.dg/cpp0x/temp_default4.C new file mode 100644 index 000000000..f1e254c40 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/temp_default4.C @@ -0,0 +1,11 @@ +// { dg-options "-std=c++0x" } + +class X { + template<typename T = int> friend void f(X) { } + template<typename T> friend void g(X); // { dg-error "previously declared here" } + template<typename T = int> friend void h(X); // { dg-error "function template friend" } +}; + +template<typename T = int> void g(X) // { dg-error "default template argument" } +{ +} diff --git a/gcc/testsuite/g++.dg/cpp0x/template_deduction.C b/gcc/testsuite/g++.dg/cpp0x/template_deduction.C new file mode 100644 index 000000000..c1eace6fa --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/template_deduction.C @@ -0,0 +1,68 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test the "Augmented" template argument deduction when binding an lvalue to an rvalue reference. + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +template <class T, T v> +struct integral_constant +{ + static const T value = v; + typedef T value_type; + typedef integral_constant<T, v> type; +}; + +typedef integral_constant<bool, true> true_type; +typedef integral_constant<bool, false> false_type; + +template <class T> struct is_lvalue_reference : public integral_constant<bool, false> {}; +template <class T> struct is_lvalue_reference<T&> : public integral_constant<bool, true> {}; + +template <class T> struct is_rvalue_reference : public integral_constant<bool, false> {}; +template <class T> struct is_rvalue_reference<T&&> : public integral_constant<bool, true> {}; + +template <bool is_lvalue_ref, bool is_rvalue_ref, class T> +void +test1(T&&) +{ + sa<is_lvalue_reference<T&&>::value == is_lvalue_ref> t1; + sa<is_rvalue_reference<T&&>::value == is_rvalue_ref> t2; +} + +template <bool is_lvalue_ref, bool is_rvalue_ref, class T> +void +test2(const T&&) // { dg-error "argument" } +{ + sa<is_lvalue_reference<const T&&>::value == is_lvalue_ref> t1; + sa<is_rvalue_reference<const T&&>::value == is_rvalue_ref> t2; +} + +template <bool is_lvalue_ref, bool is_rvalue_ref, class T> +void +test3(T*&&) +{ + sa<is_lvalue_reference<T*&&>::value == is_lvalue_ref> t1; + sa<is_rvalue_reference<T*&&>::value == is_rvalue_ref> t2; +} + +struct A {}; + +A a; + +A source() {return A();} +A* sourcep() {return 0;} + +int main() +{ + test1<true, false>(a); + test1<false, true>(source()); + test2<false, true>(a); // { dg-error "lvalue" } + test2<false, true>(source()); + test3<false, true>(&a); + test3<false, true>(sourcep()); + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/trailing1.C b/gcc/testsuite/g++.dg/cpp0x/trailing1.C new file mode 100644 index 000000000..f637857b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/trailing1.C @@ -0,0 +1,117 @@ +// Tests for late-specified return type. +// { dg-options "-std=c++0x -fabi-version=5" } + +auto f() -> int +{ + return 0; +} + +template<class T, class U> +auto add(T t, U u) -> decltype (t+u) +{ + return t+u; +} + +template<class T, class U> +decltype(T()+U()) add2(T t, U u) +{ + return t+u; +} + +template <class T, class U> +U ag (T, U) +{ + return U(); +} + +template<class T, class U> +auto add3(T t, U u) -> decltype (ag(t,u)) +{ + return ag(t,u); +} + +template<class T, class U> +decltype(*(T*)0+*(U*)0) add4(T t, U u) +{ + return t+u; +} + +template <class T> +struct A +{ + T f() {} + template <class U> + T g() {} + template <class V> + struct B + { + int MEM; + }; +}; + +template <class T> +auto f(T* t) -> decltype (t->f()) +{ + return t->f(); +} + +template <class T> +auto g(T t) -> decltype (t.f()) +{ + return t.f(); +} + +template <class T, class U> +auto h(T t, U u) -> decltype (t.template g<U>()) +{ + return t.template g<U>(); +} + +struct D { }; +struct C: public A<int>::B<D> +{ +}; + +template <class T, class U, class V> +auto k(T t, U u, V v) -> decltype (t.U::template B<V>::MEM) +{ + return t.U::template B<V>::MEM; +} + +template <class T> +auto l(T t) -> decltype (t) +{ + return t; +} + +template <class T, T u> +auto m(T t) -> decltype (u) +{ + return t; +} + +A<int> a, *p; + +int main() +{ + // { dg-final { scan-assembler "_Z3addIidEDTplfp_fp0_ET_T0_" } } + auto i = add(1, 2.0); + // { dg-final { scan-assembler "_Z4add4IidEDTpldecvPT_Li0EdecvPT0_Li0EES0_S2_" } } + auto i4 = add4(1, 2.0); + // { dg-final { scan-assembler "_Z4add2IidEDTplcvT__EcvT0__EES0_S1_" } } + auto i2 = add2(1, 2.0); + // { dg-final { scan-assembler "_Z4add3IidEDTcl2agfp_fp0_EET_T0_" } } + auto i3 = add3(1, 2.0); + // { dg-final { scan-assembler "_Z1fI1AIiEEDTclptfp_1fEEPT_" } } + f(p); + // { dg-final { scan-assembler "_Z1gI1AIiEEDTcldtfp_1fEET_" } } + g(a); + // { dg-final { scan-assembler "_Z1hI1AIiEdEDTcldtfp_1gIT0_EEET_S2_" } } + h(a,1.0); + // { dg-final { scan-assembler "_Z1kI1C1AIiE1DEDtdtfp_srNT0_1BIT1_EE3MEMET_S4_S6_" } } + k( C(), A<int>(), D() ); + // { dg-final { scan-assembler "_Z1lIiEDtfp_ET_" } } + l(1); + // { dg-final { scan-assembler "_Z1mIiLi1EEDtT0_ET_" } } + m<int,1>(1); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/trailing2.C b/gcc/testsuite/g++.dg/cpp0x/trailing2.C new file mode 100644 index 000000000..e45204fe7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/trailing2.C @@ -0,0 +1,16 @@ +// PR c++/37967 +// Negative test for auto +// { dg-options "-std=c++0x" } + +auto f1 () -> int; +auto f2 (); // { dg-error "without late return type" } +int f3 () -> int; // { dg-error "late return type" } +auto *f4 () -> int; // { dg-error "late return type" } + +struct A +{ + auto f5 () const -> int; + auto f6 (); // { dg-error "without late return type" } + int f7 () -> int; // { dg-error "late return type" } + auto *f8 () -> int; // { dg-error "late return type" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/trailing3.C b/gcc/testsuite/g++.dg/cpp0x/trailing3.C new file mode 100644 index 000000000..82d36f0d0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/trailing3.C @@ -0,0 +1,63 @@ +// More auto/decltype mangling tests. +// { dg-options "-std=c++0x" } + +template <class T> +struct B +{ + static int i; +}; + +int&& x(); + +template <class T> +struct A +{ + static int i; + static int &ir; + static int &&irr; + template <class U> + auto f(U u) -> decltype (u + i); + template <class U> + auto fr(U u) -> decltype (u + ir); + template <class U> + auto frr(U u) -> decltype (u + irr); + template <class U> + auto g(U u) -> decltype (u + sizeof (i)); + template <class U> + auto h(U u) -> decltype (u + B<U>::i); + template <class U> + auto j(U u) -> decltype (u + x()); +}; + +template<class T> template<class U> +auto A<T>::f(U u) -> decltype (u + i) +{ + return u + i; +} + +template <class... Args> +int f (Args... args); + +template <class... Args> +auto g (Args... args) -> decltype (f ((args+1)...)) +{ + return (f ((args+1)...)); +} + +int main() +{ + // { dg-final { scan-assembler "_ZN1AIiE1fIiEEDTplfp_L_ZNS0_1iEEET_" } } + A<int>().f(1); + // { dg-final { scan-assembler "_ZN1AIiE2frIiEEDTplfp_L_ZNS0_2irEEET_" } } + A<int>().fr(1); + // { dg-final { scan-assembler "_ZN1AIiE3frrIiEEDTplfp_L_ZNS0_3irrEEET_" } } + A<int>().frr(1); + // { dg-final { scan-assembler "_ZN1AIiE1gIiEEDTplfp_szL_ZNS0_1iEEET_" } } + A<int>().g(1); + // { dg-final { scan-assembler "_ZN1AIiE1hIiEEDTplfp_sr1BIT_E1iES3_" } } + A<int>().h(1); + // { dg-final { scan-assembler "_ZN1AIiE1jIiEEDTplfp_clL_Z1xvEEET_" } } + A<int>().j(1); + // { dg-final { scan-assembler "_Z1gIIidEEDTcl1fspplfp_Li1EEEDpT_" } } + g(42, 1.0); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/trailing4.C b/gcc/testsuite/g++.dg/cpp0x/trailing4.C new file mode 100644 index 000000000..d67b3b611 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/trailing4.C @@ -0,0 +1,12 @@ +// PR c++/38597 +// { dg-options "-std=c++0x" } + +template<class T, class U> +auto f(T,U) -> decltype(T() + U()) +{ return T() + U(); } + +template<class T> void g(T){} // { dg-message "note" } + +int main() { g(f); } // { dg-error "no matching function" } +// { dg-message "candidate" "candidate note" { target *-*-* } 10 } + diff --git a/gcc/testsuite/g++.dg/cpp0x/trailing5.C b/gcc/testsuite/g++.dg/cpp0x/trailing5.C new file mode 100644 index 000000000..b97d362be --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/trailing5.C @@ -0,0 +1,10 @@ +// PR c++/38798, DR 770 +// { dg-options -std=c++0x } + +struct A {}; +auto foo() -> struct A {} + +enum B {}; +auto bar() -> enum B {} + +auto baz() -> struct C {} {} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp0x/trivial1.C b/gcc/testsuite/g++.dg/cpp0x/trivial1.C new file mode 100644 index 000000000..109c8ccdb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/trivial1.C @@ -0,0 +1,86 @@ +// { dg-options "-std=c++0x" } + +// [basic.types]/10: +// Scalar types, trivial class types (Clause 9), arrays of such types and +// cv-qualified versions of these types (3.9.3) are collectively called +// trivial types. + +// [class]/6: +// A trivially copyable class is a class that: +// * has no non-trivial copy constructors (12.8), +// * has no non-trivial copy assignment operators (13.5.3, 12.8), and +// * has a trivial destructor (12.4). +// A trivial class is a class that has a trivial default constructor (12.1) +// and is trivially copyable. + +#include <type_traits> + +#define TRY(expr) static_assert (expr, #expr) +#define YES(type) TRY(std::is_trivial<type>::value); \ + TRY(std::is_trivial<type[]>::value); \ + TRY(std::is_trivial<const volatile type>::value); +#define NO(type) TRY(!std::is_trivial<type>::value); \ + TRY(!std::is_trivial<type[]>::value); \ + TRY(!std::is_trivial<const volatile type>::value); + +struct A; + +YES(int); +YES(__complex int); +YES(void *); +YES(int A::*); +typedef int (A::*pmf)(); +YES(pmf); + +struct A { ~A(); }; +NO(A); +struct F: public A { int i; }; +NO(F); +struct G: public A { A a; }; +NO(G); +struct M { A a; }; +NO(M); + +class B +{ + int i; + __complex int c; + void *p; + double ar[4]; + int A::* pm; + int (A::*pmf)(); +}; +YES(B); +struct D: public B { }; +YES(D); +struct E: public B { int q; }; +YES(E); +struct D2: public B { }; +YES(D2); +struct I: public D, public D2 { }; +YES(I); + +struct C +{ + int i; +private: + int j; +}; +YES(C); +struct H: public C { }; +YES(H); +struct N { C c; }; +YES(N); + +struct J { virtual void f(); }; +struct J2: J { }; +NO(J); +NO(J2); +struct K { }; +struct L: virtual K {}; +YES(K); +NO(L); + +// PR c++/41421 +struct O { O(int); }; +NO(O); diff --git a/gcc/testsuite/g++.dg/cpp0x/union1.C b/gcc/testsuite/g++.dg/cpp0x/union1.C new file mode 100644 index 000000000..291853d5a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/union1.C @@ -0,0 +1,34 @@ +// Negative test for C++0x unrestricted unions +// { dg-options -std=c++0x } +// { dg-prune-output "implicitly deleted because" } + +struct A +{ + A(); + A(const A&); + ~A(); +}; + +union B +{ + A a; // { dg-error "union member" } +}; + +B b; // { dg-error "B::B\\(\\)" } +B b2(b); // { dg-error "B::B\\(const B&\\)" } + +struct C +{ + union + { + A a; // { dg-error "union member" } + }; +}; + +C c; // { dg-error "C::C\\(\\)" } +C c2(c); // { dg-error "C::C\\(const C&\\)" } + +// { dg-error "B::~B" "" { target *-*-* } 17 } +// { dg-error "B::~B" "" { target *-*-* } 18 } +// { dg-error "C::~C" "" { target *-*-* } 28 } +// { dg-error "C::~C" "" { target *-*-* } 29 } diff --git a/gcc/testsuite/g++.dg/cpp0x/union2.C b/gcc/testsuite/g++.dg/cpp0x/union2.C new file mode 100644 index 000000000..4f193e281 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/union2.C @@ -0,0 +1,34 @@ +// Positive test for C++0x unrestricted unions +// { dg-options -std=c++0x } + +struct A +{ + A(); + A(const A&); + ~A(); +}; + +union B +{ + A a; + B(); + B(const B&); + ~B(); +}; + +B b; +B b2(b); + +struct C +{ + union + { + A a; + }; + C(); + C(const C&); + ~C(); +}; + +C c; +C c2(c); diff --git a/gcc/testsuite/g++.dg/cpp0x/union3.C b/gcc/testsuite/g++.dg/cpp0x/union3.C new file mode 100644 index 000000000..f1e8ddb61 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/union3.C @@ -0,0 +1,69 @@ +// Runtime test for C++0x unrestricted unions +// { dg-options -std=c++0x } +// { dg-do run } + +int c, d; +struct A +{ + int i; + A(): i(1) { ++c; } + A(const A&): i(2) { ++c; } + ~A() { ++d; } +}; + +union B +{ + A a; + B() { } + B(const B& b) { } + ~B() { } +}; + +struct C +{ + union { A a; }; + C() { } + C(const C&) { } + ~C() { } +}; + +union D +{ + A a; + D(): a() { } + D(const D& d): a(d.a) { } + ~D() { a.~A(); } +}; + +struct E +{ + union { A a; }; + E(): a() { } + E(const E& e): a (e.a) { } + ~E() { a.~A(); } +}; + +int main() +{ + { + B b1; + B b2(b1); + + C c1; + C c2(c1); + } + + if (c != 0 || d != 0) + return c+d*10; + + { + D d1; + D d2(d1); + + E e1; + E e2(e1); + } + + if (c != 4 || d != 4) + return c*100+d*1000; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/union4.C b/gcc/testsuite/g++.dg/cpp0x/union4.C new file mode 100644 index 000000000..07050475d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/union4.C @@ -0,0 +1,17 @@ +// PR c++/48537 +// { dg-options -std=c++0x } + +struct SFoo +{ + SFoo() =delete; // { dg-error "declared" } +}; + +union UFoo // { dg-error "deleted" } +{ + SFoo foo; +}; + +int main() +{ + UFoo(); // { dg-error "deleted" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/union5.C b/gcc/testsuite/g++.dg/cpp0x/union5.C new file mode 100644 index 000000000..423b34823 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/union5.C @@ -0,0 +1,23 @@ +// PR c++/49803 +// { dg-options -std=c++0x } + +struct X +{ + X() = delete; +}; + +union Y +{ + // N3291=11-0061 12.6.2/8 says no initialization of + // of other variant members (i.e. m_x) should + // be performed. + Y() : m_char1{ } + { } + + struct + { + char m_char1; + }; + + X m_x; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/unnamed_refs.C b/gcc/testsuite/g++.dg/cpp0x/unnamed_refs.C new file mode 100644 index 000000000..c59667645 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/unnamed_refs.C @@ -0,0 +1,35 @@ +// I, Howard Hinnant, hereby place this code in the public domain. + +// Test: Unamed rvalue references are treated as lvalues. + +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <bool> struct sa; +template <> struct sa<true> {}; + +struct one {long x[1];}; +struct two {long x[2];}; + +struct A {}; + +one foo(const A&) {return one();} +two foo(A&&) {return two();} + +template<typename _Tp> +inline _Tp&& +movel(_Tp& __t) +{ return static_cast<_Tp&&>(__t); } + +A&& source() {static A a; return movel(a);} + +int test1() +{ + sa<sizeof(foo(source())) == 2 * sizeof(long)> t1; + return 0; +} + +int main() +{ + return test1(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-104.C b/gcc/testsuite/g++.dg/cpp0x/variadic-104.C new file mode 100644 index 000000000..c693b33f9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-104.C @@ -0,0 +1,16 @@ +// PR c++/45236 +// { dg-options -std=c++0x } + +template <class T, class S> class foo; + +template<template<int...> class C, int... II, class S> +struct foo<C<II...>,S> +{ + template <class U> + struct bar { typedef int type; }; +}; + +template <int... I> +struct A {}; + +foo<A<3>, float>::bar<int> x; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-bind.C b/gcc/testsuite/g++.dg/cpp0x/variadic-bind.C new file mode 100644 index 000000000..abe445d43 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-bind.C @@ -0,0 +1,476 @@ +// { dg-do run } +// { dg-options "-std=gnu++0x" } +// A basic implementation of TR1's bind using variadic teplates +// Contributed by Douglas Gregor <doug.gregor@gmail.com> +#include <cassert> + +// Trivial reference_wrapper +template<typename T> +struct reference_wrapper +{ + reference_wrapper(T& x) : ptr(&x) { } + + operator T&() const { return *ptr; } + + T& get() const { return *ptr; } + + T* ptr; +}; + +template<typename T> reference_wrapper<T> ref(T& x) { return x; } +template<typename T> reference_wrapper<const T> cref(const T& x) { return x; } + +// Simple type-traits we'll need +template<typename T> +struct add_reference +{ + typedef T& type; +}; + +template<typename T> +struct add_reference<T&> +{ + typedef T& type; +}; + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +// For creating the constructor parameters of tuple<> +template<typename T> +struct add_const_reference +{ + typedef const T& type; +}; + +template<typename T> +struct add_const_reference<T&> +{ + typedef T& type; +}; + +// 6.1.3 Class template tuple: Needed for bind() implementation +template<typename... Values> +class tuple; + +template<> class tuple<> { }; + +template<typename Head, typename... Tail> +class tuple<Head, Tail...> + : private tuple<Tail...> +{ + typedef tuple<Tail...> inherited; + + public: + tuple() { } + + // implicit copy-constructor is okay + + tuple(typename add_const_reference<Head>::type v, + typename add_const_reference<Tail>::type... vtail) + : m_head(v), inherited(vtail...) { } + + template<typename... VValues> + tuple(const tuple<VValues...>& other) + : m_head(other.head()), inherited(other.tail()) { } + + template<typename... VValues> + tuple& operator=(const tuple<VValues...>& other) + { + m_head = other.head(); + tail() = other.tail(); + return *this; + } + + typename add_reference<Head>::type head() { return m_head; } + typename add_reference<const Head>::type head() const { return m_head; } + inherited& tail() { return *this; } + const inherited& tail() const { return *this; } + + protected: + Head m_head; +}; + +template<typename T> +struct make_tuple_result +{ + typedef T type; +}; + +template<typename T> +struct make_tuple_result<reference_wrapper<T> > +{ + typedef T& type; +}; + +// 6.1.3.2 Tuple creation functions +struct ignore_t { + template<typename T> ignore_t& operator=(const T&) { return *this; } +} ignore; + +template<typename... Values> +tuple<typename make_tuple_result<Values>::type...> +make_tuple(const Values&... values) +{ + return tuple<typename make_tuple_result<Values>::type...>(values...); +} + +template<typename... Values> +tuple<Values&...> tie(Values&... values) +{ + return tuple<Values&...>(values...); +} + +// 6.1.3.3 Tuple helper classes +template<typename Tuple> +struct tuple_size; + +template<> +struct tuple_size<tuple<> > +{ + static const __SIZE_TYPE__ value = 0; +}; + +template<typename Head, typename... Tail> +struct tuple_size<tuple<Head, Tail...> > +{ + static const __SIZE_TYPE__ value = 1 + tuple_size<tuple<Tail...> >::value; +}; + +template<int I, typename Tuple> +struct tuple_element; + +template<int I, typename Head, typename... Tail> +struct tuple_element<I, tuple<Head, Tail...> > +{ + typedef typename tuple_element<I-1, tuple<Tail...> >::type type; +}; + +template<typename Head, typename... Tail> +struct tuple_element<0, tuple<Head, Tail...> > +{ + typedef Head type; +}; + +// 6.1.3.4 Element access +template<int I, typename Tuple> +class get_impl; + +template<int I, typename Head, typename... Values> +class get_impl<I, tuple<Head, Values...> > +{ + typedef typename tuple_element<I-1, tuple<Values...> >::type Element; + typedef typename add_reference<Element>::type RJ; + typedef typename add_const_reference<Element>::type PJ; + typedef get_impl<I-1, tuple<Values...> > Next; + + public: + static RJ get(tuple<Head, Values...>& t) + { return Next::get(t.tail()); } + + static PJ get(const tuple<Head, Values...>& t) + { return Next::get(t.tail()); } +}; + +template<typename Head, typename... Values> +class get_impl<0, tuple<Head, Values...> > +{ + typedef typename add_reference<Head>::type RJ; + typedef typename add_const_reference<Head>::type PJ; + + public: + static RJ get(tuple<Head, Values...>& t) { return t.head(); } + static PJ get(const tuple<Head, Values...>& t) { return t.head(); } +}; + +template<int I, typename... Values> +typename add_reference< + typename tuple_element<I, tuple<Values...> >::type + >::type +get(tuple<Values...>& t) +{ + return get_impl<I, tuple<Values...> >::get(t); +} + +template<int I, typename... Values> +typename add_const_reference< + typename tuple_element<I, tuple<Values...> >::type + >::type +get(const tuple<Values...>& t) +{ + return get_impl<I, tuple<Values...> >::get(t); +} + +// 6.1.3.5 Relational operators +inline bool operator==(const tuple<>&, const tuple<>&) { return true; } + +template<typename T, typename... TTail, typename U, typename... UTail> +bool operator==(const tuple<T, TTail...>& t, const tuple<U, UTail...>& u) +{ + return t.head() == u.head() && t.tail() == u.tail(); +} + +template<typename... TValues, typename... UValues> +bool operator!=(const tuple<TValues...>& t, const tuple<UValues...>& u) +{ + return !(t == u); +} + +inline bool operator<(const tuple<>&, const tuple<>&) { return false; } + +template<typename T, typename... TTail, typename U, typename... UTail> +bool operator<(const tuple<T, TTail...>& t, const tuple<U, UTail...>& u) +{ + return (t.head() < u.head() || + (!(t.head() < u.head()) && t.tail() < u.tail())); +} + +template<typename... TValues, typename... UValues> +bool operator>(const tuple<TValues...>& t, const tuple<UValues...>& u) +{ + return u < t; +} + +template<typename... TValues, typename... UValues> +bool operator<=(const tuple<TValues...>& t, const tuple<UValues...>& u) +{ + return !(u < t); +} + +template<typename... TValues, typename... UValues> +bool operator>=(const tuple<TValues...>& t, const tuple<UValues...>& u) +{ + return !(t < u); +} + +// enable_if, the breakfast of champions +template<bool Cond, typename Type = void> +struct enable_if { + typedef Type type; +}; + +template<typename Type> +struct enable_if<false, Type> { }; + +// 3.6 Function object binders + +// 3.6.1 Class template is_bind_expression +template<typename T> +struct is_bind_expression { + static const bool value = false; +}; + +// 3.6.2 Class template is_placeholder +template<typename T> +struct is_placeholder { + static const int value = 0; +}; + +// 3.6.3 Function template bind +template<int I> struct placeholder {} ; + +template<int N> struct int_c { }; + +// A tuple of integer values +template<int...> struct int_tuple {}; + +// make_indexes_impl is a helper for make_indexes +template<int I, typename IntTuple, typename... Types> +struct make_indexes_impl; + + +template<int I, int... Indexes, typename T, typename... Types> +struct make_indexes_impl<I, int_tuple<Indexes...>, T, Types...> +{ + typedef typename make_indexes_impl<I+1, + int_tuple<Indexes..., I>, + Types...>::type type; +}; + +template<int I, int... Indexes> +struct make_indexes_impl<I, int_tuple<Indexes...> > { + typedef int_tuple<Indexes...> type; +}; + +// make_indexes takes a variable-length number of N types and +// generates an int_tuple that contains <0, 1, 2, ..., N-1>. These can +// be used as indexes for tuple's get or tuple_element operation. +template<typename... Types> +struct make_indexes : make_indexes_impl<0, int_tuple<>, Types...> { }; + +// Get the Ith tuple element, but only if I is in bounds. +template<int I, typename Tuple, typename = void> +struct safe_tuple_element{ }; + +template<int I, typename... Values> +struct safe_tuple_element<I, tuple<Values...>, + typename enable_if<(I >= 0 && + I < tuple_size<tuple<Values...> >::value) + >::type> +{ + typedef typename tuple_element<I, tuple<Values...> >::type type; +}; + +// mu maps a bound argument to an actual argument, given a tuple of +// the arguments passed to the function object returned by bind(). + +// Return the stored reference from reference_wrapper +template<typename T, typename... Args> +inline T& mu(reference_wrapper<T>& bound_arg, const tuple<Args&...>&) +{ + return bound_arg.get(); +} + +// Unwrap a tuple into separate arguments and forward to the function +// object f. +template<typename F, int... Indexes, typename... Args> +inline typename F::result_type +unwrap_and_forward(F& f, int_tuple<Indexes...>, const tuple<Args&...>& args) +{ + return f(get<Indexes>(args)...); +} + +// Evaluate the inner bind expression +template<typename Bound, typename... Args> +inline typename enable_if<is_bind_expression<Bound>::value, + typename Bound::result_type>::type +mu(Bound& bound_arg, const tuple<Args&...>& args) +{ + typedef typename make_indexes<Args...>::type Indexes; + return unwrap_and_forward(bound_arg, Indexes(), args); +} + +// Retrieve the Ith argument from args +template<typename Bound, typename... Args> +inline typename safe_tuple_element<is_placeholder<Bound>::value - 1, + tuple<Args...> >::type +mu(Bound& bound_arg, const tuple<Args&...>& args) +{ + return get<is_placeholder<Bound>::value-1>(args); +} + +// Return the stored value. +template<typename T> +struct is_reference_wrapper { + static const bool value = false; +}; + +template<typename T> +struct is_reference_wrapper<reference_wrapper<T> > { + static const bool value = true; +}; + +template<typename Bound, typename... Args> +inline typename enable_if<(!is_bind_expression<Bound>::value + && !is_placeholder<Bound>::value + && !is_reference_wrapper<Bound>::value), + Bound&>::type +mu(Bound& bound_arg, const tuple<Args&...>&) +{ + return bound_arg; +} + +// +template<typename F, typename... BoundArgs, int... Indexes, typename... Args> +typename F::result_type +apply_functor(F& f, tuple<BoundArgs...>& bound_args, int_tuple<Indexes...>, + const tuple<Args&...>& args) +{ + return f(mu(get<Indexes>(bound_args), args)...); +} + +template<typename F, typename... BoundArgs> +class bound_functor +{ + typedef typename make_indexes<BoundArgs...>::type indexes; + + public: + typedef typename F::result_type result_type; + + explicit bound_functor(const F& f, const BoundArgs&... bound_args) + : f(f), bound_args(bound_args...) { } + + template<typename... Args> + typename F::result_type operator()(Args&... args) { + return apply_functor(f, bound_args, indexes(), tie(args...)); + } + + private: + F f; + tuple<BoundArgs...> bound_args; +}; + +template<typename F, typename... BoundArgs> +struct is_bind_expression<bound_functor<F, BoundArgs...> > { + static const bool value = true; +}; + +template<typename F, typename... BoundArgs> +inline bound_functor<F, BoundArgs...> +bind(const F& f, const BoundArgs&... bound_args) +{ + return bound_functor<F, BoundArgs...>(f, bound_args...); +} + + +// 3.6.4 Placeholders +template<int I> +struct is_placeholder<placeholder<I> > { + static const int value = I; +}; + +placeholder<1> _1; +placeholder<2> _2; +placeholder<3> _3; +placeholder<4> _4; +placeholder<5> _5; +placeholder<6> _6; +placeholder<7> _7; +placeholder<8> _8; +placeholder<9> _9; + +// Test code +template<typename T> +struct plus { + typedef T result_type; + + T operator()(T x, T y) { return x + y; } +}; + +template<typename T> +struct multiplies { + typedef T result_type; + + T operator()(T x, T y) { return x * y; } +}; + +template<typename T> +struct negate { + typedef T result_type; + + T operator()(T x) { return -x; } +}; + +int main() +{ + int seventeen = 17; + int forty_two = 42; + + assert(bind(plus<int>(), _1, _2)(seventeen, forty_two) == 59); + assert(bind(plus<int>(), _1, _1)(seventeen, forty_two) == 34); + assert(bind(plus<int>(), _2, _1)(seventeen, forty_two) == 59); + assert(bind(plus<int>(), 5, _1)(seventeen, forty_two) == 22); + assert(bind(plus<int>(), ref(seventeen), _2)(seventeen, forty_two) == 59); + assert(bind(plus<int>(), bind(multiplies<int>(), 3, _1), _2)(seventeen, forty_two) + == 93); + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-crash1.C b/gcc/testsuite/g++.dg/cpp0x/variadic-crash1.C new file mode 100644 index 000000000..f26aee2a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-crash1.C @@ -0,0 +1,72 @@ +// { dg-options "-std=gnu++0x" } + +#define ONE +#define TWO +#define THREE + +struct Something {}; +Something ___; + +template <class F> +struct Trial +{ + F f; +public: + Trial() : f() {} + Trial( const F& ff ) : f(ff) { } + template <typename... Args> + struct Sig { typedef int ResultType; }; + + template <typename... Args> + struct Sig<Something,Args...> { typedef int ResultType; }; + +#ifdef ONE + +template <typename... Args> +typename Sig<Something,Args...>::ResultType operator()(const Something& s, const Args&... args) const +{ + return f(args...); +} +#endif +#ifdef TWO +template <typename... Args> +typename Sig<Args...>::ResultType operator()(const Args&... args) const +{ + return f(args...); +} +#endif +}; + +struct Internal +{ + +template <typename... Args> +struct Sig { typedef int ResultType; }; + +template <typename... Args> +struct Sig<Something,Args...> { typedef int ResultType; }; + +template <typename... Args> +int operator()(const Args&... args) const +{ + int n = sizeof...(Args); + return n; +} + + static Trial<Internal>& full() { static Trial<Internal> f; return f; } +}; + +static Trial<Internal>& internal = Internal::full(); + +int main() +{ + int n = 0; +#ifdef ONE + n = internal(___,1,2); +#endif +#ifdef THREE + n = internal(___,1,2,3); + n = internal(___,1,2,3,4); +#endif + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-crash2.C b/gcc/testsuite/g++.dg/cpp0x/variadic-crash2.C new file mode 100644 index 000000000..f46b8e534 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-crash2.C @@ -0,0 +1,20 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/39637 +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template<class... Types> +void +f(Types...) +{ + enum {e = sizeof(Types)}; // { dg-error "parameter packs not expanded with '...'" } + enum {e1 = sizeof...(Types)}; +} + +int +main() +{ + f(0); +} + +// { dg-message "note" "Types" { target *-*-* } 10 } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex1.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex1.C new file mode 100644 index 000000000..485fffa47 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex1.C @@ -0,0 +1,4 @@ +// { dg-options "-std=gnu++0x" } +template<typename ... Elements> class Tuple; +Tuple<>* t; // OK: Elements is empty +Tuple* u; // { dg-error "template-name" } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex10.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex10.C new file mode 100644 index 000000000..a392bd7d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex10.C @@ -0,0 +1,9 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Types> struct Tuple { }; + +Tuple<> t0; // Types contains no arguments +Tuple<int> t1; // Types contains one argument: int +Tuple<int, float> t2; // Types contains two arguments: int and float +Tuple<0> error; // { dg-error "mismatch" } +// { dg-error "expected a type" "" { target *-*-* } 7 } +// { dg-error "in declaration" "" { target *-*-* } 7 } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex11.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex11.C new file mode 100644 index 000000000..57ef2a3d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex11.C @@ -0,0 +1,9 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Types> + void f(Types... args); + +void g() { + f(); // okay: args contains no arguments + f(1); // okay: args contains one int argument + (2, 1.0); // okay: args contains two arguments, an int and a double +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex12.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex12.C new file mode 100644 index 000000000..b97df3102 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex12.C @@ -0,0 +1,8 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Types> + void f(Types... rest); + +template<typename... Types> + void g(Types... rest) { + f(&rest...); // ``&rest...'' is a pack expansion, ``&rest'' is its pattern + } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex13.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex13.C new file mode 100644 index 000000000..b742cb1d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex13.C @@ -0,0 +1,39 @@ +// { dg-options "-std=gnu++0x" } + +template<typename T, typename U> struct is_same { + static const bool value = false; +}; + +template<typename T> struct is_same<T, T> { + static const bool value = true; +}; + +template<typename...> struct Tuple {}; +template<typename T1, typename T2> struct Pair {}; + +template<typename... Args1> + struct zip { + template<typename... Args2> + struct with { + typedef Tuple<Pair<Args1, Args2>...> type; // { dg-error "mismatched argument pack" } + }; + }; + +static_assert + (is_same<zip<short, int>::with<unsigned short, unsigned>::type, + Tuple<Pair<short, unsigned short>, Pair<int, unsigned> > >::value, + "zip"); + +typedef zip<short>::with<unsigned short, unsigned>::type T2; // error: different number of arguments specified + // for Args1 and Args2 + +template<typename... Args> void f(Args...); + +template<typename... Args> void g(Args... args) +{ + f(const_cast<const Args*>(&args)...); // okay: ``Args'' and ``args'' are expanded + f(5 ...); // { dg-error "contains no argument packs" } + f(args); // { dg-error "parameter packs not expanded" } + // { dg-message "args" "note" { target *-*-* } 36 } + f(h(args...) + args...); // okay: first ``args'' expanded within h, second ``args'' expanded within f. +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex14.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex14.C new file mode 100644 index 000000000..f33ca0e86 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex14.C @@ -0,0 +1,19 @@ +// { dg-options "-std=gnu++0x" } + +template<class T> class A { /* ... */ }; +template<class T, class U = T> class B { /* ... */ }; +template<class... Types> class C { /* ... */ }; + +template<template<class> class P> class X { /* ... */ }; +template<template<class...> class Q> class Y { /* ... */ }; + +X<A> xA; // okay +X<B> xB; // { dg-error "mismatch" } +// { dg-error "expected a template" "" { target *-*-* } 11 } +// { dg-error "invalid type" "" { target *-*-* } 11 } +X<C> xC; // { dg-error "mismatch" } +// { dg-error "expected a template" "" { target *-*-* } 14 } +// { dg-error "invalid type" "" { target *-*-* } 14 } +Y<A> yA; +Y<B> yB; +Y<C> yC; // okay diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex2.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex2.C new file mode 100644 index 000000000..ca5fa2716 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex2.C @@ -0,0 +1,8 @@ +// { dg-options "-std=gnu++0x" } +template<class... Types> struct B { // { dg-error "declaration of" } + void f3(); + void f4(); +}; + +template<class... Types> void B<Types...>::f3() { } // OK +template<class... Types> void B<Types>::f4() { } // { dg-error "invalid" } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex3.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex3.C new file mode 100644 index 000000000..bd973055d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex3.C @@ -0,0 +1,11 @@ +// { dg-options "-std=gnu++0x" } +template<class X, class Y, class... Z> X f(Y); // { dg-message "note" } +void g() +{ + int i = f<int>(5.6); + int j = f(5.6); // { dg-error "no matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 6 } + f<void>(f<int, bool>); + f<void>(f<int>); // { dg-error "no matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 9 } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex4.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex4.C new file mode 100644 index 000000000..5bf211696 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex4.C @@ -0,0 +1,13 @@ +// { dg-options "-std=gnu++0x" } +template<class X, class Y, class Z> X f(Y,Z); // { dg-message "note" } +template<class... Args> void f2(); +void g() +{ + f<int,const char*,double>("aa",3.0); + f<int,const char*>("aa",3.0); // Z is deduced to be double + f<int>("aa",3.0); // Y is deduced to be char*, and + // Z is deduced to be double + f("aa",3.0); // { dg-error "no matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 10 } + f2<char, short, int, long>(); // okay +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex5.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex5.C new file mode 100644 index 000000000..2439a51c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex5.C @@ -0,0 +1,7 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Types> void f(Types... values); + +void g() +{ + f<int*, float*>(0, 0, 0); // Types is deduced to the sequence int*, float*, int +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex6.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex6.C new file mode 100644 index 000000000..87b1bf205 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex6.C @@ -0,0 +1,13 @@ +// { dg-options "-std=gnu++0x" } +template<class...> struct Tuple { }; + +template<class... Types> void f(Types&...); +template<class... Types1, class... Types2> void g(Tuple<Types1...>, Tuple<Types2...>); + +void h(int x, float& y) +{ + const int z = x; + f(x, y, z); // Types is deduced to int, const int, float + g(Tuple<short, int, long>(), Tuple<float, double>()); // Types1 is deduced to short, int long + // Types2 is deduced to float, double +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex7.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex7.C new file mode 100644 index 000000000..7ca31f9c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex7.C @@ -0,0 +1,13 @@ +// { dg-options "-std=gnu++0x" } +template<typename...> struct Tuple { }; +template<typename... Types> char& g(Tuple<Types...>); // #1 +template<typename T1, typename... Types> short& g(Tuple<T1, Types...>); // #2 +template<typename T1, typename... Types> int& g(Tuple<T1, Types&...>); // #3 + +void f() { + // char& x1 = g(Tuple<>()); // calls #1 + short& y1 = g(Tuple<int, float>()); // calls #2 + // int& z1 = g(Tuple<int, float&>()); // calls #3 + // int& z2 = g(Tuple<int>()); // calls #3 + // int& z3 = g(Tuple<int>()); // calls #3 +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex8.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex8.C new file mode 100644 index 000000000..03d28b825 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex8.C @@ -0,0 +1,18 @@ +// { dg-options "-std=gnu++0x" } +template<class> struct X { static const bool primary = true; }; +template<class R, class... ArgTypes> struct X<R(int, ArgTypes...)> { + static const bool primary = false; +}; +template<class... Types> struct Y { static const bool primary = true; }; +template<class T, class... Types> struct Y<T, Types&...> { + static const bool primary = false; +}; + +static_assert (X<int>::primary, "uses primary template"); +static_assert (!X<int(int, float, double)>::primary, + "uses partial specialization"); +static_assert (X<int(float, int)>::primary, "uses primary template"); +static_assert (Y<>::primary, "uses primary template"); +static_assert (!Y<int&, float&, double&>::primary, + "uses partial specialization"); +static_assert (Y<int, float, double>::primary, "uses primary template"); diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex9.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex9.C new file mode 100644 index 000000000..74215c997 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex9.C @@ -0,0 +1,10 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Args> char& f(Args... args); // #1 +template<typename T1, typename... Args> short& f(T1 a1, Args... args); // #2 +template<typename T1, typename T2> int& f(T1 a2, T2 a3); // #3 + +void g() { + char& x = f(); // calls #1 + short& y = f(1, 2, 3); // calls #2 + int& z = f(1, 2); // calls #3 +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-function.C b/gcc/testsuite/g++.dg/cpp0x/variadic-function.C new file mode 100644 index 000000000..eeb137705 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-function.C @@ -0,0 +1,96 @@ +// { dg-do run } +// { dg-options "-std=gnu++0x" } +// A basic implementation of TR1's function using variadic teplates +// Contributed by Douglas Gregor <doug.gregor@gmail.com> +#include <cassert> + +template<typename Signature> +class function; + +template<typename R, typename... Args> +class invoker_base +{ + public: + virtual ~invoker_base() { } + virtual R invoke(Args...) = 0; + virtual invoker_base* clone() = 0; +}; + +template<typename F, typename R, typename... Args> +class functor_invoker : public invoker_base<R, Args...> +{ + public: + explicit functor_invoker(const F& f) : f(f) { } + R invoke(Args... args) { return f(args...); } + functor_invoker* clone() { return new functor_invoker(f); } + + private: + F f; +}; + +template<typename R, typename... Args> +class function<R (Args...)> { + public: + typedef R result_type; + + function() : invoker (0) { } + + function(const function& other) : invoker(0) { + if (other.invoker) + invoker = other.invoker->clone(); + } + + template<typename F> + function(const F& f) : invoker(0) { + invoker = new functor_invoker<F, R, Args...>(f); + } + + ~function() { + if (invoker) + delete invoker; + } + + function& operator=(const function& other) { + function(other).swap(*this); + return *this; + } + + template<typename F> + function& operator=(const F& f) { + function(f).swap(*this); + return *this; + } + + void swap(function& other) { + invoker_base<R, Args...>* tmp = invoker; + invoker = other.invoker; + other.invoker = tmp; + } + + result_type operator()(Args... args) const { + assert(invoker); + return invoker->invoke(args...); + } + + private: + invoker_base<R, Args...>* invoker; +}; + +struct plus { + template<typename T> T operator()(T x, T y) { return x + y; } +}; + +struct multiplies { + template<typename T> T operator()(T x, T y) { return x * y; } +}; + +int main() +{ + function<int(int, int)> f1 = plus(); + assert(f1(3, 5) == 8); + + f1 = multiplies(); + assert(f1(3, 5) == 15); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-init.C b/gcc/testsuite/g++.dg/cpp0x/variadic-init.C new file mode 100644 index 000000000..34ade85e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-init.C @@ -0,0 +1,56 @@ +// { dg-do run } +// { dg-options "-std=gnu++0x" } + +// PR c++/33510 +#define SIZE_FROM_CTOR +extern "C" void abort (); + +template<int M, int N> struct pair +{ + int i, j; + pair () : i (M), j (N) {} +}; + +template<int... M> struct S +{ + template<int... N> static int *foo () + { +#ifdef SIZE_FROM_CTOR + static int x[] = { (M + N)..., -1 }; +#else + static int x[1 + sizeof... N] = { (M + N)..., -1 }; +#endif + return x; + } +}; + +template<typename... M> struct R +{ + template<typename... N> static int *foo () + { +#ifdef SIZE_FROM_CTOR + static int x[] = { (sizeof(M) + sizeof(N))..., -1 }; +#else + static int x[1 + sizeof... N] = { (sizeof(M) + sizeof(N))..., -1 }; +#endif + return x; + } +}; + +int *bar () +{ + return S<0, 1, 2>::foo<0, 1, 2> (); +} + +int *baz () +{ + return R<char, short, int>::foo<float, double, long> (); +} + + +int main () +{ + int *p = bar (); + if (p[0] != 0 || p[1] != 2 || p[2] != 4 || p[3] != -1) + abort (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-lambda.C b/gcc/testsuite/g++.dg/cpp0x/variadic-lambda.C new file mode 100644 index 000000000..705d44149 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-lambda.C @@ -0,0 +1,79 @@ +// { dg-options "-std=c++0x" } + +struct int_placeholder; + +template<typename T> +struct do_replace +{ + typedef T type; +}; + +template<> +struct do_replace<int_placeholder> +{ + typedef int type; +}; + +template<typename T> struct lambdalike +{ + typedef T type; +}; + +template<template<typename...> class TT, typename... Args> +struct lambdalike<TT<Args...> > { + typedef TT<typename do_replace<Args>::type...> type; +}; + + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +template<typename... Elements> struct tuple; +template<typename T1, typename T2> struct pair; + +static_assert(is_same<lambdalike<tuple<float, int_placeholder, double>>::type, + tuple<float, int, double>>::value, + "MPL lambda-like replacement on tuple"); +static_assert(is_same<lambdalike<pair<float, int_placeholder>>::type, + pair<float, int>>::value, + "MPL lambda-like replacement on pair"); + + +struct _1 {}; + +template<typename Arg0, typename Lambda> +struct eval +{ + typedef Lambda type; +}; + +template<typename Arg0> +struct eval<Arg0, _1> +{ + typedef Arg0 type; +}; + +template<typename Arg0, template<typename...> class T, typename... Pack> +struct eval<Arg0, T<Pack...> > +{ + typedef T< typename eval<Arg0, Pack>::type... > type; +}; + +static_assert(is_same<eval<int, tuple<float, _1, double>>::type, + tuple<float, int, double>>::value, "eval tuple"); +static_assert(is_same<eval<int, pair<_1, double>>::type, + pair<int, double>>::value, "eval pair"); +static_assert(is_same<eval<int, + tuple<pair<_1, _1>, pair<float, float>, + pair<double, _1>>>::type, + tuple<pair<int, int>, pair<float, float>, pair<double, int>>>::value, + "recursive eval"); diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-mem_fn.C b/gcc/testsuite/g++.dg/cpp0x/variadic-mem_fn.C new file mode 100644 index 000000000..51c5c79ef --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-mem_fn.C @@ -0,0 +1,50 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do run } +// A basic implementation of TR1's mem_fn using variadic teplates +// Contributed by Douglas Gregor <doug.gregor@gmail.com> +#include <cassert> + +template<typename R, typename Class, typename... Args> +class Mem_fn +{ + public: + explicit Mem_fn(R (Class::*pmf)(Args...)) : pmf(pmf) { } + + R operator()(Class& object, Args... args) + { + return (object.*pmf)(args...); + } + + R operator()(Class* object, Args... args) + { + return (object->*pmf)(args...); + } + + R (Class::*pmf)(Args...); +}; + +template<typename R, typename Class, typename... Args> +inline Mem_fn<R, Class, Args...> +mem_fn(R (Class::* pmf)(Args...)) +{ + return Mem_fn<R, Class, Args...>(pmf); +} + +class X { + public: + int negate(int x) { return -x; } + int plus(int x, int y) { return x + y; } +}; + +int main() +{ + X x; + X* xp = &x; + + assert(mem_fn(&X::negate)(x, 17) == -17); + assert(mem_fn(&X::negate)(xp, 17) == -17); + assert(mem_fn(&X::plus)(x, 17, 25) == 42); + assert(mem_fn(&X::plus)(xp, 17, 25) == 42); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-new.C b/gcc/testsuite/g++.dg/cpp0x/variadic-new.C new file mode 100644 index 000000000..5bbb9c81b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-new.C @@ -0,0 +1,19 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } +// Contributed by Peter Dimov +// PR c++/32597 +#include <assert.h> +#include <new> + +int k = 5; + +template< class... Args > void f( Args... args ) +{ + new( &k ) int( args... ); +} + +int main() +{ + f(); + assert( k == 0 ); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-new2.C b/gcc/testsuite/g++.dg/cpp0x/variadic-new2.C new file mode 100644 index 000000000..81d333398 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-new2.C @@ -0,0 +1,24 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } +// PR c++/32597 +#include <assert.h> +#include <new> + +template< class... Args > void f( Args... args ) +{ + { + int x = 17; + (void)x; + } + + { + int y(args...); + assert(y == 0); + } + +} + +int main() +{ + f(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-rref.C b/gcc/testsuite/g++.dg/cpp0x/variadic-rref.C new file mode 100644 index 000000000..08221b460 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-rref.C @@ -0,0 +1,36 @@ +// { dg-options "-std=c++0x" } +// PR c++/33939 +template<typename T> +struct refs_only; + +template<typename T> +struct refs_only<T &> +{}; + +template<typename T> +refs_only<T> foo( T && t) +{ + return refs_only<T>(); +} + +template<typename... T> +struct va_refs_only; + +template<typename T> +struct va_refs_only<T> + : refs_only<T> +{}; + +template<typename... T> +va_refs_only<T...> bar( T &&... t) +{ + return va_refs_only<T...>(); +} + +int main() +{ + int j = 0; + foo(j); + bar(j); // error: invalid use of incomplete type 'struct refs_only<int>' +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-throw.C b/gcc/testsuite/g++.dg/cpp0x/variadic-throw.C new file mode 100644 index 000000000..8363c2a73 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-throw.C @@ -0,0 +1,26 @@ +// { dg-options -std=c++0x } +// { dg-prune-output "note" } +// PR c++/33509 +template<int M, int N> struct pair +{ + int i, j; + pair() : i(M), j(N) {} +}; + +template<int... M> struct S +{ + template<int... N> static int foo() throw (pair <M, N>...) // { dg-error "mismatched" } + { + return 1; + } +}; + +int bar () +{ + return S<0, 1, 2>::foo<0, 1, 3> (); +} + +int wibble() +{ + return S<0, 1, 2>::foo<0, 1> (); // { dg-error "no matching" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ttp.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ttp.C new file mode 100644 index 000000000..41f1c1db4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ttp.C @@ -0,0 +1,12 @@ +// { dg-options -std=c++0x } +// PR c++/34101 +template<typename> struct A {}; + +template<template<typename> class...> struct B {}; + +template<template<typename> class T> void foo(const B<T>&); + +void bar() +{ + foo(B<A>()); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-tuple.C b/gcc/testsuite/g++.dg/cpp0x/variadic-tuple.C new file mode 100644 index 000000000..11ce14af2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-tuple.C @@ -0,0 +1,294 @@ +// { dg-do run } +// { dg-options "-std=gnu++0x" } +// An implementation of TR1's <tuple> using variadic teplates +// Contributed by Douglas Gregor <doug.gregor@gmail.com> + +#include <string> +#include <cassert> +#include <cstring> + +// Trivial reference_wrapper +template<typename T> +struct reference_wrapper +{ + reference_wrapper(T& x) : ptr(&x) { } + + operator T&() const { return *ptr; } + + T* ptr; +}; + +template<typename T> reference_wrapper<T> ref(T& x) { return x; } +template<typename T> reference_wrapper<const T> cref(const T& x) { return x; } + +// Simple type-traits we'll need +template<typename T> +struct add_reference +{ + typedef T& type; +}; + +template<typename T> +struct add_reference<T&> +{ + typedef T& type; +}; + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +// For creating the constructor parameters of tuple<> +template<typename T> +struct add_const_reference +{ + typedef const T& type; +}; + +template<typename T> +struct add_const_reference<T&> +{ + typedef T& type; +}; + +// 6.1.3 Class template tuple +template<typename... Values> +class tuple; + +template<> class tuple<> { }; + +template<typename Head, typename... Tail> +class tuple<Head, Tail...> + : private tuple<Tail...> +{ + typedef tuple<Tail...> inherited; + + public: + tuple() { } + + // implicit copy-constructor is okay + + tuple(typename add_const_reference<Head>::type v, + typename add_const_reference<Tail>::type... vtail) + : m_head(v), inherited(vtail...) { } + + template<typename... VValues> + tuple(const tuple<VValues...>& other) + : m_head(other.head()), inherited(other.tail()) { } + + template<typename... VValues> + tuple& operator=(const tuple<VValues...>& other) + { + m_head = other.head(); + tail() = other.tail(); + return *this; + } + + typename add_reference<Head>::type head() { return m_head; } + typename add_reference<const Head>::type head() const { return m_head; } + inherited& tail() { return *this; } + const inherited& tail() const { return *this; } + + protected: + Head m_head; +}; + +template<typename T> +struct make_tuple_result +{ + typedef T type; +}; + +template<typename T> +struct make_tuple_result<reference_wrapper<T> > +{ + typedef T& type; +}; + +// 6.1.3.2 Tuple creation functions +struct ignore_t { + template<typename T> ignore_t& operator=(const T&) { return *this; } +} ignore; + +template<typename... Values> +tuple<typename make_tuple_result<Values>::type...> +make_tuple(const Values&... values) +{ + return tuple<typename make_tuple_result<Values>::type...>(values...); +} + +template<typename... Values> +tuple<Values&...> tie(Values&... values) +{ + return tuple<Values&...>(values...); +} + +// 6.1.3.3 Tuple helper classes +template<typename Tuple> +struct tuple_size; + +template<> +struct tuple_size<tuple<> > +{ + static const std::size_t value = 0; +}; + +template<typename Head, typename... Tail> +struct tuple_size<tuple<Head, Tail...> > +{ + static const std::size_t value = 1 + tuple_size<tuple<Tail...> >::value; +}; + +template<int I, typename Tuple> +struct tuple_element; + +template<int I, typename Head, typename... Tail> +struct tuple_element<I, tuple<Head, Tail...> > +{ + typedef typename tuple_element<I-1, tuple<Tail...> >::type type; +}; + +template<typename Head, typename... Tail> +struct tuple_element<0, tuple<Head, Tail...> > +{ + typedef Head type; +}; + +// 6.1.3.4 Element access +template<int I, typename Tuple> +class get_impl; + +template<int I, typename Head, typename... Values> +class get_impl<I, tuple<Head, Values...> > +{ + typedef typename tuple_element<I-1, tuple<Values...> >::type Element; + typedef typename add_reference<Element>::type RJ; + typedef typename add_const_reference<Element>::type PJ; + typedef get_impl<I-1, tuple<Values...> > Next; + + public: + static RJ get(tuple<Head, Values...>& t) + { return Next::get(t.tail()); } + + static PJ get(const tuple<Head, Values...>& t) + { return Next::get(t.tail()); } +}; + +template<typename Head, typename... Values> +class get_impl<0, tuple<Head, Values...> > +{ + typedef typename add_reference<Head>::type RJ; + typedef typename add_const_reference<Head>::type PJ; + + public: + static RJ get(tuple<Head, Values...>& t) { return t.head(); } + static PJ get(const tuple<Head, Values...>& t) { return t.head(); } +}; + +template<int I, typename... Values> +typename add_reference< + typename tuple_element<I, tuple<Values...> >::type + >::type +get(tuple<Values...>& t) +{ + return get_impl<I, tuple<Values...> >::get(t); +} + +template<int I, typename... Values> +typename add_const_reference< + typename tuple_element<I, tuple<Values...> >::type + >::type +get(const tuple<Values...>& t) +{ + return get_impl<I, tuple<Values...> >::get(t); +} + +// 6.1.3.5 Relational operators +inline bool operator==(const tuple<>&, const tuple<>&) { return true; } + +template<typename T, typename... TTail, typename U, typename... UTail> +bool operator==(const tuple<T, TTail...>& t, const tuple<U, UTail...>& u) +{ + return t.head() == u.head() && t.tail() == u.tail(); +} + +template<typename... TValues, typename... UValues> +bool operator!=(const tuple<TValues...>& t, const tuple<UValues...>& u) +{ + return !(t == u); +} + +inline bool operator<(const tuple<>&, const tuple<>&) { return false; } + +template<typename T, typename... TTail, typename U, typename... UTail> +bool operator<(const tuple<T, TTail...>& t, const tuple<U, UTail...>& u) +{ + return (t.head() < u.head() || + (!(t.head() < u.head()) && t.tail() < u.tail())); +} + +template<typename... TValues, typename... UValues> +bool operator>(const tuple<TValues...>& t, const tuple<UValues...>& u) +{ + return u < t; +} + +template<typename... TValues, typename... UValues> +bool operator<=(const tuple<TValues...>& t, const tuple<UValues...>& u) +{ + return !(u < t); +} + +template<typename... TValues, typename... UValues> +bool operator>=(const tuple<TValues...>& t, const tuple<UValues...>& u) +{ + return !(t < u); +} + +int a0[tuple_size<tuple<> >::value == 0? 1 : -1]; +int a1[tuple_size<tuple<int, float, double> >::value == 3? 1 : -1]; +int a2a[is_same<tuple_element<0, tuple<int, float, double> >::type, int> + ::value? 1 : -1]; +int a2b[is_same<tuple_element<1, tuple<int, float, double> >::type, float> + ::value? 1 : -1]; +int a2c[is_same<tuple_element<2, tuple<int, float, double> >::type, double> + ::value? 1 : -1]; + +int main() +{ + tuple<> t0; + tuple<int> t1(1); + tuple<int, float> t2(1, 3.14159f); + tuple<int, float, const char*> t3a(1, 3.14159f, "Hello, world!"); + tuple<long, double, std::string> t3b(t3a); + t3b = t3a; + // t3a = t3b; DPG: triggers an error, as it should. + + tuple<int, float, std::string> t3c = + make_tuple(17, 2.718281828, std::string("Fun")); + + int seventeen = 17; + double pi = 3.14159; + tuple<int&, double&> seventeen_pi = make_tuple(ref(seventeen), ref(pi)); + tuple<int&, const double&> seventeen_pi2 = + make_tuple(ref(seventeen), cref(pi)); + tuple<int&, double&> seventeen_pi_tied = tie(seventeen, pi); + assert(get<0>(t3a) == 1); + assert(get<1>(t3a) == 3.14159f); + assert(std::strcmp(get<2>(t3a), "Hello, world!") == 0); + + assert(t3a == t3b); + assert(!(t3a != t3b)); + assert(!(t3a < t3b)); + assert(!(t3a > t3b)); + assert(t3a <= t3b && t3b <= t3a); + assert(t3a >= t3b && t3b >= t3a); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-unify-2.C b/gcc/testsuite/g++.dg/cpp0x/variadic-unify-2.C new file mode 100644 index 000000000..80c9f5d2c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-unify-2.C @@ -0,0 +1,14 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/40155 +// { dg-options "-std=c++0x" } +// { dg-do compile } + +template <typename T> struct identity +{ typedef T type; }; + +template <typename RT, typename... A> +int forward_call(RT (*) (A...), typename identity<A>::type...); + +int g (double); + +int i = forward_call(&g, 0); diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-unify.C b/gcc/testsuite/g++.dg/cpp0x/variadic-unify.C new file mode 100644 index 000000000..54234391e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-unify.C @@ -0,0 +1,15 @@ +// { dg-options "-std=c++0x" } +template<typename...> struct tuple { }; + +template<typename... Args1, typename... Args2> +void foo(tuple<Args1..., Args2...>, tuple<Args1...>, tuple<Args2...>); + +struct X{ }; + +void bar() +{ + tuple<int, float> tif; + tuple<double, X> tdx; + tuple<int, float, double, X> tall; + foo(tall, tif, tdx); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C b/gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C new file mode 100644 index 000000000..a8463de19 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C @@ -0,0 +1,12 @@ +// PR c++/50086 +// { dg-options -std=c++0x } + +template<typename T> void tfun(); +template<typename T> void fun1(T); +template<typename... Types> void fun2(Types... args); + +int main() +{ + fun1(tfun<int>); // ok + fun2(tfun<int>); // error: unresolved overloaded function type +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-value1.C b/gcc/testsuite/g++.dg/cpp0x/variadic-value1.C new file mode 100644 index 000000000..301bd5463 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-value1.C @@ -0,0 +1,24 @@ +// PR c++/52796 +// { dg-options "-std=c++0x -pedantic-errors" } + +inline void *operator new(__SIZE_TYPE__ s, void *p) { return p; } + +struct A +{ + int i; + template<class... Ts> + A(Ts&&... ts): i(ts...) { } +}; + +static union { + unsigned char c[sizeof(A)]; + int i; +}; + +int main() +{ + i = 0xdeadbeef; + new(c) A; + if (i != 0) + __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic1.C b/gcc/testsuite/g++.dg/cpp0x/variadic1.C new file mode 100644 index 000000000..f87d53ca3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic1.C @@ -0,0 +1,10 @@ +// { dg-options "-std=gnu++0x" } +template<typename...> +class tuple; + +template<typename... Args> +class tuple { }; + +template<typename T1, class... Args> +class tuple1p { }; + diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic10.C b/gcc/testsuite/g++.dg/cpp0x/variadic10.C new file mode 100644 index 000000000..5f73eba8d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic10.C @@ -0,0 +1,22 @@ +// { dg-options "-std=gnu++0x" } +template<typename T1, typename T2> +struct pair {}; + +template<typename... Args> +struct tuple { + static const int value = 0; +}; + +template<> +struct tuple<pair<int, float> > { }; + +template<typename... Outer> +struct X { + template<typename... Inner> + struct Y + { + typedef tuple<pair<Outer, Inner>...> type; // { dg-error "mismatched argument pack lengths" } + }; +}; + +X<int, double>::Y<short, char, double>::type honk; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic100.C b/gcc/testsuite/g++.dg/cpp0x/variadic100.C new file mode 100644 index 000000000..a364bbc91 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic100.C @@ -0,0 +1,15 @@ +// PR c++/43143 +// { dg-options "-std=c++0x" } + +template<typename T> +T&& declval(); + +template<class T, class... Args> +void test() { + T t(declval<Args>()...); +} + +int main() { + test<const int>(); // OK + test<int[23]>(); // Error +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic101.C b/gcc/testsuite/g++.dg/cpp0x/variadic101.C new file mode 100644 index 000000000..445a770af --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic101.C @@ -0,0 +1,23 @@ +// PR c++/43382 +// { dg-options "-std=c++0x" } + +template<class T> +struct Container +{ T f() const; }; + +template<class T> +T deref(const T& t) +{ return t; } + + +template <class T, class... Args> +auto +deref(const T& u, int r, Args... args) +-> decltype(deref(u.f(), args...)) +{ return deref(u.f(), args...); } + +int main(void) +{ + Container<Container<int>> v; + deref(v,1,2); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic102.C b/gcc/testsuite/g++.dg/cpp0x/variadic102.C new file mode 100644 index 000000000..dc9c4aea8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic102.C @@ -0,0 +1,19 @@ +// { dg-options "-std=c++0x" } + +struct nAny { + template<class... T> + nAny(T&&...); +}; + +template<class T> +T&& create(); + +template<class T, class... Args> +void test() { + T t(create<Args>()...); + (void) t; +} + +int main() { + test<nAny>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic103.C b/gcc/testsuite/g++.dg/cpp0x/variadic103.C new file mode 100644 index 000000000..9d6b5ea20 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic103.C @@ -0,0 +1,14 @@ +// { dg-options "-std=c++0x" } + +template<class T> +T&& create(); + +template<class T, class... Args> +void test() { + T t(create<Args>()...); // { dg-error "incomplete" } + (void) t; +} + +int main() { + test<int[]>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic105.C b/gcc/testsuite/g++.dg/cpp0x/variadic105.C new file mode 100644 index 000000000..24d7e15be --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic105.C @@ -0,0 +1,24 @@ +// PR c++/47289 +// { dg-options -std=c++0x } +// { dg-prune-output "note" } + +template <template <typename... __ARGS> class _F, typename... _ARGS> +auto reverse (_ARGS... args) -> decltype(_F<_ARGS...>::call_function(args...)) { + return _F<_ARGS...>::call_function(args...); +} + +template <typename _T> +_T sum(_T x) { return x; } + +template <typename _T, typename... _ARGS> +_T sum(_T x, _ARGS... args) { return x + sum(args...); } + +template <typename _T, typename... _ARGS> +struct call_sum { + static _T call_function(_T x1, _ARGS... args) { return sum(x1, args...); } +}; + +int main() { + // This shouldn't be an error; this is bug 35722. + reverse<call_sum>(1,2); // { dg-bogus "no match" "" { xfail *-*-* } } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic106.C b/gcc/testsuite/g++.dg/cpp0x/variadic106.C new file mode 100644 index 000000000..80ec0844f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic106.C @@ -0,0 +1,22 @@ +// Origin: PR c++/47326 +// { dg-options "-std=c++0x" } +// { dg-do compile } + +template <int _N> +struct A +{ + typedef int value_type; +}; + +template <typename... _ARGS> +auto +f (_ARGS... args) -> typename A<sizeof...(args)>::value_type +{ + return 12; +} + +int +main() +{ + f(1,2); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic108.C b/gcc/testsuite/g++.dg/cpp0x/variadic108.C new file mode 100644 index 000000000..3ad5af457 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic108.C @@ -0,0 +1,10 @@ +// PR c++/48736 +// { dg-options -std=c++0x } + +template<class T> +T&& create(); + +template<class T, class... Args, + class = decltype(T{create<Args>()...}) // Line X +> +char f(int); diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic109.C b/gcc/testsuite/g++.dg/cpp0x/variadic109.C new file mode 100644 index 000000000..0ec69af81 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic109.C @@ -0,0 +1,17 @@ +// PR c++/48292 +// { dg-options -std=c++0x } + +template <typename... Args> int g(Args...); + +template <int N = 0> +struct A +{ + template <typename... Args> + static auto f(Args... args) -> decltype(g(args...)); +}; + +int main() +{ + A<>::f(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic11.C b/gcc/testsuite/g++.dg/cpp0x/variadic11.C new file mode 100644 index 000000000..3c27de0fb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic11.C @@ -0,0 +1,18 @@ +// { dg-options "-std=gnu++0x" } +template<typename...> struct count; + +template<> +struct count<> { + static const int value = 0; +}; + +template<typename T, typename... Args> +struct count<T, Args...> { + static const int value = 1 + count<Args...>::value; +}; + +int a0[count<>::value == 0? 1 : -1]; +int a1[count<char>::value == 1? 1 : -1]; +int a2[count<char, short>::value == 2? 1 : -1]; +int a3[count<char, short, int>::value == 3? 1 : -1]; +int a4[count<char, short, int, long>::value == 4? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic110.C b/gcc/testsuite/g++.dg/cpp0x/variadic110.C new file mode 100644 index 000000000..86f1bb154 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic110.C @@ -0,0 +1,15 @@ +// PR c++/45698 +// { dg-options -std=c++0x } + +template <class... Ts> struct tuple { }; + +template<class... Ts> +struct A { + template<typename T> struct N { }; + tuple<N<Ts>...> tup; +}; + +int main() +{ + A<int, double> a; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic111.C b/gcc/testsuite/g++.dg/cpp0x/variadic111.C new file mode 100644 index 000000000..378162e16 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic111.C @@ -0,0 +1,19 @@ +// PR c++/48424 +// { dg-options -std=c++0x } + +template<typename... Args1> +struct S +{ + template<typename... Args2> + void f(Args1... args1, Args2&&... args2) + { + } +}; + +int main() +{ + S<int, double> s; + s.f(1,2.0,false,'a'); +} + +// { dg-final { scan-assembler "_ZN1SIIidEE1fIIbcEEEvidDpOT_" } } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic113.C b/gcc/testsuite/g++.dg/cpp0x/variadic113.C new file mode 100644 index 000000000..3f1bb2ad0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic113.C @@ -0,0 +1,20 @@ +// PR c++/49251 +// { dg-options "-std=c++0x -Wunused-parameter" } + +struct A {}; +template <int> int f(A); + +template< int... Indices > +struct indices {}; + +template< class... Args > +void sink( Args&&... ) {} + +template< class T, int... Indices > +void unpack_test( T && t, indices<Indices...> ) { + sink( f<Indices>(t)... ); +} + +int main() { + unpack_test( A(), indices<>() ); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic114.C b/gcc/testsuite/g++.dg/cpp0x/variadic114.C new file mode 100644 index 000000000..3ffede5c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic114.C @@ -0,0 +1,27 @@ +// PR c++/49785 +// { dg-options -std=c++0x } + +template <typename, typename ...> struct B { }; +template <typename> class A; + +template <typename R, typename ... S> +struct A <R (S ...)> : public B <R, S ...> +{ + struct C {}; + template <typename D> A (D, C = C ()) { } + R operator () (...); +}; + +template <typename R, typename ... S, typename T> +auto operator >> (A <R (S ...)>, T)->A <R (S ...)> +{ + []() {}; +} + +int +main () +{ + A <int (int, int)> a = [](int, int) {}; + auto b = []{}; + (a >> b) (3, 5); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic115.C b/gcc/testsuite/g++.dg/cpp0x/variadic115.C new file mode 100644 index 000000000..fa032e3b0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic115.C @@ -0,0 +1,19 @@ +// PR c++/49593 +// { dg-options -std=c++0x } + +template<typename... T> void f(T...) { } + +template<typename... Args> +static void +g(Args&&... args) +{ + f( static_cast<Args>(args)... ); + f( (Args)args... ); + f( Args(args)... ); + f( Args{args}... ); +} + +int main() +{ + g(1, '2', 3.0); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic116.C b/gcc/testsuite/g++.dg/cpp0x/variadic116.C new file mode 100644 index 000000000..079d751cb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic116.C @@ -0,0 +1,32 @@ +// Origin: PR c++/48320 +// { dg-options -std=c++0x } + +template<class... T> +struct tuple +{ + typedef int type; +}; + +template<int... Indices> +struct indices +{ +}; + +template<unsigned i, class Tuple> +struct tuple_element +{ + typedef Tuple type; +}; + +template<class Tuple, + int... Indices, + class Result = tuple<typename tuple_element<Indices, Tuple>::type...> > +Result +f(Tuple&&, indices<Indices...>); + + +void +foo() +{ + f(tuple<int, char, unsigned> (), indices<2, 1, 0> ()); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic12.C b/gcc/testsuite/g++.dg/cpp0x/variadic12.C new file mode 100644 index 000000000..30108c999 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic12.C @@ -0,0 +1,42 @@ +// { dg-options "-std=gnu++0x" } +// A tuple type +template<typename... Args> struct tuple { }; + +// Determine if two types are the same +template<typename T, typename U> +struct is_same { + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> { + static const bool value = true; +}; + +// Append 'T' to the end of Tuple +template<typename T, typename Tuple> +struct append_to_tuple; + +template<typename T, typename... Args> +struct append_to_tuple<T, tuple<Args...> > { + typedef tuple<Args..., T> type; +}; + +// Reverse a sequence of arguments (and return the result as a tuple) +template<typename... Args> struct reverse; + +template<typename T, typename... Args> +struct reverse<T, Args...> { + typedef typename append_to_tuple<T, typename reverse<Args...>::type>::type + type; +}; + +template<> +struct reverse<> { + typedef tuple<> type; +}; + +int a0[is_same<reverse<>::type, tuple<> >::value? 1 : -1]; +int a1[is_same<reverse<int>::type, tuple<int> >::value? 1 : -1]; +int a2[is_same<reverse<char, int>::type, tuple<int, char> >::value? 1 : -1]; +int a3[is_same<reverse<char, int, long>::type, tuple<long, int, char> >::value? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic13.C b/gcc/testsuite/g++.dg/cpp0x/variadic13.C new file mode 100644 index 000000000..7794e8a3d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic13.C @@ -0,0 +1,19 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Args> struct tuple1 { }; +template<typename... Args> struct tuple2 { }; + +template<typename T, typename U> +struct same_tuple_args { + static const bool value = false; +}; + +template<typename... Args> +struct same_tuple_args<tuple1<Args...>, tuple2<Args...> > { + static const bool value = true; +}; + +int same0[same_tuple_args<tuple1<>, tuple2<> >::value? 1 : -1]; +int same1[same_tuple_args<tuple1<int>, tuple2<int> >::value? 1 : -1]; +int same2[same_tuple_args<tuple1<float, int>, tuple2<float, int> >::value? 1 : -1]; +int diff0[!same_tuple_args<tuple1<>, tuple2<int> >::value? 1 : -1]; +int diff1[!same_tuple_args<tuple1<int, float>, tuple2<float, int> >::value? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic134.C b/gcc/testsuite/g++.dg/cpp0x/variadic134.C new file mode 100644 index 000000000..b7ec40c04 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic134.C @@ -0,0 +1,17 @@ +// PR c++/53862 +// { dg-options "-std=c++0x" } + +typedef unsigned long size_t; + +template<typename> struct is_scalar { static const bool value = true; }; +template<bool, typename T> struct enable_if { typedef T type; }; + +template <size_t N, typename... Args> +void f(Args...) {} + +template <size_t N, typename T, typename... Args> +typename enable_if<is_scalar<T>::value, void>::type f(T, Args...) {} + +int main() { + f<1>(1); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic14.C b/gcc/testsuite/g++.dg/cpp0x/variadic14.C new file mode 100644 index 000000000..3c1bb0d6d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic14.C @@ -0,0 +1,21 @@ +// { dg-options "-std=gnu++0x" } +template<typename R, typename... ArgTypes> +struct make_function_type +{ + typedef R type(ArgTypes...); +}; + +template<typename T, typename U> +struct is_same { + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> { + static const bool value = true; +}; + +int a0[is_same<make_function_type<int>::type, int()>::value? 1 : -1]; +int a1[is_same<make_function_type<int, float>::type, int(float)>::value? 1 : -1]; +int a2[is_same<make_function_type<int, float>::type, int(float)>::value? 1 : -1]; +int a3[is_same<make_function_type<int, float, double>::type, int(float, double)>::value? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic15.C b/gcc/testsuite/g++.dg/cpp0x/variadic15.C new file mode 100644 index 000000000..68786cb82 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic15.C @@ -0,0 +1,21 @@ +// { dg-options "-std=gnu++0x" } +template<typename R, typename... ArgTypes> +struct make_function_type +{ + typedef R type(const ArgTypes&...); +}; + +template<typename T, typename U> +struct is_same { + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> { + static const bool value = true; +}; + +int a0[is_same<make_function_type<int>::type, int()>::value? 1 : -1]; +int a1[is_same<make_function_type<int, float>::type, int(const float&)>::value? 1 : -1]; +int a2[is_same<make_function_type<int, float>::type, int(const float&)>::value? 1 : -1]; +int a3[is_same<make_function_type<int, float, double>::type, int(const float&, double const&)>::value? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic16.C b/gcc/testsuite/g++.dg/cpp0x/variadic16.C new file mode 100644 index 000000000..001919d46 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic16.C @@ -0,0 +1,21 @@ +// { dg-options "-std=gnu++0x" } +template<typename R, typename... ArgTypes> +struct make_function_type +{ + typedef R type(const ArgTypes&... args); +}; + +template<typename T, typename U> +struct is_same { + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> { + static const bool value = true; +}; + +int a0[is_same<make_function_type<int>::type, int()>::value? 1 : -1]; +int a1[is_same<make_function_type<int, float>::type, int(const float&)>::value? 1 : -1]; +int a2[is_same<make_function_type<int, float>::type, int(const float&)>::value? 1 : -1]; +int a3[is_same<make_function_type<int, float, double>::type, int(const float&, double const&)>::value? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic17.C b/gcc/testsuite/g++.dg/cpp0x/variadic17.C new file mode 100644 index 000000000..986721bbe --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic17.C @@ -0,0 +1,21 @@ +// { dg-options "-std=gnu++0x" } +template<typename R, typename... ArgTypes> +struct make_function_type +{ + typedef R type(const ArgTypes&......); +}; + +template<typename T, typename U> +struct is_same { + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> { + static const bool value = true; +}; + +int a0[is_same<make_function_type<int>::type, int(...)>::value? 1 : -1]; +int a1[is_same<make_function_type<int, float>::type, int(const float&...)>::value? 1 : -1]; +int a2[is_same<make_function_type<int, float>::type, int(const float&,...)>::value? 1 : -1]; +int a3[is_same<make_function_type<int, float, double>::type, int(const float&, double const&...)>::value? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic18.C b/gcc/testsuite/g++.dg/cpp0x/variadic18.C new file mode 100644 index 000000000..147ed8e4b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic18.C @@ -0,0 +1,47 @@ +// { dg-options "-std=gnu++0x" } +template<typename...> class tuple { }; + +template<typename T, template<typename T> class... Metafunctions> +struct apply_all +{ + typedef tuple<typename Metafunctions<T>::type...> type; +}; + +template<typename T, typename U> +struct is_same { + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> { + static const bool value = true; +}; + +template<typename T> +struct add_pointer { + typedef T* type; +}; + +template<typename T> +struct add_pointer<T&> +{ + typedef T& type; +}; + +template<typename T> +struct add_reference { + typedef T& type; +}; + +template<typename T> +struct add_reference<T&> +{ + typedef T& type; +}; + +int a0[is_same<apply_all<int>::type,tuple<> >::value? 1 : -1]; +int a1[is_same<apply_all<int, add_pointer>::type,tuple<int*> >::value? 1 : -1]; +int a2[is_same<apply_all<int, add_pointer, add_reference>::type,tuple<int*, int&> >::value? 1 : -1]; +int a3[is_same<apply_all<int&, add_pointer, add_reference>::type,tuple<int&, int&> >::value? 1 : -1]; + + diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic19.C b/gcc/testsuite/g++.dg/cpp0x/variadic19.C new file mode 100644 index 000000000..92e7a953a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic19.C @@ -0,0 +1,19 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Args> +struct tuple { + static const int value = 0; +}; + +template<typename T, template<class T> class... Metafunctions> +struct tuple<Metafunctions<T>...> { + static const int value = 1; +}; + +template<typename T> struct add_pointer; +template<typename T> struct add_reference; + +int a0[tuple<int, float>::value == 0? 1 : -1]; +int a1[tuple<add_pointer<int>, add_pointer<float> >::value == 0? 1 : -1]; +int a2[tuple<>::value == 0? 1 : -1]; +int a3[tuple<add_pointer<int> >::value == 1? 1 : -1]; +int a4[tuple<add_pointer<int>, add_reference<int> >::value == 1? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic2.C b/gcc/testsuite/g++.dg/cpp0x/variadic2.C new file mode 100644 index 000000000..d62a54245 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic2.C @@ -0,0 +1,17 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Args = int> // { dg-error "default argument" } +class tuple2; + +template<typename... = int> // { dg-error "default argument" } +class tuple3; + +template<typename T1, typename T2, typename... Rest> +struct two_or_more {}; // { dg-error "provided for" } + +typedef two_or_more<int> bad; // { dg-error "2 or more" } +// { dg-error "invalid type" "" { target *-*-* } 11 } + +void f() +{ + two_or_more<int, float> z = 5; // { dg-error "two_or_more<int, float>" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic20.C b/gcc/testsuite/g++.dg/cpp0x/variadic20.C new file mode 100644 index 000000000..7f2446e55 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic20.C @@ -0,0 +1,47 @@ +// { dg-options "-std=gnu++0x" } +template<typename T> struct add_pointer; +template<typename T> struct add_reference; + +template<template<class T> class... Metafunctions> +struct metatuple { + static const int value = 0; +}; + +template<> +struct metatuple<add_pointer> { + static const int value = 1; +}; + +template<template<class T> class Meta> +struct metatuple<Meta, Meta> { // { dg-error "candidates" } + static const int value = 2; +}; + +template<template<class T> class... Metafunctions> +struct metatuple<add_pointer, Metafunctions...> { // { dg-error "" } + static const int value = 3; +}; + +template<template<class T> class First, + template<class T> class... Metafunctions> +struct metatuple<First, Metafunctions...> { // { dg-error "struct" } + static const int value = 4; +}; + +template<template<class T> class First, + template<class T> class Second, + template<class T> class... Metafunctions> +struct metatuple<First, Second, Metafunctions...> { // { dg-error "struct" } + static const int value = 5; +}; + +int a0[metatuple<>::value == 0? 1 : -1]; +int a1[metatuple<add_pointer>::value == 1? 1 : -1]; +int a2a[metatuple<add_pointer, add_pointer>::value == 2? 1 : -1]; // { dg-error "ambiguous|array bound" } +int a2b[metatuple<add_reference, add_reference>::value == 2? 1 : -1]; +int a3[metatuple<add_pointer, add_reference>::value == 3? 1 : -1]; // { dg-error "ambiguous|array bound" } +int a4[metatuple<add_reference>::value == 4? 1 : -1]; +int a5[metatuple<add_reference, add_pointer>::value == 5? 1 : -1]; + +// { dg-error "incomplete" "" { target *-*-* } 40 } +// { dg-error "incomplete" "" { target *-*-* } 42 } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic21.C b/gcc/testsuite/g++.dg/cpp0x/variadic21.C new file mode 100644 index 000000000..b65e995b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic21.C @@ -0,0 +1,7 @@ +// { dg-options "-std=gnu++0x" } +template<typename T, int... Dims> +struct array { }; + +array<int> a0; +array<int, 1> a1; +array<int, 1, 2, 3, 4> a1234; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic22.C b/gcc/testsuite/g++.dg/cpp0x/variadic22.C new file mode 100644 index 000000000..1d26e40d9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic22.C @@ -0,0 +1,21 @@ +// { dg-options "-std=gnu++0x" } +template<typename R, typename... ArgTypes> +struct make_function_type +{ + typedef R type(ArgTypes... args); +}; + +template<typename T, typename U> +struct is_same { + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> { + static const bool value = true; +}; + +int a0[is_same<make_function_type<int>::type, int()>::value? 1 : -1]; +int a1[is_same<make_function_type<int, float>::type, int(float)>::value? 1 : -1]; +int a2[is_same<make_function_type<int, float>::type, int(float)>::value? 1 : -1]; +int a3[is_same<make_function_type<int, float, double>::type, int(float, double const)>::value? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic23.C b/gcc/testsuite/g++.dg/cpp0x/variadic23.C new file mode 100644 index 000000000..43309a1e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic23.C @@ -0,0 +1,25 @@ +// { dg-options "-std=gnu++0x" } +template<typename T, int... Dims> +struct array { + static const int value = 0; +}; + +template<> +struct array<int, 17> { + static const int value = 1; +}; + +template<int... Dims> +struct array<float, 1, Dims...> { + static const int value = 2; +}; + +template<typename T, int... Dims> +struct array<T, 1, Dims...> { + static const int value = 3; +}; + +int a0[array<int>::value == 0? 1 : -1]; +int a1[array<int, 17>::value == 1? 1 : -1]; +int a2[array<float, 1, 2, 3>::value == 2? 1 : -1]; +int a3[array<double, 1, 2, 3>::value == 3? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic24.C b/gcc/testsuite/g++.dg/cpp0x/variadic24.C new file mode 100644 index 000000000..6ef8e8a77 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic24.C @@ -0,0 +1,6 @@ +// { dg-options "-std=gnu++0x" } +template<typename T, T... Values> +struct vector_c { }; + +vector_c<int, 17, 42> intvec; +vector_c<char, 'a', 'b', 'c'> charvec; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic25.C b/gcc/testsuite/g++.dg/cpp0x/variadic25.C new file mode 100644 index 000000000..6589e7f60 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic25.C @@ -0,0 +1,16 @@ +// { dg-options "-std=gnu++0x" } +template<int... Values> +struct sum; + +template<> +struct sum<> { + static const int value = 0; +}; + +template<int Value, int... Values> +struct sum<Value, Values...> { + static const int value = Value + sum<Values...>::value; +}; + +int a0[sum<>::value == 0? 1 : -1]; +int a1[sum<1, 2, 3, 4, 5>::value == 15? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic26.C b/gcc/testsuite/g++.dg/cpp0x/variadic26.C new file mode 100644 index 000000000..7f9f6bc80 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic26.C @@ -0,0 +1,24 @@ +// { dg-options "-std=gnu++0x" } +template<template<int, int> class Meta, int Initial, int... Values> +struct accumulate { + static const int value = Initial; +}; + +template<template<int, int> class Meta, int Initial, int Value, int... Rest> +struct accumulate<Meta, Initial, Value, Rest...> { + static const int value = + Meta<Value, accumulate<Meta, Initial, Rest...>::value>::value; +}; + +template<int X, int Y> +struct sum { + static const int value = X + Y; +}; + +template<int X, int Y> +struct prod { + static const int value = X * Y; +}; + +int a0[accumulate<sum,0,1,2,3,4,5>::value == 15? 1 : -1]; +int a1[accumulate<prod,1,1,2,3,4,5>::value == 120? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic27.C b/gcc/testsuite/g++.dg/cpp0x/variadic27.C new file mode 100644 index 000000000..45a897ce2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic27.C @@ -0,0 +1,22 @@ +// { dg-options "-std=gnu++0x" } +template<typename Signature> +struct function_traits; + +template<typename R, typename... ArgTypes> +struct function_traits<R(ArgTypes...)> { + typedef R result_type; +}; + +template<typename T, typename U> +struct same_type { + static const bool value = false; +}; + +template<typename T> +struct same_type<T, T> { + static const bool value = true; +}; + +int a0[same_type<function_traits<int()>::result_type, int>::value? 1 : -1]; +int a1[same_type<function_traits<int(float)>::result_type, int>::value? 1 : -1]; +int a2[same_type<function_traits<int(double, char)>::result_type, int>::value? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic28.C b/gcc/testsuite/g++.dg/cpp0x/variadic28.C new file mode 100644 index 000000000..167088b49 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic28.C @@ -0,0 +1,25 @@ +// { dg-options "-std=gnu++0x" } +template<typename Signature> +struct function_traits; + +template<typename R, typename... ArgTypes> +struct function_traits<R(ArgTypes......)> { + typedef R result_type; +}; + +template<typename T, typename U> +struct same_type { + static const bool value = false; +}; + +template<typename T> +struct same_type<T, T> { + static const bool value = true; +}; + +int a0[same_type<function_traits<int(double, char...)>::result_type, int>::value? 1 : -1]; +int a1[same_type<function_traits<int(double, char,...)>::result_type, int>::value? 1 : -1]; +int a2[same_type<function_traits<int(char,...)>::result_type, int>::value? 1 : -1]; +int a3[same_type<function_traits<int(...)>::result_type, int>::value? 1 : -1]; +int a4[same_type<function_traits<int(double x, char...)>::result_type, int>::value? 1 : -1]; +int a5[same_type<function_traits<int(double, char y...)>::result_type, int>::value? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic29.C b/gcc/testsuite/g++.dg/cpp0x/variadic29.C new file mode 100644 index 000000000..aaed59583 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic29.C @@ -0,0 +1,35 @@ +// { dg-options "-std=gnu++0x" } +template<typename Signature> +struct function_traits; + +template<typename R, typename... ArgTypes> +struct function_traits<R(ArgTypes...)> { + typedef R result_type; +}; + +template<typename R, typename Class, typename... ArgTypes> +struct function_traits<R (Class::*)(ArgTypes...)> { + typedef R result_type; +}; + +template<typename R, typename Class, typename... ArgTypes> +struct function_traits<R (Class::*)(ArgTypes...) const> { + typedef R result_type; +}; + +template<typename T, typename U> +struct same_type { + static const bool value = false; +}; + +template<typename T> +struct same_type<T, T> { + static const bool value = true; +}; + +struct X {}; + +int a0[same_type<function_traits<int (X::*)()>::result_type, int>::value? 1 : -1]; +int a1[same_type<function_traits<int (X::*)(float)>::result_type, int>::value? 1 : -1]; +int a2[same_type<function_traits<int (X::*)(double, char)>::result_type, int>::value? 1 : -1]; +int a3[same_type<function_traits<int (X::*)(double, char) const>::result_type, int>::value? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic3.C b/gcc/testsuite/g++.dg/cpp0x/variadic3.C new file mode 100644 index 000000000..42ba8ab47 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic3.C @@ -0,0 +1,10 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Args> +class tuple {}; + +void f() +{ + tuple<> x; + tuple<int> y; + tuple<int, float> z; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic30.C b/gcc/testsuite/g++.dg/cpp0x/variadic30.C new file mode 100644 index 000000000..66cbe9f62 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic30.C @@ -0,0 +1,11 @@ +// { dg-options "-std=gnu++0x" } +template<typename... T> +void eat(T...); + +void f() +{ + eat(); + eat(1); + eat(1, 2); + eat(17, 3.14159, "Hello, World!"); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic31.C b/gcc/testsuite/g++.dg/cpp0x/variadic31.C new file mode 100644 index 000000000..db8daa898 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic31.C @@ -0,0 +1,11 @@ +// { dg-options "-std=gnu++0x -g" } +template<typename... T> +void eat(T...) { } + +void f() +{ + eat(); + eat(1); + eat(1, 2); + eat(17, 3.14159, "Hello, World!"); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic32.C b/gcc/testsuite/g++.dg/cpp0x/variadic32.C new file mode 100644 index 000000000..c5bee55cc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic32.C @@ -0,0 +1,11 @@ +// { dg-options "-std=gnu++0x" } +template<typename... T> +void eat(const T&...) { } + +void f() +{ + eat(); + eat(1); + eat(1, 2); + eat(17, 3.14159, "Hello, World!"); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic33.C b/gcc/testsuite/g++.dg/cpp0x/variadic33.C new file mode 100644 index 000000000..5784be887 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic33.C @@ -0,0 +1,16 @@ +// { dg-options "-std=gnu++0x" } +void print_all() {} + +template<typename T, typename... Rest> +void print_all(const T& t, const Rest&... rest) +{ + print_all(rest...); +} + +void f() +{ + print_all(); + print_all(1); + print_all(1, 3.14159); + print_all("Hello, World!", 17, 3.14159); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic34.C b/gcc/testsuite/g++.dg/cpp0x/variadic34.C new file mode 100644 index 000000000..5eee3f13c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic34.C @@ -0,0 +1,11 @@ +// { dg-options "-std=gnu++0x" } +template<int I, typename... Args> +void get_ith(const Args&... args); + +void f() +{ + get_ith<1>(1, 2, 3); + get_ith<1, int>(1, 2.0, 'x'); + get_ith<1, int, double>(1, 2.0, 'x'); + get_ith<1, int, double, char>(1, 2.0, 'x'); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic35.C b/gcc/testsuite/g++.dg/cpp0x/variadic35.C new file mode 100644 index 000000000..1f21976e8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic35.C @@ -0,0 +1,10 @@ +// { dg-options "-std=gnu++0x" } +template<int I, typename... Args> +void get_ith(const Args&... args); // { dg-message "note" } + +void f() +{ + get_ith<1, float>(1, 2.0, 'x'); + get_ith<1, int, double, char, int>(1, 2.0, 'x'); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 8 } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic36.C b/gcc/testsuite/g++.dg/cpp0x/variadic36.C new file mode 100644 index 000000000..906360204 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic36.C @@ -0,0 +1,15 @@ +// { dg-options "-std=gnu++0x" } +template<typename T, typename... Args> +void f(const T&, const Args&... args) +{ + f(args); // { dg-error "packs not expanded" } +} + +template<typename... Values> +struct tuple_base { }; + +template<typename... Values> +struct tuple : tuple_base<Values> { }; // { dg-error "packs not expanded" } + +// { dg-message "args" "note" { target *-*-* } 5 } +// { dg-message "Values" "note" { target *-*-* } 12 } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic37.C b/gcc/testsuite/g++.dg/cpp0x/variadic37.C new file mode 100644 index 000000000..a6e5f613f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic37.C @@ -0,0 +1,10 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Values> +struct tuple +{ + static const __SIZE_TYPE__ length = sizeof...(Values); +}; + +int a0[tuple<>::length == 0? 1 : -1]; +int a1[tuple<int>::length == 1? 1 : -1]; +int a2[tuple<int, float>::length == 2? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic38.C b/gcc/testsuite/g++.dg/cpp0x/variadic38.C new file mode 100644 index 000000000..e4ae4a630 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic38.C @@ -0,0 +1,6 @@ +// { dg-options "-std=gnu++0x" } +template<int... Values> +struct int_vec {}; + +template<int... Values> +struct int_vec<0, (Values+1)...> {}; // { dg-error "involves template parameter" } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic39.C b/gcc/testsuite/g++.dg/cpp0x/variadic39.C new file mode 100644 index 000000000..bd656ba85 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic39.C @@ -0,0 +1,13 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Args> +struct tuple {}; + +template<typename T, typename... Args> +struct tuple<Args..., T> { }; // { dg-error "end" } + + +template<int... Values> +struct int_vec { }; + +template<int I, int... Values> +struct int_vec<Values..., I> { }; // { dg-error "end" } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic4.C b/gcc/testsuite/g++.dg/cpp0x/variadic4.C new file mode 100644 index 000000000..9257a92d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic4.C @@ -0,0 +1,15 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } +template<typename... Args> +class tuple {}; + +void f_none(tuple<>) {} +void f_one(tuple<int>) {} +void f_two(tuple<int, float>) {} +void f_nested(tuple<int, tuple<double, char>, float>) { } + + +// { dg-final { scan-assembler "_Z6f_none5tupleIIEE" } } +// { dg-final { scan-assembler "_Z5f_one5tupleIIiEE" } } +// { dg-final { scan-assembler "_Z5f_two5tupleIIifEE" } } +// { dg-final { scan-assembler "_Z8f_nested5tupleIIiS_IIdcEEfEE" } } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic40.C b/gcc/testsuite/g++.dg/cpp0x/variadic40.C new file mode 100644 index 000000000..6cc9273a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic40.C @@ -0,0 +1,3 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Values, typename T> +struct backward_tuple {}; // { dg-error "end" } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic41.C b/gcc/testsuite/g++.dg/cpp0x/variadic41.C new file mode 100644 index 000000000..9cfd847f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic41.C @@ -0,0 +1,14 @@ +// A function parameter pack is only deduced if it's at the end +// { dg-options "-std=gnu++0x" } +template<typename... Args> +void f(const Args&... args, int oops); + +int main() +{ + f<>(1); + f(1); + f<int>(1,2); + f(1,2); // { dg-error "no match" } +} + +// { dg-prune-output "note" } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic42.C b/gcc/testsuite/g++.dg/cpp0x/variadic42.C new file mode 100644 index 000000000..47d9b66da --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic42.C @@ -0,0 +1,12 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } +template<typename... Args> +void f(Args...) { } + +void g() +{ + f<int*, float*, double*>(0, 0, 0); + f<int*>(0,0,0); +} +// { dg-final { scan-assembler "_Z1fIIPiPfPdEEvDpT_" } } +// { dg-final { scan-assembler "_Z1fIIPiiiEEvDpT_" } } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic43.C b/gcc/testsuite/g++.dg/cpp0x/variadic43.C new file mode 100644 index 000000000..fce81ae0d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic43.C @@ -0,0 +1,8 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Args> +int f(const Args&...); + +void g() +{ + int (*fp)(const int&, const float&) = &f; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic44.C b/gcc/testsuite/g++.dg/cpp0x/variadic44.C new file mode 100644 index 000000000..8452a96cc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic44.C @@ -0,0 +1,13 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } +template<typename... Args> +int f(const Args&...); + +template<typename T> void g(T) { } + +void h() +{ + g(&f<int, float>); +} + +// { dg-final { scan-assembler "_Z1gIPFiRKiRKfEEvT_"} } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic45.C b/gcc/testsuite/g++.dg/cpp0x/variadic45.C new file mode 100644 index 000000000..c5a66ab20 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic45.C @@ -0,0 +1,10 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Args> +int& f(Args...); + +template<typename T1, typename T2> +float& f(T1, T2); + +float& g() { + return f(17, 3.14159); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic46.C b/gcc/testsuite/g++.dg/cpp0x/variadic46.C new file mode 100644 index 000000000..8b81a363b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic46.C @@ -0,0 +1,11 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Args> +int& f(Args&...); + +template<typename... Args> +float& f(const Args&...); + +int& g(int x, float y) +{ + return f(x, y); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic47.C b/gcc/testsuite/g++.dg/cpp0x/variadic47.C new file mode 100644 index 000000000..d80371c0e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic47.C @@ -0,0 +1,18 @@ +// { dg-options "-std=gnu++0x" } +template<typename T> struct wrap { }; + +template<typename... Args> +int& f(const Args&...); + +template<typename... Args> +float& f(const wrap<Args>&...); + +int& g(int x, float y, double z) +{ + return f(x, y, z); +} + +float& h(wrap<int> x, wrap<float> y, wrap<double> z) +{ + return f(x, y, z); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic48.C b/gcc/testsuite/g++.dg/cpp0x/variadic48.C new file mode 100644 index 000000000..ab3f777f7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic48.C @@ -0,0 +1,10 @@ +// { dg-options "-std=gnu++0x" } +template<typename T, typename... Args> +int& f(const T&, Args...); + +template<typename T> +float& f(const T&); + +float& g() { + return f(17); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic49.C b/gcc/testsuite/g++.dg/cpp0x/variadic49.C new file mode 100644 index 000000000..7e2215f2c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic49.C @@ -0,0 +1,9 @@ +// { dg-options "-std=gnu++0x" } +int& f(...); + +template<typename... Args> +float& f(Args...); + +float& g() { + return f(17, 3.14159); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic5.C b/gcc/testsuite/g++.dg/cpp0x/variadic5.C new file mode 100644 index 000000000..d1f333566 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic5.C @@ -0,0 +1,38 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Args> +struct tuple { + static const int value = 0; +}; + +template<> +struct tuple<> { + static const int value = 1; +}; + +template<> +struct tuple<int> { + static const int value = 2; +}; + + +template<> +struct tuple<int, float> { + static const int value = 3; +}; + +template<typename T> +struct tuple<T, T> { + static const int value = 4; +}; + +template<> +struct tuple<float, float> { + static const int value = 5; +}; + +int a0[tuple<float>::value == 0? 1 : -1]; +int a1[tuple<>::value == 1? 1 : -1]; +int a2[tuple<int>::value == 2? 1 : -1]; +int a3[tuple<int, float>::value == 3? 1 : -1]; +int a4[tuple<int, int>::value == 4? 1 : -1]; +int a5[tuple<float, float>::value == 5? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic50.C b/gcc/testsuite/g++.dg/cpp0x/variadic50.C new file mode 100644 index 000000000..a2c3b7c90 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic50.C @@ -0,0 +1,9 @@ +// { dg-options "-std=gnu++0x" } +int& f(int, double, ...); + +template<typename... Args> +float& f(Args...); + +float& g() { + return f(17, 3.14159, 3); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic51.C b/gcc/testsuite/g++.dg/cpp0x/variadic51.C new file mode 100644 index 000000000..e2e2d630a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic51.C @@ -0,0 +1,10 @@ +// { dg-options "-std=gnu++0x" } +template<typename T1, typename T2> +float& f(T1, T2); + +template<typename... Args> +int& f(Args...); + +float& g() { + return f(17, 3.14159); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic52.C b/gcc/testsuite/g++.dg/cpp0x/variadic52.C new file mode 100644 index 000000000..12b121fe4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic52.C @@ -0,0 +1,7 @@ +// { dg-options "-std=gnu++0x" } +template<typename T, T... Values> +struct vector_c { }; + +vector_c<int, 1, 2, 3> v1; +vector_c<char, 'a', 'b', 'c'> v2; +vector_c<long, 1u, 2, 3l> v3; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic53.C b/gcc/testsuite/g++.dg/cpp0x/variadic53.C new file mode 100644 index 000000000..09a3879b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic53.C @@ -0,0 +1,17 @@ +// { dg-options "-std=gnu++0x" } +template<typename F, typename... BoundArgs> +class bound_functor +{ + public: + typedef typename F::result_type result_type; + + template<typename... Args> + typename F::result_type operator()(Args&... args); +}; + +template<typename F, typename... BoundArgs> +template<typename... Args> +typename F::result_type +bound_functor<F, BoundArgs...>::operator()(Args&... args) +{ +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic54.C b/gcc/testsuite/g++.dg/cpp0x/variadic54.C new file mode 100644 index 000000000..db750d765 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic54.C @@ -0,0 +1,12 @@ +// { dg-options "-std=gnu++0x" } +template<typename F, typename... BoundArgs> +class bound_functor +{ + public: + bound_functor(); +}; + +template<typename F, typename... BoundArgs> +bound_functor<F, BoundArgs...>::bound_functor() +{ +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic55.C b/gcc/testsuite/g++.dg/cpp0x/variadic55.C new file mode 100644 index 000000000..b9c8cffb0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic55.C @@ -0,0 +1,12 @@ +// { dg-options "-std=gnu++0x" } +template<typename F, typename... BoundArgs> +class bound_functor +{ + public: + bound_functor(const BoundArgs&... bound_args); +}; + +template<typename F, typename... BoundArgs> +bound_functor<F, BoundArgs...>::bound_functor(const BoundArgs&...) +{ +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic56.C b/gcc/testsuite/g++.dg/cpp0x/variadic56.C new file mode 100644 index 000000000..77846e513 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic56.C @@ -0,0 +1,19 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Elements> +struct tuple { }; + +template<typename T, typename... Elements> +struct tuple<T, Elements...> { + int foo(); +}; + +template<typename T, typename... Elements> +struct tuple<T*, Elements...> { + int bar(); +}; + +template<typename T, typename... Elements> +int tuple<T, Elements...>::foo() { return 0; } + +template<typename T, typename... Elements> +int tuple<T*, Elements...>::bar() { return 0; } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic57.C b/gcc/testsuite/g++.dg/cpp0x/variadic57.C new file mode 100644 index 000000000..9833b1bb3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic57.C @@ -0,0 +1,16 @@ +// { dg-options "-std=gnu++0x" } +template<typename T, int... Dims> +struct array { + int foo(); +}; + +template<typename T> +struct array<T, 0> { + int bar(); +}; + +template<typename T, int... Dims> +int array<T, Dims...>::foo() { } + +template<typename T> +int array<T, 0>::bar() { } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic58.C b/gcc/testsuite/g++.dg/cpp0x/variadic58.C new file mode 100644 index 000000000..5da0730b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic58.C @@ -0,0 +1,16 @@ +// { dg-options "-std=gnu++0x" } +#include <typeinfo> + +template<typename... Args> +void foo(Args...) { } + +template<typename... Args> +void bar(Args... args) { + foo(Args()...); + foo(args = args...); + foo(reinterpret_cast<void*>(&args)...); + foo(const_cast<const Args>(args)...); + foo(static_cast<void*>(&args)...); + foo(dynamic_cast<void*>(&args)...); + foo(typeid(Args)...); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic59.C b/gcc/testsuite/g++.dg/cpp0x/variadic59.C new file mode 100644 index 000000000..6d6e52f93 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic59.C @@ -0,0 +1,4 @@ +// { dg-options "-std=gnu++0x" } +template<class T, typename... VarArgs> +void print(T t, VarArgs args); // { dg-error "packs not expanded" } +// { dg-message "VarArgs" "note" { target *-*-* } 3 } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic6.C b/gcc/testsuite/g++.dg/cpp0x/variadic6.C new file mode 100644 index 000000000..105550bb9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic6.C @@ -0,0 +1,12 @@ +// { dg-options "-std=gnu++0x" } +template<typename ... Args> +struct tuple_base {}; + +template<typename ... Args> +struct tuple : public tuple_base<Args...> +{ +}; + +tuple<> zero; +tuple<int> one; +tuple<float, int> two; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic60.C b/gcc/testsuite/g++.dg/cpp0x/variadic60.C new file mode 100644 index 000000000..b86711ff6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic60.C @@ -0,0 +1 @@ +template<typename... Args> class tuple; // { dg-error "variadic templates" } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic61.C b/gcc/testsuite/g++.dg/cpp0x/variadic61.C new file mode 100644 index 000000000..d06c5f6b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic61.C @@ -0,0 +1,2 @@ +// { dg-options "-std=gnu++98 -pedantic" } +template<typename... Args> class tuple; // { dg-warning "variadic templates" } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic62.C b/gcc/testsuite/g++.dg/cpp0x/variadic62.C new file mode 100644 index 000000000..010b3a5d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic62.C @@ -0,0 +1,2 @@ +// { dg-options "-std=gnu++98 -pedantic-errors" } +template<typename... Args> class tuple; // { dg-error "variadic templates" } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic63.C b/gcc/testsuite/g++.dg/cpp0x/variadic63.C new file mode 100644 index 000000000..359def1cd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic63.C @@ -0,0 +1,2 @@ +// { dg-options "-std=gnu++0x -pedantic" } +template<typename... Args> class tuple; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic64.C b/gcc/testsuite/g++.dg/cpp0x/variadic64.C new file mode 100644 index 000000000..c9212e2e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic64.C @@ -0,0 +1,19 @@ +// { dg-options "-std=gnu++0x" } +template<int... Indexes> + struct _Index_tuple { }; + +template<int _Num, typename _Tuple = _Index_tuple<> > +struct _Build_index_tuple; + +template<int _Num, int... _Indexes> +struct _Build_index_tuple<_Num, _Index_tuple<_Indexes...> > + : _Build_index_tuple<_Num - 1, + _Index_tuple<_Indexes..., sizeof...(_Indexes)> > +{ +}; + +template<int... _Indexes> +struct _Build_index_tuple<0, _Index_tuple<_Indexes...> > +{ + typedef _Index_tuple<_Indexes...> __type; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic65.C b/gcc/testsuite/g++.dg/cpp0x/variadic65.C new file mode 100644 index 000000000..1c815d1d9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic65.C @@ -0,0 +1,8 @@ +// { dg-options "-std=gnu++0x" } +struct unused; +template<typename T1 = unused, typename T2 = unused, typename T3 = unused, + typename T4 = unused, typename T5 = unused, typename T6 = unused> +struct tuple {}; + +template<typename... Args> +void foo(tuple<Args...>) { } // { dg-bogus "cannot expand" "" { xfail *-*-* } } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic66.C b/gcc/testsuite/g++.dg/cpp0x/variadic66.C new file mode 100644 index 000000000..5c31ae06f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic66.C @@ -0,0 +1,9 @@ +// { dg-options "-std=gnu++0x" } + +template<typename Result, typename Functor, typename... ArgTypes> +Result bind(Functor, ArgTypes...) { } + +void f() +{ + bind<int>(17, 20, 22); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic67.C b/gcc/testsuite/g++.dg/cpp0x/variadic67.C new file mode 100644 index 000000000..e496bfc17 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic67.C @@ -0,0 +1,24 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Elements> struct tuple {}; + +template<typename... Args> +struct nested +{ + typedef tuple<tuple<Args, Args...>...> type; +}; + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +int a0[is_same<nested<int, float>::type, + tuple<tuple<int, int, float>, + tuple<float, int, float> > >::value? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic68.C b/gcc/testsuite/g++.dg/cpp0x/variadic68.C new file mode 100644 index 000000000..07cf8e389 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic68.C @@ -0,0 +1,23 @@ +// { dg-do run } +// { dg-options "-std=gnu++0x" } +extern "C" void abort(); + +template<typename T, T... Values> +void f(T* expected_values, int n) +{ + if (sizeof...(Values) != n) + abort (); + + T values[] = { Values... }; + for (int i = 0; i < n; ++i) + if (values[i] != expected_values[i]) + abort(); +} + +int main() +{ + int test_arr1[3] = { 1, 2, 3 }; + f<int, 1, 2, 3>(test_arr1, 3); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic69.C b/gcc/testsuite/g++.dg/cpp0x/variadic69.C new file mode 100644 index 000000000..5fe9a1950 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic69.C @@ -0,0 +1,34 @@ +// { dg-options "-std=gnu++0x" } +template<typename T> +struct stored_value +{ + explicit stored_value() : value() { } + + explicit stored_value(const T& value) : value(value) { } + + stored_value(int, const T& value) : value(value) { } + + T value; +}; + +template<typename... Values> +struct myclass : public stored_value<Values>... +{ + myclass() { } + + explicit myclass(const Values&... values) + : stored_value<Values>(values)... { } + + explicit myclass(int x, const Values&... values) + : stored_value<Values>(x, values)... { } + +}; + +void f() +{ + int i; + float f; + myclass<int*, float*> ifp1; + myclass<int*, float*> ifp2(&i, &f); + myclass<int*, float*> ifp3(1, &i, &f); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic7.C b/gcc/testsuite/g++.dg/cpp0x/variadic7.C new file mode 100644 index 000000000..3ba37bfb6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic7.C @@ -0,0 +1,33 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Args> +struct tuple_base { + static const int value = 0; +}; + +template<> +struct tuple_base<int> { + static const int value = 1; +}; + +template<> +struct tuple_base<int, float> { + static const int value = 2; +}; + +template<> +struct tuple_base<float, int> { + static const int value = 3; +}; + +template<typename... Args> +struct int_tuple : tuple_base<int, Args...> { }; + +template<typename... Args> +struct tuple_int : tuple_base<Args..., int> { }; + +int a0a[int_tuple<int>::value == 0? 1 : -1]; +int a0b[int_tuple<int>::value == 0? 1 : -1]; +int a1a[int_tuple<>::value == 1? 1 : -1]; +int a1b[tuple_int<>::value == 1? 1 : -1]; +int a2[int_tuple<float>::value == 2? 1 : -1]; +int a3[tuple_int<float>::value == 3? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic70.C b/gcc/testsuite/g++.dg/cpp0x/variadic70.C new file mode 100644 index 000000000..15bed461d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic70.C @@ -0,0 +1,22 @@ +// { dg-do run } +// { dg-options "-std=gnu++0x" } +template <typename T, T... Args> struct bomb; + +template <typename T> +struct bomb<T> { + static const T value = 0; +}; + +template <typename T, T v, T... Args> +struct bomb<T, v, Args...> { + static const T value = v + bomb<T, Args...>::value; +}; + +extern "C" void abort(); + +int main() { + bomb<int, 1, 2, 3, 4> b; + if (b.value != 10) + abort(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic71.C b/gcc/testsuite/g++.dg/cpp0x/variadic71.C new file mode 100644 index 000000000..bea3cc346 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic71.C @@ -0,0 +1,12 @@ +// { dg-options "-std=gnu++0x" } +template<typename...> struct list {}; + +template<typename Sequence, typename Head> +struct push_front; + +template<typename... Elements, typename Head> +struct push_front<list<Elements...>, Head> { + typedef list<Head, Elements> type; // { dg-error "parameter packs not expanded" } +}; + +// { dg-message "Elements" "note" { target *-*-* } 9 } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic72.C b/gcc/testsuite/g++.dg/cpp0x/variadic72.C new file mode 100644 index 000000000..b1a620d53 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic72.C @@ -0,0 +1,21 @@ +// { dg-options "-std=gnu++0x" } +struct A {}; +struct B {}; +struct C {}; + +template<typename... Mixins> +struct mixed_up : public Mixins... +{ +}; + +void fA(A); +void fB(B); +void fC(C); + +void g() +{ + mixed_up<A, B, C> m; + fA(m); + fB(m); + fC(m); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic73.C b/gcc/testsuite/g++.dg/cpp0x/variadic73.C new file mode 100644 index 000000000..05925e7aa --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic73.C @@ -0,0 +1,33 @@ +// { dg-do run } +// { dg-options "-std=gnu++0x" } +struct A {}; +struct B {}; +struct C {}; + +template<typename... Exceptions> void f(int idx) throw(Exceptions...) { + if (idx == 0) throw A(); + else if (idx == 1) throw B(); + else if (idx == 2) throw C(); +} + +extern "C" void abort(); + +int main() +{ + try { + f<A, B, C>(0); + abort(); + } catch (A) { + } + try { + f<A, B, C>(1); + abort(); + } catch (B) { + } + try { + f<A, B, C>(2); + abort(); + } catch (C) { + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic74.C b/gcc/testsuite/g++.dg/cpp0x/variadic74.C new file mode 100644 index 000000000..19b6b11d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic74.C @@ -0,0 +1,26 @@ +// { dg-options "-std=gnu++0x" } +template <class... Types> class A +{ +public: + template <Types... Values> class X { /* ... */ }; // { dg-error "not a valid type for a template constant parameter" } +}; + +template<class... Types> class B +{ +public: + template <Types*... Values> class X { + typename A<Types*...>::template X<Values...> foo; + }; +}; + +int i; +float f; + +A<int*, float*>::X<&i, &f> apple1; +B<int, float>::X<&i, &f> banana1; + +A<int*, float*>::X<&i> apple2; // { dg-error "wrong number of template arguments" } +// { dg-error "invalid type" "" { target *-*-* } 22 } +A<int*, float*>::X<&i, &f, &f> apple3; // { dg-error "wrong number of template arguments" } +// { dg-error "invalid type" "" { target *-*-* } 24 } +A<int, float> apple4; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic75.C b/gcc/testsuite/g++.dg/cpp0x/variadic75.C new file mode 100644 index 000000000..f57f8b3ef --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic75.C @@ -0,0 +1,33 @@ +// { dg-options "-std=gnu++0x" } + +template<typename...> struct tuple { }; + +template<template<typename T> class Meta, typename... Values> +struct apply_all +{ + typedef tuple<typename Meta<Values>::type...> type; +}; + +template<typename T, typename U> +struct is_same { + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> { + static const bool value = true; +}; + +template<typename T> +struct add_reference { + typedef T& type; +}; + +template<typename T> +struct add_reference<T&> { + typedef T& type; +}; + +static_assert(is_same<apply_all<add_reference, int, int&, float>::type, + tuple<int&, int&, float&> >::value, + "check apply"); diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic76.C b/gcc/testsuite/g++.dg/cpp0x/variadic76.C new file mode 100644 index 000000000..a9f8eabb3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic76.C @@ -0,0 +1,13 @@ +// PR c++/33496 +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template<int... N> int foo () +{ + return sizeof... N (); // { dg-error "cannot be used as a function" } +} + +int bar () +{ + return foo<0> (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic77.C b/gcc/testsuite/g++.dg/cpp0x/variadic77.C new file mode 100644 index 000000000..43f2d1e43 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic77.C @@ -0,0 +1,22 @@ +// PR c++/33496 +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template<int M, int N> struct pair +{ + int i, j; + pair () : i (M), j (N) {} +}; + +template<int... M> struct S +{ + template<int... N> static int foo () + { + return sizeof... (pair<M, N>); // { dg-error "mismatched argument pack lengths" } + } +}; + +int bar () +{ + return S<0, 1, 2>::foo<0, 1> (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic78.C b/gcc/testsuite/g++.dg/cpp0x/variadic78.C new file mode 100644 index 000000000..9e2b84ad0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic78.C @@ -0,0 +1,23 @@ +// PR c++/33496 +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template<int M, int N> struct pair +{ + int i, j; + pair () : i (M), j (N) {} +}; + +template<int... M> struct S +{ + template<int... N> static int *foo () + { + static int x[] = { (M + N)... }; // { dg-error "mismatched argument pack lengths" } + return x; + } +}; + +int *bar () +{ + return S<0, 1, 2>::foo<0, 1> (); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic79.C b/gcc/testsuite/g++.dg/cpp0x/variadic79.C new file mode 100644 index 000000000..c6479e04f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic79.C @@ -0,0 +1,7 @@ +// PR c++/33213 +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +template<template<typename> class...> struct A; + +template<template<typename...> class... B> struct A<B...> {}; // { dg-error "mismatch|'template<class ...> class ... B ...'" } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic8.C b/gcc/testsuite/g++.dg/cpp0x/variadic8.C new file mode 100644 index 000000000..c3a1340cf --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic8.C @@ -0,0 +1,23 @@ +// { dg-options "-std=gnu++0x" } +template<typename... Args> +struct tuple_base { + static const int value = 0; +}; + +template<> +struct tuple_base<int*> +{ + static const int value = 1; +}; + +template<typename T> +struct tuple_base<T*> +{ + static const int value = 2; +}; + +template<typename... Args> +struct tuple_of_pointers : tuple_base<Args*...> { }; + +int a1[tuple_of_pointers<int>::value == 1? 1 : -1]; +int a2[tuple_of_pointers<float>::value == 2? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic80.C b/gcc/testsuite/g++.dg/cpp0x/variadic80.C new file mode 100644 index 000000000..a56cdb404 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic80.C @@ -0,0 +1,28 @@ +// PR c++/31434 +// { dg-do run } +// { dg-options "-std=c++0x" } + +extern "C" void abort (); + +template<typename... T> inline int foo (const T...) { return 1; } +template<typename... T> inline int foo (const T *...) { return 2; } + +void +bar (int *a) +{ + a[0] = foo (0); + a[1] = foo (*a); + a[2] = foo<int> (a); + a[3] = foo<int> (2, 3, 4, 5); + a[4] = foo<int> (a, a + 1, a + 2); +} + +int +main () +{ + int a[5]; + bar (a); + if (a[0] != 1 || a[1] != 1 || a[2] != 2 || a[3] != 1 || a[4] != 2) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic81.C b/gcc/testsuite/g++.dg/cpp0x/variadic81.C new file mode 100644 index 000000000..cce61b316 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic81.C @@ -0,0 +1,11 @@ +// PR c++/33461 +// { dg-options "-std=gnu++0x" } + +template<typename> struct A; + +template<typename... T> struct A<T*> // { dg-error "not expanded|T|not used|T" } +{ + struct B; +}; + +A<void*> a; // { dg-error "incomplete" } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic82.C b/gcc/testsuite/g++.dg/cpp0x/variadic82.C new file mode 100644 index 000000000..fb3ddb3c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic82.C @@ -0,0 +1,11 @@ +// PR c++/33461 +// { dg-options "-std=gnu++0x" } + +template<typename> struct A; + +template<typename... T> struct A<T*...> // { dg-bogus "cannot expand" "" { xfail *-*-* } } +{ + struct B; +}; + +A<void*> a; // { dg-bogus "incomplete type" "" { xfail *-*-* } } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic83.C b/gcc/testsuite/g++.dg/cpp0x/variadic83.C new file mode 100644 index 000000000..2613d625f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic83.C @@ -0,0 +1,8 @@ +// PR c++/31441 +// { dg-options "-std=gnu++0x" } + +template<typename> struct A; + +template<typename... T> struct A<T...> { }; // { dg-bogus "cannot expand" "" { xfail *-*-* } } + +A<int> a; // { dg-bogus "incomplete type" "" { xfail *-*-* } } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic84.C b/gcc/testsuite/g++.dg/cpp0x/variadic84.C new file mode 100644 index 000000000..ce3126795 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic84.C @@ -0,0 +1,26 @@ +// PR c++/32565 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template<typename...> struct A1; +template<template<int...> class T> struct A1<T<0> > {}; +template<typename...> struct A2; +template<template<int...> class T> struct A2<T<0, 1> > {}; +template<typename...> struct A3; +template<template<int, int...> class T> struct A3<T<0, 1> > {}; +template<typename...> struct A4; +template<template<typename...> class T> struct A4<T<int> > {}; +template<typename...> struct A5; +template<template<typename...> class T> struct A5<T<int, long> > {}; +template<typename...> struct A6; +template<template<typename, typename...> class T> struct A6<T<int, long> > {}; +template<int> struct B1 {}; +template<int, int> struct B2 {}; +template<typename> struct B3 {}; +template<typename, typename> struct B4 {}; +A1<B1<0> > a1; +A2<B2<0, 1> > a2; +A3<B2<0, 1> > a3; +A4<B3<int> > a4; +A5<B4<int, long> > a5; +A6<B4<int, long> > a6; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic85.C b/gcc/testsuite/g++.dg/cpp0x/variadic85.C new file mode 100644 index 000000000..facb26391 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic85.C @@ -0,0 +1,10 @@ +// PR c++/32565 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template<typename...> struct A1; +template<template<int, int...> class T> struct A1<T<0, 1> > {}; +template<int, int, int...> struct B1 {}; +A1<B1<0, 1> > a1; +template<int...> struct B2 {}; +A1<B2<0, 1> > a2; // { dg-error "incomplete type" } diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic86.C b/gcc/testsuite/g++.dg/cpp0x/variadic86.C new file mode 100644 index 000000000..d8fcd620e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic86.C @@ -0,0 +1,19 @@ +// PR c++/33943 +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template<typename... A> struct foo {}; + +template<typename A0, typename... A1> struct bar {}; + +template<typename U> struct baz; + +template<template<typename...> class T, typename... U> struct baz< T<U...> > +{}; + +template<template<typename, typename...> class T, typename U, typename... V> +struct baz< T<U, V...> > +{}; + +baz< foo<int, short> > b1; +baz< bar<int, short> > b2; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic87.C b/gcc/testsuite/g++.dg/cpp0x/variadic87.C new file mode 100644 index 000000000..1defa23da --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic87.C @@ -0,0 +1,23 @@ +// PR c++/33965 +// { dg-options -std=c++0x } +template<typename T> +struct foo +{ + static bool const value = false; +}; + +template<template<typename...> class T, typename... Args> +struct foo<T<Args...> > +{ + static bool const value = true; +}; + +template<int I> +struct int_ +{}; + +int main() +{ + static_assert(foo<int_<0> >::value == false, + "picked up partial specialization, but should not have"); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic88.C b/gcc/testsuite/g++.dg/cpp0x/variadic88.C new file mode 100644 index 000000000..b14cabe32 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic88.C @@ -0,0 +1,23 @@ +// { dg-options "-std=c++0x" } + +template<template<typename...> class TT> +TT<int, float, double> foo(TT<int, float>) +{ + return TT<int, float, double>(); +} + +template<typename T> +int& foo(T) +{ + static int i = 0; return i; +} + +template<typename T, typename U> +struct pair {}; + +void bar() +{ + pair<int, float> p; + int& i = foo(p); +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic89.C b/gcc/testsuite/g++.dg/cpp0x/variadic89.C new file mode 100644 index 000000000..b943771a6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic89.C @@ -0,0 +1,14 @@ +// { dg-options "-std=c++0x" } +// Contributed by Eric Niebler +template<typename T, typename U> +struct pair +{}; + +template<typename T> +struct test; + +template<template<typename...> class T, typename... Args> +struct test<T<Args...> > +{}; + +test<pair<int, double> > t; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic9.C b/gcc/testsuite/g++.dg/cpp0x/variadic9.C new file mode 100644 index 000000000..c5db6af6a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic9.C @@ -0,0 +1,38 @@ +// { dg-options "-std=gnu++0x" } +template<typename T1, typename T2> +struct pair {}; + +template<typename... Args> +struct tuple { + static const int value = 0; +}; + +template<> +struct tuple<pair<int, float> > { + static const int value = 1; +}; + +template<typename U> +struct tuple<pair<int, U> > { + static const int value = 2; +}; + +template<typename T, typename U> +struct tuple<pair<T, U>, pair<T, U> > { + static const int value = 3; +}; + + +template<typename... Outer> +struct X { + template<typename... Inner> + struct Y + { + typedef tuple<pair<Outer, Inner>...> type; + }; +}; + +int a0[X<int, double>::Y<short, char>::type::value == 0? 1 : -1]; +int a1[X<int>::Y<float>::type::value == 1? 1 : -1]; +int a2[X<int>::Y<double>::type::value == 2? 1 : -1]; +int a3[X<int, int>::Y<double, double>::type::value == 3? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic90.C b/gcc/testsuite/g++.dg/cpp0x/variadic90.C new file mode 100644 index 000000000..632e166c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic90.C @@ -0,0 +1,8 @@ +// { dg-options "-std=c++0x" } + +template<template<typename...> class TT> +struct X { }; + +template<typename T, typename U> struct pair { }; + +X<pair> x; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic91.C b/gcc/testsuite/g++.dg/cpp0x/variadic91.C new file mode 100644 index 000000000..d78b791fb --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic91.C @@ -0,0 +1,17 @@ +// { dg-options "-std=c++0x" } +template<int N> struct Int2Type { }; + +template<typename... T> +struct Outer { + template<typename... U> + void foo(Int2Type<sizeof...(T)>, Int2Type<sizeof...(U)>); +}; + + +Outer<short, int, long> outer; + +void g4() { + outer.foo<float, double>(Int2Type<3>(), Int2Type<2>()); +} + +template<typename... T, template<T...> class X> void f1(); diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic92.C b/gcc/testsuite/g++.dg/cpp0x/variadic92.C new file mode 100644 index 000000000..d382912c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic92.C @@ -0,0 +1,70 @@ +// Various tests for variadic templates and partial specialization. +// { dg-options "-std=c++0x" } + +// PR c++/36846 +template<typename A, typename B> +struct pair; + +template<typename... T> +struct pairs; + +template<typename... AS, typename... BS> +struct pairs<pair<AS, BS>...> { + struct mismatched_packs {}; +}; + +template class pairs< + pair<int, int>, + pair<int, int> +>; + +template<int A, int B> +struct point; + +template<typename... T> +struct points; + +template<int... AS, int... BS> +struct points<point<AS, BS>...> { + struct mismatched_packs {}; +}; + +template class points< + point<0, 1>, + point<0, 1> +>; + +// PR c++/35477 +template <class...ARGS> struct tuple {}; +template <class A, class B> struct test {}; +template <class... ARGS, class B> struct test<B, tuple<ARGS...>> +{ + template <class T> struct inside {}; +}; + +// PR c++/38276 +template<typename...> struct A; + +template<typename, typename> struct B; + +template<typename... T, typename... U> struct B<A<T...>, A<U...> > +{ + static int i; +}; + +B<A<>, A<int> > b1; + +B<A<int>, A<> > b2; + +// PR c++/35784 +template <typename...> struct p; + +template <typename, typename> struct d; + +template <typename... A, typename... B> +struct d<p<A...>, p<B...> > { typedef int t; }; + +typedef d<p<>, p<int, float> >::t q; +typedef d<q, d<p<int>, p<float> >::t> r; // * + +typedef d<d<p<>, p<int, float> >::t, d<p<>, p<> >::t> s; diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic93.C b/gcc/testsuite/g++.dg/cpp0x/variadic93.C new file mode 100644 index 000000000..7d8c3298e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic93.C @@ -0,0 +1,11 @@ +// PR c++/35297 +// { dg-options "-std=c++0x" } + +template <class T=int, class... ARGS> +struct test2 {}; + +int main() +{ + test2<> a; + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic94.C b/gcc/testsuite/g++.dg/cpp0x/variadic94.C new file mode 100644 index 000000000..8420f73a6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic94.C @@ -0,0 +1,33 @@ +// PR c++/40595 +// { dg-options "-std=c++0x" } + +template<int N> +struct S +{ + typedef int type; +}; + +template<typename T> +struct Get +{ + static T get(); +}; + +template<typename F> +struct B +{ + template<typename ... Args> + typename S<sizeof( Get<F>::get() (Get<Args>::get() ...) )>::type + f(Args&& ... a); +}; + +struct X +{ + bool operator()(int) const; +}; + +int main() +{ + B<X> b; + b.f(1); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic95.C b/gcc/testsuite/g++.dg/cpp0x/variadic95.C new file mode 100644 index 000000000..ebb04ebc1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic95.C @@ -0,0 +1,17 @@ +// PR c++/39863 +// { dg-options -std=c++0x } + +template <typename... T> +struct A {}; + +template <typename T, typename U> +struct S {}; + +template <typename... T, typename... U> +A< S<T, U>... > f(U... u) +{ return A< S<T, U>... >(); } + +int main() +{ + f<int>(0.0); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic96.C b/gcc/testsuite/g++.dg/cpp0x/variadic96.C new file mode 100644 index 000000000..d4709d074 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic96.C @@ -0,0 +1,26 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/41785 +// { dg-options -std=c++0x } + +struct a {}; + +template < typename T, typename ENCLOSING > +struct base; + +template < typename... T > +struct derived + : public base< T, derived< T... > >... +{}; + +template < typename... T> +struct base< a, derived< T... > > +{ + typedef derived< T... > + Derived; +}; + +int main() +{ + derived< a > instance; +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic97.C b/gcc/testsuite/g++.dg/cpp0x/variadic97.C new file mode 100644 index 000000000..a2070319e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic97.C @@ -0,0 +1,35 @@ +// PR c++/42266 +// { dg-options -std=c++0x } + +template<typename... _Elements> + class tuple; + +template<typename _Arg> + class _Mu; + +template<typename _Signature> + struct _Bind; + +template<typename _Functor, typename... _Bound_args> + class _Bind<_Functor(_Bound_args...)> + { + template<typename... _Args, typename + = decltype(_Functor()(_Mu<_Bound_args>()(_Bound_args(), + tuple<_Args...>())...) )> + void __call() { } + }; + +template<typename _Functor, typename _Arg> + _Bind<_Functor(_Arg)> + bind(_Functor, _Arg) { } + +struct State +{ + bool ready() { return true; } + + void f() + { + bind(&State::ready, this); + } +}; + diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic98.C b/gcc/testsuite/g++.dg/cpp0x/variadic98.C new file mode 100644 index 000000000..6af599fca --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic98.C @@ -0,0 +1,411 @@ +// PR c++/42358 +// { dg-do assemble } +// { dg-options -std=c++0x } + +typedef __PTRDIFF_TYPE__ ptrdiff_t; +typedef __SIZE_TYPE__ size_t; +namespace std __attribute__ ((__visibility__ ("default"))) { + using ::size_t; +} +namespace std __attribute__ ((__visibility__ ("default"))) { + struct __sfinae_types { + typedef char __one; + typedef struct { + } __two; + }; + template<typename _Tp, _Tp __v> struct integral_constant { + static const _Tp value = __v; + typedef _Tp value_type; + typedef integral_constant<_Tp, __v> type; + }; + typedef integral_constant<bool, false> false_type; + template<typename> struct remove_cv; + template<typename> struct __is_void_helper : public false_type { + }; + template<typename _Tp> struct is_void : public integral_constant<bool, (__is_void_helper<typename remove_cv<_Tp>::type>::value)> { + }; + template<typename> struct is_array : public false_type { + }; + template<typename> struct is_function : public false_type { + }; + template<typename, unsigned _Uint = 0> struct extent : public integral_constant<std::size_t, 0> { + }; + template<typename _Tp> struct remove_const { + typedef _Tp type; + }; + template<typename _Tp> struct remove_volatile { + typedef _Tp type; + }; + template<typename _Tp> struct remove_cv { + typedef typename remove_const<typename remove_volatile<_Tp>::type>::type type; + }; + template<typename> struct is_lvalue_reference : public false_type { + }; + template<typename> struct is_rvalue_reference : public false_type { + }; + template<typename _Tp> struct is_reference : public integral_constant<bool, (is_lvalue_reference<_Tp>::value || is_rvalue_reference<_Tp>::value)> { + }; + template<typename _Tp> struct remove_reference { + typedef _Tp type; + }; + template<typename _Tp, bool = !is_reference<_Tp>::value && !is_void<_Tp>::value> struct __add_rvalue_reference_helper { + typedef _Tp type; + }; + template<typename _Tp> struct add_rvalue_reference : public __add_rvalue_reference_helper<_Tp> { + }; + template<typename _Tp> typename add_rvalue_reference<_Tp>::type declval(); + template<typename _From, typename _To, bool = (is_void<_From>::value || is_void<_To>::value || is_function<_To>::value || is_array<_To>::value)> struct __is_convertible_helper { + }; + template<typename _From, typename _To> struct __is_convertible_helper<_From, _To, false> : public __sfinae_types { + static __one __test(_To); + static __two __test(...); + static const bool __value = sizeof(__test(declval<_From>())) == 1; + }; + template<typename _From, typename _To> struct is_convertible : public integral_constant<bool, __is_convertible_helper<_From, _To>::__value> { + }; + template<bool, typename _Tp = void> struct enable_if { + }; + template<typename _Tp> struct enable_if<true, _Tp> { + typedef _Tp type; + }; + template<typename _Tp> struct identity { + typedef _Tp type; + }; + template<typename _Tp> inline typename enable_if<!is_lvalue_reference<_Tp>::value, _Tp&&>::type forward(typename std::identity<_Tp>::type& __t) { + } + template<typename _Tp> inline typename enable_if<is_lvalue_reference<_Tp>::value, _Tp>::type forward(typename std::identity<_Tp>::type __t) { + } + template<typename _Tp> inline typename std::remove_reference<_Tp>::type&& move(_Tp&& __t) { + } + template<class _T1, class _T2> struct pair { + typedef _T1 first_type; + typedef _T2 second_type; + _T1 first; + _T2 second; + template<class _U1, class = typename std::enable_if<std::is_convertible<_U1, _T1>::value>::type> pair(_U1&& __x, const _T2& __y) : first(std::forward<_U1>(__x)), second(__y) { + } + template<class _U2, class = typename std::enable_if<std::is_convertible<_U2, _T2>::value>::type> pair(const _T1& __x, _U2&& __y) : first(__x), second(std::forward<_U2>(__y)) { + } + template<class _U1, class _U2, class = typename std::enable_if<std::is_convertible<_U1, _T1>::value && std::is_convertible<_U2, _T2>::value>::type> pair(_U1&& __x, _U2&& __y) : first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { + } + template<class _U1, class _U2> pair(pair<_U1, _U2>&& __p) : first(std::move(__p.first)), second(std::move(__p.second)) { + } + template<class _U1, class _U2> pair& operator=(pair<_U1, _U2>&& __p) { + } + }; + struct input_iterator_tag { + }; + struct output_iterator_tag { + }; + struct forward_iterator_tag : public input_iterator_tag { + }; + struct bidirectional_iterator_tag : public forward_iterator_tag { + }; + template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t, typename _Pointer = _Tp*, typename _Reference = _Tp&> struct iterator { + typedef _Category iterator_category; + typedef _Tp value_type; + typedef _Distance difference_type; + typedef _Pointer pointer; + typedef _Reference reference; + }; + template<typename _Iterator> struct iterator_traits { + typedef typename _Iterator::iterator_category iterator_category; + typedef typename _Iterator::value_type value_type; + typedef typename _Iterator::difference_type difference_type; + typedef typename _Iterator::pointer pointer; + typedef typename _Iterator::reference reference; + }; + template<typename _Iter> inline typename iterator_traits<_Iter>::iterator_category __iterator_category(const _Iter&) { + } + template<typename _InputIterator> inline typename iterator_traits<_InputIterator>::difference_type __distance(_InputIterator __first, _InputIterator __last, input_iterator_tag) { + } + template<typename _InputIterator> inline typename iterator_traits<_InputIterator>::difference_type distance(_InputIterator __first, _InputIterator __last) { + return std::__distance(__first, __last, std::__iterator_category(__first)); + } + template<typename _Iterator> class reverse_iterator : public iterator<typename iterator_traits<_Iterator>::iterator_category, typename iterator_traits<_Iterator>::value_type, typename iterator_traits<_Iterator>::difference_type, typename iterator_traits<_Iterator>::pointer, typename iterator_traits<_Iterator>::reference> { + }; + template<typename _Container> class back_insert_iterator : public iterator<output_iterator_tag, void, void, void, void> { + }; +} +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) { + template<typename _Tp> class new_allocator { + public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + new_allocator() throw() { + } + new_allocator(const new_allocator&) throw() { + } + template<typename _Tp1> new_allocator(const new_allocator<_Tp1>&) throw() { + } + template<typename... _Args> void construct(pointer __p, _Args&&... __args) { + } + }; +} +namespace std __attribute__ ((__visibility__ ("default"))) { + template<typename _Tp> class allocator: public __gnu_cxx::new_allocator<_Tp> { + public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + template<typename _Tp1> struct rebind { + typedef allocator<_Tp1> other; + }; + allocator() throw() { + } + template<typename _Tp1> allocator(const allocator<_Tp1>&) throw() { + } + }; + extern template class allocator<char>; + extern template class allocator<wchar_t>; + template<typename _Arg, typename _Result> struct unary_function { + typedef _Arg argument_type; + typedef _Result result_type; + }; + template<typename _Arg1, typename _Arg2, typename _Result> struct binary_function { + typedef _Arg1 first_argument_type; + typedef _Arg2 second_argument_type; + typedef _Result result_type; + }; + template<typename _Tp> struct less : public binary_function<_Tp, _Tp, bool> { + bool operator()(const _Tp& __x, const _Tp& __y) const { + } + }; + template<typename _Pair> struct _Select1st : public unary_function<_Pair, typename _Pair::first_type> { + const typename _Pair::first_type& operator()(const _Pair& __x) const { + } + }; + struct _Rb_tree_node_base { + typedef _Rb_tree_node_base* _Base_ptr; + typedef const _Rb_tree_node_base* _Const_Base_ptr; + }; + template<typename _Val> struct _Rb_tree_node : public _Rb_tree_node_base { + typedef _Rb_tree_node<_Val>* _Link_type; + _Val _M_value_field; + template<typename... _Args> _Rb_tree_node(_Args&&... __args) : _Rb_tree_node_base(), _M_value_field(std::forward<_Args>(__args)...) { + } + }; + template<typename _Tp> struct _Rb_tree_iterator { + typedef _Tp value_type; + typedef _Tp& reference; + typedef _Tp* pointer; + typedef bidirectional_iterator_tag iterator_category; + typedef ptrdiff_t difference_type; + typedef _Rb_tree_iterator<_Tp> _Self; + typedef _Rb_tree_node_base::_Base_ptr _Base_ptr; + typedef _Rb_tree_node<_Tp>* _Link_type; + _Base_ptr _M_node; + }; + template<typename _Tp> struct _Rb_tree_const_iterator { + typedef _Tp value_type; + typedef const _Tp& reference; + typedef const _Tp* pointer; + typedef _Rb_tree_iterator<_Tp> iterator; + typedef bidirectional_iterator_tag iterator_category; + typedef ptrdiff_t difference_type; + typedef _Rb_tree_const_iterator<_Tp> _Self; + typedef _Rb_tree_node_base::_Const_Base_ptr _Base_ptr; + typedef const _Rb_tree_node<_Tp>* _Link_type; + explicit _Rb_tree_const_iterator(_Link_type __x) : _M_node(__x) { + } + _Rb_tree_const_iterator(const iterator& __it) : _M_node(__it._M_node) { + } + _Base_ptr _M_node; + }; + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc = allocator<_Val> > class _Rb_tree { + typedef typename _Alloc::template rebind<_Rb_tree_node<_Val> >::other _Node_allocator; + typedef _Rb_tree_node_base* _Base_ptr; + typedef const _Rb_tree_node_base* _Const_Base_ptr; + public: + typedef _Key key_type; + typedef _Val value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef _Rb_tree_node<_Val>* _Link_type; + typedef const _Rb_tree_node<_Val>* _Const_Link_type; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Alloc allocator_type; + _Node_allocator& _M_get_Node_allocator() { + } + _Link_type _M_get_node() { + } + template<typename... _Args> _Link_type _M_create_node(_Args&&... __args) { + _Link_type __tmp = _M_get_node(); + try { + _M_get_Node_allocator().construct(__tmp, std::forward<_Args>(__args)...); + } + catch(...) { + } + } + template<typename _Key_compare, bool _Is_pod_comparator = __is_pod(_Key_compare)> struct _Rb_tree_impl : public _Node_allocator { + _Key_compare _M_key_compare; + _Rb_tree_node_base _M_header; + size_type _M_node_count; + _Rb_tree_impl(const _Key_compare& __comp, const _Node_allocator& __a) : _Node_allocator(__a), _M_key_compare(__comp), _M_header(), _M_node_count(0) { + } + void _M_initialize() { + } + }; + _Rb_tree_impl<_Compare> _M_impl; + _Base_ptr& _M_rightmost() { + } + _Link_type _M_begin() { + } + _Link_type _M_end() { + } + _Const_Link_type _M_end() const { + } + static _Link_type _S_right(_Base_ptr __x) { + } + static const_reference _S_value(_Const_Base_ptr __x) { + } + static const _Key& _S_key(_Const_Base_ptr __x) { + return _KeyOfValue()(_S_value(__x)); + } + typedef _Rb_tree_iterator<value_type> iterator; + typedef _Rb_tree_const_iterator<value_type> const_iterator; + typedef std::reverse_iterator<iterator> reverse_iterator; + typedef std::reverse_iterator<const_iterator> const_reverse_iterator; + iterator _M_insert_(_Const_Base_ptr __x, _Const_Base_ptr __y, const value_type& __v); + iterator _M_insert_lower(_Base_ptr __x, _Base_ptr __y, const value_type& __v); + iterator _M_insert_equal_lower(const value_type& __x); + iterator _M_lower_bound(_Link_type __x, _Link_type __y, const _Key& __k); + iterator _M_upper_bound(_Link_type __x, _Link_type __y, const _Key& __k); + _Rb_tree(const _Compare& __comp, const allocator_type& __a = allocator_type()) : _M_impl(__comp, __a) { + } + iterator end() { + } + iterator _M_insert_equal_(const_iterator __position, const value_type& __x); + template<typename _InputIterator> void _M_insert_unique(_InputIterator __first, _InputIterator __last); + template<typename _InputIterator> void _M_insert_equal(_InputIterator __first, _InputIterator __last); + size_type count(const key_type& __k) const; + pair<iterator, iterator> equal_range(const key_type& __k); + pair<const_iterator, const_iterator> equal_range(const key_type& __k) const; + }; + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: _M_insert_(_Const_Base_ptr __x, _Const_Base_ptr __p, const _Val& __v) { + _Link_type __z = _M_create_node(__v); + } + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: _M_insert_lower(_Base_ptr __x, _Base_ptr __p, const _Val& __v) { + _Link_type __z = _M_create_node(__v); + } + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: _M_insert_equal_lower(const _Val& __v) { + _Link_type __x = _M_begin(); + _Link_type __y = _M_end(); + return _M_insert_lower(__x, __y, __v); + } + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> pair<typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator, typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator> _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: equal_range(const _Key& __k) { + _Link_type __x = _M_begin(); + _Link_type __y = _M_end(); + while (__x != 0) { + if (_M_impl._M_key_compare(_S_key(__x), __k)) __x = _S_right(__x); + else { + _Link_type __xu(__x), __yu(__y); + return pair<iterator, iterator>(_M_lower_bound(__x, __y, __k), _M_upper_bound(__xu, __yu, __k)); + } + } + } + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> pair<typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator, typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator> _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: equal_range(const _Key& __k) const { + _Const_Link_type __y = _M_end(); + return pair<const_iterator, const_iterator>(const_iterator(__y), const_iterator(__y)); + } + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: _M_insert_equal_(const_iterator __position, const _Val& __v) { + if (__position._M_node == _M_end()) { + if (__position._M_node == _M_rightmost()) return _M_insert_(0, _M_rightmost(), __v); + else return _M_insert_equal_lower(__v); + } + } + template<typename _Key, typename _Val, typename _KoV, typename _Cmp, typename _Alloc> template<class _II> void _Rb_tree<_Key, _Val, _KoV, _Cmp, _Alloc>:: _M_insert_equal(_II __first, _II __last) { + for (; + __first != __last; + ++__first) _M_insert_equal_(end(), *__first); + } + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc> typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::size_type _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: count(const _Key& __k) const { + pair<const_iterator, const_iterator> __p = equal_range(__k); + const size_type __n = std::distance(__p.first, __p.second); + } + template<class _E> class initializer_list { + public: + typedef _E value_type; + typedef const _E& reference; + typedef const _E& const_reference; + typedef size_t size_type; + typedef const _E* iterator; + typedef const _E* const_iterator; + iterator _M_array; + size_type _M_len; + initializer_list(const_iterator __a, size_type __l) : _M_array(__a), _M_len(__l) { + } + const_iterator begin() const { + } + const_iterator end() const { + } + }; + template <typename _Key, typename _Tp, typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > > class multimap { + typedef _Key key_type; + typedef _Tp mapped_type; + typedef std::pair<const _Key, _Tp> value_type; + typedef _Compare key_compare; + typedef _Alloc allocator_type; + typedef typename _Alloc::value_type _Alloc_value_type; + typedef typename _Alloc::template rebind<value_type>::other _Pair_alloc_type; + typedef _Rb_tree<key_type, value_type, _Select1st<value_type>, key_compare, _Pair_alloc_type> _Rep_type; + _Rep_type _M_t; + public: + typedef typename _Pair_alloc_type::pointer pointer; + typedef typename _Pair_alloc_type::const_pointer const_pointer; + typedef typename _Pair_alloc_type::reference reference; + typedef typename _Pair_alloc_type::const_reference const_reference; + typedef typename _Rep_type::iterator iterator; + typedef typename _Rep_type::const_iterator const_iterator; + typedef typename _Rep_type::size_type size_type; + typedef typename _Rep_type::difference_type difference_type; + typedef typename _Rep_type::reverse_iterator reverse_iterator; + typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator; + multimap(initializer_list<value_type> __l, const _Compare& __comp = _Compare(), const allocator_type& __a = allocator_type()) : _M_t(__comp, __a) { + _M_t._M_insert_equal(__l.begin(), __l.end()); + } + template<typename _InputIterator> multimap(_InputIterator __first, _InputIterator __last) : _M_t() { + } + template<typename _InputIterator> multimap(_InputIterator __first, _InputIterator __last, const _Compare& __comp, const allocator_type& __a = allocator_type()) : _M_t(__comp, __a) { + } + template<typename _InputIterator> void insert(_InputIterator __first, _InputIterator __last) { + } + size_type count(const key_type& __x) const { + return _M_t.count(__x); + } + std::pair<iterator, iterator> equal_range(const key_type& __x) { + return _M_t.equal_range(__x); + } + template<typename _K1, typename _T1, typename _C1, typename _A1> friend bool operator==(const multimap<_K1, _T1, _C1, _A1>&, const multimap<_K1, _T1, _C1, _A1>&); + template<typename _K1, typename _T1, typename _C1, typename _A1> friend bool operator<(const multimap<_K1, _T1, _C1, _A1>&, const multimap<_K1, _T1, _C1, _A1>&); + }; +} +extern "C" { + extern void __assert_fail (__const char *__assertion, __const char *__file, unsigned int __line, __const char *__function) throw () __attribute__ ((__noreturn__)); +} +using namespace std; +int test01() { + typedef multimap<int,double> Container; + typedef Container::iterator iterator; + typedef pair<iterator,iterator> itpair; + Container m({ + { + 1, 1.0 } + } + ); + itpair ip = m.equal_range(1); + ((distance(ip.first, ip.second) == 3) ? static_cast<void> (0) : __assert_fail ("distance(ip.first, ip.second) == 3", "/home/richard/src/trunk/libstdc++-v3/testsuite/23_containers/multimap/init-list.cc", 36, __PRETTY_FUNCTION__)); + ((m.count(7) == 2) ? static_cast<void> (0) : __assert_fail ("m.count(7) == 2", "/home/richard/src/trunk/libstdc++-v3/testsuite/23_containers/multimap/init-list.cc", 54, __PRETTY_FUNCTION__)); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic99.C b/gcc/testsuite/g++.dg/cpp0x/variadic99.C new file mode 100644 index 000000000..457212712 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic99.C @@ -0,0 +1,22 @@ +// PR c++/43054 +// { dg-options "-std=c++0x" } + +template<typename R> struct future { }; + +template<typename Fn, typename... Args> + auto + async(Fn&& fn, Args&&... args) + -> future<decltype(fn(args...))>; + +template<typename Fn, typename... Args> + auto + async(Fn&& fn, Args&&... args) + -> future<decltype(fn(args...))>; + +int work2(int value); + +void work(int value) +{ + async(work2, value); +} + diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-33964.C b/gcc/testsuite/g++.dg/cpp0x/vt-33964.C new file mode 100644 index 000000000..0b84b6cec --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-33964.C @@ -0,0 +1,20 @@ +// { dg-options "-std=c++0x" } +template<typename ... Args> +struct foo +{ + static bool const value = true; +}; + +template<typename ... Args> +struct foo< typename Args::is_applied... > // { dg-error "not used|Args" } +{ + static bool const value = false; +}; + +struct not_applied { typedef void is_applied; }; +struct applied { typedef applied is_applied; }; + +int main() +{ + foo<applied, applied> i; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34050.C b/gcc/testsuite/g++.dg/cpp0x/vt-34050.C new file mode 100644 index 000000000..cb19b3914 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34050.C @@ -0,0 +1,9 @@ +// { dg-options "-std=c++0x" } +struct A {}; + +template<typename... T> struct B : T... +{ + B() : T()... {} +}; + +B<A> b; diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34051-2.C b/gcc/testsuite/g++.dg/cpp0x/vt-34051-2.C new file mode 100644 index 000000000..2c7bb50f0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34051-2.C @@ -0,0 +1,7 @@ +// { dg-options "-std=c++0x" } +template<typename... T> struct A +{ + int i __attribute__((aligned(__alignof(T)))); // { dg-error "parameter packs|T" } +}; + +A<int> a; diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34051.C b/gcc/testsuite/g++.dg/cpp0x/vt-34051.C new file mode 100644 index 000000000..88ae56703 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34051.C @@ -0,0 +1,12 @@ +// { dg-options "-std=c++0x" } +struct A +{ + operator int(); +}; + +template <typename... T> struct B : A +{ + using A::operator T; // { dg-error "parameter packs|T" } +}; + +B<int> b; diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34052.C b/gcc/testsuite/g++.dg/cpp0x/vt-34052.C new file mode 100644 index 000000000..15310cfe7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34052.C @@ -0,0 +1,8 @@ +// { dg-options "-std=c++0x" } +template<typename... T, typename = T> struct A {}; // { dg-error "must be at the end" } + + +template<template<typename... T, typename = T> class U> struct B // { dg-error "must be at the end" } +{ + template<int> U<int> foo(); // { dg-error "mismatch|constant|invalid|invalid" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34055.C b/gcc/testsuite/g++.dg/cpp0x/vt-34055.C new file mode 100644 index 000000000..c50778430 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34055.C @@ -0,0 +1,31 @@ +// { dg-options "-std=c++0x" } +// PR c++/34055 +template<typename...> struct A; + +template<typename...T> struct A<T*> // { dg-error "parameter packs|T" } +{ + void foo(); +}; + +template<typename...T> void A<T*>::foo() {} // { dg-error "invalid declarator" } + + + +template<typename...> struct B; + +template<typename...T> struct B<T&> // { dg-error "parameter packs|T" } +{ + void foo(); +}; + +template<typename...T> void B<T&>::foo() {} // { dg-error "invalid declarator" } + + +template<typename...> struct C; + +template<typename...T> struct C<T()> // { dg-error "parameter packs|T" } +{ + void foo(); +}; + +template<typename...T> void C<T()>::foo() {} // { dg-error "invalid declarator" } diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34102.C b/gcc/testsuite/g++.dg/cpp0x/vt-34102.C new file mode 100644 index 000000000..00f0b4f4a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34102.C @@ -0,0 +1,7 @@ +// { dg-options "-std=c++0x" } +// PR c++/34102 +struct A {}; + +template<typename> struct B : virtual A {}; + +template<typename...T> struct C : B<T> {}; // { dg-error "parameter packs|T" } diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34103.C b/gcc/testsuite/g++.dg/cpp0x/vt-34103.C new file mode 100644 index 000000000..3bbbb46a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34103.C @@ -0,0 +1,7 @@ +// { dg-options "-std=c++0x" } +// PR c++/34103 +template<typename> struct A {}; + +template<typename...T> void foo(A<T>, A<T>); // { dg-error "parameter packs|T" } + +template<typename...T> void foo(A<T>, A<T>) {} // { dg-error "parameter packs|T" } diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34219-2.C b/gcc/testsuite/g++.dg/cpp0x/vt-34219-2.C new file mode 100644 index 000000000..193bc0c6c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34219-2.C @@ -0,0 +1,22 @@ +// { dg-options "-std=c++0x" } +template<template<typename... T> class Comp, typename... T> void f( T... Value) +{ + static_assert( Comp<T>::value > 0, "" ); // { dg-error "parameter packs|T" } +} + +template<template<typename... T> class Comp, typename... T> void g( T... Value) +{ + static_assert( Comp<T...>::value > 0, "" ); +} + +template <typename... T> +struct Foo +{ + static const int value=1; +}; + +int main() +{ + f<Foo>( 2 ); + g<Foo>( 2 ); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34219.C b/gcc/testsuite/g++.dg/cpp0x/vt-34219.C new file mode 100644 index 000000000..fb3584ea8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34219.C @@ -0,0 +1,15 @@ +// { dg-options "-std=c++0x" } +template<typename T, T a, T... Params> +struct max +{ + static const T value = a > max<T, Params>::value ? a : max<T, Params>::value; // { dg-error "not expanded|Params" } +}; + +template<typename T, T a, T b> +struct max<T, a, b> +{ + static const T value = a > b ? a : b; +}; + +static const int value1 = max< int, 1, 2>::value; +static const int value2 = max< int, 1, 3, 5>::value; diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34314.C b/gcc/testsuite/g++.dg/cpp0x/vt-34314.C new file mode 100644 index 000000000..4a935b367 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34314.C @@ -0,0 +1,50 @@ +// { dg-options "-std=c++0x" } + +template<typename Fun, typename... Args> // { dg-error "template parameter" } +struct call; + +template<typename Fun, typename Arg0> +struct call // { dg-error "redeclared here" } +{ + template<typename Sig> + struct result; + + template<typename X, typename Y> + struct result<X(Y)> + { + typedef X type; + }; +}; + + +template<typename Fun, int... N> // { dg-error "template parameter" } +struct call2; + +template<typename Fun, int N> +struct call2 // { dg-error "redeclared here" } +{ + template<typename Sig> + struct result; + + template<typename X, typename Y> + struct result<X(Y)> + { + typedef X type; + }; +}; + +template<typename Fun, template<typename> class... TT> // { dg-error "template parameter" } +struct call3; + +template<typename Fun, template<typename> class TT> +struct call3 // { dg-error "redeclared here" } +{ + template<typename Sig> + struct result; + + template<typename X, typename Y> + struct result<X(Y)> + { + typedef X type; + }; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34399.C b/gcc/testsuite/g++.dg/cpp0x/vt-34399.C new file mode 100644 index 000000000..542fae586 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34399.C @@ -0,0 +1,10 @@ +// { dg-options "-std=c++0x" } +template<int...> struct A +{ + void foo(); +}; + +struct B +{ + template<int N> friend void A<N>::A::foo(); // { dg-error "declared as friend" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34606.C b/gcc/testsuite/g++.dg/cpp0x/vt-34606.C new file mode 100644 index 000000000..467943354 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34606.C @@ -0,0 +1,9 @@ +// { dg-options "-std=c++0x" } +template<typename...> struct A; + +template<typename T, typename... U> struct A<T, U> // { dg-error "parameter packs|U" } +{ + template<typename> struct B; + + template<typename X> struct B<X*> {}; +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34751.C b/gcc/testsuite/g++.dg/cpp0x/vt-34751.C new file mode 100644 index 000000000..e3ca39e79 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34751.C @@ -0,0 +1,19 @@ +// { dg-options "-std=c++0x" } +// PR c++/34751 +struct A {}; + +template<typename... Args = int> // { dg-error "cannot have a default" } +void f(Args... args = 0); // { dg-error "cannot have a default argument" } + +template<typename... Args> +void g(Args... = 0); // { dg-error "cannot have a default argument" } + + +template<int, typename T = A, int T::*...p = 0 > struct B {}; // { dg-error "cannot have a default argument|no default argument" } + +B<0> b; + +template<int, typename T = A, int T::*... = 0 > struct C {}; // { dg-error "cannot have a default argument|no default argument" } + +C<0> c; + diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34753.C b/gcc/testsuite/g++.dg/cpp0x/vt-34753.C new file mode 100644 index 000000000..15eaebebc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34753.C @@ -0,0 +1,14 @@ +// { dg-options "-std=c++0x" } +template<typename... T> struct A +{ + template<T> struct B {}; // { dg-error "not expanded|T" } +}; + +A<int>::B<0> b; + +template<typename... T> struct B +{ + template<T> B(); // { dg-error "not expanded|T" } +}; + +B<int> c; diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34754.C b/gcc/testsuite/g++.dg/cpp0x/vt-34754.C new file mode 100644 index 000000000..97c006532 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34754.C @@ -0,0 +1,6 @@ +// { dg-options "-std=c++0x" } +template<template<int> class... T> struct A +{ + void foo(T<0>); // { dg-error "not expanded|T" } + void bar(T<0>); // { dg-error "not expanded|T" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34755.C b/gcc/testsuite/g++.dg/cpp0x/vt-34755.C new file mode 100644 index 000000000..9d5a3d1ca --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34755.C @@ -0,0 +1,6 @@ +// { dg-options "-std=c++0x" } +template<typename> struct A {}; + +template<template<typename> class... T> void foo(T<int>) {} // { dg-error "not expanded|T" } + +template void foo<A>(A<int>); // { dg-error "does not match" } diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34919.C b/gcc/testsuite/g++.dg/cpp0x/vt-34919.C new file mode 100644 index 000000000..829579918 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34919.C @@ -0,0 +1,13 @@ +// { dg-options "-std=c++0x" } +template<int... N> struct A +{ + static void foo() + { + int i = N; // { dg-error "not expanded|N" } + } +}; + +void bar() +{ + A<0>::foo(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34961.C b/gcc/testsuite/g++.dg/cpp0x/vt-34961.C new file mode 100644 index 000000000..3a872146e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34961.C @@ -0,0 +1,7 @@ +// { dg-options "-std=c++0x" } +template<typename... T> struct A +{ + static const int i __attribute__((aligned(__alignof(T)))) = 0; // { dg-error "not expanded|T" } +}; + +A<int> a; diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-35023.C b/gcc/testsuite/g++.dg/cpp0x/vt-35023.C new file mode 100644 index 000000000..9db20503e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-35023.C @@ -0,0 +1,11 @@ +// { dg-options "-std=c++0x" } +template<typename... T> int foo() +{ + T t; // { dg-error "parameter packs|T" } + return t; +} + +void bar() +{ + foo<int>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-35024.C b/gcc/testsuite/g++.dg/cpp0x/vt-35024.C new file mode 100644 index 000000000..77f0b66bd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-35024.C @@ -0,0 +1,11 @@ +// { dg-options "-std=c++0x" } +template<typename... T> int foo() +{ + typename T::X x; // { dg-error "parameter packs|T" } + return x; +} + +void bar() +{ + foo<int>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-35026.C b/gcc/testsuite/g++.dg/cpp0x/vt-35026.C new file mode 100644 index 000000000..643a416c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-35026.C @@ -0,0 +1,7 @@ +// { dg-options "-std=c++0x" } +template<typename... T> struct A +{ + T* x[1]; // { dg-error "parameter packs|T" } +}; + +A<int> a; diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-35147.C b/gcc/testsuite/g++.dg/cpp0x/vt-35147.C new file mode 100644 index 000000000..fecb36ec8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-35147.C @@ -0,0 +1,18 @@ +// { dg-options "-std=c++0x" } + +template<typename _Tp> + _Tp&& forward(_Tp&& __t) { return __t; } // { dg-message "note" } + +void f(...); + +template<typename... Args> +void g(Args&&... args) +{ + f(forward<Args...>(args...)); // { dg-error "no matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 11 } +} + +void h() +{ + g(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-35242.C b/gcc/testsuite/g++.dg/cpp0x/vt-35242.C new file mode 100644 index 000000000..9cc859b87 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-35242.C @@ -0,0 +1,7 @@ +// { dg-options "-std=c++0x" } +struct A +{ + template<typename... T> struct B; +}; + +template<typename... T> struct A::B<T*> {}; // { dg-error "parameter packs|T" } diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-35243.C b/gcc/testsuite/g++.dg/cpp0x/vt-35243.C new file mode 100644 index 000000000..4b5557442 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-35243.C @@ -0,0 +1,9 @@ +// { dg-options "-std=c++0x" } +struct A {}; + +template<typename... T> struct B : T... +{ + B() : T(x)... {} // { dg-error "not declared" } +}; + +B<A> b; diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-35331.C b/gcc/testsuite/g++.dg/cpp0x/vt-35331.C new file mode 100644 index 000000000..0add9819b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-35331.C @@ -0,0 +1,7 @@ +// { dg-options "-std=c++0x" } +template<typename...> struct A; + +template<typename...T> struct A<T*> // { dg-error "not expanded|T" } +{ + friend void foo(); +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-37737-1.C b/gcc/testsuite/g++.dg/cpp0x/vt-37737-1.C new file mode 100644 index 000000000..de11b1651 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-37737-1.C @@ -0,0 +1,12 @@ +// { dg-options "-std=c++0x" } +// { dg-prune-output "note" } + +void f() { } + +template<class U, class... T> +void f(){ f<T...>(); } // { dg-error "no matching" } + +int main() +{ + f<char>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-37737-2.C b/gcc/testsuite/g++.dg/cpp0x/vt-37737-2.C new file mode 100644 index 000000000..2ff7e5b0b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-37737-2.C @@ -0,0 +1,16 @@ +// { dg-options "-std=c++0x" } + +template<class U, class... T> +void f() // { dg-message "note" } +{ + f<T...>(); // { dg-error "no matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 6 } +} + +template<> +void f() { } // { dg-error "template-id" } + +int main() +{ + f<char>(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-40092.C b/gcc/testsuite/g++.dg/cpp0x/vt-40092.C new file mode 100644 index 000000000..ecb698061 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-40092.C @@ -0,0 +1,21 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +template <typename... Types> struct package {}; + +template <int ArgGen> struct wrapper_gen {}; + +template <int ArgNest> struct wrapper_nest +{ + typedef wrapper_gen<ArgNest> type_nest; +}; + +template <int... ArgPack> +struct wrapper_pack +{ + typedef package<wrapper_gen <ArgPack>...> type_pack; + // incorrect error: expansion pattern 'wrapper_gen<ArgNest>' + // contains no argument packs +}; + + diff --git a/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x.C b/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x.C new file mode 100644 index 000000000..5ad9b61b8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/warn_cxx0x.C @@ -0,0 +1,9 @@ +// { dg-options "-std=gnu++98 -Wc++0x-compat" } +int static_assert; // { dg-warning "will become a keyword" } +int nullptr; // { dg-warning "will become a keyword" } + +void foo() +{ + static_assert = 5; + nullptr = 5; +} diff --git a/gcc/testsuite/g++.dg/debug/anonunion1.C b/gcc/testsuite/g++.dg/debug/anonunion1.C new file mode 100644 index 000000000..c48a8cdc1 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/anonunion1.C @@ -0,0 +1,14 @@ +// PR debug/9039 +// Verify that the debugging backends don't get confused by ALIAS_DECLs. + +int foo() +{ + union + { + int z; + unsigned int w; + }; + + w = 0; + return 0; +} diff --git a/gcc/testsuite/g++.dg/debug/const1.C b/gcc/testsuite/g++.dg/debug/const1.C new file mode 100644 index 000000000..7cbc57141 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/const1.C @@ -0,0 +1,11 @@ +// PR c++/6381 +// Bug: we were emitting the initializer for bar, which referenced foo, +// which was not emitted. + +// { dg-options "-O" } +// { dg-do link } + +static const int foo[] = { 0 }; +static const int * const bar[] = { foo }; + +int main() {} diff --git a/gcc/testsuite/g++.dg/debug/const2.C b/gcc/testsuite/g++.dg/debug/const2.C new file mode 100644 index 000000000..8e98f8b19 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/const2.C @@ -0,0 +1,15 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 1 Apr 2005 <nathan@codesourcery.com> + +// { dg-options "-ggdb2" } +// Origin: ivan <ivanr@syncad.com> +// pinskia@gcc.gnu.org +// Bug 20505: ICE with -ggdb2 + +struct b +{ + static const int d; + virtual bool IsEmpty() const=0; + int e,c; +}; +const int b::d = ((__SIZE_TYPE__)(&((b*)1)->c) - 1); diff --git a/gcc/testsuite/g++.dg/debug/const3.C b/gcc/testsuite/g++.dg/debug/const3.C new file mode 100644 index 000000000..375c548a3 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/const3.C @@ -0,0 +1,3 @@ +/* { dg-do compile } */ +typedef float FloatVect __attribute__((__vector_size__(16))); +const FloatVect Foo = { 250000000.0, 0.0, 0.0, 0.0 }; diff --git a/gcc/testsuite/g++.dg/debug/const4.C b/gcc/testsuite/g++.dg/debug/const4.C new file mode 100644 index 000000000..ec8133d77 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/const4.C @@ -0,0 +1,2 @@ +/* { dg-do compile } */ +const __complex__ int x = 2i; diff --git a/gcc/testsuite/g++.dg/debug/crash1.C b/gcc/testsuite/g++.dg/debug/crash1.C new file mode 100644 index 000000000..4fba256b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/crash1.C @@ -0,0 +1,17 @@ +template <typename T> +class foo +{ + T t; +}; + +class bar; +typedef foo<bar> foobar; + +class obj +{ + virtual foobar* yeah() = 0; +}; + +class bar : virtual public obj +{ +}; diff --git a/gcc/testsuite/g++.dg/debug/debug.exp b/gcc/testsuite/g++.dg/debug/debug.exp new file mode 100644 index 000000000..e98d0fe55 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/debug.exp @@ -0,0 +1,30 @@ +# Copyright (C) 2002, 2007 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# G++ testsuite that uses the `dg.exp' driver. + +# Load support procs. +load_lib g++-dg.exp + +# Initialize `dg'. +dg-init + +# Main loop. +gcc-dg-debug-runtest g++_target_compile trivial.C [list -O2 -O3] \ + [lsort [glob -nocomplain $srcdir/$subdir/*.C]] + +# All done. +dg-finish diff --git a/gcc/testsuite/g++.dg/debug/debug1.C b/gcc/testsuite/g++.dg/debug/debug1.C new file mode 100644 index 000000000..3efcbc98f --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/debug1.C @@ -0,0 +1,48 @@ +// Test whether dwarf2 debug info works with named return value optimization +// { dg-do compile } + +struct S +{ + virtual ~S(); + S (const char *str); + S& operator= (const char *str); + operator const char *() const; + S& operator+= (const char *str); +}; +inline S operator+ (const char *s1, const S &s2) +{ + S x (s1); + x += s2; + return x; +} +struct U +{ + U (); + U& operator= (const char *); + const char *foo() const; + operator const char *() const { return foo(); } +}; +template <class T> struct V +{ + T v; +}; +template <class T> struct W +{ + V<T> *w; + W() : w (0) {} + const T& operator* () const { return w->v; } + T& operator* () { return w->v; } +}; +struct X { + X(); +}; +struct Y { + Y (const U &u); +}; +X::X() +{ + W<U> a; + U b; + b = (*a) + "xx"; + Y c (b); +} diff --git a/gcc/testsuite/g++.dg/debug/debug2.C b/gcc/testsuite/g++.dg/debug/debug2.C new file mode 100644 index 000000000..e0164202d --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/debug2.C @@ -0,0 +1,42 @@ +/* Verify that sched re-inserts needed scopes properly. */ +/* { dg-do compile } */ +/* { dg-options "-mcpu=ev5" { target alpha*-*-* } } */ + +template <class T> +inline void foo() +{ + void (T::*x)() __attribute__ ((__unused__)) = &T::bar; +} + +template <class T> +struct D +{ + void bar() { + } + T i; +}; + +template <class T> +struct E +{ + void bar() { + foo <D<T> > (); + *i-- = *i; + } + T i; +}; + +struct A {}; +template<typename T> struct B { typedef typename T::t t; }; +template<typename T> struct B<T*> { typedef T& t; }; +template<typename T> +struct C +{ + T b; + explicit C (const T& i) : b (i) { } + typename B<T>::t operator* () const { return *b; } + C operator-- (int) { return C (b--); } +}; + +template void foo <E<C<A**> > > (); +template void foo <D<C<A**> > > (); diff --git a/gcc/testsuite/g++.dg/debug/debug3.C b/gcc/testsuite/g++.dg/debug/debug3.C new file mode 100644 index 000000000..c7251429f --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/debug3.C @@ -0,0 +1,47 @@ +// PR optimization/5547 +// This testcase caused ICE on IA-32, since DWARF-2 was unable +// to emit location expression for parameter a of operator+. +// { dg-do compile { target fpic } } +// { dg-options "-fpic" } + +struct A { char *s; }; + +inline A operator+ (char a, const A &b) +{ + A s; + s.s = new char[12]; + s.s[0] = a; + return s; +} + +int b (const A &); + +void test1 (const A &x, int y) +{ + int j = b ("012345"[y] + x); + for (int i = 0; i < y; i++); +} + +void test2 (const A &x, int y) +{ + int j = b ("012345678"[y + 2] + x); + for (int i = 0; i < y; i++); +} + +void test3 (const A &x, int y) +{ + int j = b ("012345678"[y - 6] + x); + for (int i = 0; i < y; i++); +} + +void test4 (const A &x, int y) +{ + int j = b ("012345678"[2 * y - 10] + x); + for (int i = 0; i < y; i++); +} + +void test5 (const A &x, int y) +{ + int j = b ("012345678"[4 * y] + x); + for (int i = 0; i < y; i++); +} diff --git a/gcc/testsuite/g++.dg/debug/debug4.C b/gcc/testsuite/g++.dg/debug/debug4.C new file mode 100644 index 000000000..8dceb0875 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/debug4.C @@ -0,0 +1,17 @@ +/* PR debug/5770 + This testcase failed at -O -g because the following constants + were optimized away since they were never referenced, but + since they are variables with initializers, rtl_for_decl_location + run expand_expr on their initializers and returned it. + This lead to references to constants which were deferred and thus + never emitted. */ +/* { dg-do link } */ + +static const char foo[] = "foo string"; +static const char bar[30] = "bar string"; +static const wchar_t baz[] = L"baz string"; + +int +main () +{ +} diff --git a/gcc/testsuite/g++.dg/debug/debug5.C b/gcc/testsuite/g++.dg/debug/debug5.C new file mode 100644 index 000000000..8dffa9487 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/debug5.C @@ -0,0 +1,10 @@ +// { dg-do compile } + +int foo() +{ + int a = 1; + int b = 1; + int e[a][b]; + e[0][0] = 0; + return e[a-1][b-1]; +} diff --git a/gcc/testsuite/g++.dg/debug/debug6.C b/gcc/testsuite/g++.dg/debug/debug6.C new file mode 100644 index 000000000..64f121b00 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/debug6.C @@ -0,0 +1,7 @@ +// { dg-do compile } + +void foo() +{ + int i=1, x[i]; +} + diff --git a/gcc/testsuite/g++.dg/debug/debug7.C b/gcc/testsuite/g++.dg/debug/debug7.C new file mode 100644 index 000000000..8731cf81d --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/debug7.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// { dg-prune-output "note" } + +void f (int); + +int +main() { + + int a = 4; + int b = 5; + int (*x)[b] = new int[a][b]; // { dg-error "" } + + x[2][1] = 7; + + for (int i = 0; i < a; ++i) + for (int j = 0; j < b; ++j) + f (x[i][j]); + delete [] x; +} diff --git a/gcc/testsuite/g++.dg/debug/debug8.C b/gcc/testsuite/g++.dg/debug/debug8.C new file mode 100644 index 000000000..1f8a18ac8 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/debug8.C @@ -0,0 +1,2 @@ +struct t{}; +struct g : public t{}; diff --git a/gcc/testsuite/g++.dg/debug/debug9.C b/gcc/testsuite/g++.dg/debug/debug9.C new file mode 100644 index 000000000..aa328ee6f --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/debug9.C @@ -0,0 +1,26 @@ +/* { dg-do assemble } */ +/* This testcase requires entries in the debug_range section in DWARF which + refer to a vague linkage function. */ + +struct s +{ + ~s (); +}; + +bool f1 (); +s f2 (s); + +template<int x> void +f3(const s & a) +{ + while (f1 () && f1 ()) + { + s c = f2(a); + } +} + +int main() +{ + f3<0>(s ()); + return 0; +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf-eh-personality-1.C b/gcc/testsuite/g++.dg/debug/dwarf-eh-personality-1.C new file mode 100644 index 000000000..5c72588e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf-eh-personality-1.C @@ -0,0 +1,17 @@ +// { dg-options "-fno-dwarf2-cfi-asm" } + +extern void bar (void); +int foo (void) +{ + try { + bar(); + } catch (...) { + return 1; + } + return 0; +} + +int foobar (void) +{ +} + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2-1.C b/gcc/testsuite/g++.dg/debug/dwarf2-1.C new file mode 100644 index 000000000..e90d51030 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2-1.C @@ -0,0 +1,22 @@ +// Copyright (C) 2006 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 6 Jan 2006 <nathan@codesourcery.com> + +// PR 24824 +// Origin: wanderer@rsu.ru + +// { dg-options "-feliminate-dwarf2-dups" } + +namespace N +{ + struct Base + { + int m; + }; + + struct Derived : Base + { + using Base::m; + }; +} + +N::Derived thing; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2-2.C b/gcc/testsuite/g++.dg/debug/dwarf2-2.C new file mode 100644 index 000000000..9e6dbd216 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2-2.C @@ -0,0 +1,17 @@ +// PR debug/27057 +// { dg-do compile } +// { dg-options "-g -feliminate-dwarf2-dups" } + +namespace N +{ +} + +struct A +{ + void foo (); +}; + +void A::foo () +{ + using namespace N; +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/accessibility1.C b/gcc/testsuite/g++.dg/debug/dwarf2/accessibility1.C new file mode 100644 index 000000000..4992f4191 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/accessibility1.C @@ -0,0 +1,24 @@ +// PR debug/44668 +// { dg-do compile } +// { dg-options "-g -dA" } + +struct C +{ +private: + typedef int a; + a b; + enum g { g1, g2 } h; + struct D { int i; } i; +protected: + typedef int c; + c d; +public: + typedef int e; + e f; +} c; + +// 3 private DW_TAG_member dies, 1 private DW_TAG_typedef, +// 1 private DW_TAG_enumeration_type and 1 private DW_TAG_structure_type +// { dg-final { scan-assembler-times "3\[^\\r\\n\]* DW_AT_accessibility" 6 } } +// 1 private DW_TAG_member die, 1 private DW_TAG_typedef +// { dg-final { scan-assembler-times "2\[^\\r\\n\]* DW_AT_accessibility" 2 } } diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/anonname1.C b/gcc/testsuite/g++.dg/debug/dwarf2/anonname1.C new file mode 100644 index 000000000..b1cae2140 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/anonname1.C @@ -0,0 +1,18 @@ +// PR debug/41828 +// { dg-do compile } +// { dg-options "-gdwarf-2 -dA -std=c++0x" } +// { dg-final { scan-assembler-not "<anonymous" } } +// { dg-final { scan-assembler-not "\\._\[0-9\]" } } +// { dg-final { scan-assembler-not "\$_\[0-9\]" } } +// { dg-final { scan-assembler-not "__anon_" } } + +struct +{ + union + { + struct + { + enum { a, b, c } x; + } s; + }; +} x; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/const2.C b/gcc/testsuite/g++.dg/debug/dwarf2/const2.C new file mode 100644 index 000000000..27f4c2658 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/const2.C @@ -0,0 +1,6 @@ +/* { dg-do compile { target powerpc_altivec_ok } } */ +/* { dg-options "-O -gdwarf-2 -dA -maltivec" } */ +/* { dg-final { scan-assembler "DW_AT_const_value" } } */ + +typedef float FloatVect __attribute__((__vector_size__(16))); +const FloatVect Foo = { 250000000.0, 0.0, 0.0, 0.0 }; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C b/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C new file mode 100644 index 000000000..81360c243 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C @@ -0,0 +1,7 @@ +/* { dg-do compile { target i386*-*-* } } */ +/* { dg-options "-O -gdwarf-2 -dA -msse" } */ +/* { dg-require-effective-target sse } */ +/* { dg-final { scan-assembler "DW_AT_const_value" } } */ + +typedef float FloatVect __attribute__((__vector_size__(16))); +const FloatVect Foo = { 250000000.0, 0.0, 0.0, 0.0 }; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/dwarf2.exp b/gcc/testsuite/g++.dg/debug/dwarf2/dwarf2.exp new file mode 100644 index 000000000..37dd794be --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/dwarf2.exp @@ -0,0 +1,43 @@ +# Copyright (C) 2007, 2007, 2010 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# G++ testsuite that uses the `dg.exp' driver. + +# Load support procs. +load_lib g++-dg.exp + +# If a testcase doesn't have special options, use these. +global DEFAULT_CFLAGS +if ![info exists DEFAULT_CFLAGS] then { + set DEFAULT_CFLAGS " -gdwarf-2" +} + +# Initialize `dg'. +dg-init + +# Main loop. +set comp_output [g++_target_compile \ + "$srcdir/$subdir/../trivial.C" "trivial.S" assembly \ + "additional_flags=-gdwarf-2"] +if { ! [string match "*: target system does not support the * debug format*" \ + $comp_output] } { + remove-build-file "trivial.S" + dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C $srcdir/c-c++-common/dwarf2/*.c]] \ + "" $DEFAULT_CFLAGS +} + +# All done. +dg-finish diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/dwarf4-typedef.C b/gcc/testsuite/g++.dg/debug/dwarf2/dwarf4-typedef.C new file mode 100644 index 000000000..c5520fa72 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/dwarf4-typedef.C @@ -0,0 +1,34 @@ +/* { dg-do compile } */ +/* { dg-options "-gdwarf-4" } */ + +/* Regression test for an ICE in output_die when using -gdwarf-4. */ + +namespace { + +struct A { + virtual ~A(); +}; + +struct B : public A { + template <typename A> + bool foo(A x[2]) { } +}; + +template <typename T> +struct C { + T v[2]; +}; + +template <typename T> +bool X(T &b) { + typedef C<int> D; + D x[2]; + return b.foo(x); +} + +void f() { + B b; + X<B>(b); +} + +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/enum1.C b/gcc/testsuite/g++.dg/debug/dwarf2/enum1.C new file mode 100644 index 000000000..b5518ef18 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/enum1.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// { dg-options "-g -dA -gno-strict-dwarf -std=c++0x" } +// { dg-final { scan-assembler-times "DIE\[^\n\r\]*DW_TAG_enumeration_type" 3 } } +// { dg-final { scan-assembler-times " DW_AT_enum_class" 2 } } + +enum A { a1, a2 } a; +enum struct B { b1, b2 } b; +enum class C { c1, c2 } c; + +void +foo () +{ + a = a1; + a = A::a2; + b = B::b1; + b = B::b2; + c = C::c1; + c = C::c2; +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/explicit-constructor.C b/gcc/testsuite/g++.dg/debug/dwarf2/explicit-constructor.C new file mode 100644 index 000000000..32d205d20 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/explicit-constructor.C @@ -0,0 +1,19 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++ +// { dg-do compile } +// { dg-options "-O -g -dA -gno-strict-dwarf" } +// { dg-final { scan-assembler-times "DW_AT_explicit" 2 } } + +struct Foo +{ + Foo () {} + explicit Foo (int) {} + Foo (char) {} + ~Foo () {}; +}; + +void +bar () +{ + Foo foo; +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.C b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.C new file mode 100644 index 000000000..a4a0b50ee --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.C @@ -0,0 +1,126 @@ +// { dg-do compile } +// { dg-options "-gdwarf-2 -dA -femit-struct-debug-detailed=any" } +// { dg-final { scan-assembler "timespec.*DW_AT_name" } } +// { dg-final { scan-assembler "tv_sec.*DW_AT_name" } } +// { dg-final { scan-assembler "tv_nsec.*DW_AT_name" } } +// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } } +// { dg-final { scan-assembler "it_interval.*DW_AT_name" } } +// { dg-final { scan-assembler "it_value.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_ordy_defn_ref_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_ordy_defn_ptr_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_ordy_defn_fld_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_ordy_defn_var_head_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_ordy_defn_var_head_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_ordy_defn_var_head_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_ordy_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_tmpl_defn_fld_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_tmpl_defn_ptr_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_tmpl_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_tmpl_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_tmpl_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_tmpl_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_tmpl_defn_ptr_base.*DW_AT_name" } } +# 1 "fesd-any.C" +# 1 "<built-in>" +# 1 "<command-line>" +# 1 "fesd-any.C" + +//#include "time.h" +# 1 "time.h" 1 3 4 +struct timespec + { + long int tv_sec; + long int tv_nsec; + }; + +struct itimerspec + { + struct timespec it_interval; + struct timespec it_value; + }; + +# 6 "fesd-any.C" 2 + +struct timespec base_var8; +struct itimerspec *base_var9; + +#include "fesd-any.h" + +struct gstruct_head_ordy_defn_var_base base_var1; +struct gstruct_base_ordy_defn_var_base base_var2; + +struct gstruct_head_tmpl_defn_var_base< int > base_var5; +struct gstruct_base_tmpl_defn_var_base< int > base_var6; + +int base_function() { + return 0 ++ base_var1.field_head_ordy_defn_var_base ++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base ++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base ++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base ++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base ++ base_var5.field_head_tmpl_defn_var_base ++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base ++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base ++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base ++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base +; +} + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.h b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.h new file mode 100644 index 000000000..762f5878f --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.h @@ -0,0 +1,42 @@ +#include "fesd.h" + +struct gstruct_base_ordy_decl_not; +struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; }; + +struct gstruct_base_ordy_decl_ref_base; +struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; }; +struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; }; +struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; }; +struct gstruct_base_ordy_defn_var_base { + gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc; + gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref; + gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr; + gstruct_head_ordy_defn_fld_base field1_base_ordy_defn_var_base_fld; + gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc; + gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref; + gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr; + gstruct_base_ordy_defn_fld_base field2_base_ordy_defn_var_base_fld; +}; + +template< typename T > struct gstruct_base_tmpl_decl_not; +template< typename T > struct gstruct_base_tmpl_defn_not +{ int field_base_tmpl_defn_not; }; + +template< typename T > struct gstruct_base_tmpl_decl_ref_base; +template< typename T > struct gstruct_base_tmpl_defn_ref_base +{ int field_base_tmpl_defn_ref_base; }; +template< typename T > struct gstruct_base_tmpl_defn_ptr_base +{ int field_base_tmpl_defn_ptr_base; }; +template< typename T > struct gstruct_base_tmpl_defn_fld_base +{ int field_base_tmpl_defn_fld_base; }; +template< typename T > struct gstruct_base_tmpl_defn_var_base { + gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc; + gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref; + gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr; + gstruct_head_tmpl_defn_fld_base< T > field1_base_tmpl_defn_var_base_fld; + gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc; + gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref; + gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr; + gstruct_base_tmpl_defn_fld_base< T > field2_base_tmpl_defn_var_base_fld; +}; + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.C b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.C new file mode 100644 index 000000000..4f580ebd3 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.C @@ -0,0 +1,126 @@ +// { dg-do compile } +// { dg-options "-gdwarf-2 -dA -femit-struct-debug-baseonly" } +// { dg-final { scan-assembler "timespec.*DW_AT_name" } } +// { dg-final { scan-assembler-not "tv_sec.*DW_AT_name" } } +// { dg-final { scan-assembler-not "tv_nsec.*DW_AT_name" } } +// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } } +// { dg-final { scan-assembler-not "it_interval.*DW_AT_name" } } +// { dg-final { scan-assembler-not "it_value.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_tmpl_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_tmpl_defn_ptr_base.*DW_AT_name" } } +# 1 "fesd-baseonly.C" +# 1 "<built-in>" +# 1 "<command-line>" +# 1 "fesd-baseonly.C" + +//#include "time.h" +# 1 "time.h" 1 3 4 +struct timespec + { + long int tv_sec; + long int tv_nsec; + }; + +struct itimerspec + { + struct timespec it_interval; + struct timespec it_value; + }; + +# 6 "fesd-baseonly.C" 2 + +struct timespec base_var8; +struct itimerspec *base_var9; + +#include "fesd-baseonly.h" + +struct gstruct_head_ordy_defn_var_base base_var1; +struct gstruct_base_ordy_defn_var_base base_var2; + +struct gstruct_head_tmpl_defn_var_base< int > base_var5; +struct gstruct_base_tmpl_defn_var_base< int > base_var6; + +int base_function() { + return 0 ++ base_var1.field_head_ordy_defn_var_base ++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base ++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base ++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base ++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base ++ base_var5.field_head_tmpl_defn_var_base ++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base ++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base ++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base ++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base +; +} + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.h b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.h new file mode 100644 index 000000000..762f5878f --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.h @@ -0,0 +1,42 @@ +#include "fesd.h" + +struct gstruct_base_ordy_decl_not; +struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; }; + +struct gstruct_base_ordy_decl_ref_base; +struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; }; +struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; }; +struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; }; +struct gstruct_base_ordy_defn_var_base { + gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc; + gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref; + gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr; + gstruct_head_ordy_defn_fld_base field1_base_ordy_defn_var_base_fld; + gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc; + gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref; + gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr; + gstruct_base_ordy_defn_fld_base field2_base_ordy_defn_var_base_fld; +}; + +template< typename T > struct gstruct_base_tmpl_decl_not; +template< typename T > struct gstruct_base_tmpl_defn_not +{ int field_base_tmpl_defn_not; }; + +template< typename T > struct gstruct_base_tmpl_decl_ref_base; +template< typename T > struct gstruct_base_tmpl_defn_ref_base +{ int field_base_tmpl_defn_ref_base; }; +template< typename T > struct gstruct_base_tmpl_defn_ptr_base +{ int field_base_tmpl_defn_ptr_base; }; +template< typename T > struct gstruct_base_tmpl_defn_fld_base +{ int field_base_tmpl_defn_fld_base; }; +template< typename T > struct gstruct_base_tmpl_defn_var_base { + gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc; + gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref; + gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr; + gstruct_head_tmpl_defn_fld_base< T > field1_base_tmpl_defn_var_base_fld; + gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc; + gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref; + gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr; + gstruct_base_tmpl_defn_fld_base< T > field2_base_tmpl_defn_var_base_fld; +}; + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.C b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.C new file mode 100644 index 000000000..0af0a83d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.C @@ -0,0 +1,126 @@ +// { dg-do compile } +// { dg-options "-gdwarf-2 -dA -femit-struct-debug-detailed=none" } +// { dg-final { scan-assembler "timespec.*DW_AT_name" } } +// { dg-final { scan-assembler-not "tv_sec.*DW_AT_name" } } +// { dg-final { scan-assembler-not "tv_nsec.*DW_AT_name" } } +// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } } +// { dg-final { scan-assembler-not "it_interval.*DW_AT_name" } } +// { dg-final { scan-assembler-not "it_value.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_base_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_base_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_base_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_base_tmpl_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_base_tmpl_defn_ptr_base.*DW_AT_name" } } +# 1 "fesd-none.C" +# 1 "<built-in>" +# 1 "<command-line>" +# 1 "fesd-none.C" + +//#include "time.h" +# 1 "time.h" 1 3 4 +struct timespec + { + long int tv_sec; + long int tv_nsec; + }; + +struct itimerspec + { + struct timespec it_interval; + struct timespec it_value; + }; + +# 6 "fesd-none.C" 2 + +struct timespec base_var8; +struct itimerspec *base_var9; + +#include "fesd-none.h" + +struct gstruct_head_ordy_defn_var_base base_var1; +struct gstruct_base_ordy_defn_var_base base_var2; + +struct gstruct_head_tmpl_defn_var_base< int > base_var5; +struct gstruct_base_tmpl_defn_var_base< int > base_var6; + +int base_function() { + return 0 ++ base_var1.field_head_ordy_defn_var_base ++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base ++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base ++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base ++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base ++ base_var5.field_head_tmpl_defn_var_base ++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base ++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base ++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base ++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base +; +} + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.h b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.h new file mode 100644 index 000000000..762f5878f --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.h @@ -0,0 +1,42 @@ +#include "fesd.h" + +struct gstruct_base_ordy_decl_not; +struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; }; + +struct gstruct_base_ordy_decl_ref_base; +struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; }; +struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; }; +struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; }; +struct gstruct_base_ordy_defn_var_base { + gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc; + gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref; + gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr; + gstruct_head_ordy_defn_fld_base field1_base_ordy_defn_var_base_fld; + gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc; + gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref; + gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr; + gstruct_base_ordy_defn_fld_base field2_base_ordy_defn_var_base_fld; +}; + +template< typename T > struct gstruct_base_tmpl_decl_not; +template< typename T > struct gstruct_base_tmpl_defn_not +{ int field_base_tmpl_defn_not; }; + +template< typename T > struct gstruct_base_tmpl_decl_ref_base; +template< typename T > struct gstruct_base_tmpl_defn_ref_base +{ int field_base_tmpl_defn_ref_base; }; +template< typename T > struct gstruct_base_tmpl_defn_ptr_base +{ int field_base_tmpl_defn_ptr_base; }; +template< typename T > struct gstruct_base_tmpl_defn_fld_base +{ int field_base_tmpl_defn_fld_base; }; +template< typename T > struct gstruct_base_tmpl_defn_var_base { + gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc; + gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref; + gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr; + gstruct_head_tmpl_defn_fld_base< T > field1_base_tmpl_defn_var_base_fld; + gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc; + gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref; + gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr; + gstruct_base_tmpl_defn_fld_base< T > field2_base_tmpl_defn_var_base_fld; +}; + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.C b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.C new file mode 100644 index 000000000..a93b90f05 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.C @@ -0,0 +1,126 @@ +// { dg-do compile } +// { dg-options "-gdwarf-2 -dA -femit-struct-debug-reduced" } +// { dg-final { scan-assembler "timespec.*DW_AT_name" } } +// { dg-final { scan-assembler "tv_sec.*DW_AT_name" } } +// { dg-final { scan-assembler "tv_nsec.*DW_AT_name" } } +// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } } +// { dg-final { scan-assembler "it_interval.*DW_AT_name" } } +// { dg-final { scan-assembler "it_value.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_tmpl_defn_fld_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_tmpl_defn_ptr_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_tmpl_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_tmpl_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_tmpl_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_head_tmpl_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_tmpl_defn_ptr_base.*DW_AT_name" } } +# 1 "fesd-reduced.C" +# 1 "<built-in>" +# 1 "<command-line>" +# 1 "fesd-reduced.C" + +//#include "time.h" +# 1 "time.h" 1 3 4 +struct timespec + { + long int tv_sec; + long int tv_nsec; + }; + +struct itimerspec + { + struct timespec it_interval; + struct timespec it_value; + }; + +# 6 "fesd-reduced.C" 2 + +struct timespec base_var8; +struct itimerspec *base_var9; + +#include "fesd-reduced.h" + +struct gstruct_head_ordy_defn_var_base base_var1; +struct gstruct_base_ordy_defn_var_base base_var2; + +struct gstruct_head_tmpl_defn_var_base< int > base_var5; +struct gstruct_base_tmpl_defn_var_base< int > base_var6; + +int base_function() { + return 0 ++ base_var1.field_head_ordy_defn_var_base ++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base ++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base ++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base ++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base ++ base_var5.field_head_tmpl_defn_var_base ++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base ++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base ++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base ++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base +; +} + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.h b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.h new file mode 100644 index 000000000..762f5878f --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.h @@ -0,0 +1,42 @@ +#include "fesd.h" + +struct gstruct_base_ordy_decl_not; +struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; }; + +struct gstruct_base_ordy_decl_ref_base; +struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; }; +struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; }; +struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; }; +struct gstruct_base_ordy_defn_var_base { + gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc; + gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref; + gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr; + gstruct_head_ordy_defn_fld_base field1_base_ordy_defn_var_base_fld; + gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc; + gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref; + gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr; + gstruct_base_ordy_defn_fld_base field2_base_ordy_defn_var_base_fld; +}; + +template< typename T > struct gstruct_base_tmpl_decl_not; +template< typename T > struct gstruct_base_tmpl_defn_not +{ int field_base_tmpl_defn_not; }; + +template< typename T > struct gstruct_base_tmpl_decl_ref_base; +template< typename T > struct gstruct_base_tmpl_defn_ref_base +{ int field_base_tmpl_defn_ref_base; }; +template< typename T > struct gstruct_base_tmpl_defn_ptr_base +{ int field_base_tmpl_defn_ptr_base; }; +template< typename T > struct gstruct_base_tmpl_defn_fld_base +{ int field_base_tmpl_defn_fld_base; }; +template< typename T > struct gstruct_base_tmpl_defn_var_base { + gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc; + gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref; + gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr; + gstruct_head_tmpl_defn_fld_base< T > field1_base_tmpl_defn_var_base_fld; + gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc; + gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref; + gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr; + gstruct_base_tmpl_defn_fld_base< T > field2_base_tmpl_defn_var_base_fld; +}; + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.C b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.C new file mode 100644 index 000000000..95a9a31ff --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.C @@ -0,0 +1,126 @@ +// { dg-do compile } +// { dg-options "-gdwarf-2 -dA -femit-struct-debug-detailed=sys" } +// { dg-final { scan-assembler "timespec.*DW_AT_name" } } +// { dg-final { scan-assembler "tv_sec.*DW_AT_name" } } +// { dg-final { scan-assembler "tv_nsec.*DW_AT_name" } } +// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } } +// { dg-final { scan-assembler "it_interval.*DW_AT_name" } } +// { dg-final { scan-assembler "it_value.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_head.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_tmpl_defn_fld_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } } +// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_base.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } } +// { dg-final { scan-assembler "field_base_tmpl_defn_ptr_base.*DW_AT_name" } } +# 1 "fesd-sys.C" +# 1 "<built-in>" +# 1 "<command-line>" +# 1 "fesd-sys.C" + +//#include "time.h" +# 1 "time.h" 1 3 4 +struct timespec + { + long int tv_sec; + long int tv_nsec; + }; + +struct itimerspec + { + struct timespec it_interval; + struct timespec it_value; + }; + +# 6 "fesd-sys.C" 2 + +struct timespec base_var8; +struct itimerspec *base_var9; + +#include "fesd-sys.h" + +struct gstruct_head_ordy_defn_var_base base_var1; +struct gstruct_base_ordy_defn_var_base base_var2; + +struct gstruct_head_tmpl_defn_var_base< int > base_var5; +struct gstruct_base_tmpl_defn_var_base< int > base_var6; + +int base_function() { + return 0 ++ base_var1.field_head_ordy_defn_var_base ++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base ++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base ++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base ++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base ++ base_var5.field_head_tmpl_defn_var_base ++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base ++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base ++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base ++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base +; +} + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.h b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.h new file mode 100644 index 000000000..762f5878f --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.h @@ -0,0 +1,42 @@ +#include "fesd.h" + +struct gstruct_base_ordy_decl_not; +struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; }; + +struct gstruct_base_ordy_decl_ref_base; +struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; }; +struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; }; +struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; }; +struct gstruct_base_ordy_defn_var_base { + gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc; + gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref; + gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr; + gstruct_head_ordy_defn_fld_base field1_base_ordy_defn_var_base_fld; + gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc; + gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref; + gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr; + gstruct_base_ordy_defn_fld_base field2_base_ordy_defn_var_base_fld; +}; + +template< typename T > struct gstruct_base_tmpl_decl_not; +template< typename T > struct gstruct_base_tmpl_defn_not +{ int field_base_tmpl_defn_not; }; + +template< typename T > struct gstruct_base_tmpl_decl_ref_base; +template< typename T > struct gstruct_base_tmpl_defn_ref_base +{ int field_base_tmpl_defn_ref_base; }; +template< typename T > struct gstruct_base_tmpl_defn_ptr_base +{ int field_base_tmpl_defn_ptr_base; }; +template< typename T > struct gstruct_base_tmpl_defn_fld_base +{ int field_base_tmpl_defn_fld_base; }; +template< typename T > struct gstruct_base_tmpl_defn_var_base { + gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc; + gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref; + gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr; + gstruct_head_tmpl_defn_fld_base< T > field1_base_tmpl_defn_var_base_fld; + gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc; + gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref; + gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr; + gstruct_base_tmpl_defn_fld_base< T > field2_base_tmpl_defn_var_base_fld; +}; + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd.h b/gcc/testsuite/g++.dg/debug/dwarf2/fesd.h new file mode 100644 index 000000000..83bb15a17 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd.h @@ -0,0 +1,67 @@ +/* +where from: base = matching base; head = other header +what kind: ordy = ordinary struct; tmpl = template struct +definition: decl = incomplete declaration; defn = full definition +how used: not = not used; ref = by ref; ptr = through pointer; + fld = as field; var = as variable +from where: base = from base; head = other header +*/ + +struct gstruct_head_ordy_decl_not; +struct gstruct_head_ordy_defn_not { int field_head_ordy_defn_not; }; + +struct gstruct_head_ordy_decl_ref_head; +struct gstruct_head_ordy_defn_ref_head { int field_head_ordy_defn_ref_head; }; +struct gstruct_head_ordy_defn_ptr_head { int field_head_ordy_defn_ptr_head; }; +struct gstruct_head_ordy_defn_fld_head { int field_head_ordy_defn_fld_head; }; +struct gstruct_head_ordy_defn_var_head { + gstruct_head_ordy_decl_ref_head *field_head_ordy_defn_var_head_inc; + gstruct_head_ordy_defn_ref_head *field_head_ordy_defn_var_head_ref; + gstruct_head_ordy_defn_ptr_head *field_head_ordy_defn_var_head_ptr; + gstruct_head_ordy_defn_fld_head field_head_ordy_defn_var_head_fld; +}; +extern struct gstruct_head_ordy_defn_var_head head_var1; + +struct gstruct_head_ordy_decl_ref_base; +struct gstruct_head_ordy_defn_ref_base { int field_head_ordy_defn_ref_base; }; +struct gstruct_head_ordy_defn_ptr_base { int field_head_ordy_defn_ptr_base; }; +struct gstruct_head_ordy_defn_fld_base { int field_head_ordy_defn_fld_base; }; +struct gstruct_head_ordy_defn_var_base { int field_head_ordy_defn_var_base; }; + +template< typename T > struct gstruct_head_tmpl_decl_not; +template< typename T > struct gstruct_head_tmpl_defn_not +{ T field_head_tmpl_defn_not; }; + +template< typename T > struct gstruct_head_tmpl_decl_ref_head; +template< typename T > struct gstruct_head_tmpl_defn_ref_head +{ T field_head_tmpl_defn_ref_head; }; +template< typename T > struct gstruct_head_tmpl_defn_ptr_head +{ T field_head_tmpl_defn_ptr_head; }; +template< typename T > struct gstruct_head_tmpl_defn_fld_head +{ T field_head_tmpl_defn_fld_head; }; +template< typename T > struct gstruct_head_tmpl_defn_var_head { + gstruct_head_tmpl_decl_ref_head< T > *field_head_tmpl_defn_var_head_inc; + gstruct_head_tmpl_defn_ref_head< T > *field_head_tmpl_defn_var_head_ref; + gstruct_head_tmpl_defn_ptr_head< T > *field_head_tmpl_defn_var_head_ptr; + gstruct_head_tmpl_defn_fld_head< T > field_head_tmpl_defn_var_head_fld; +}; +extern gstruct_head_tmpl_defn_var_head< int > head_var5; + +template< typename T > struct gstruct_head_tmpl_decl_ref_base; +template< typename T > struct gstruct_head_tmpl_defn_ref_base +{ T field_head_tmpl_defn_ref_base; }; +template< typename T > struct gstruct_head_tmpl_defn_ptr_base +{ T field_head_tmpl_defn_ptr_base; }; +template< typename T > struct gstruct_head_tmpl_defn_fld_base +{ T field_head_tmpl_defn_fld_base; }; +template< typename T > struct gstruct_head_tmpl_defn_var_base +{ T field_head_tmpl_defn_var_base; }; + +inline int head_function() { + return 0 ++ head_var1.field_head_ordy_defn_var_head_ptr->field_head_ordy_defn_ptr_head ++ head_var1.field_head_ordy_defn_var_head_fld.field_head_ordy_defn_fld_head ++ head_var5.field_head_tmpl_defn_var_head_ptr->field_head_tmpl_defn_ptr_head ++ head_var5.field_head_tmpl_defn_var_head_fld.field_head_tmpl_defn_fld_head +; +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/global-used-types-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/global-used-types-1.C new file mode 100644 index 000000000..69b56478a --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/global-used-types-1.C @@ -0,0 +1,13 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// { dg-options "-g -dA -fno-merge-debug-strings" } +// { dg-do compile } +// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_enumeration_type" 1 } } +// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_enumerator" 2 } } +// { dg-final { scan-assembler-times "ascii \"a.0\"\[\t \]+\[^\n\]*DW_AT_name" 1 } } +// { dg-final { scan-assembler-times "ascii \"b.0\"\[\t \]+\[^\n\]*DW_AT_name" 1 } } + +struct foo +{ + enum { a, b }; +}; +char s[foo::b]; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/icf.C b/gcc/testsuite/g++.dg/debug/dwarf2/icf.C new file mode 100644 index 000000000..523ee8700 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/icf.C @@ -0,0 +1,50 @@ +// Test support for ICF debugging. +// { dg-do compile } +// { dg-options "-O0 -gdwarf-2 -fenable-icf-debug -dA" } + +class A +{ + public: + A(); + virtual void work(); + virtual int p(); + private: + int i; +}; + +class B +{ + public: + B(); + ~B(); + void work(const A* a); + private: + int j; +}; + +int +test1(A* a) +{ + a->work(); +} + +int +test2(A* a) +{ + if (a->p()) + { + B b; + b.work(a); + } +} + +// Verify that we get .debug_dcall and .debug_vcall tables generated +// and that we see entries for both virtual calls. +// { dg-final { scan-assembler "\\.section.*\.debug_dcall" { xfail mips-sgi-irix* } } } +// { dg-final { scan-assembler "\\.section.*\.debug_vcall" } } +// { dg-final { scan-assembler "New caller" { xfail mips-sgi-irix* } } } +// { dg-final { scan-assembler "Caller DIE offset" { xfail mips-sgi-irix* } } } +// { dg-final { scan-assembler "Point of call" } } +// { dg-final { scan-assembler "Callee DIE offset" { xfail mips-sgi-irix* } } } +// { dg-final { scan-assembler "0\[ \t\]+.*Vtable slot" } } +// { dg-final { scan-assembler "0x1\[ \t\]+.*Vtable slot" } } diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-1.C new file mode 100644 index 000000000..bfdb4f8f5 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-1.C @@ -0,0 +1,17 @@ +// PR debug/39524 +// { dg-do compile } +// { dg-options "-gdwarf-2 -dA -O0 -fno-merge-debug-strings" } + +namespace A +{ + static int var2 = 2; +} + +int +func () +{ + using A::var2; + return var2; +} + +// { dg-final { scan-assembler-times "var2\[^\n\r\]*DW_AT_name" 1 } } diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-2.C new file mode 100644 index 000000000..65141d74e --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-2.C @@ -0,0 +1,18 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR debug/38390 +// { dg-do compile } +// { dg-options "-g -dA -gno-strict-dwarf" } +// { dg-final { scan-assembler "DW_TAG_imported_module" } } + +namespace A +{ + int v; +} + +int +f () +{ + using namespace A; + return v; +} + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-3.C b/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-3.C new file mode 100644 index 000000000..6c563752a --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-3.C @@ -0,0 +1,17 @@ +// PR debug/39379 +// { dg-do compile } +// { dg-options "-g -dA -gno-strict-dwarf" } +// { dg-final { scan-assembler "DW_TAG_imported_module" } } + +namespace A +{ + int v; +} + +int +main () +{ + using namespace A; + v++; + return v - 1; +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-4.C b/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-4.C new file mode 100644 index 000000000..a325ce20f --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-4.C @@ -0,0 +1,21 @@ +// PR debug/39379 +// { dg-do compile } +// { dg-options "-g -dA -gno-strict-dwarf" } +// { dg-final { scan-assembler "DW_TAG_imported_module" } } + +namespace A +{ + int v; +} + +int +f () +{ + int i; + { + using namespace A; + v++; + i = v - 1; + } + return i; +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/imported-module.C b/gcc/testsuite/g++.dg/debug/dwarf2/imported-module.C new file mode 100644 index 000000000..7b25233f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/imported-module.C @@ -0,0 +1,35 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR debug/37410 +// { dg-do compile } + +namespace A1 + { + int aaa = 1; + }; +namespace A2 + { + int aaa = 2; + }; + +int +foo (void) +{ + int x; + + { + int block_create; + using namespace A1; + + block_create = aaa; /* break1 */ + } + + { + int block_create; + using namespace A2; + + block_create = aaa; /* break2 */ + } + + return x = 0; +} + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/inline1.C b/gcc/testsuite/g++.dg/debug/dwarf2/inline1.C new file mode 100644 index 000000000..ea405f853 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/inline1.C @@ -0,0 +1,18 @@ +// This isn't really testing dwarf output, but rather that we can inline f +// even though the call precedes the definition. + +// { dg-options "-gdwarf-2 -dA -O" } +// { dg-final { scan-assembler "DW_TAG_inlined_subroutine" } } + +template <class T> +inline T f(T); + +int main() +{ + f(1); +} + +int i; + +template <class T> +inline T f(T t) { ++i; return t; } diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/lineno-simple1.C b/gcc/testsuite/g++.dg/debug/dwarf2/lineno-simple1.C new file mode 100644 index 000000000..e0ef7f71c --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/lineno-simple1.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options "-g -O0 -dA" } + +struct C { // { dg-function-on-line {_ZN1CC[12]Ev} } + virtual void + foo() {} // { dg-function-on-line _ZN1C3fooEv } +}; +static C dummy; + +int +main (void) +{ // { dg-function-on-line main } +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/local-var-in-contructor.C b/gcc/testsuite/g++.dg/debug/dwarf2/local-var-in-contructor.C new file mode 100644 index 000000000..d61d27fe7 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/local-var-in-contructor.C @@ -0,0 +1,30 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR27574 +// { dg-do compile } +// { dg-options "-O0 -g" } +// { dg-final { scan-assembler "problem" } } + +void f (int *) +{ +} + +class A +{ +public: + A(int i); +}; + +A::A(int i) +{ + int *problem = new int(i); + f (problem); +} + +int +main (void) +{ + A a (0); + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/localclass1.C b/gcc/testsuite/g++.dg/debug/dwarf2/localclass1.C new file mode 100644 index 000000000..c7c55e12d --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/localclass1.C @@ -0,0 +1,76 @@ +// PR c++/27017 +// { dg-do compile } +// { dg-options "-gdwarf-2 -dA -feliminate-unused-debug-types -fno-merge-debug-strings" } + +int +foo (int arg1) +{ + struct localstruct1 + { + static inline int staticfn1 (int arg2) + { + int var2 = arg2 << 2; + return arg2 + var2; + } + static int staticfn2 (int arg3) + { + int var3 = arg3 << 2; + return arg3 + var3; + } + static inline int staticfn3 (int arg4) + { + int var4 = arg4 << 2; + return arg4 + var4; + } + static int staticfn4 (int arg5) + { + int var5 = arg5 << 2; + return arg5 + var5; + } + int method1 (int arg6) + { + int var6 = arg6 << 2; + return arg6 + var6; + } + }; + struct localstruct2 + { + static inline int staticfn5 (int arg7) + { + int var7 = arg7 << 2; + return arg7 + var7; + } + static int staticfn6 (int arg8) + { + int var8 = arg8 << 2; + return arg8 + var8; + } + }; + return localstruct1::staticfn1 (arg1) + localstruct1::staticfn2 (arg1); +} + +int +main () +{ + return foo (1) - 10; +} + +// { dg-final { scan-assembler "main\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler "foo\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler "staticfn1\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler "staticfn2\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "staticfn3\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "staticfn4\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "staticfn5\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "staticfn6\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "method1\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler "arg1\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler "arg2\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler "arg3\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "arg4\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "arg5\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "arg6\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "arg7\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "arg8\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler "localstruct1\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "localstruct2\[^\n\r\]*DW_AT_name" } } diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/localclass2.C b/gcc/testsuite/g++.dg/debug/dwarf2/localclass2.C new file mode 100644 index 000000000..6e9a0664f --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/localclass2.C @@ -0,0 +1,76 @@ +// PR c++/27017 +// { dg-do compile } +// { dg-options "-gdwarf-2 -dA -O2 -feliminate-unused-debug-types -fno-merge-debug-strings" } + +int +foo (int arg1) +{ + struct localstruct1 + { + static inline int staticfn1 (int arg2) + { + int var2 = arg2 << 2; + return arg2 + var2; + } + static int staticfn2 (int arg3) + { + int var3 = arg3 << 2; + return arg3 + var3; + } + static inline int staticfn3 (int arg4) + { + int var4 = arg4 << 2; + return arg4 + var4; + } + static int staticfn4 (int arg5) + { + int var5 = arg5 << 2; + return arg5 + var5; + } + int method1 (int arg6) + { + int var6 = arg6 << 2; + return arg6 + var6; + } + }; + struct localstruct2 + { + static inline int staticfn5 (int arg7) + { + int var7 = arg7 << 2; + return arg7 + var7; + } + static int staticfn6 (int arg8) + { + int var8 = arg8 << 2; + return arg8 + var8; + } + }; + return localstruct1::staticfn1 (arg1) + localstruct1::staticfn2 (arg1); +} + +int +main () +{ + return foo (1) - 10; +} + +// { dg-final { scan-assembler "main\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler "foo\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler "staticfn1\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler "staticfn2\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "staticfn3\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "staticfn4\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "staticfn5\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "staticfn6\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "method1\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler "arg1\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler "arg2\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler "arg3\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "arg4\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "arg5\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "arg6\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "arg7\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "arg8\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler "localstruct1\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler-not "localstruct2\[^\n\r\]*DW_AT_name" } } diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/namespace-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/namespace-1.C new file mode 100644 index 000000000..6137125ec --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/namespace-1.C @@ -0,0 +1,30 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR debug/41170 +// { dg-options "-g -dA -fno-merge-debug-strings -gno-strict-dwarf" } +// +// We want to test that there is a DW_TAG_namespace DIE DW_AT_name is set +// to "not_emitted". That namespace die has a child DW_TAG_typedef DIE +// which DW_AT_name is the null terminated string "T". +// { dg-final { scan-assembler-times "DIE +\\(\[^\n\]*\\) DW_TAG_namespace" 1 } } +// { dg-final { scan-assembler-times "\"not_emitted.0\"\[^\n\]*DW_AT_name" 1 } } +// { dg-final { scan-assembler-times "DIE +\\(\[^\n\]*\\) DW_TAG_typedef" 1 } } +// { dg-final { scan-assembler-times "\.ascii \"T.0\"\[\t \]+\[^\n\]*DW_AT_name" 1 } } + +struct strukt +{ + int m; +}; + +namespace not_emitted +{ + typedef strukt T; +} + +int +main() +{ + not_emitted::T t; + t.m = 0; + return 0; +} + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/nested-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/nested-1.C new file mode 100644 index 000000000..336582c11 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/nested-1.C @@ -0,0 +1,29 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR debug/40109 +// { dg-do compile } +// { dg-options "-g -dA -O0" } + +namespace A +{ + + class B + { + }; + typedef A::B AB; +}; + +int +main() +{ + A::AB ab; + return 0; +} + +// { dg-final { scan-assembler "DW_TAG_typedef" } } +// +// What we want to do here is to be sure that the DIE of A::AB is generated +// as a child of the DIE of the namespace A declaration. +// So this test won't catch a regression on this fix yet. To write a proper +// test for this fix, we would need a dwarf reader written in tcl, +// or something along those lines. + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C new file mode 100644 index 000000000..3e6f6b591 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C @@ -0,0 +1,37 @@ +/* + Origin: PR debug/45024 + { dg-options "-g -dA -fno-merge-debug-strings" } + { dg-do compile } +*/ + +struct S { + template<typename Z> struct T { }; +}; + +S::T<int> tval; + +/* +We want to express that the DIE of S::T<int> must be a child of the DIE of S, like in assembly this output: + + .uleb128 0x2 # (DIE (0x9e) DW_TAG_structure_type) + .ascii "S\0" # DW_AT_name + .byte 0x1 # DW_AT_byte_size + .byte 0x1 # DW_AT_decl_file (../../prtests/test-PR45024.cc) + .byte 0x1 # DW_AT_decl_line + .long 0xbc # DW_AT_sibling + .uleb128 0x3 # (DIE (0xa8) DW_TAG_structure_type) + .ascii "T<int>\0" # DW_AT_name + .byte 0x1 # DW_AT_byte_size + .byte 0x1 # DW_AT_decl_file (../../prtests/test-PR45024.cc) + .byte 0x2 # DW_AT_decl_line + .uleb128 0x4 # (DIE (0xb3) DW_TAG_template_type_param) + .ascii "Z\0" # DW_AT_name + .long 0xbc # DW_AT_type + .byte 0 # end of children of DIE 0xa8 + .byte 0 # end of children of DIE 0x9e + +Hence the slightly odd regexp: + + { dg-final { scan-assembler "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_structure_type\\)\[\n\r\]+\[^\n\r\]*\"S\\\\0\"\[ \t\]+\(\[@|#;!\]|//?\)\[ \t\]+DW_AT_name\[\n\r\]+\(.*\)?\\(DIE\[^\n\r\]*DW_TAG_structure_type\\)\[\n\r\]+\[^\n\r\]*\"T<int>\\\\0\"\[ \t\]+\(.*\)?\\(DIE\[^\n\r\]*DW_TAG_template_type_param\\)\[\n\r\]+\[^\n\r\]*\[\n\r\]+\[^\n\r\]*\[\n\r\]+\[^\n\r\]*\(\[@|#;!\]|//?\)\[ \t\]+end of children of DIE\[^\n\r\]*\[\n\r\]+\[^\n\r\]*end of children of DIE\[^\n\r\]*" } } + + */ diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr41063.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr41063.C new file mode 100644 index 000000000..f23efef13 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr41063.C @@ -0,0 +1,20 @@ +// Contributed by Cary Coutant <ccoutant@google.com> +// Origin: PR debug/41063 +// { dg-do compile } + +struct A { + virtual void run(); +}; + +void test() { + struct B : public A { + void run() { + struct C : public A { + C() { } + B *b_; + }; + C c; + } + }; + B b; +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr44641.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr44641.C new file mode 100644 index 000000000..2df002f6b --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr44641.C @@ -0,0 +1,41 @@ +// Origin: PR 44641 +// { dg-do compile } +// { dg-options "-g -O0 -dA" } + +template <class A> struct MisplacedDbg; +template<class T> struct MisplacedDbg<T*>; +struct Full; +template<> struct MisplacedDbg<Full>; + +struct Arg; +typedef MisplacedDbg<Arg> Typedef1; +typedef MisplacedDbg<Arg*> Typedef2; +typedef MisplacedDbg<Full> Typedef3; + +template<typename T> struct Base { + virtual ~Base() { + } +}; + +template <> +struct MisplacedDbg<Full> // { dg-function-on-line {_ZN12MisplacedDbgI4FullEC[12]Ev} } + // { dg-function-on-line {_ZN12MisplacedDbgI4FullED0Ev} { target *-*-* } 21 } + + : public Base<int> { +}; + +template <class T> +struct MisplacedDbg<T*> // { dg-function-on-line {_ZN12MisplacedDbgIP3ArgEC[12]Ev} } + // { dg-function-on-line {_ZN12MisplacedDbgIP3ArgED0Ev} { target *-*-* } 28 } + : public Base<int> { +}; + +template <class A> +struct MisplacedDbg // { dg-function-on-line {_ZN12MisplacedDbgI3ArgEC[12]Ev} } + // { dg-function-on-line {_ZN12MisplacedDbgI3ArgED0Ev} { target *-*-* } 34 } + : public Base<int> { +}; + +static MisplacedDbg<Arg> static_var1; +static MisplacedDbg<Arg*> static_var2; +static MisplacedDbg<Full> static_var3; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-1.C new file mode 100644 index 000000000..72f24ad4a --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-1.C @@ -0,0 +1,22 @@ +// PR debug/45997 +// { dg-do compile } +// { dg-options "-gdwarf-2 -dA" } + +typedef int my_int; +typedef const my_int const_my_int; +typedef volatile const_my_int volatile_const_my_int; + +my_int v_my_int = 0; +const_my_int v_const_my_int = 1; +volatile_const_my_int v_volatile_const_my_int = 4; + +int +main () +{ + asm volatile ("" : : "r" (&v_my_int)); + asm volatile ("" : : "r" (&v_const_my_int)); + asm volatile ("" : : "r" (&v_volatile_const_my_int)); + return 0; +} + +// { dg-final { scan-assembler-times "DIE\[^\n\r\]*DW_TAG_base_type" 1 } } diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-2.C new file mode 100644 index 000000000..ade542804 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-2.C @@ -0,0 +1,22 @@ +// PR debug/45997 +// { dg-do compile } +// { dg-options "-gdwarf-2 -dA" } + +typedef int my_int; +typedef volatile my_int volatile_my_int; +typedef const volatile_my_int const_volatile_my_int; + +my_int v_my_int = 0; +volatile_my_int v_volatile_my_int = 1; +const_volatile_my_int v_const_volatile_my_int = 4; + +int +main () +{ + asm volatile ("" : : "r" (&v_my_int)); + asm volatile ("" : : "r" (&v_volatile_my_int)); + asm volatile ("" : : "r" (&v_const_volatile_my_int)); + return 0; +} + +// { dg-final { scan-assembler-times "DIE\[^\n\r\]*DW_TAG_base_type" 1 } } diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr46123.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr46123.C new file mode 100644 index 000000000..eee192c26 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr46123.C @@ -0,0 +1,47 @@ +// PR debug/46123 +// { dg-do compile } +// { dg-options "-gdwarf-4" } + +struct foo +{ + static int bar () + { + int i; + static int baz = 1; + { + static int baz = 2; + i = baz++; + } + { + struct baz + { + static int m () + { + static int n; + return n += 10; + } + }; + baz a; + i += a.m (); + } + { + static int baz = 3; + i += baz; + baz += 30; + } + i += baz; + baz += 60; + return i; + } +}; + +int main () +{ + foo x; + + if (x.bar () != 16) + return 1; + if (x.bar() != 117) + return 1; + return 0; +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr46527.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr46527.C new file mode 100644 index 000000000..dfc983b17 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr46527.C @@ -0,0 +1,18 @@ +// Origin: PR 46527 +// { dg-do compile } +// { dg-options "-g -O0 -dA" } + +template <typename T> struct Struct { + double defined_later(); +}; +struct WrapperStruct { + Struct<double> ClassInstantiated; +}; +template <typename T> double +Struct<T>::defined_later() // { dg-function-on-line {_ZN6StructIdE13defined_laterEv} } +{ + return 1; +} +void InstantiateMethod() { + Struct<double>().defined_later(); +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-1.C new file mode 100644 index 000000000..63e04e426 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-1.C @@ -0,0 +1,17 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR debug/39706 +// { dg-do compile { target *-*-darwin* } } +// { dg-options "-g -dA -fno-merge-debug-strings" } +// +// There should be one debug_pubnames section generated. +// { dg-final { scan-assembler-times "\.section\[\t \]\[^\n\]*debug_pubnames" 1 } } +// +// Then check of the presence of the names we are interested in. +// { dg-final { scan-assembler-times "\"main.0\"\[^\n\]*external name" 1 } } +// { dg-final { scan-assembler-times "\"ns::ns_x\[^\n\]*external name" 1 } } +// { dg-final { scan-assembler-times "\"y::y_x\[^\n\]*external name" 1 } } + +namespace ns { int ns_x; } +class y { public: static int y_x; }; +int y::y_x; +int main() { return ns::ns_x; } diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/redeclaration-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/redeclaration-1.C new file mode 100644 index 000000000..8aaff8ef2 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/redeclaration-1.C @@ -0,0 +1,18 @@ +// Origin: PR debug/43325 +// { dg-options "-g -dA" } +// { dg-do compile } + +// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE \[^\n\r\]*DW_TAG_lexical_block\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_low_pc\[\n\r\]{1,2}\[^\n\r\]*DW_AT_high_pc\[\n\r\]{1,2}\[^\n\r\]*\\(DIE \[^\n\r\]*DW_TAG_variable\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_name" 2 } } + +namespace S +{ + int + f() + { + int i = 42; + { + extern int i; + return i; + } + } +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/rv1.C b/gcc/testsuite/g++.dg/debug/dwarf2/rv1.C new file mode 100644 index 000000000..c954daa91 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/rv1.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// { dg-options "-g -dA -gdwarf-4 -std=c++0x" } +// { dg-final { scan-assembler-times "DIE\[^\n\r\]*DW_TAG_reference_type" 1 } } +// { dg-final { scan-assembler-times "DIE\[^\n\r\]*DW_TAG_rvalue_reference_type" 1 } } + +struct A { A (); ~A (); }; +struct B { B (); ~B (); }; + +void +foo () +{ + A v; + A &a = v; + B &&b = B (); +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C new file mode 100644 index 000000000..81bcb2775 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C @@ -0,0 +1,28 @@ +// Origin: PR debug/45088 +// { dg-do compile } +// { dg-options "-g -dA" } +// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_pointer_type\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_byte_size\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type" 4 } } + +struct A +{ + virtual ~A(); +}; + +struct B : public A +{ + virtual ~B(){} +}; + +struct C : public B +{ + A* a1; +}; + +int +main() +{ + C c; + c.a1 = 0; + return 0; +} + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C new file mode 100644 index 000000000..b1c5401da --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C @@ -0,0 +1,29 @@ +// Origin: PR debug/45088 +// { dg-do compile } +// { dg-options "-g -dA" } +// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_pointer_type\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_byte_size\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type" 4 } } + +template<class T> +struct A +{ + virtual ~A(); +}; + +struct B : public A<int> +{ + virtual ~B(){} +}; + +struct C : public B +{ + A<int>* a1; +}; + +int +main() +{ + C c; + c.a1 = 0; + return 0; +} + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member1.C b/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member1.C new file mode 100644 index 000000000..dce279ed4 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member1.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// { dg-options "-g -dA -fno-merge-debug-strings" } + +struct A +{ + static int staticdatamember; +}; + +int A::staticdatamember = 6; + +// { dg-final { scan-assembler "DW_TAG_member\[^\n\r\]*\[\n\r\]*\[^\n\r\]*staticdatamember\[^\n\r\]*DW_AT_name" } } +// { dg-final { scan-assembler "DW_TAG_variable\[^\n\r\]*\[\n\r\]*\[^\n\r\]*DW_AT_specification" } } diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member2.C b/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member2.C new file mode 100644 index 000000000..568144503 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member2.C @@ -0,0 +1,12 @@ +// PR debug/26965 +// { dg-options "-gdwarf-2 -dA" } +// { dg-final { scan-assembler-not "DW_TAG_variable" } } +// { dg-final { scan-assembler-not "DW_TAG_enumerator" } } +// { dg-final { scan-assembler-not "DW_TAG_enumeration_type" } } + +enum x { i = 1 }; +class c { + static const x beg = i; + int foo () { return (int) beg; } +}; +void bar () { } diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/static-local-var-in-ctor.C b/gcc/testsuite/g++.dg/debug/dwarf2/static-local-var-in-ctor.C new file mode 100644 index 000000000..a1bf6b53c --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/static-local-var-in-ctor.C @@ -0,0 +1,37 @@ +// PR debug/39372 +// { dg-do compile } +// { dg-options "-O0 -g -dA" } +// { dg-final { scan-assembler "DW_OP_addr\[^\n\r\]*\[\n\r\]*\[^\n\r\]*staticvar1" } } +// { dg-final { scan-assembler "DW_OP_addr\[^\n\r\]*\[\n\r\]*\[^\n\r\]*staticvar2" } } + +extern void f (int *); + +struct A +{ + A(int i); + void foo(int i); +}; + +A::A(int i) +{ + static int *staticvar1 = new int(i); + f (staticvar1); +} + +void A::foo(int i) +{ + static int *staticvar2 = new int(i); + f (staticvar2); +} + +void f (int *) +{ +} + +int +main (void) +{ + A a(42); + a.foo(42); + return 0; +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-1.C new file mode 100644 index 000000000..3a43d9fa5 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-1.C @@ -0,0 +1,16 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// origin PR debug/30161 +// { dg-options "-g -dA" } +// { dg-do compile } +// { dg-final { scan-assembler "DW_TAG_template_type_param" } } +// { dg-final { scan-assembler "U.*DW_AT_name" } } + +template <class U> +U +func(U m) +{ + return m; +} + +int i = func<int>(2); + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-2.C new file mode 100644 index 000000000..27c68d796 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-2.C @@ -0,0 +1,22 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// origin PR debug/30161 +// { dg-options "-g -dA" } +// { dg-do compile } +// { dg-final { scan-assembler "DW_TAG_template_value_param" } } +// { dg-final { scan-assembler "i.*DW_AT_name" } } +// { dg-final { scan-assembler "3.*DW_AT_const_value" } } + + +template <int i> +int +func() +{ + int j = i; + return j; +} + +const int foo = 1; +const int bar = 2; + +int h = func<foo+bar>(); + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-3.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-3.C new file mode 100644 index 000000000..4c7249035 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-3.C @@ -0,0 +1,24 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR debug/30161 +// { dg-options "-g -dA -gno-strict-dwarf -fno-merge-debug-strings" } +// { dg-final { scan-assembler "DW_TAG_template_value_param" } } +// { dg-final { scan-assembler "f.*DW_AT_name" } } +// { dg-final { scan-assembler "DW_AT_location\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_addr\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*_Z4blehv\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_stack_value" } } */ + +typedef void (*func_ptr)(); + +template <func_ptr f> +int +func() +{ + f(); + return 0; +} + +void +bleh() +{ +} + +int c = func<bleh>(); + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-4.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-4.C new file mode 100644 index 000000000..85401b228 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-4.C @@ -0,0 +1,38 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR debug/30161 +// { dg-options "-std=c++0x -g -dA" } +// +// In theory the compiler instantiates count<int, char, long>, +// count<char, long> and count<long>. In practice, only +// count<int, char, long> is emitted, thanks to constant folding. +// So in theory, each of the 3 instances of count yields a +// DW_TAG_GNU_template_parameter_pack DIE, but in practise, there is only one +// DW_TAG_GNU_template_parameter_pack as there is only count<int, char, long> +// is emitted. +// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_GNU_template_parameter_pack" 1} } +// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_template_type_param" 3} } + + +template <typename... Args> struct count; + +template <> +struct count<> +{ + static const int value = 0; +}; + +template <typename T, typename... Args> +struct count<T, Args...> +{ + static const int value = 1 + count<Args...>::value; +}; + +template<typename... P> +int +do_count() +{ + return count<P...>::value; +} + +int c = do_count<int, char, long>(); + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-5.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-5.C new file mode 100644 index 000000000..c4fd8dc3e --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-5.C @@ -0,0 +1,28 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR debug/30161 +// { dg-options "-g -dA" } +// { dg-final { scan-assembler "DW_TAG_template_type_param" } } +// { dg-final { scan-assembler "T.*DW_AT_name" } } + +template <class T> +struct vector +{ + int size; + + vector () : size (0) + { + } +}; + + +template<template <class T> class U> +int +bar() +{ + U<int> u; + return u.size; +} + +vector<int> v; +int j = bar<vector>(); + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-6.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-6.C new file mode 100644 index 000000000..99bbba3da --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-6.C @@ -0,0 +1,38 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR debug/30161 +// { dg-options "-g -dA -fno-merge-debug-strings" } +// { dg-final { scan-assembler-times "DW_TAG_GNU_template_template_param" 2 } } +// { dg-final { scan-assembler-times "\"vector.0\".*?DW_AT_GNU_template_name" 1 } } +// { dg-final { scan-assembler-times ".ascii \"U.0\".*?DW_AT_name" 1 } } + +template <class T> +struct vector_base +{ + + static int get_sizeof_t() + { + return 0; + } +}; + +template <class T> +struct vector : public vector_base<T> +{ + static int get_sizeof_t() + { + return sizeof (T); + } + T member1; + T member2; +}; + +template <template <class T> class U> +int +bar() +{ + return U<int>::get_sizeof_t(); +} + +int i = bar<vector>(); + + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-7.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-7.C new file mode 100644 index 000000000..fc82dce79 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-7.C @@ -0,0 +1,59 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR debug/30161 +// { dg-options "-g -dA -std=c++0x -fno-merge-debug-strings" } +// { dg-do compile } + +// There must be 5 subprograms generated: +// printf(const char*), printf<int, char, int>, +// printf<char, int>, printf<int> and foo(). +// { dg-final {scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_subprogram" 5 } } + +// That makes 6 template type parameters. +// { dg-final {scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_template_type_param" 6 } } +// { dg-final {scan-assembler-times "\"printf<int, char, int>.0\"\[^\n\]*DW_AT_name" 1 } } +// { dg-final {scan-assembler-times "\"printf<char, int>.0\"\[^\n\]*DW_AT_name" 1 } } +// { dg-final {scan-assembler-times "\"printf<int>.0\"\[^\n\]*DW_AT_name" 1 } } +// { dg-final {scan-assembler-times "\"printf.0\"\[^\n\]*DW_AT_name" 1 } } + +// printf<int, char, int> and printf<char, int> have a pack expansion as +// function parameters. There should then be 3 +// DW_TAG_GNU_template_parameter_pack and 3 DW_TAG_GNU_formal_parameter_pack DIEs +// { dg-final {scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_GNU_template_parameter_pack" 3 } } +// { dg-final {scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_GNU_formal_parameter_pack" 3 } } +// These 3 function template instantiations has a total of 3 template +// parameters named T. +// { dg_final {scan-assembler-times "\.ascii \"T.0\"\[\t \]+\[^\n\]*DW_AT_name" 3 } } + + +void +printf(const char* s) +{ + /* Commented this to not pull std::cout into what should be + a simple test. + while (*s) + std::cout << *s++; + */ +} + +template<typename T, typename... PackTypes> +void +printf(const char* s, + T value, + PackTypes... args) +{ + while (*s) + { + if (*s == '%' && *++s != '%') + { + /* std::cout << value; */ + return printf(++s, args...); + } + } +} + +void +foo () +{ + int x; + printf("%c %d", x, 'x', 3); +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-1.C new file mode 100644 index 000000000..e28297b55 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-1.C @@ -0,0 +1,15 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// origin PR debug/30161 +// { dg-options "-g -dA" } +// { dg-do compile } +// { dg-final { scan-assembler "DW_TAG_template_type_param" } } +// { dg-final { scan-assembler "U.*DW_AT_name" } } + +template <class U> +class A +{ + U m; +}; + +A<int> a; + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-10.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-10.C new file mode 100644 index 000000000..c12fe3990 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-10.C @@ -0,0 +1,22 @@ +// Origin PR c++/47291 +// { dg-options "-g -dA" } +// { dg-do compile } + +struct S; +template< int S::* cst> struct D {}; + +struct S +{ + int i; + D < &S::i > di; //<-- folding &S::i was failing + // because i has no offset as S is not laid out yet +}; + +int +main() +{ + S s; + return s.i; +} + +// { dg-final { scan-assembler-times "DIE \\(\[^\n\r\]*\\) DW_TAG_template_value_param" 1 } } diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-2.C new file mode 100644 index 000000000..ce5fbab74 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-2.C @@ -0,0 +1,23 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// origin PR debug/30161 +// { dg-options "-g -dA" } +// { dg-do compile } +// { dg-final { scan-assembler "DW_TAG_template_value_param" } } +// { dg-final { scan-assembler "i.*DW_AT_name" } } +// { dg-final { scan-assembler "3.*DW_AT_const_value" } } + +template <int i> +struct A +{ + int m; + A () + { + m = i; + } +}; + +const int foo = 1; +const int bar = 2; + +A<foo+bar> a; + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-3.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-3.C new file mode 100644 index 000000000..e69e1c9f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-3.C @@ -0,0 +1,25 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR debug/30161 +// { dg-options "-g -dA -gno-strict-dwarf -fno-merge-debug-strings" } +// { dg-final { scan-assembler "DW_TAG_template_value_param" } } +// { dg-final { scan-assembler "f.*DW_AT_name" } } +// { dg-final { scan-assembler "DW_AT_location\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_addr\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*_Z4blehv\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_stack_value" } } */ + +typedef void (*func_ptr) (); + +template <func_ptr f> +struct A +{ + A () + { + f (); + } +}; + +void +bleh () +{ +} + +A<bleh> a; + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-4.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-4.C new file mode 100644 index 000000000..a0ca6137c --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-4.C @@ -0,0 +1,36 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR debug/30161 +// { dg-options "-std=c++0x -g -dA" } +// +// In theory the compiler instantiates count<int, char, long>, +// count<char, long> and count<long>. In practice, only +// count<int, char, long> is emitted, thanks to constant folding. +// So in theory, each of the 3 instances of count yields a +// DW_TAG_GNU_template_parameter_pack DIE, but in practise, there is only one +// DW_TAG_GNU_template_parameter_pack as there is only count<int, char, long> +// is emitted. +// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_GNU_template_parameter_pack" 1} } +// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_template_type_param" 3} } + +template <typename... Args> struct count; + +template <> +struct count<> +{ + static const int value = 0; +}; + +template <typename T, typename... Args> +struct count<T, Args...> +{ + static const int value = 1 + count<Args...>::value; +}; + +int +foo () +{ + count<int, char, long> c; + int nb = count<int, char, long>::value; + return nb; +} + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-5.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-5.C new file mode 100644 index 000000000..f36eac5f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-5.C @@ -0,0 +1,29 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR debug/30161 +// { dg-options "-g -dA" } +// { dg-final { scan-assembler "DW_TAG_template_type_param" } } +// { dg-final { scan-assembler "T.*DW_AT_name" } } + +template <class T> +struct vector +{ + int size; + + vector () : size (0) + { + } +}; + +template<template <class T> class U> +struct bar +{ + U<int> u; + int m; + bar () : m (u.size) + { + } +}; + +vector<int> v; +bar<vector> b; + diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-6.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-6.C new file mode 100644 index 000000000..06cdef5b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-6.C @@ -0,0 +1,44 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR debug/30161 +// { dg-options "-g -dA -fno-merge-debug-strings" } +// { dg-final { scan-assembler-times "DW_TAG_GNU_template_template_param" 2 } } +// { dg-final { scan-assembler-times "\"vector.0\"\[^\n\]*DW_AT_GNU_template_name" 1 } } +// { dg-final { scan-assembler-times ".ascii \"U.0\"\[^\n\]*DW_AT_name" 1 } } + +template <class T> +struct vector_base +{ + T tab[3 + 1]; + static int get_sizeof_t() + { + return sizeof (tab); + } +}; + +template <class T> +struct vector : public vector_base<T> +{ + static int get_sizeof_t() + { + return sizeof (T); + } + T member1; + T member2; +}; + +template <template <class T> class U> +struct bar +{ + int foo() + { + return U<int>::get_sizeof_t (); + } +}; + + +int +foo_func () +{ + bar<vector> b; + return b.foo (); +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-7.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-7.C new file mode 100644 index 000000000..2b393594f --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-7.C @@ -0,0 +1,21 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR debug/30161 +// { dg-options "-std=c++0x -g -dA -fno-merge-debug-strings" } + +// The type M<> should have one DW_TAG_GNU_template_parameter_pack DIE, +// with no DW_AT_name attribute. We don't test the fact that it has no +// DW_AT_name though. +// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_GNU_template_parameter_pack" 1 } } + + +template <typename...> +struct M +{ +}; + +struct R : + M<> +{ +}; + +R r; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-8.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-8.C new file mode 100644 index 000000000..db4e0580a --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-8.C @@ -0,0 +1,15 @@ +// Origin PR debug/46955 +// { dg-options "-g -dA" } +// { dg-do compile } + +struct S { int f; }; +template<int S::*MP> struct T { }; +T<&S::f> v; + +// For the type of v, we should have this DWARF generated: +// .uleb128 0x6 # (DIE (0x57) DW_TAG_template_value_param) +// .ascii "MP\0" # DW_AT_name +// .long 0x61 # DW_AT_type +// .byte 0 # DW_AT_const_value +// So let's look for that. +// { dg-final { scan-assembler-times "\[^\n\r\]*DIE \\(\[^\n\r\]*\\) DW_TAG_template_value_param\[^\n\r\]*\[\n\r\]{1,2}\[^\n\r\]*DW_AT_name\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type\[\n\r\]{1,2}\[^\n\r\]*DW_AT_const_value\[\n\r\]{1,2}" 1 } } diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-9.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-9.C new file mode 100644 index 000000000..7af1d9192 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-9.C @@ -0,0 +1,28 @@ +// Origin PR debug/PR46973 +// { dg-options "-g -dA" } +// { dg-do compile } + +struct S +{ + int f; +}; + +template<typename T, int I, int *P, int S::*MP> +struct Base +{ + template<typename Z> + struct Inner + { + }; +}; + +int a_global; + +int main () +{ + Base<long, 47, &a_global, &S::f>::Inner<float> inner; + return 0; +} + +// { dg-final { scan-assembler-times "DIE \\(\[^\n\r\]*\\) DW_TAG_template_type_param" 2 } } +// { dg-final { scan-assembler-times "DIE \\(\[^\n\r\]*\\) DW_TAG_template_value_param" 3 } } diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/typedef1.C b/gcc/testsuite/g++.dg/debug/dwarf2/typedef1.C new file mode 100644 index 000000000..a9ce44d52 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/typedef1.C @@ -0,0 +1,33 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/40705 +// { dg-options "-g -dA" } +// { dg-do compile } +// { dg-final { scan-assembler-times "DW_TAG_structure_type" 2 } } +// { dg-final { scan-assembler-times "DW_AT_name: \"foo<1u>\"|\"foo<1u>..\"\[^\n\]*DW_AT_name" 1 } } +// { dg-final { scan-assembler-times "DW_TAG_enumeration_type" 2 } } +// { dg-final { scan-assembler-times "DW_AT_name: \"typedef foo<1u>::type type\"|\"typedef foo<1u>::type type..\"\[^\n\]*DW_AT_name" 1 } } +// { dg-final { scan-assembler-times "DIE \\(\[^\n\]*\\) DW_TAG_enumeration_type" 1 } } +// { dg-final { scan-assembler-times "\"e0..\"\[^\n\]*DW_AT_name" 1 } } +// { dg-final { scan-assembler-times "\"e1..\"\[^\n\]*DW_AT_name" 1 } } + +template <unsigned int n> +struct foo +{ +public: + typedef + unsigned char type; +}; + +template<> +struct foo<1> +{ + typedef enum { e0, e1 } type; +}; + +int +main() +{ + foo<1> f; + foo<1>::type t = foo<1>::e1; + return t; +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/typedef2.C b/gcc/testsuite/g++.dg/debug/dwarf2/typedef2.C new file mode 100644 index 000000000..5bf04998a --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/typedef2.C @@ -0,0 +1,11 @@ +// Origin: PR debug/43628 +// { dg-options "-g -dA" } +// { dg-do compile } + +// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_formal_parameter\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type\[\n\r\]{1,2}" 1 } } +class C +{ + public: + typedef void (*t) (C); +}; +C::t f; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/typedef3.C b/gcc/testsuite/g++.dg/debug/dwarf2/typedef3.C new file mode 100644 index 000000000..ca70d9cac --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/typedef3.C @@ -0,0 +1,19 @@ +// Origin: PR debug/44188 +// { dg-options "-g -dA" } +// { dg-do compile } + +// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_typedef\\)" 1 } } + +// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_structure_type\\)" 1 } } + +typedef struct +{ + int i; +} AAA; + +int +main(void) +{ + AAA aa; + return 0; +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C b/gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C new file mode 100644 index 000000000..2879f6099 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C @@ -0,0 +1,10 @@ +// Origin: PR debug/45171 +// { dg-options "-g -dA -fno-eliminate-unused-debug-types" } +// { dg-do compile } + +// There should be 2 real instances of byte_size -- one for the +// struct and one for "int". The other two instances are from +// the comments in the .debug_abbrev section. +// { dg-final { scan-assembler-times "DW_AT_byte_size" 4 } } + +typedef struct { int a, b; } x; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/typedef5.C b/gcc/testsuite/g++.dg/debug/dwarf2/typedef5.C new file mode 100644 index 000000000..d9d058c9c --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/typedef5.C @@ -0,0 +1,10 @@ +// Origin: PR debug/46101 +// { dg-options "-g -feliminate-dwarf2-dups" } +// { dg-do compile } + +typedef struct +{ + virtual void f () { } +} A; + +A a; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/typedef6.C b/gcc/testsuite/g++.dg/debug/dwarf2/typedef6.C new file mode 100644 index 000000000..8896446a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/typedef6.C @@ -0,0 +1,30 @@ +// Origin PR debug/ +// { dg-options "-g -dA" } + +class C { +public: + C() {} + ~C() {} +}; +typedef struct { + C m; +} t; +typedef t s; +s v; + +/* + We want to check that we have a DIE describing the typedef t like this: + + .uleb128 0xc # (DIE (0xb8) DW_TAG_typedef) + .ascii "t\0" # DW_AT_name + .byte 0x1 # DW_AT_decl_file (../../prtests/test.cc) + .byte 0xb # DW_AT_decl_line + .long 0x78 # DW_AT_type + + e.g, it should not haven any child DIE -- the bug here was that this + DIE had children DIEs. So we check that the last line is immediately + followed by a line containing the pattern "(DIE (", instead of a + line containing a DW_AT_sibling attribute. + */ + +// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE \[^\n\r\]* DW_TAG_typedef\\)\[\n\r\]{1,2}\[^\n\r\].*\"t\\\\0\"\[^\n\r\]*DW_AT_name\[\n\r\]{1,2}\[^\n\r\]*\[\n\r\]{1,2}\[^\n\r\]*\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type\[\n\r\]{1,2}\[^\n\r\]*\\(DIE" 1 } } diff --git a/gcc/testsuite/g++.dg/debug/enum-1.C b/gcc/testsuite/g++.dg/debug/enum-1.C new file mode 100644 index 000000000..7681e9b52 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/enum-1.C @@ -0,0 +1,16 @@ +/* Verify that used enums are output. */ +/* { dg-do compile } */ +/* { dg-final { scan-assembler "JTI_MAX" } } */ + +int var; + +enum java_tree_index +{ + JTI_MAX +}; + +void function (void) +{ + var = JTI_MAX; +} + diff --git a/gcc/testsuite/g++.dg/debug/enum-2.C b/gcc/testsuite/g++.dg/debug/enum-2.C new file mode 100644 index 000000000..d5501313d --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/enum-2.C @@ -0,0 +1,22 @@ +/* Verify that used enums are output. */ +/* { dg-do compile } */ +/* { dg-final { scan-assembler "JTI_MAX" } } */ + +int var; + +enum java_tree_index +{ + JTI_MAX +}; + +template<int X> +void tmpl (void) +{ + var = JTI_MAX + X; +} + +void +function (void) +{ + tmpl<2>(); +} diff --git a/gcc/testsuite/g++.dg/debug/minimal1.C b/gcc/testsuite/g++.dg/debug/minimal1.C new file mode 100644 index 000000000..c2daa0ff2 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/minimal1.C @@ -0,0 +1,7 @@ +// PR debug/6387 +// Verify that -g1 works with local class member functions. + +void foo(); +void bar() { + struct A { A() { foo(); } } a; +} diff --git a/gcc/testsuite/g++.dg/debug/namespace1.C b/gcc/testsuite/g++.dg/debug/namespace1.C new file mode 100644 index 000000000..6629efb9a --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/namespace1.C @@ -0,0 +1,258 @@ +/* Test DWARF namespace support. + This test case is based on GDB testsuite test case. */ +/* { dg-do compile } */ + +namespace AAA { + char c; + int i; + int A_xyzq (int); + char xyzq (char); + class inA { + public: + int xx; + int fum (int); + }; +}; + +int AAA::inA::fum (int i) +{ + return 10 + i; +} + +namespace BBB { + char c; + int i; + int B_xyzq (int); + char xyzq (char); + + namespace CCC { + char xyzq (char); + }; + + class Klasse { + public: + char xyzq (char); + int dummy; + }; +}; + +int AAA::A_xyzq (int x) +{ + return 2 * x; +} + +char AAA::xyzq (char c) +{ + return 'a'; +} + + +int BBB::B_xyzq (int x) +{ + return 3 * x; +} + +char BBB::xyzq (char c) +{ + return 'b'; +} + +char BBB::CCC::xyzq (char c) +{ + return 'z'; +} + +char BBB::Klasse::xyzq (char c) +{ + return 'o'; +} + +void marker1(void) +{ + return; +} + +namespace +{ + int X = 9; + + namespace G + { + int Xg = 10; + + namespace + { + int XgX = 11; + } + } +} + +namespace H +{ + int h = 14; +} + +namespace I = H; + +namespace J +{ + int j = 15; +} + +using namespace J; + +namespace K +{ + int k = 16; +} + +namespace L +{ + using namespace K; +} + +namespace O +{ + int o = 18; +} + +namespace P +{ + using namespace O; +} + +namespace Q +{ + using namespace P; +} + +namespace R +{ + int r1 = 19; + int r2 = 20; +} + +using R::r1; + +namespace C +{ + int c = 1; + int shadow = 12; + + class CClass { + public: + int x; + class NestedClass { + public: + int y; + }; + }; + + namespace + { + int cX = 6; + + namespace F + { + int cXf = 7; + + namespace + { + int cXfX = 8; + } + } + } + + namespace C + { + int cc = 2; + } + + namespace E + { + int ce = 4; + } + + namespace D + { + int cd = 3; + int shadow = 13; + + namespace E + { + int cde = 5; + } + + namespace M + { + int cdm = 17; + } + + using namespace M; + + void marker2 (void) + { + // NOTE: carlton/2003-04-23: I'm listing the expressions that I + // plan to have GDB try to print out, just to make sure that the + // compiler and I agree which ones should be legal! It's easy + // to screw up when testing the boundaries of namespace stuff. + c; + //cc; + C::cc; + cd; + //C::D::cd; + E::cde; + shadow; + //E::ce; + cX; + F::cXf; + F::cXfX; + X; + G::Xg; + //cXOtherFile; + //XOtherFile; + G::XgX; + I::h; + j; + L::k; + //k; + cdm; + Q::o; + //o; + r1; + //r2; + + return; + } + + } +} + +int main () +{ + using AAA::inA; + char c1; + + using namespace BBB; + + c1 = xyzq ('x'); + c1 = AAA::xyzq ('x'); + c1 = BBB::CCC::xyzq ('m'); + + inA ina; + + ina.xx = 33; + + int y; + + y = AAA::A_xyzq (33); + y += B_xyzq (44); + + BBB::Klasse cl; + + c1 = cl.xyzq('e'); + + marker1(); + + C::D::marker2 (); +} diff --git a/gcc/testsuite/g++.dg/debug/namespace2.C b/gcc/testsuite/g++.dg/debug/namespace2.C new file mode 100644 index 000000000..f70bc8fad --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/namespace2.C @@ -0,0 +1,8 @@ +// PR debug/36278 +// { dg-do compile } + +namespace N +{ + typedef void T; +} +using N::T; diff --git a/gcc/testsuite/g++.dg/debug/nullptr01.C b/gcc/testsuite/g++.dg/debug/nullptr01.C new file mode 100644 index 000000000..ab08588f2 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/nullptr01.C @@ -0,0 +1,15 @@ +// Test that debugging backends don't crash on NULLPTR_TYPE. +// { dg-options "-std=c++0x" } + +typedef decltype(nullptr) nullptr_t; + +nullptr_t np1; +void f (nullptr_t) { } +template <class T> struct A { }; +template <class T> nullptr_t g(T t); +template <> nullptr_t g(A<nullptr_t>) +{ + nullptr_t local; +} +// { dg-final { scan-assembler "_Z1fDn" } } +// { dg-final { scan-assembler "_Z1gI1AIDnEES1_T_" } } diff --git a/gcc/testsuite/g++.dg/debug/pr15736.cc b/gcc/testsuite/g++.dg/debug/pr15736.cc new file mode 100644 index 000000000..6e83cd26c --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr15736.cc @@ -0,0 +1,12 @@ +// Test PR 15736 fix +// Contributed by Devang Patel <dpatel@apple.com> +// { dg-do compile } + + +struct B { + int n; +}; + +struct A : B { + using B::n; +}; diff --git a/gcc/testsuite/g++.dg/debug/pr16792.C b/gcc/testsuite/g++.dg/debug/pr16792.C new file mode 100644 index 000000000..39003cbe2 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr16792.C @@ -0,0 +1,10 @@ +// { dg-do compile } + +struct S { S(); }; +int foo (S b, double j) { }; + +int main () +{ + int foo (S, double); + S v; +} diff --git a/gcc/testsuite/g++.dg/debug/pr22514.C b/gcc/testsuite/g++.dg/debug/pr22514.C new file mode 100644 index 000000000..ed31cc7a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr22514.C @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +namespace s +{ + template <int> struct _List_base + { + int _M_impl; + }; + template<int i> struct list : _List_base<i> + { + using _List_base<i>::_M_impl; + } // { dg-error "after struct definition" } +} +s::list<1> OutputModuleListType; diff --git a/gcc/testsuite/g++.dg/debug/pr27657.C b/gcc/testsuite/g++.dg/debug/pr27657.C new file mode 100644 index 000000000..8351625bb --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr27657.C @@ -0,0 +1,9 @@ +/* { dg-do link } */ + +const char s[] = ""; +const char *const p = s; + +int main() +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/debug/pr29906.C b/gcc/testsuite/g++.dg/debug/pr29906.C new file mode 100644 index 000000000..08bbe879b --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr29906.C @@ -0,0 +1,10 @@ +// { dg-do compile } +// { dg-options "-g -fno-emit-class-debug-always" } + +struct A{ + typedef int T; + virtual ~A(); +}; +struct B:public A{ + using A::T; +}; diff --git a/gcc/testsuite/g++.dg/debug/pr30898.C b/gcc/testsuite/g++.dg/debug/pr30898.C new file mode 100644 index 000000000..4c06ea608 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr30898.C @@ -0,0 +1,13 @@ +// { dg-do compile } + +double foo() +{ + union + { + int i; + double d; + }; + + i = 0; + return d; +} diff --git a/gcc/testsuite/g++.dg/debug/pr34895.C b/gcc/testsuite/g++.dg/debug/pr34895.C new file mode 100644 index 000000000..ca06336c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr34895.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// { dg-options "-O2 -g" } +// +// Copyright (C) 2008 Free Software Foundation, Inc. +// Contributed by Theodore.Papadopoulo 20 Jan 2008 <Theodore.Papadopoulo@sophia.inria.fr> + +struct A { + A() { } + unsigned operator()() { return 1; } +}; +struct B: public A { + typedef const A base; + using base::operator(); + B() { } +}; +int +main() { + B b; +} diff --git a/gcc/testsuite/g++.dg/debug/pr43010.C b/gcc/testsuite/g++.dg/debug/pr43010.C new file mode 100644 index 000000000..24b5b2713 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr43010.C @@ -0,0 +1,8 @@ +// PR debug/43010 +// { dg-do compile } +// { dg-options "-g -femit-struct-debug-baseonly" } +# 1 "foo.C" +# 1 "bar.h" 1 +typedef struct { int i; } S __attribute__((aligned)); +typedef struct { struct { int i; } j; } T __attribute__((aligned)); +# 1 "foo.C" 2 diff --git a/gcc/testsuite/g++.dg/debug/pr44178.C b/gcc/testsuite/g++.dg/debug/pr44178.C new file mode 100644 index 000000000..2df566926 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr44178.C @@ -0,0 +1,39 @@ +// PR debug/44178 +// { dg-do compile } +// { dg-options "-funroll-loops -fcompare-debug" { target i?86-*-* x86_64-*-* } } +// { dg-options "-fsched-pressure -funroll-loops -fschedule-insns -fcompare-debug" { target i?86-*-* x86_64-*-* } } + +struct A +{ + A (); + A (const A &) {} + A &operator = (const A &); +}; + +struct B +{ + int u1; + A u2; + int u3; + int i; +}; + +B f1 (int *); +B f2 (int, int, int, int); +B f3 (B *, B *); + +B +f4 (int x, int y, int z) +{ + B b1, b2; + for (int i = x; i > 0; i--) + for (int j = y; j > 0; j--) + { + int k; + f1 (&k); + b2 = f2 (i, 0, 0, z); + if (b2.i) return b2; + f3 (&b1, &b2); + } + return b1; +} diff --git a/gcc/testsuite/g++.dg/debug/pr44182.C b/gcc/testsuite/g++.dg/debug/pr44182.C new file mode 100644 index 000000000..3e062a3fe --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr44182.C @@ -0,0 +1,26 @@ +// PR tree-optimization/44182 +// { dg-do compile } +// { dg-options "-fcompare-debug" } + +struct S +{ + int i; + S (); + ~S (); + void f1 (); + void f2 (S s) + { + f3 (s.i); + for (int j = 0; j < s.i; j++) f1 (); + } + void f3 (int j) + { + if (j > i) f1 (); + } +}; + +void +f (S *x) +{ + x->f2 (S ()); +} diff --git a/gcc/testsuite/g++.dg/debug/pr45660.C b/gcc/testsuite/g++.dg/debug/pr45660.C new file mode 100644 index 000000000..4f03fd5e7 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr45660.C @@ -0,0 +1,16 @@ +// PR debug/45660 +// { dg-do compile } +// { dg-options "-g -fno-inline" } + +void +test () +{ + struct S + { + typedef void (**T) (void); + static T i (void) { return 0; } + }; + S s; + if (s.i ()) + *s.i () = 0; +} diff --git a/gcc/testsuite/g++.dg/debug/pr46123.C b/gcc/testsuite/g++.dg/debug/pr46123.C new file mode 100644 index 000000000..9e115cd06 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr46123.C @@ -0,0 +1,47 @@ +// PR debug/46123 +// { dg-do compile } +// { dg-options "-g -feliminate-dwarf2-dups" } + +struct foo +{ + static int bar () + { + int i; + static int baz = 1; + { + static int baz = 2; + i = baz++; + } + { + struct baz + { + static int m () + { + static int n; + return n += 10; + } + }; + baz a; + i += a.m (); + } + { + static int baz = 3; + i += baz; + baz += 30; + } + i += baz; + baz += 60; + return i; + } +}; + +int main () +{ + foo x; + + if (x.bar () != 16) + return 1; + if (x.bar() != 117) + return 1; + return 0; +} diff --git a/gcc/testsuite/g++.dg/debug/pr46240.cc b/gcc/testsuite/g++.dg/debug/pr46240.cc new file mode 100644 index 000000000..c12a6988a --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr46240.cc @@ -0,0 +1,172 @@ +// { dg-do compile } +// { dg-options "-O3 -g" } + +template <typename T> +T &max (T &a, T &b) +{ + if (a < b) return b; else return a; +} +int foo (double); +struct S +{ + struct T + { + int dims, count; + T (int, int) : dims (), count () {} + }; + T *rep; + S () {} + S (int r, int c) : rep (new T (r, c)) {} + ~S () { delete rep; } +}; +template <typename T> +struct U +{ + static T epsilon () throw (); +}; +template <class T> +struct V +{ + struct W + { + T * data; + int count; + W (int n) : data (new T[n]), count () {} + }; + V::W *rep; + S dimensions; + int slice_len; + V (S s) : rep (new V <T>::W (get_size (s))) {} + int capacity () { return slice_len; } + int get_size (S); +}; +template <class T> +struct Z : public V <T> +{ + Z () : V <T> (S (0, 0)) {} + Z (int r, int c) : V <T> (S (r, c)) {} +}; +template <class T> +struct A : public Z <T> +{ + A () : Z <T> () {} + A (int n, int m) : Z <T> (n, m) {} +}; +template <class T> +struct B : public V <T> +{ +}; +struct C : public A <double> +{ + C () : A <double> () {} + C (int r, int c) : A <double> (r, c) {} +}; +struct D : public B <double> +{ +}; +template <class T> +struct E +{ +}; +template <class T> +struct G : public E <T> +{ +}; +struct H : public G <double> +{ +}; +template <class R> +struct I +{ + R scl, sum; + void accum (R val) + { + R t = __builtin_fabs (val); + if (scl == t) + sum += 1; + } + operator R () { __builtin_sqrt (sum); return R (); } +}; +template <class R> +struct J +{ + template < class U > void accum (U val) {} + operator R () { return R (); } +}; +template <class R> +struct K +{ + R max; + template <class U> void accum (U val) + { + double z = __builtin_fabs (val); + max = ::max (max, z); + } + operator R () { return max; } +}; +template <class R> +struct L +{ + unsigned num; + template <class U> void accum (U) {} + operator R () { return num; } +}; +template <class T, class R, class S> +void bar (V <T> &v, R &res, S acc) +{ + for (int i = 0; i < v.capacity (); i++) + acc.accum ((i)); + res = acc; +} +template <class T, class R> +void bar (B <T> &v, R) +{ + R res; + bar (v, res, I <R> ()); +} +template <class T, class R> +R bar (A <T> &v, R p) +{ + R res; + if (p == 2) + bar (v, res, I <R> ()); + else if (p == 1) + bar (v, res, J <R> ()); + else if (p == sizeof (float) ? (p) : foo (p)) + { + if (p > 0) + bar (v, res, K <R> ()); + } + else if (p == 0) + bar (v, res, L <R> ()); + return res; +} +template <class CT, class VectorT, class R> +void +baz (CT m, R p, R tol, int maxiter, VectorT) +{ + VectorT y (0, 0), z (0, 1); + R q = 0; + R gamma = 0, gamma1 = 0; + gamma = bar (y, p); + (void) (bar (z, q) <= (gamma1 <= gamma)); +} +int a = 100; +template <class CT, class VectorT, class R> +void +test (CT m, R p, VectorT) +{ + VectorT x; + R sqrteps (U <R>::epsilon ()); + baz (m, p, sqrteps, a, x); +} +void +fn (D x, double p) +{ + bar (x, p); +} +void +fn (H x, double p) +{ + test (x, p, C ()); +} diff --git a/gcc/testsuite/g++.dg/debug/pr46241.C b/gcc/testsuite/g++.dg/debug/pr46241.C new file mode 100644 index 000000000..95c814d4f --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr46241.C @@ -0,0 +1,19 @@ +class btIDebugDraw; +class btCollisionWorld { + virtual btIDebugDraw* getDebugDrawer() { }; + static void rayTestSingle(); +}; +class btTriangleCallback { +public: + virtual ~btTriangleCallback(); +}; +class btTriangleRaycastCallback: public btTriangleCallback { +public: + btTriangleRaycastCallback(); +}; +void btCollisionWorld::rayTestSingle() +{ + struct BridgeTriangleRaycastCallback : public btTriangleRaycastCallback { + BridgeTriangleRaycastCallback() : btTriangleRaycastCallback() { } + }; +} diff --git a/gcc/testsuite/g++.dg/debug/pr46338.C b/gcc/testsuite/g++.dg/debug/pr46338.C new file mode 100644 index 000000000..dfa92452d --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr46338.C @@ -0,0 +1,24 @@ +// PR debug/46338 +// { dg-do compile } +// { dg-options "-O -fprofile-generate -fcompare-debug" } + +void bar (); + +struct S +{ + int f () + { + } +}; + +S *s; + +void +foo (int x) +{ + if (x) + return; + bar (); + for (int j = 0; j < s->f (); j++) + ; +} diff --git a/gcc/testsuite/g++.dg/debug/pr46583.C b/gcc/testsuite/g++.dg/debug/pr46583.C new file mode 100644 index 000000000..a4e94238e --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr46583.C @@ -0,0 +1,40 @@ +// PR debug/46583 +// { dg-do compile } +// { dg-options "-O -fno-inline -fipa-cp -fipa-cp-clone -fcompare-debug" } + +template < typename = unsigned long >struct A +{ + unsigned long elems[3]; + unsigned long *begin () + { + return 0; + } +}; + +void +bar (unsigned long *a1, unsigned long, unsigned long *a3, unsigned const &) +{ + *a3 = *a1; +} + +A < >operatorM (A < >a1, unsigned long a2) +{ + typedef A < >G; + G a3; + bar (a1.begin (), a2, a3.begin (), 0); + return a3; +} + +struct B +{ + B (A < >m):n (operatorM (m, 1)) + { + } + A < >n; +}; + +void +foo () +{ + B (A < >()); +} diff --git a/gcc/testsuite/g++.dg/debug/pr47106.C b/gcc/testsuite/g++.dg/debug/pr47106.C new file mode 100644 index 000000000..3a8100f8c --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr47106.C @@ -0,0 +1,38 @@ +// { dg-do compile } +// { dg-options "-O -fpartial-inlining -flto -fconserve-stack -fcompare-debug" } +// { dg-require-effective-target lto } + +void end (int, int) __attribute__ ((__noreturn__)); + +struct S +{ + int i; + S *s; +}; + +inline bool f (S *s) +{ + if (!s->s) + end (0, 0); + return s->s == s; +} + +inline bool +baz (S s1, S) +{ + while (f (&s1)); +} + +inline bool +bar (S s1, S s2, S) +{ + baz (s1, s2); +} + +S getS (); + +bool +foo () +{ + bar (getS (), getS (), getS ()); +} diff --git a/gcc/testsuite/g++.dg/debug/pr47209.C b/gcc/testsuite/g++.dg/debug/pr47209.C new file mode 100644 index 000000000..c144c1639 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr47209.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// { dg-options "-femit-struct-debug-baseonly" } +struct A +{ + void foo (); +}; + +struct B : A +{ + typedef const A base; + using base::foo; +}; diff --git a/gcc/testsuite/g++.dg/debug/pr47283.C b/gcc/testsuite/g++.dg/debug/pr47283.C new file mode 100644 index 000000000..dadbeff3d --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr47283.C @@ -0,0 +1,58 @@ +// PR debug/47283 +// { dg-do compile } + +template <typename T> inline const T & +f1 (const T &a, const T &b) +{ + if (a < b) + return b; + return a; +}; + +struct A +{ + A (int w, int h) { a1 = w; } + A f2 (const A &) const; + int a1, a2; +}; + +inline A +A::f2 (const A &x) const +{ + return A (f1 (a1, x.a1), f1 (a2, x.a2)); +}; + +struct B +{ + A f3 () const; + void f4 (const A &) { b2 = 5 + b1; } + int b1, b2; +}; + +struct C +{ +}; + +struct D +{ + virtual C f5 (const C &) const; +}; + +struct E +{ + C f6 () const; + int f7 () const; + virtual B f8 (const C &) const; + A f9 () const; + virtual void f10 (); + struct F { D *h; } *d; +}; + +void +E::f10 () +{ + const C c = d->h->f5 (f6 ()); + B b = f8 (c); + b.f4 (b.f3 ().f2 (f9 ())); + f7 (); +} diff --git a/gcc/testsuite/g++.dg/debug/static1.C b/gcc/testsuite/g++.dg/debug/static1.C new file mode 100644 index 000000000..7419ce507 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/static1.C @@ -0,0 +1,16 @@ +// PR c++/24569 + +template <int dim> +struct S +{ + static const int u = 2 * dim; + static const int p[u]; + static int f(); +}; + +template <> +inline int S<3>::f () { return 1; } + +template <int dim> const int S<dim>::u; + +template class S<3>; diff --git a/gcc/testsuite/g++.dg/debug/template1.C b/gcc/testsuite/g++.dg/debug/template1.C new file mode 100644 index 000000000..279b4b173 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/template1.C @@ -0,0 +1,15 @@ +// PR c++/5118 + +template <int Count> +class d +{ +public: + d() + { + myInt = Count; + } + int myInt; + virtual ~d() {} +}; + +volatile d<5> instD; diff --git a/gcc/testsuite/g++.dg/debug/trivial.C b/gcc/testsuite/g++.dg/debug/trivial.C new file mode 100644 index 000000000..5b125eca9 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/trivial.C @@ -0,0 +1,6 @@ +/* { dg-do run } */ + +int main(void) +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/debug/typedef1.C b/gcc/testsuite/g++.dg/debug/typedef1.C new file mode 100644 index 000000000..82455358b --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/typedef1.C @@ -0,0 +1,17 @@ +// PR debug/6436 +// { dg-do compile } + +typedef struct +{ + unsigned int a0, a1; +} A __attribute__ ((aligned(8))); + +typedef struct +{ + A a; +} B; + +struct C +{ + B *bp; +}; diff --git a/gcc/testsuite/g++.dg/debug/typedef2.C b/gcc/testsuite/g++.dg/debug/typedef2.C new file mode 100644 index 000000000..a216242c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/typedef2.C @@ -0,0 +1,12 @@ +// PR c++/17695 + +template<typename T> struct A +{ + T t; + A(); +}; + +struct B +{ + B() { typedef int C; A<C> a; } +} b; diff --git a/gcc/testsuite/g++.dg/debug/typedef3.C b/gcc/testsuite/g++.dg/debug/typedef3.C new file mode 100644 index 000000000..366c69a68 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/typedef3.C @@ -0,0 +1,19 @@ +// PR debug/16261 +// { dg-do compile } + +namespace N +{ + struct A {}; + typedef A B; +} + +void foo() +{ + struct C + { + C(N::B) {} + }; + + N::B b; + C c(b); +} diff --git a/gcc/testsuite/g++.dg/debug/using1.C b/gcc/testsuite/g++.dg/debug/using1.C new file mode 100644 index 000000000..d3168fc6c --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/using1.C @@ -0,0 +1,15 @@ +// PR c++/19406 +// { dg-do compile } + +struct A +{ + virtual int foo(); + double d; +}; + +struct B : public A +{ + A::d; +}; + +B b; diff --git a/gcc/testsuite/g++.dg/debug/using2.C b/gcc/testsuite/g++.dg/debug/using2.C new file mode 100644 index 000000000..94f0deae7 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/using2.C @@ -0,0 +1,21 @@ +// PR c++/22489 + +namespace N { } + +struct T +{ + T () { } +}; + +void +bar () +{ + struct U : public T + { + void baz () + { + using namespace N; + } + } u; + u.baz(); +} diff --git a/gcc/testsuite/g++.dg/debug/using3.C b/gcc/testsuite/g++.dg/debug/using3.C new file mode 100644 index 000000000..df3e3dfa3 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/using3.C @@ -0,0 +1,8 @@ +// PR debug/31899 + +namespace NS { + int x = 0; + int &ref = x; +} + +using NS::ref; diff --git a/gcc/testsuite/g++.dg/debug/vartrack1.C b/gcc/testsuite/g++.dg/debug/vartrack1.C new file mode 100644 index 000000000..d72cb6f35 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/vartrack1.C @@ -0,0 +1,99 @@ +// This testcase used to hang the compiler in vt_find_locations. +// { dg-do compile } +// { dg-options "-O2 -g" } + +struct S +{ + int a; + S *b, *c, *d; +}; + +struct T +{ + void f1 (S *x); + void f2 (S *x); + void f3 (S *x, S *y); + S *e; +}; + +void +T::f3 (S *x, S *y) +{ + while (x != this->e && (!x || x->a == 1)) + { + if (x == y->c) + { + S *w = y->d; + if (w && w->a == 0) + { + w->a = 1; + y->a = 0; + f2 (y); + w = y->d; + } + if (w && (!w->c || w->c->a == 1) && (!w->d || w->d->a == 1)) + { + w->a = 0; + x = y; + y = x->b; + } + else + { + if (w && (!w->d || w->d->a == 1)) + { + if (w->c) + w->c->a = 1; + w->a = 0; + f1 (w); + w = y->d; + } + if (w) + { + w->a = y->a; + if (w->d) + w->d->a = 1; + } + y->a = 1; + f2 (y); + x = e; + } + } + else + { + S *w = y->c; + if (w && w->a == 0) + { + w->a = 1; + y->a = 0; + f1 (y); + w = y->c; + } + if (w && (!w->c || w->c->a == 1) && (!w->d || w->d->a == 1)) + { + w->a = 0; + x = y; + y = x->b; + } + else + { + if (w && (!w->c || w->c->a == 1)) + { + w->a = 0; + if (w->d) + w->d->a = 1; + f2 (w); + w = y->c; + } + if (w) + { + w->a = y->a; + if (w->c) + w->c->a = 1; + } + y->a = 1; + f1 (y); + x = e; + } + } + } +} diff --git a/gcc/testsuite/g++.dg/dfp/44473-1.C b/gcc/testsuite/g++.dg/dfp/44473-1.C new file mode 100644 index 000000000..38689fa16 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/44473-1.C @@ -0,0 +1,122 @@ +/* { dg-do assemble } */ + +/* Minimized from the testcase in PR c++/44473; mangling of decimal types + did not include CV qualifiers. */ + +namespace std +{ + namespace decimal + { + class decimal32 + { + public: + typedef float __decfloat32 __attribute__ ((mode (SD))); + explicit decimal32 (float __r):__val (__r) {} + private: + __decfloat32 __val; + }; + }; + + template <typename _BI1, typename _BI2> + _BI2 copy_backward (_BI1 __first, _BI2 __result); +} + +namespace __gnu_cxx +{ + template <typename _Iterator, typename _Container> + class __normal_iterator + { + public: + explicit __normal_iterator (const _Iterator & __i) {} + const _Iterator & base () const {} + }; + + template <typename _IteratorL, typename _IteratorR, typename _Container> + bool operator== (const __normal_iterator <_IteratorL, _Container> &__lhs, + const __normal_iterator <_IteratorR, _Container> &__rhs) + { + return __lhs.base () == __rhs.base (); + } + + template <typename _Tp> + class new_allocator + { + public: + typedef _Tp *pointer; + typedef const _Tp *const_pointer; + template <typename _Tp1> + struct rebind + { + typedef new_allocator <_Tp1> other; + }; + }; +} + +namespace std +{ + template <typename _Tp> + class allocator:public __gnu_cxx::new_allocator <_Tp> {}; + + template <typename _Tp, typename _Alloc> + struct _Vector_base + { + typedef typename _Alloc::template rebind <_Tp>::other _Tp_alloc_type; + struct _Vector_impl:public _Tp_alloc_type + { + typename _Tp_alloc_type::pointer _M_finish; + }; + public: _Vector_impl _M_impl; + }; + + template <typename _Tp, typename _Alloc = std::allocator <_Tp> > + class vector:protected _Vector_base <_Tp, _Alloc> + { + typedef _Vector_base <_Tp, _Alloc> _Base; + typedef typename _Base::_Tp_alloc_type _Tp_alloc_type; + public: + typedef _Tp value_type; + typedef typename _Tp_alloc_type::pointer pointer; + typedef typename _Tp_alloc_type::const_pointer const_pointer; + typedef __gnu_cxx::__normal_iterator <pointer, vector> iterator; + typedef __gnu_cxx::__normal_iterator <const_pointer, vector> + const_iterator; + const_iterator begin () const; + iterator end () + { + return iterator (this->_M_impl._M_finish); + } + const_iterator end () const + { + return const_iterator (this->_M_impl._M_finish); + } + bool empty () const + { + return begin () == end (); + } + void push_back (const value_type & __x) + { + _M_insert_aux (end ()); + } + void _M_insert_aux (iterator __position); + }; + + template <typename _Tp, typename _Alloc> + void vector <_Tp, _Alloc>::_M_insert_aux (iterator __position) + { + std::copy_backward (__position.base (), this->_M_impl._M_finish - 1); + } +} + +std::vector <std::decimal::decimal32> vec; + +int +foo () +{ + return (vec.empty ()) ? 1 : 0; +} + +bool +bar () +{ + vec.push_back (std::decimal::decimal32 (0)); +} diff --git a/gcc/testsuite/g++.dg/dfp/44473-2.C b/gcc/testsuite/g++.dg/dfp/44473-2.C new file mode 100644 index 000000000..311f62299 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/44473-2.C @@ -0,0 +1,25 @@ +// { dg-do compile } + +// Mangling of classes from std::decimal are special-cased. + +namespace std { + namespace decimal { + class decimal64 { + public: + typedef float __decfloat64 __attribute__ ((mode (DD))); + explicit decimal64 (int __r):__val (__r) {} + private: + __decfloat64 __val; + }; + } +} + +int bar (const std::decimal::decimal64 & x) { } + +int foo () +{ + std::decimal::decimal64 x(0); + bar (x); +} + +// { dg-final { scan-assembler "_Z3barRKDd:" } } diff --git a/gcc/testsuite/g++.dg/dfp/base.C b/gcc/testsuite/g++.dg/dfp/base.C new file mode 100644 index 000000000..3e5dc50ba --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/base.C @@ -0,0 +1,23 @@ +// PR c++/50207 +// { dg-do compile } + +namespace std +{ + namespace decimal + { + template <class _Fmt> struct _FmtTraits; + class decimal32; + template <> struct _FmtTraits <decimal32> + { + static const long _NumBytes = 4UL; + }; + template <class _Tr> class _DecBase + { + unsigned char _Bytes[_Tr::_NumBytes]; + }; + class decimal32 : public _DecBase <_FmtTraits <decimal32> > // { dg-error "has base" } + { + decimal32 () { } + }; + } +} diff --git a/gcc/testsuite/g++.dg/dfp/dfp.exp b/gcc/testsuite/g++.dg/dfp/dfp.exp new file mode 100644 index 000000000..4b15ca529 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/dfp.exp @@ -0,0 +1,67 @@ +# Copyright (C) 2005, 2006, 2007, 2009 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# GCC testsuite that uses the `dg.exp' driver. + +# Load support procs. +load_lib g++-dg.exp + +# Skip these tests for targets that don't support this extension. +if { ![check_effective_target_dfp] } { + return; +} + +# If the decimal float is supported in the compiler but not yet in the +# runtime, treat all tests as compile-only. +global dg-do-what-default +set save-dg-do-what-default ${dg-do-what-default} +if { ![check_effective_target_dfprt] } { + verbose "dfp.exp: runtime support for decimal float does not exist" 2 + set dg-do-what-default compile +} else { + verbose "dfp.exp: runtime support for decimal float exists, use it" 2 + set dg-do-what-default run +} +verbose "dfp.exp: dg-do-what-default is ${dg-do-what-default}" 2 + +global DEFAULT_CXXFLAGS +if [info exists DEFAULT_CXXFLAGS] then { + set save_default_cxxflags $DEFAULT_CXXFLAGS +} + +# If a testcase doesn't have special options, use these. +set DEFAULT_CXXFLAGS "" + +# Initialize `dg'. +dg-init + +# Main loop. Run the tests that are specific to C++. +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[C]] \ + "" $DEFAULT_CXXFLAGS +# Run tests that are shared with C testing. +dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/dfp/*.c]] \ + "" $DEFAULT_CXXFLAGS + +# All done. +dg-finish + +set dg-do-what-default ${save-dg-do-what-default} +verbose "dfp.exp: dg-do-what-default is ${dg-do-what-default}" 2 +if [info exists save_default_cxxflags] { + set DEFAULT_CXXFLAGS $save_default_cxxflags +} else { + unset DEFAULT_CXXFLAGS +} diff --git a/gcc/testsuite/g++.dg/dfp/mangle-1.C b/gcc/testsuite/g++.dg/dfp/mangle-1.C new file mode 100644 index 000000000..455d3e4c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/mangle-1.C @@ -0,0 +1,40 @@ +// { dg-do compile } + +// Mangling of classes from std::decimal are special-cased. +// Derived from g++.dg/abi/mangle13.C. + +namespace std { + namespace decimal { + class decimal64 { + public: + typedef float __decfloat64 __attribute__ ((mode (DD))); + explicit decimal64 (float __r):__val (__r) {} + private: + __decfloat64 __val; + }; + } +} + +struct A { + template <typename T> std::decimal::decimal64 f (); + std::decimal::decimal64 operator+(); + operator std::decimal::decimal64 (); + template <typename T> + std::decimal::decimal64 operator-(); +}; + +typedef std::decimal::decimal64 (A::*P)(); + +template <P> struct S {}; + +template <typename T> void g (S<&T::template f<std::decimal::decimal64> >) {} +template <typename T> void g (S<&T::operator+ >) {} +template <typename T> void g (S<&T::operator std::decimal::decimal64>) {} +template <typename T> void g (S<&T::template operator- <std::decimal::decimal64> >) {} + +template void g<A> (S<&A::f<std::decimal::decimal64> >); +template void g<A> (S<&A::operator+>); +template void g<A> (S<&A::operator std::decimal::decimal64>); + +// { dg-final { scan-assembler "\n?_Z1gI1AEv1SIXadsrT_1fIDdEEE\[: \t\n\]" } } +// { dg-final { scan-assembler "\n?_Z1gI1AEv1SIXadsrT_plEE\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/dfp/mangle-2.C b/gcc/testsuite/g++.dg/dfp/mangle-2.C new file mode 100644 index 000000000..1af9aa1a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/mangle-2.C @@ -0,0 +1,28 @@ +// { dg-do compile } + +// Mangling of classes from std::decimal are special-cased. +// Derived from g++.dg/abi/mangle15.C. + +namespace std { + namespace decimal { + class decimal64 { + public: + typedef float __decfloat64 __attribute__ ((mode (DD))); + explicit decimal64 (float __r):__val (__r) {} + private: + __decfloat64 __val; + }; + } +} + +struct A { + template <typename T> std::decimal::decimal64 f (); +}; + +typedef std::decimal::decimal64 (A::*P)(); + +template <P> struct S {}; + +void g (S<&A::f<std::decimal::decimal64> >) {} + +// { dg-final { scan-assembler "\n?_Z1g1SIXadL_ZN1A1fIDdEEDdvEEE\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/dfp/mangle-3.C b/gcc/testsuite/g++.dg/dfp/mangle-3.C new file mode 100644 index 000000000..c716ed0e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/mangle-3.C @@ -0,0 +1,28 @@ +// { dg-do compile } + +// Mangling of classes from std::decimal are special-cased. +// Derived from g++.dg/abi/mangle20-1.C. + +namespace std { + namespace decimal { + class decimal64 { + public: + typedef float __decfloat64 __attribute__ ((mode (DD))); + explicit decimal64 (int __r):__val (__r) {} + private: + __decfloat64 __val; + }; + } +} + +template <int I> void f(std::decimal::decimal64 (*)[2]) {} +template <int I> void g(std::decimal::decimal64 (*)[I+2]) {} + +static const std::decimal::decimal64 I(1); +static const std::decimal::decimal64 J(2); + +template void f<1>(std::decimal::decimal64 (*)[2]); +template void g<1>(std::decimal::decimal64 (*)[3]); + +// { dg-final { scan-assembler "\n_?_Z1fILi1EEvPA2_Dd\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_Z1gILi1EEvPAplT_Li2E_Dd\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/dfp/mangle-4.C b/gcc/testsuite/g++.dg/dfp/mangle-4.C new file mode 100644 index 000000000..899d5661c --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/mangle-4.C @@ -0,0 +1,35 @@ +// { dg-do compile } + +// Mangling of classes from std::decimal are special-cased. +// Derived from g++.dg/abi/mangle30.C. + +namespace std { + namespace decimal { + class decimal64 { + public: + typedef float __decfloat64 __attribute__ ((mode (DD))); + explicit decimal64 (int __r):__val (__r) {} + private: + __decfloat64 __val; + }; + } +} + +struct A +{ + template <class T> + struct B + { + typedef T myT; + }; +}; + +template <class T> +void f (T t, typename T::template B<std::decimal::decimal64>::myT u, typename T::template B<int>::myT v); + +void foo () +{ + f (A(), std::decimal::decimal64(0), 1); +} + +// { dg-final { scan-assembler "_Z1fI1AEvT_NS1_1BIDdE3myTENS2_IiE3myTE" } } diff --git a/gcc/testsuite/g++.dg/dfp/mangle-5.C b/gcc/testsuite/g++.dg/dfp/mangle-5.C new file mode 100644 index 000000000..794577f86 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/mangle-5.C @@ -0,0 +1,29 @@ +// { dg-do compile } + +// Mangling of classes from std::decimal are special-cased. +// Derived from g++.dg/abi/mangle35.C. + +namespace std { + namespace decimal { + class decimal128 { + public: + typedef float __decfloat128 __attribute__ ((mode (TD))); + explicit decimal128 (int __r):__val (__r) {} + private: + __decfloat128 __val; + }; + } +} + +template<void (*)()> struct A {}; + +template<typename> void foo(); + +template<typename T> A<foo<T> > bar(); + +void baz() +{ + bar<std::decimal::decimal128>(); +} + +// { dg-final { scan-assembler "_Z3barIDeE1AIX3fooIT_EEEv" } } diff --git a/gcc/testsuite/g++.dg/dfp/mangle-mode.C b/gcc/testsuite/g++.dg/dfp/mangle-mode.C new file mode 100644 index 000000000..ac30cb323 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/mangle-mode.C @@ -0,0 +1,37 @@ +// { dg-do compile } + +// Check that the compiler mangles types defined with decimal float +// modes according to the vendor-neutral C++ ABI. + +typedef float _Decimal32 __attribute__((mode(SD))); +typedef float _Decimal64 __attribute__((mode(DD))); +typedef float _Decimal128 __attribute__((mode(TD))); + +extern void foo32 (_Decimal32 a, _Decimal32 &b, _Decimal32 *c); +extern void foo64 (_Decimal64 *a, _Decimal64 b, _Decimal64 &c); +extern void foo128 (_Decimal128 &a, _Decimal128 *b, _Decimal128 c); + +void +bar32 (void) +{ + _Decimal32 x, y, z; + foo32 (x, y, &z); +} + +void +bar64 (void) +{ + _Decimal64 x, y, z; + foo64 (&x, y, z); +} + +void +bar128 (void) +{ + _Decimal128 x, y, z; + foo128 (x, &y, z); +} + +// { dg-final { scan-assembler "Z5foo32DfRDfPDf" } } +// { dg-final { scan-assembler "Z5foo64PDdDdRDd" } } +// { dg-final { scan-assembler "Z6foo128RDePDeDe" } } diff --git a/gcc/testsuite/g++.dg/dfp/nofields.C b/gcc/testsuite/g++.dg/dfp/nofields.C new file mode 100644 index 000000000..7234672d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/nofields.C @@ -0,0 +1,19 @@ +// PR c++/46862 +// { dg-do compile } + +namespace std +{ + namespace decimal + { + class decimal32 { }; // { dg-error "does not have any fields" } + class decimal64 { }; // { dg-error "does not have any fields" } + class decimal128 { }; // { dg-error "does not have any fields" } + } +} + +void +foo (std::decimal::decimal32 x, + std::decimal::decimal64 y, + std::decimal::decimal128 z) +{ +} diff --git a/gcc/testsuite/g++.dg/dfp/typeid1.C b/gcc/testsuite/g++.dg/dfp/typeid1.C new file mode 100644 index 000000000..cdc33a774 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/typeid1.C @@ -0,0 +1,8 @@ +// PR c++/39131 +// { dg-do link } + +#include <typeinfo> + +const std::type_info &r = typeid(0.dd); + +int main() { } diff --git a/gcc/testsuite/g++.dg/dg.exp b/gcc/testsuite/g++.dg/dg.exp new file mode 100644 index 000000000..5851dcc94 --- /dev/null +++ b/gcc/testsuite/g++.dg/dg.exp @@ -0,0 +1,64 @@ +# Copyright (C) 2000, 2007, 2009, 2010 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# G++ testsuite that uses the `dg.exp' driver. + +# Load support procs. +load_lib g++-dg.exp + +# If a testcase doesn't have special options, use these. +global DEFAULT_CXXFLAGS +if ![info exists DEFAULT_CXXFLAGS] then { + set DEFAULT_CXXFLAGS " -ansi -pedantic-errors -Wno-long-long" +} + +# Initialize `dg'. +dg-init + +# Gather a list of all tests, with the exception of those in directories +# that are handled specially. +set tests [lsort [find $srcdir/$subdir *.C]] +set tests [prune $tests $srcdir/$subdir/bprob/*] +set tests [prune $tests $srcdir/$subdir/charset/*] +set tests [prune $tests $srcdir/$subdir/compat/*] +set tests [prune $tests $srcdir/$subdir/debug/*] +set tests [prune $tests $srcdir/$subdir/dfp/*] +set tests [prune $tests $srcdir/$subdir/gcov/*] +set tests [prune $tests $srcdir/$subdir/lto/*] +set tests [prune $tests $srcdir/$subdir/pch/*] +set tests [prune $tests $srcdir/$subdir/plugin/*] +set tests [prune $tests $srcdir/$subdir/special/*] +set tests [prune $tests $srcdir/$subdir/tls/*] +set tests [prune $tests $srcdir/$subdir/vect/*] +set tests [prune $tests $srcdir/$subdir/gomp/*] +set tests [prune $tests $srcdir/$subdir/tree-prof/*] +set tests [prune $tests $srcdir/$subdir/torture/*] +set tests [prune $tests $srcdir/$subdir/graphite/*] +set tests [prune $tests $srcdir/$subdir/guality/*] + +# Main loop. +dg-runtest $tests "" $DEFAULT_CXXFLAGS + +# C/C++ common tests. +dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/*.\[cSi\]]] \ + "" "" + +dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cpp/*.\[cS\]]] \ + "" "" + + +# All done. +dg-finish diff --git a/gcc/testsuite/g++.dg/diagnostic/aka1.C b/gcc/testsuite/g++.dg/diagnostic/aka1.C new file mode 100644 index 000000000..37f8df939 --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/aka1.C @@ -0,0 +1,15 @@ +// Basic test for typedef stripping in diagnostics. + +struct A { + void f(); +}; + +void A::f() { + // We don't want an aka for the injected-class-name. + A a = 0; // { dg-error "type .A. requested" } +} + +typedef A B; + +// We do want an aka for a real typedef. +B b = 0; // { dg-error "B .aka A." } diff --git a/gcc/testsuite/g++.dg/diagnostic/bitfld1.C b/gcc/testsuite/g++.dg/diagnostic/bitfld1.C new file mode 100644 index 000000000..f75df38a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/bitfld1.C @@ -0,0 +1,13 @@ +// PR c++/46001 +// { dg-do compile } + +struct S +{ + char *p; + unsigned char f : 1; +}; + +struct S s; +void *a = s.p | s.f; // { dg-error "unsigned char:1" } + +// { dg-bogus "__java_boolean" "" { target *-*-* } 11 } diff --git a/gcc/testsuite/g++.dg/diagnostic/bitfld2.C b/gcc/testsuite/g++.dg/diagnostic/bitfld2.C new file mode 100644 index 000000000..10b7d9cea --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/bitfld2.C @@ -0,0 +1,9 @@ +// PR c++/33840 +// { dg-do compile } + +template<int> struct A +{ + struct {} : 2; // { dg-error "expected ';' after struct" } +}; +// { dg-error "ISO C.. forbids declaration" "" { target *-*-* } 6 } +// { dg-error "ISO C.. prohibits anonymous" "" { target *-*-* } 6 } diff --git a/gcc/testsuite/g++.dg/diagnostic/method1.C b/gcc/testsuite/g++.dg/diagnostic/method1.C new file mode 100644 index 000000000..8e1225d07 --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/method1.C @@ -0,0 +1,20 @@ +// PR c++/44627 +// { dg-do compile } + +struct A +{ + A *foo (); +}; + +template <class T> +void +bar () +{ + A::foo ().anything; // { dg-error "request for member" } +} + +void +baz () +{ + bar <int> (); +} diff --git a/gcc/testsuite/g++.dg/diagnostic/parm1.C b/gcc/testsuite/g++.dg/diagnostic/parm1.C new file mode 100644 index 000000000..2e553e2d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/parm1.C @@ -0,0 +1,11 @@ +// PR c++/44366 +// While printing the operand of sizeof We were trying to print f as the +// scope of t, causing infinite recursion. + +template <typename T> +void f(T t, int(*)[sizeof(t)]) +{ + struct A { void g() { + foo; // { dg-error "foo" } + } }; +} diff --git a/gcc/testsuite/g++.dg/eh/080514-1.C b/gcc/testsuite/g++.dg/eh/080514-1.C new file mode 100644 index 000000000..dafa32503 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/080514-1.C @@ -0,0 +1,16 @@ +// This used to fail on s390 due to cse removing an insn with a +// REG_EH_REGION without deleting the EH edge. +// { dg-do compile } +// { dg-options "-O2 -fnon-call-exceptions" } + +void +run (int m, double d) +{ + int stack[m]; + int *sp = stack; + + if (d == 1.0) + *(sp++) = (0); + else if (d < 1.0) + *(sp++) = (-1); +} diff --git a/gcc/testsuite/g++.dg/eh/alias1.C b/gcc/testsuite/g++.dg/eh/alias1.C new file mode 100644 index 000000000..e6af38317 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/alias1.C @@ -0,0 +1,42 @@ +// { dg-do run } +// { dg-options "-O3" } +/* PR c++/28139: disjoint alias sets for the store from + expand_start_catch_block than for loading P result in P being loaded + before it is initialized for sh-elf. */ + +extern "C" { +void exit (int) __attribute__ ((noreturn)); +} + +int i_glob = 42; +int *p0 = &i_glob; +typedef int **ipp; + +void +g (int i) +{ + if (!i_glob) + exit ((__SIZE_TYPE__) & i); +} + +static void +h () +{ + throw &p0; +} + +int +main() +{ + g (42); + try + { + h (); + } + catch (const ipp &p) + { + if (**p != 42) + exit (1); + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/arm-iwmmxt-unwind.C b/gcc/testsuite/g++.dg/eh/arm-iwmmxt-unwind.C new file mode 100644 index 000000000..109837cd8 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/arm-iwmmxt-unwind.C @@ -0,0 +1,47 @@ +/* Test unwinding of iWMMXt register saves. */ +/* Origin: Joseph Myers <joseph@codesourcery.com> */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm32 } */ + +#ifdef __IWMMXT__ +extern "C" void abort (void); +extern "C" void exit (int); + +void +foo (void) +{ + register long long wr10 asm("wr10") = 0; + register long long wr11 asm("wr11") = 1; + register long long wr12 asm("wr12") = 2; + register long long wr14 asm("wr14") = 4; + register long long wr15 asm("wr15") = 5; + asm volatile ("" : "+y" (wr10), "+y" (wr11), "+y" (wr12), "+y" (wr14), "+y" (wr15)); + throw ""; +} + +int +main (void) +{ + register long long wr10 asm("wr10") = 10; + register long long wr11 asm("wr11") = 11; + register long long wr12 asm("wr12") = 12; + register long long wr13 asm("wr13") = 13; + register long long wr14 asm("wr14") = 14; + register long long wr15 asm("wr15") = 15; + asm volatile ("" : "+y" (wr10), "+y" (wr11), "+y" (wr12), "+y" (wr13), "+y" (wr14), "+y" (wr15)); + try { + foo (); + } catch (...) { + asm volatile ("" : "+y" (wr10), "+y" (wr11), "+y" (wr12), "+y" (wr13), "+y" (wr14), "+y" (wr15)); + if (wr10 != 10 || wr11 != 11 || wr12 != 12 || wr13 != 13 || wr14 != 14 || wr15 != 15) + abort (); + } + exit (0); +} +#else +int +main (void) +{ +} +#endif diff --git a/gcc/testsuite/g++.dg/eh/arm-vfp-unwind.C b/gcc/testsuite/g++.dg/eh/arm-vfp-unwind.C new file mode 100644 index 000000000..62263c0c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/arm-vfp-unwind.C @@ -0,0 +1,40 @@ +/* { dg-do run } */ +/* { dg-require-effective-target arm32 } */ + +/* Test to catch off-by-one errors in arm/pr-support.c. */ + +#if defined (__VFP_FP__) && !defined (__SOFTFP__) + +#include <iostream> +#include <stdlib.h> + +using namespace std; + +static void donkey () +{ + asm volatile ("fcpyd d9, %P0" : : "w" (1.2345) : "d9"); + throw 1; +} + +int main() +{ + try + { + donkey (); + } + catch (int foo) + { + return 0; + } + return 1; +} + +#else + +int main() +{ + return 0; +} + +#endif + diff --git a/gcc/testsuite/g++.dg/eh/async-unwind1.C b/gcc/testsuite/g++.dg/eh/async-unwind1.C new file mode 100644 index 000000000..69b2c345e --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/async-unwind1.C @@ -0,0 +1,61 @@ +// PR rtl-optimization/36419 +// { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } +// { dg-options "-Os -fasynchronous-unwind-tables -mpreferred-stack-boundary=4" } + +extern "C" void abort (); + +int v = -1; +unsigned int n; + +__attribute__((noinline, used)) +void foo (int a, int) +{ + if (v < 0) + v = ((unsigned long) &a) & 15; + else if ((((unsigned long) &a) & 15) != v) + abort (); + if (n++ == 0) + throw 1; +} + +__attribute__((noinline, used)) +void baz (int a, int, int, int, int, int, int) +{ + if (v < 0) + v = ((unsigned long) &a) & 15; + else if ((((unsigned long) &a) & 15) != v) + abort (); + if (n++ == 0) + throw 1; +} + +struct A { A () { }; ~A (); char c[24]; }; + +__attribute__((noinline)) +A::~A () +{ + asm volatile ("" : : : "memory"); +} + +__attribute__((noinline)) +void bar () +{ + A a; + try + { + foo (1, 2); + baz (3, 4, 5, 6, 7, 8, 9); + } + catch (...) + { + } + foo (1, 2); + baz (3, 4, 5, 6, 7, 8, 9); +} + +int +main () +{ + bar (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/async-unwind2.C b/gcc/testsuite/g++.dg/eh/async-unwind2.C new file mode 100644 index 000000000..0c31f80e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/async-unwind2.C @@ -0,0 +1,255 @@ +// PR rtl-optimization/36419 +// { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } +// { dg-require-effective-target fpic } +// { dg-options "-Os -fasynchronous-unwind-tables -fpic -fno-inline" } + +#include <stdarg.h> + +extern "C" void abort (); + +extern "C" +{ + struct R { int r1; unsigned short r2[1]; }; + int bar1 (unsigned short *, int, short) throw (); + void bar2 (R *) throw (); + void bar3 (R **, const unsigned short *, int) throw (); + void bar4 (R **, const char *) throw (); + void bar5 (void *, const char *, ...); +} + +struct S +{ + R *s; + struct T { }; + S (R *x, T *) { s = x; } + ~S () { bar2 (s); } + S &operator= (const S &x); + S &operator+= (const S &x); + S sfn1 (const S &x) const; + friend S operator+ (const S &x1, const S &x2); + static S sfn2 (int i) + { + unsigned short q[33]; + R *p = 0; + bar3 (&p, q, bar1 (q, i, 10)); + return S (p, (T *) 0); + } + static S sfn3 (const char *x) + { + R *p = 0; + bar4 (&p, x); + return S (p, (T *) 0); + } +}; + +struct U { }; +template <class C> unsigned char operator >>= (const U &, C &); + +struct V; +struct W +{ + V *w; + unsigned char is () const; +}; + +template <class T> struct X : public W +{ + inline ~X (); + X (); + X (const W &); + T *operator -> () const; +}; + +struct E +{ + E (); + E (const S &, const X <V> &); + E (E const &); + ~E (); + E &operator = (E const &); +}; + +struct V +{ + virtual void release () throw (); +}; + +template <class T> X <T>::~X () +{ + if (w) + w->release (); +} + +struct Y +{ + virtual U yfn1 (const S &); +}; + +struct Z; + +X <V> baz1 (const S &) throw (E); +X <Z> baz2 (const X <Z> &) throw (E); + +template <typename T> X<T>::X () +{ + w = __null; +} + +template <typename T> X<T>::X (W const &) +{ + w = __null; +} + +U Y::yfn1 (const S &) +{ + throw 12; +} + +Y y; + +template <typename T> T *X<T>::operator -> () const +{ + return &y; +} + +X <V> baz1 (const S &) throw (E) +{ + return X<V> (); +} + +E::E () +{ +} + +E::~E () +{ +} + +X <Z> baz2 (const X <Z> &) throw (E) +{ + throw E (); +} + +int bar1 (unsigned short *, int, short) throw () +{ + asm volatile ("" : : : "memory"); + return 0; +} + +void bar2 (R *) throw () +{ + asm volatile ("" : : : "memory"); +} + +void bar3 (R **, const unsigned short *, int) throw () +{ + asm volatile ("" : : : "memory"); +} + +void bar4 (R **, const char *) throw () +{ + asm volatile ("" : : : "memory"); +} + +int events[2]; +void *sp; + +void bar5 (void *p, const char *s, ...) +{ + va_list ap; + va_start (ap, s); + if (p) + throw 19; + switch (*s) + { + case 't': + if (events[0] != va_arg (ap, int)) + abort (); + events[0]++; + break; + case 'f': + abort (); + case 'c': + if (events[1] != va_arg (ap, int)) + abort (); + events[1]++; + if (events[1] == 1) + sp = va_arg (ap, void *); + else if (sp != va_arg (ap, void *)) + abort (); + break; + } +} + +unsigned char W::is () const +{ + return 1; +} + +S &S::operator += (const S &) +{ + return *this; +} + +template <class C> unsigned char operator >>= (const U &, C &) +{ + throw 1; +} + +template X<Y>::X (); +template X<Z>::X (); +template unsigned char operator >>= (const U &, X<Z> &); +template X<Y>::X (W const &); + +template Y *X<Y>::operator-> () const; + +X <Z> foo () throw () +{ + X <Z> a; + X <Y> b; + try + { + b = X <Y> (baz1 (S::sfn3 ("defg"))); + } + catch (E &) + { + } + if (b.is ()) + { + for (int n = 0; n < 10; n++) + { + S c = S::sfn3 ("abcd"); + c += S::sfn2 (n); + X <Z> d; + try + { + bar5 ((void *) 0, "trying %d\n", n); + if ((b->yfn1 (c) >>= d)) + if (d.is ()) + { + bar5 ((void *) 0, "failure1 on %d\n", n); + a = baz2 (d); + if (a.is ()) + break; + } + bar5 ((void *) 0, "failure2 on %d\n", n); + } + catch (...) + { + void *p; + asm volatile ("movl %%esp, %0" : "=r" (p)); + bar5 ((void *) 0, "caught %d %p\n", n, p); + } + } + } + return a; +} + +int +main () +{ + foo (); + if (events[0] != 10 || events[1] != 10) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/builtin1.C b/gcc/testsuite/g++.dg/eh/builtin1.C new file mode 100644 index 000000000..ed49e9a96 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/builtin1.C @@ -0,0 +1,26 @@ +// Verify that if explicit prototype for builtin is present without throw(), +// both the normal builtin and __builtin_* variant are expected to be +// able to throw exceptions. +// { dg-do compile } +// { dg-options "-fdump-tree-eh" } + +extern "C" int printf (const char *, ...); + +struct A { A (); ~A (); int i; }; + +int +foo () +{ + A a; + printf ("foo %d\n", a.i); +} + +int +bar () +{ + A a; + __builtin_printf ("foo %d\n", a.i); +} + +/* { dg-final { scan-tree-dump-times "resx" 2 "eh" } } */ +/* { dg-final { cleanup-tree-dump "eh" } } */ diff --git a/gcc/testsuite/g++.dg/eh/builtin2.C b/gcc/testsuite/g++.dg/eh/builtin2.C new file mode 100644 index 000000000..fe0c4de6b --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/builtin2.C @@ -0,0 +1,25 @@ +// Verify that if explicit prototype for builtin is present with throw(), +// neither the normal builtin nor __builtin_* variant can throw exceptions. +// { dg-do compile } +// { dg-options "-fdump-tree-eh" } + +extern "C" int printf (const char *, ...) throw(); + +struct A { A (); ~A (); int i; }; + +int +foo () +{ + A a; + printf ("foo %d\n", a.i); +} + +int +bar () +{ + A a; + __builtin_printf ("foo %d\n", a.i); +} + +/* { dg-final { scan-tree-dump-times "resx" 0 "eh" } } */ +/* { dg-final { cleanup-tree-dump "eh" } } */ diff --git a/gcc/testsuite/g++.dg/eh/builtin3.C b/gcc/testsuite/g++.dg/eh/builtin3.C new file mode 100644 index 000000000..45809b815 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/builtin3.C @@ -0,0 +1,16 @@ +// Without explicit prototype, we need to assume the builtin can +// throw for builtins that at least on one platform can throw. +// { dg-do compile } +// { dg-options "-fdump-tree-eh" } + +struct A { A (); ~A (); int i; }; + +int +bar () +{ + A a; + __builtin_printf ("foo %d\n", a.i); +} + +/* { dg-final { scan-tree-dump-times "resx" 1 "eh" } } */ +/* { dg-final { cleanup-tree-dump "eh" } } */ diff --git a/gcc/testsuite/g++.dg/eh/builtin4.C b/gcc/testsuite/g++.dg/eh/builtin4.C new file mode 100644 index 000000000..32348174a --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/builtin4.C @@ -0,0 +1,6 @@ +// PR c++/33289 +// { dg-do compile } + +typedef __SIZE_TYPE__ size_t; +extern "C" int __sprintf_chk (char *__restrict, int, size_t, const char *, ...) throw (); +extern "C" int __sprintf_chk (char *__restrict, int, size_t, const char *, ...) throw (); diff --git a/gcc/testsuite/g++.dg/eh/cast1.C b/gcc/testsuite/g++.dg/eh/cast1.C new file mode 100644 index 000000000..964dd698d --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/cast1.C @@ -0,0 +1,10 @@ +// PR c++/28523 + +class A {}; +class B : public A {}; + +int main() +{ + throw (A) B(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/catch1.C b/gcc/testsuite/g++.dg/eh/catch1.C new file mode 100644 index 000000000..730218011 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/catch1.C @@ -0,0 +1,8 @@ +// PR c++/28250 +// { dg-do compile } + +template<int> void foo() +{ + try {} + catch (int(0)) {} // { dg-error "before" } +} diff --git a/gcc/testsuite/g++.dg/eh/catch2.C b/gcc/testsuite/g++.dg/eh/catch2.C new file mode 100644 index 000000000..33db94649 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/catch2.C @@ -0,0 +1,9 @@ +// PR c++/28250 +// { dg-do compile } + +void foo() +{ + try {} + catch () {} // { dg-error "before" } + catch (...) {} +} diff --git a/gcc/testsuite/g++.dg/eh/catch3.C b/gcc/testsuite/g++.dg/eh/catch3.C new file mode 100644 index 000000000..884829288 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/catch3.C @@ -0,0 +1,10 @@ +// PR c++/28250 +// { dg-do compile } + +template<int> void foo() +{ + try {} + catch () {} // { dg-error "type-specifier" } +} + +template void foo<0>(); diff --git a/gcc/testsuite/g++.dg/eh/catch4.C b/gcc/testsuite/g++.dg/eh/catch4.C new file mode 100644 index 000000000..34cf71212 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/catch4.C @@ -0,0 +1,8 @@ +// PR c++/28250 +// { dg-do compile } + +void foo() +{ + try { throw; } + catch () {} // { dg-error "type-specifier" } +} diff --git a/gcc/testsuite/g++.dg/eh/catch5.C b/gcc/testsuite/g++.dg/eh/catch5.C new file mode 100644 index 000000000..6001b566e --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/catch5.C @@ -0,0 +1,13 @@ +// PR c++/31411 + +struct allocator{ + ~allocator() throw(); +}; +struct string +{ + string(const string& str, const allocator& al = allocator()); +}; +int main() { + try {} + catch (string smess) {} +} diff --git a/gcc/testsuite/g++.dg/eh/check-vect.h b/gcc/testsuite/g++.dg/eh/check-vect.h new file mode 100644 index 000000000..b46a88275 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/check-vect.h @@ -0,0 +1,23 @@ +/* Check if system supports SIMD. Copied from gcc.dg/vect/tree-vect.h. */ +#include <signal.h> + +extern "C" void abort (void); +extern "C" void exit (int); + +void +sig_ill_handler (int sig) +{ + exit(0); +} + +void check_vect (void) +{ + signal(SIGILL, sig_ill_handler); +#if defined(__i386__) || defined(__x86_64__) + /* SSE2 instruction: movsd %xmm0,%xmm0 */ + asm volatile (".byte 0xf2,0x0f,0x10,0xc0"); +#elif defined(__sparc__) + asm volatile (".word\t0x81b007c0"); +#endif + signal (SIGILL, SIG_DFL); +} diff --git a/gcc/testsuite/g++.dg/eh/cleanup1.C b/gcc/testsuite/g++.dg/eh/cleanup1.C new file mode 100644 index 000000000..981b3e8d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/cleanup1.C @@ -0,0 +1,417 @@ +struct vector { ~vector(); }; +struct C { C(); + vector x; }; + +struct A { + A(); + + typedef C T; + + T a0000; T a0001; T a0002; T a0003; T a0004; T a0005; T a0006; T a0007; T a0008; T a0009; + T a0010; T a0011; T a0012; T a0013; T a0014; T a0015; T a0016; T a0017; T a0018; T a0019; + T a0020; T a0021; T a0022; T a0023; T a0024; T a0025; T a0026; T a0027; T a0028; T a0029; + T a0030; T a0031; T a0032; T a0033; T a0034; T a0035; T a0036; T a0037; T a0038; T a0039; + T a0040; T a0041; T a0042; T a0043; T a0044; T a0045; T a0046; T a0047; T a0048; T a0049; + T a0050; T a0051; T a0052; T a0053; T a0054; T a0055; T a0056; T a0057; T a0058; T a0059; + T a0060; T a0061; T a0062; T a0063; T a0064; T a0065; T a0066; T a0067; T a0068; T a0069; + T a0070; T a0071; T a0072; T a0073; T a0074; T a0075; T a0076; T a0077; T a0078; T a0079; + T a0080; T a0081; T a0082; T a0083; T a0084; T a0085; T a0086; T a0087; T a0088; T a0089; + T a0090; T a0091; T a0092; T a0093; T a0094; T a0095; T a0096; T a0097; T a0098; T a0099; + T a0100; T a0101; T a0102; T a0103; T a0104; T a0105; T a0106; T a0107; T a0108; T a0109; + T a0110; T a0111; T a0112; T a0113; T a0114; T a0115; T a0116; T a0117; T a0118; T a0119; + T a0120; T a0121; T a0122; T a0123; T a0124; T a0125; T a0126; T a0127; T a0128; T a0129; + T a0130; T a0131; T a0132; T a0133; T a0134; T a0135; T a0136; T a0137; T a0138; T a0139; + T a0140; T a0141; T a0142; T a0143; T a0144; T a0145; T a0146; T a0147; T a0148; T a0149; + T a0150; T a0151; T a0152; T a0153; T a0154; T a0155; T a0156; T a0157; T a0158; T a0159; + T a0160; T a0161; T a0162; T a0163; T a0164; T a0165; T a0166; T a0167; T a0168; T a0169; + T a0170; T a0171; T a0172; T a0173; T a0174; T a0175; T a0176; T a0177; T a0178; T a0179; + T a0180; T a0181; T a0182; T a0183; T a0184; T a0185; T a0186; T a0187; T a0188; T a0189; + T a0190; T a0191; T a0192; T a0193; T a0194; T a0195; T a0196; T a0197; T a0198; T a0199; + T a0200; T a0201; T a0202; T a0203; T a0204; T a0205; T a0206; T a0207; T a0208; T a0209; + T a0210; T a0211; T a0212; T a0213; T a0214; T a0215; T a0216; T a0217; T a0218; T a0219; + T a0220; T a0221; T a0222; T a0223; T a0224; T a0225; T a0226; T a0227; T a0228; T a0229; + T a0230; T a0231; T a0232; T a0233; T a0234; T a0235; T a0236; T a0237; T a0238; T a0239; + T a0240; T a0241; T a0242; T a0243; T a0244; T a0245; T a0246; T a0247; T a0248; T a0249; + T a0250; T a0251; T a0252; T a0253; T a0254; T a0255; T a0256; T a0257; T a0258; T a0259; + T a0260; T a0261; T a0262; T a0263; T a0264; T a0265; T a0266; T a0267; T a0268; T a0269; + T a0270; T a0271; T a0272; T a0273; T a0274; T a0275; T a0276; T a0277; T a0278; T a0279; + T a0280; T a0281; T a0282; T a0283; T a0284; T a0285; T a0286; T a0287; T a0288; T a0289; + T a0290; T a0291; T a0292; T a0293; T a0294; T a0295; T a0296; T a0297; T a0298; T a0299; + T a0300; T a0301; T a0302; T a0303; T a0304; T a0305; T a0306; T a0307; T a0308; T a0309; + T a0310; T a0311; T a0312; T a0313; T a0314; T a0315; T a0316; T a0317; T a0318; T a0319; + T a0320; T a0321; T a0322; T a0323; T a0324; T a0325; T a0326; T a0327; T a0328; T a0329; + T a0330; T a0331; T a0332; T a0333; T a0334; T a0335; T a0336; T a0337; T a0338; T a0339; + T a0340; T a0341; T a0342; T a0343; T a0344; T a0345; T a0346; T a0347; T a0348; T a0349; + T a0350; T a0351; T a0352; T a0353; T a0354; T a0355; T a0356; T a0357; T a0358; T a0359; + T a0360; T a0361; T a0362; T a0363; T a0364; T a0365; T a0366; T a0367; T a0368; T a0369; + T a0370; T a0371; T a0372; T a0373; T a0374; T a0375; T a0376; T a0377; T a0378; T a0379; + T a0380; T a0381; T a0382; T a0383; T a0384; T a0385; T a0386; T a0387; T a0388; T a0389; + T a0390; T a0391; T a0392; T a0393; T a0394; T a0395; T a0396; T a0397; T a0398; T a0399; + T a0400; T a0401; T a0402; T a0403; T a0404; T a0405; T a0406; T a0407; T a0408; T a0409; + T a0410; T a0411; T a0412; T a0413; T a0414; T a0415; T a0416; T a0417; T a0418; T a0419; + T a0420; T a0421; T a0422; T a0423; T a0424; T a0425; T a0426; T a0427; T a0428; T a0429; + T a0430; T a0431; T a0432; T a0433; T a0434; T a0435; T a0436; T a0437; T a0438; T a0439; + T a0440; T a0441; T a0442; T a0443; T a0444; T a0445; T a0446; T a0447; T a0448; T a0449; + T a0450; T a0451; T a0452; T a0453; T a0454; T a0455; T a0456; T a0457; T a0458; T a0459; + T a0460; T a0461; T a0462; T a0463; T a0464; T a0465; T a0466; T a0467; T a0468; T a0469; + T a0470; T a0471; T a0472; T a0473; T a0474; T a0475; T a0476; T a0477; T a0478; T a0479; + T a0480; T a0481; T a0482; T a0483; T a0484; T a0485; T a0486; T a0487; T a0488; T a0489; + T a0490; T a0491; T a0492; T a0493; T a0494; T a0495; T a0496; T a0497; T a0498; T a0499; + + T a0500; T a0501; T a0502; T a0503; T a0504; T a0505; T a0506; T a0507; T a0508; T a0509; + T a0510; T a0511; T a0512; T a0513; T a0514; T a0515; T a0516; T a0517; T a0518; T a0519; + T a0520; T a0521; T a0522; T a0523; T a0524; T a0525; T a0526; T a0527; T a0528; T a0529; + T a0530; T a0531; T a0532; T a0533; T a0534; T a0535; T a0536; T a0537; T a0538; T a0539; + T a0540; T a0541; T a0542; T a0543; T a0544; T a0545; T a0546; T a0547; T a0548; T a0549; + T a0550; T a0551; T a0552; T a0553; T a0554; T a0555; T a0556; T a0557; T a0558; T a0559; + T a0560; T a0561; T a0562; T a0563; T a0564; T a0565; T a0566; T a0567; T a0568; T a0569; + T a0570; T a0571; T a0572; T a0573; T a0574; T a0575; T a0576; T a0577; T a0578; T a0579; + T a0580; T a0581; T a0582; T a0583; T a0584; T a0585; T a0586; T a0587; T a0588; T a0589; + T a0590; T a0591; T a0592; T a0593; T a0594; T a0595; T a0596; T a0597; T a0598; T a0599; + T a0600; T a0601; T a0602; T a0603; T a0604; T a0605; T a0606; T a0607; T a0608; T a0609; + T a0610; T a0611; T a0612; T a0613; T a0614; T a0615; T a0616; T a0617; T a0618; T a0619; + T a0620; T a0621; T a0622; T a0623; T a0624; T a0625; T a0626; T a0627; T a0628; T a0629; + T a0630; T a0631; T a0632; T a0633; T a0634; T a0635; T a0636; T a0637; T a0638; T a0639; + T a0640; T a0641; T a0642; T a0643; T a0644; T a0645; T a0646; T a0647; T a0648; T a0649; + T a0650; T a0651; T a0652; T a0653; T a0654; T a0655; T a0656; T a0657; T a0658; T a0659; + T a0660; T a0661; T a0662; T a0663; T a0664; T a0665; T a0666; T a0667; T a0668; T a0669; + T a0670; T a0671; T a0672; T a0673; T a0674; T a0675; T a0676; T a0677; T a0678; T a0679; + T a0680; T a0681; T a0682; T a0683; T a0684; T a0685; T a0686; T a0687; T a0688; T a0689; + T a0690; T a0691; T a0692; T a0693; T a0694; T a0695; T a0696; T a0697; T a0698; T a0699; + T a0700; T a0701; T a0702; T a0703; T a0704; T a0705; T a0706; T a0707; T a0708; T a0709; + T a0710; T a0711; T a0712; T a0713; T a0714; T a0715; T a0716; T a0717; T a0718; T a0719; + T a0720; T a0721; T a0722; T a0723; T a0724; T a0725; T a0726; T a0727; T a0728; T a0729; + T a0730; T a0731; T a0732; T a0733; T a0734; T a0735; T a0736; T a0737; T a0738; T a0739; + T a0740; T a0741; T a0742; T a0743; T a0744; T a0745; T a0746; T a0747; T a0748; T a0749; + T a0750; T a0751; T a0752; T a0753; T a0754; T a0755; T a0756; T a0757; T a0758; T a0759; + T a0760; T a0761; T a0762; T a0763; T a0764; T a0765; T a0766; T a0767; T a0768; T a0769; + T a0770; T a0771; T a0772; T a0773; T a0774; T a0775; T a0776; T a0777; T a0778; T a0779; + T a0780; T a0781; T a0782; T a0783; T a0784; T a0785; T a0786; T a0787; T a0788; T a0789; + T a0790; T a0791; T a0792; T a0793; T a0794; T a0795; T a0796; T a0797; T a0798; T a0799; + T a0800; T a0801; T a0802; T a0803; T a0804; T a0805; T a0806; T a0807; T a0808; T a0809; + T a0810; T a0811; T a0812; T a0813; T a0814; T a0815; T a0816; T a0817; T a0818; T a0819; + T a0820; T a0821; T a0822; T a0823; T a0824; T a0825; T a0826; T a0827; T a0828; T a0829; + T a0830; T a0831; T a0832; T a0833; T a0834; T a0835; T a0836; T a0837; T a0838; T a0839; + T a0840; T a0841; T a0842; T a0843; T a0844; T a0845; T a0846; T a0847; T a0848; T a0849; + T a0850; T a0851; T a0852; T a0853; T a0854; T a0855; T a0856; T a0857; T a0858; T a0859; + T a0860; T a0861; T a0862; T a0863; T a0864; T a0865; T a0866; T a0867; T a0868; T a0869; + T a0870; T a0871; T a0872; T a0873; T a0874; T a0875; T a0876; T a0877; T a0878; T a0879; + T a0880; T a0881; T a0882; T a0883; T a0884; T a0885; T a0886; T a0887; T a0888; T a0889; + T a0890; T a0891; T a0892; T a0893; T a0894; T a0895; T a0896; T a0897; T a0898; T a0899; + T a0900; T a0901; T a0902; T a0903; T a0904; T a0905; T a0906; T a0907; T a0908; T a0909; + T a0910; T a0911; T a0912; T a0913; T a0914; T a0915; T a0916; T a0917; T a0918; T a0919; + T a0920; T a0921; T a0922; T a0923; T a0924; T a0925; T a0926; T a0927; T a0928; T a0929; + T a0930; T a0931; T a0932; T a0933; T a0934; T a0935; T a0936; T a0937; T a0938; T a0939; + T a0940; T a0941; T a0942; T a0943; T a0944; T a0945; T a0946; T a0947; T a0948; T a0949; + T a0950; T a0951; T a0952; T a0953; T a0954; T a0955; T a0956; T a0957; T a0958; T a0959; + T a0960; T a0961; T a0962; T a0963; T a0964; T a0965; T a0966; T a0967; T a0968; T a0969; + T a0970; T a0971; T a0972; T a0973; T a0974; T a0975; T a0976; T a0977; T a0978; T a0979; + T a0980; T a0981; T a0982; T a0983; T a0984; T a0985; T a0986; T a0987; T a0988; T a0989; + T a0990; T a0991; T a0992; T a0993; T a0994; T a0995; T a0996; T a0997; T a0998; T a0999; + T a1000; T a1001; T a1002; T a1003; T a1004; T a1005; T a1006; T a1007; T a1008; T a1009; + T a1010; T a1011; T a1012; T a1013; T a1014; T a1015; T a1016; T a1017; T a1018; T a1019; + T a1020; T a1021; T a1022; T a1023; T a1024; T a1025; T a1026; T a1027; T a1028; T a1029; + T a1030; T a1031; T a1032; T a1033; T a1034; T a1035; T a1036; T a1037; T a1038; T a1039; + T a1040; T a1041; T a1042; T a1043; T a1044; T a1045; T a1046; T a1047; T a1048; T a1049; + T a1050; T a1051; T a1052; T a1053; T a1054; T a1055; T a1056; T a1057; T a1058; T a1059; + T a1060; T a1061; T a1062; T a1063; T a1064; T a1065; T a1066; T a1067; T a1068; T a1069; + T a1070; T a1071; T a1072; T a1073; T a1074; T a1075; T a1076; T a1077; T a1078; T a1079; + T a1080; T a1081; T a1082; T a1083; T a1084; T a1085; T a1086; T a1087; T a1088; T a1089; + T a1090; T a1091; T a1092; T a1093; T a1094; T a1095; T a1096; T a1097; T a1098; T a1099; + T a1100; T a1101; T a1102; T a1103; T a1104; T a1105; T a1106; T a1107; T a1108; T a1109; + T a1110; T a1111; T a1112; T a1113; T a1114; T a1115; T a1116; T a1117; T a1118; T a1119; + T a1120; T a1121; T a1122; T a1123; T a1124; T a1125; T a1126; T a1127; T a1128; T a1129; + T a1130; T a1131; T a1132; T a1133; T a1134; T a1135; T a1136; T a1137; T a1138; T a1139; + T a1140; T a1141; T a1142; T a1143; T a1144; T a1145; T a1146; T a1147; T a1148; T a1149; + T a1150; T a1151; T a1152; T a1153; T a1154; T a1155; T a1156; T a1157; T a1158; T a1159; + T a1160; T a1161; T a1162; T a1163; T a1164; T a1165; T a1166; T a1167; T a1168; T a1169; + T a1170; T a1171; T a1172; T a1173; T a1174; T a1175; T a1176; T a1177; T a1178; T a1179; + T a1180; T a1181; T a1182; T a1183; T a1184; T a1185; T a1186; T a1187; T a1188; T a1189; + T a1190; T a1191; T a1192; T a1193; T a1194; T a1195; T a1196; T a1197; T a1198; T a1199; + T a1200; T a1201; T a1202; T a1203; T a1204; T a1205; T a1206; T a1207; T a1208; T a1209; + T a1210; T a1211; T a1212; T a1213; T a1214; T a1215; T a1216; T a1217; T a1218; T a1219; + T a1220; T a1221; T a1222; T a1223; T a1224; T a1225; T a1226; T a1227; T a1228; T a1229; + T a1230; T a1231; T a1232; T a1233; T a1234; T a1235; T a1236; T a1237; T a1238; T a1239; + T a1240; T a1241; T a1242; T a1243; T a1244; T a1245; T a1246; T a1247; T a1248; T a1249; + T a1250; T a1251; T a1252; T a1253; T a1254; T a1255; T a1256; T a1257; T a1258; T a1259; + T a1260; T a1261; T a1262; T a1263; T a1264; T a1265; T a1266; T a1267; T a1268; T a1269; + T a1270; T a1271; T a1272; T a1273; T a1274; T a1275; T a1276; T a1277; T a1278; T a1279; + T a1280; T a1281; T a1282; T a1283; T a1284; T a1285; T a1286; T a1287; T a1288; T a1289; + T a1290; T a1291; T a1292; T a1293; T a1294; T a1295; T a1296; T a1297; T a1298; T a1299; + T a1300; T a1301; T a1302; T a1303; T a1304; T a1305; T a1306; T a1307; T a1308; T a1309; + T a1310; T a1311; T a1312; T a1313; T a1314; T a1315; T a1316; T a1317; T a1318; T a1319; + T a1320; T a1321; T a1322; T a1323; T a1324; T a1325; T a1326; T a1327; T a1328; T a1329; + T a1330; T a1331; T a1332; T a1333; T a1334; T a1335; T a1336; T a1337; T a1338; T a1339; + T a1340; T a1341; T a1342; T a1343; T a1344; T a1345; T a1346; T a1347; T a1348; T a1349; + T a1350; T a1351; T a1352; T a1353; T a1354; T a1355; T a1356; T a1357; T a1358; T a1359; + T a1360; T a1361; T a1362; T a1363; T a1364; T a1365; T a1366; T a1367; T a1368; T a1369; + T a1370; T a1371; T a1372; T a1373; T a1374; T a1375; T a1376; T a1377; T a1378; T a1379; + T a1380; T a1381; T a1382; T a1383; T a1384; T a1385; T a1386; T a1387; T a1388; T a1389; + T a1390; T a1391; T a1392; T a1393; T a1394; T a1395; T a1396; T a1397; T a1398; T a1399; + T a1400; T a1401; T a1402; T a1403; T a1404; T a1405; T a1406; T a1407; T a1408; T a1409; + T a1410; T a1411; T a1412; T a1413; T a1414; T a1415; T a1416; T a1417; T a1418; T a1419; + T a1420; T a1421; T a1422; T a1423; T a1424; T a1425; T a1426; T a1427; T a1428; T a1429; + T a1430; T a1431; T a1432; T a1433; T a1434; T a1435; T a1436; T a1437; T a1438; T a1439; + T a1440; T a1441; T a1442; T a1443; T a1444; T a1445; T a1446; T a1447; T a1448; T a1449; + T a1450; T a1451; T a1452; T a1453; T a1454; T a1455; T a1456; T a1457; T a1458; T a1459; + T a1460; T a1461; T a1462; T a1463; T a1464; T a1465; T a1466; T a1467; T a1468; T a1469; + T a1470; T a1471; T a1472; T a1473; T a1474; T a1475; T a1476; T a1477; T a1478; T a1479; + T a1480; T a1481; T a1482; T a1483; T a1484; T a1485; T a1486; T a1487; T a1488; T a1489; + T a1490; T a1491; T a1492; T a1493; T a1494; T a1495; T a1496; T a1497; T a1498; T a1499; + T a1500; T a1501; T a1502; T a1503; T a1504; T a1505; T a1506; T a1507; T a1508; T a1509; + T a1510; T a1511; T a1512; T a1513; T a1514; T a1515; T a1516; T a1517; T a1518; T a1519; + T a1520; T a1521; T a1522; T a1523; T a1524; T a1525; T a1526; T a1527; T a1528; T a1529; + T a1530; T a1531; T a1532; T a1533; T a1534; T a1535; T a1536; T a1537; T a1538; T a1539; + T a1540; T a1541; T a1542; T a1543; T a1544; T a1545; T a1546; T a1547; T a1548; T a1549; + T a1550; T a1551; T a1552; T a1553; T a1554; T a1555; T a1556; T a1557; T a1558; T a1559; + T a1560; T a1561; T a1562; T a1563; T a1564; T a1565; T a1566; T a1567; T a1568; T a1569; + T a1570; T a1571; T a1572; T a1573; T a1574; T a1575; T a1576; T a1577; T a1578; T a1579; + T a1580; T a1581; T a1582; T a1583; T a1584; T a1585; T a1586; T a1587; T a1588; T a1589; + T a1590; T a1591; T a1592; T a1593; T a1594; T a1595; T a1596; T a1597; T a1598; T a1599; + T a1600; T a1601; T a1602; T a1603; T a1604; T a1605; T a1606; T a1607; T a1608; T a1609; + T a1610; T a1611; T a1612; T a1613; T a1614; T a1615; T a1616; T a1617; T a1618; T a1619; + T a1620; T a1621; T a1622; T a1623; T a1624; T a1625; T a1626; T a1627; T a1628; T a1629; + T a1630; T a1631; T a1632; T a1633; T a1634; T a1635; T a1636; T a1637; T a1638; T a1639; + T a1640; T a1641; T a1642; T a1643; T a1644; T a1645; T a1646; T a1647; T a1648; T a1649; + T a1650; T a1651; T a1652; T a1653; T a1654; T a1655; T a1656; T a1657; T a1658; T a1659; + T a1660; T a1661; T a1662; T a1663; T a1664; T a1665; T a1666; T a1667; T a1668; T a1669; + T a1670; T a1671; T a1672; T a1673; T a1674; T a1675; T a1676; T a1677; T a1678; T a1679; + T a1680; T a1681; T a1682; T a1683; T a1684; T a1685; T a1686; T a1687; T a1688; T a1689; + T a1690; T a1691; T a1692; T a1693; T a1694; T a1695; T a1696; T a1697; T a1698; T a1699; + T a1700; T a1701; T a1702; T a1703; T a1704; T a1705; T a1706; T a1707; T a1708; T a1709; + T a1710; T a1711; T a1712; T a1713; T a1714; T a1715; T a1716; T a1717; T a1718; T a1719; + T a1720; T a1721; T a1722; T a1723; T a1724; T a1725; T a1726; T a1727; T a1728; T a1729; + T a1730; T a1731; T a1732; T a1733; T a1734; T a1735; T a1736; T a1737; T a1738; T a1739; + T a1740; T a1741; T a1742; T a1743; T a1744; T a1745; T a1746; T a1747; T a1748; T a1749; + T a1750; T a1751; T a1752; T a1753; T a1754; T a1755; T a1756; T a1757; T a1758; T a1759; + T a1760; T a1761; T a1762; T a1763; T a1764; T a1765; T a1766; T a1767; T a1768; T a1769; + T a1770; T a1771; T a1772; T a1773; T a1774; T a1775; T a1776; T a1777; T a1778; T a1779; + T a1780; T a1781; T a1782; T a1783; T a1784; T a1785; T a1786; T a1787; T a1788; T a1789; + T a1790; T a1791; T a1792; T a1793; T a1794; T a1795; T a1796; T a1797; T a1798; T a1799; + T a1800; T a1801; T a1802; T a1803; T a1804; T a1805; T a1806; T a1807; T a1808; T a1809; + T a1810; T a1811; T a1812; T a1813; T a1814; T a1815; T a1816; T a1817; T a1818; T a1819; + T a1820; T a1821; T a1822; T a1823; T a1824; T a1825; T a1826; T a1827; T a1828; T a1829; + T a1830; T a1831; T a1832; T a1833; T a1834; T a1835; T a1836; T a1837; T a1838; T a1839; + T a1840; T a1841; T a1842; T a1843; T a1844; T a1845; T a1846; T a1847; T a1848; T a1849; + T a1850; T a1851; T a1852; T a1853; T a1854; T a1855; T a1856; T a1857; T a1858; T a1859; + T a1860; T a1861; T a1862; T a1863; T a1864; T a1865; T a1866; T a1867; T a1868; T a1869; + T a1870; T a1871; T a1872; T a1873; T a1874; T a1875; T a1876; T a1877; T a1878; T a1879; + T a1880; T a1881; T a1882; T a1883; T a1884; T a1885; T a1886; T a1887; T a1888; T a1889; + T a1890; T a1891; T a1892; T a1893; T a1894; T a1895; T a1896; T a1897; T a1898; T a1899; + T a1900; T a1901; T a1902; T a1903; T a1904; T a1905; T a1906; T a1907; T a1908; T a1909; + T a1910; T a1911; T a1912; T a1913; T a1914; T a1915; T a1916; T a1917; T a1918; T a1919; + T a1920; T a1921; T a1922; T a1923; T a1924; T a1925; T a1926; T a1927; T a1928; T a1929; + T a1930; T a1931; T a1932; T a1933; T a1934; T a1935; T a1936; T a1937; T a1938; T a1939; + T a1940; T a1941; T a1942; T a1943; T a1944; T a1945; T a1946; T a1947; T a1948; T a1949; + T a1950; T a1951; T a1952; T a1953; T a1954; T a1955; T a1956; T a1957; T a1958; T a1959; + T a1960; T a1961; T a1962; T a1963; T a1964; T a1965; T a1966; T a1967; T a1968; T a1969; + T a1970; T a1971; T a1972; T a1973; T a1974; T a1975; T a1976; T a1977; T a1978; T a1979; + T a1980; T a1981; T a1982; T a1983; T a1984; T a1985; T a1986; T a1987; T a1988; T a1989; + T a1990; T a1991; T a1992; T a1993; T a1994; T a1995; T a1996; T a1997; T a1998; T a1999; + + + T a2000; T a2001; T a2002; T a2003; T a2004; T a2005; T a2006; T a2007; T a2008; T a2009; + T a2010; T a2011; T a2012; T a2013; T a2014; T a2015; T a2016; T a2017; T a2018; T a2019; + T a2020; T a2021; T a2022; T a2023; T a2024; T a2025; T a2026; T a2027; T a2028; T a2029; + T a2030; T a2031; T a2032; T a2033; T a2034; T a2035; T a2036; T a2037; T a2038; T a2039; + T a2040; T a2041; T a2042; T a2043; T a2044; T a2045; T a2046; T a2047; T a2048; T a2049; + T a2050; T a2051; T a2052; T a2053; T a2054; T a2055; T a2056; T a2057; T a2058; T a2059; + T a2060; T a2061; T a2062; T a2063; T a2064; T a2065; T a2066; T a2067; T a2068; T a2069; + T a2070; T a2071; T a2072; T a2073; T a2074; T a2075; T a2076; T a2077; T a2078; T a2079; + T a2080; T a2081; T a2082; T a2083; T a2084; T a2085; T a2086; T a2087; T a2088; T a2089; + T a2090; T a2091; T a2092; T a2093; T a2094; T a2095; T a2096; T a2097; T a2098; T a2099; + T a2100; T a2101; T a2102; T a2103; T a2104; T a2105; T a2106; T a2107; T a2108; T a2109; + T a2110; T a2111; T a2112; T a2113; T a2114; T a2115; T a2116; T a2117; T a2118; T a2119; + T a2120; T a2121; T a2122; T a2123; T a2124; T a2125; T a2126; T a2127; T a2128; T a2129; + T a2130; T a2131; T a2132; T a2133; T a2134; T a2135; T a2136; T a2137; T a2138; T a2139; + T a2140; T a2141; T a2142; T a2143; T a2144; T a2145; T a2146; T a2147; T a2148; T a2149; + T a2150; T a2151; T a2152; T a2153; T a2154; T a2155; T a2156; T a2157; T a2158; T a2159; + T a2160; T a2161; T a2162; T a2163; T a2164; T a2165; T a2166; T a2167; T a2168; T a2169; + T a2170; T a2171; T a2172; T a2173; T a2174; T a2175; T a2176; T a2177; T a2178; T a2179; + T a2180; T a2181; T a2182; T a2183; T a2184; T a2185; T a2186; T a2187; T a2188; T a2189; + T a2190; T a2191; T a2192; T a2193; T a2194; T a2195; T a2196; T a2197; T a2198; T a2199; + T a2200; T a2201; T a2202; T a2203; T a2204; T a2205; T a2206; T a2207; T a2208; T a2209; + T a2210; T a2211; T a2212; T a2213; T a2214; T a2215; T a2216; T a2217; T a2218; T a2219; + T a2220; T a2221; T a2222; T a2223; T a2224; T a2225; T a2226; T a2227; T a2228; T a2229; + T a2230; T a2231; T a2232; T a2233; T a2234; T a2235; T a2236; T a2237; T a2238; T a2239; + T a2240; T a2241; T a2242; T a2243; T a2244; T a2245; T a2246; T a2247; T a2248; T a2249; + T a2250; T a2251; T a2252; T a2253; T a2254; T a2255; T a2256; T a2257; T a2258; T a2259; + T a2260; T a2261; T a2262; T a2263; T a2264; T a2265; T a2266; T a2267; T a2268; T a2269; + T a2270; T a2271; T a2272; T a2273; T a2274; T a2275; T a2276; T a2277; T a2278; T a2279; + T a2280; T a2281; T a2282; T a2283; T a2284; T a2285; T a2286; T a2287; T a2288; T a2289; + T a2290; T a2291; T a2292; T a2293; T a2294; T a2295; T a2296; T a2297; T a2298; T a2299; + T a2300; T a2301; T a2302; T a2303; T a2304; T a2305; T a2306; T a2307; T a2308; T a2309; + T a2310; T a2311; T a2312; T a2313; T a2314; T a2315; T a2316; T a2317; T a2318; T a2319; + T a2320; T a2321; T a2322; T a2323; T a2324; T a2325; T a2326; T a2327; T a2328; T a2329; + T a2330; T a2331; T a2332; T a2333; T a2334; T a2335; T a2336; T a2337; T a2338; T a2339; + T a2340; T a2341; T a2342; T a2343; T a2344; T a2345; T a2346; T a2347; T a2348; T a2349; + T a2350; T a2351; T a2352; T a2353; T a2354; T a2355; T a2356; T a2357; T a2358; T a2359; + T a2360; T a2361; T a2362; T a2363; T a2364; T a2365; T a2366; T a2367; T a2368; T a2369; + T a2370; T a2371; T a2372; T a2373; T a2374; T a2375; T a2376; T a2377; T a2378; T a2379; + T a2380; T a2381; T a2382; T a2383; T a2384; T a2385; T a2386; T a2387; T a2388; T a2389; + T a2390; T a2391; T a2392; T a2393; T a2394; T a2395; T a2396; T a2397; T a2398; T a2399; + T a2400; T a2401; T a2402; T a2403; T a2404; T a2405; T a2406; T a2407; T a2408; T a2409; + T a2410; T a2411; T a2412; T a2413; T a2414; T a2415; T a2416; T a2417; T a2418; T a2419; + T a2420; T a2421; T a2422; T a2423; T a2424; T a2425; T a2426; T a2427; T a2428; T a2429; + T a2430; T a2431; T a2432; T a2433; T a2434; T a2435; T a2436; T a2437; T a2438; T a2439; + T a2440; T a2441; T a2442; T a2443; T a2444; T a2445; T a2446; T a2447; T a2448; T a2449; + T a2450; T a2451; T a2452; T a2453; T a2454; T a2455; T a2456; T a2457; T a2458; T a2459; + T a2460; T a2461; T a2462; T a2463; T a2464; T a2465; T a2466; T a2467; T a2468; T a2469; + T a2470; T a2471; T a2472; T a2473; T a2474; T a2475; T a2476; T a2477; T a2478; T a2479; + T a2480; T a2481; T a2482; T a2483; T a2484; T a2485; T a2486; T a2487; T a2488; T a2489; + T a2490; T a2491; T a2492; T a2493; T a2494; T a2495; T a2496; T a2497; T a2498; T a2499; + T a2500; T a2501; T a2502; T a2503; T a2504; T a2505; T a2506; T a2507; T a2508; T a2509; + T a2510; T a2511; T a2512; T a2513; T a2514; T a2515; T a2516; T a2517; T a2518; T a2519; + T a2520; T a2521; T a2522; T a2523; T a2524; T a2525; T a2526; T a2527; T a2528; T a2529; + T a2530; T a2531; T a2532; T a2533; T a2534; T a2535; T a2536; T a2537; T a2538; T a2539; + T a2540; T a2541; T a2542; T a2543; T a2544; T a2545; T a2546; T a2547; T a2548; T a2549; + T a2550; T a2551; T a2552; T a2553; T a2554; T a2555; T a2556; T a2557; T a2558; T a2559; + T a2560; T a2561; T a2562; T a2563; T a2564; T a2565; T a2566; T a2567; T a2568; T a2569; + T a2570; T a2571; T a2572; T a2573; T a2574; T a2575; T a2576; T a2577; T a2578; T a2579; + T a2580; T a2581; T a2582; T a2583; T a2584; T a2585; T a2586; T a2587; T a2588; T a2589; + T a2590; T a2591; T a2592; T a2593; T a2594; T a2595; T a2596; T a2597; T a2598; T a2599; + T a2600; T a2601; T a2602; T a2603; T a2604; T a2605; T a2606; T a2607; T a2608; T a2609; + T a2610; T a2611; T a2612; T a2613; T a2614; T a2615; T a2616; T a2617; T a2618; T a2619; + T a2620; T a2621; T a2622; T a2623; T a2624; T a2625; T a2626; T a2627; T a2628; T a2629; + T a2630; T a2631; T a2632; T a2633; T a2634; T a2635; T a2636; T a2637; T a2638; T a2639; + T a2640; T a2641; T a2642; T a2643; T a2644; T a2645; T a2646; T a2647; T a2648; T a2649; + T a2650; T a2651; T a2652; T a2653; T a2654; T a2655; T a2656; T a2657; T a2658; T a2659; + T a2660; T a2661; T a2662; T a2663; T a2664; T a2665; T a2666; T a2667; T a2668; T a2669; + T a2670; T a2671; T a2672; T a2673; T a2674; T a2675; T a2676; T a2677; T a2678; T a2679; + T a2680; T a2681; T a2682; T a2683; T a2684; T a2685; T a2686; T a2687; T a2688; T a2689; + T a2690; T a2691; T a2692; T a2693; T a2694; T a2695; T a2696; T a2697; T a2698; T a2699; + T a2700; T a2701; T a2702; T a2703; T a2704; T a2705; T a2706; T a2707; T a2708; T a2709; + T a2710; T a2711; T a2712; T a2713; T a2714; T a2715; T a2716; T a2717; T a2718; T a2719; + T a2720; T a2721; T a2722; T a2723; T a2724; T a2725; T a2726; T a2727; T a2728; T a2729; + T a2730; T a2731; T a2732; T a2733; T a2734; T a2735; T a2736; T a2737; T a2738; T a2739; + T a2740; T a2741; T a2742; T a2743; T a2744; T a2745; T a2746; T a2747; T a2748; T a2749; + T a2750; T a2751; T a2752; T a2753; T a2754; T a2755; T a2756; T a2757; T a2758; T a2759; + T a2760; T a2761; T a2762; T a2763; T a2764; T a2765; T a2766; T a2767; T a2768; T a2769; + T a2770; T a2771; T a2772; T a2773; T a2774; T a2775; T a2776; T a2777; T a2778; T a2779; + T a2780; T a2781; T a2782; T a2783; T a2784; T a2785; T a2786; T a2787; T a2788; T a2789; + T a2790; T a2791; T a2792; T a2793; T a2794; T a2795; T a2796; T a2797; T a2798; T a2799; + T a2800; T a2801; T a2802; T a2803; T a2804; T a2805; T a2806; T a2807; T a2808; T a2809; + T a2810; T a2811; T a2812; T a2813; T a2814; T a2815; T a2816; T a2817; T a2818; T a2819; + T a2820; T a2821; T a2822; T a2823; T a2824; T a2825; T a2826; T a2827; T a2828; T a2829; + T a2830; T a2831; T a2832; T a2833; T a2834; T a2835; T a2836; T a2837; T a2838; T a2839; + T a2840; T a2841; T a2842; T a2843; T a2844; T a2845; T a2846; T a2847; T a2848; T a2849; + T a2850; T a2851; T a2852; T a2853; T a2854; T a2855; T a2856; T a2857; T a2858; T a2859; + T a2860; T a2861; T a2862; T a2863; T a2864; T a2865; T a2866; T a2867; T a2868; T a2869; + T a2870; T a2871; T a2872; T a2873; T a2874; T a2875; T a2876; T a2877; T a2878; T a2879; + T a2880; T a2881; T a2882; T a2883; T a2884; T a2885; T a2886; T a2887; T a2888; T a2889; + T a2890; T a2891; T a2892; T a2893; T a2894; T a2895; T a2896; T a2897; T a2898; T a2899; + T a2900; T a2901; T a2902; T a2903; T a2904; T a2905; T a2906; T a2907; T a2908; T a2909; + T a2910; T a2911; T a2912; T a2913; T a2914; T a2915; T a2916; T a2917; T a2918; T a2919; + T a2920; T a2921; T a2922; T a2923; T a2924; T a2925; T a2926; T a2927; T a2928; T a2929; + T a2930; T a2931; T a2932; T a2933; T a2934; T a2935; T a2936; T a2937; T a2938; T a2939; + T a2940; T a2941; T a2942; T a2943; T a2944; T a2945; T a2946; T a2947; T a2948; T a2949; + T a2950; T a2951; T a2952; T a2953; T a2954; T a2955; T a2956; T a2957; T a2958; T a2959; + T a2960; T a2961; T a2962; T a2963; T a2964; T a2965; T a2966; T a2967; T a2968; T a2969; + T a2970; T a2971; T a2972; T a2973; T a2974; T a2975; T a2976; T a2977; T a2978; T a2979; + T a2980; T a2981; T a2982; T a2983; T a2984; T a2985; T a2986; T a2987; T a2988; T a2989; + T a2990; T a2991; T a2992; T a2993; T a2994; T a2995; T a2996; T a2997; T a2998; T a2999; + + + T a3000; T a3001; T a3002; T a3003; T a3004; T a3005; T a3006; T a3007; T a3008; T a3009; + T a3010; T a3011; T a3012; T a3013; T a3014; T a3015; T a3016; T a3017; T a3018; T a3019; + T a3020; T a3021; T a3022; T a3023; T a3024; T a3025; T a3026; T a3027; T a3028; T a3029; + T a3030; T a3031; T a3032; T a3033; T a3034; T a3035; T a3036; T a3037; T a3038; T a3039; + T a3040; T a3041; T a3042; T a3043; T a3044; T a3045; T a3046; T a3047; T a3048; T a3049; + T a3050; T a3051; T a3052; T a3053; T a3054; T a3055; T a3056; T a3057; T a3058; T a3059; + T a3060; T a3061; T a3062; T a3063; T a3064; T a3065; T a3066; T a3067; T a3068; T a3069; + T a3070; T a3071; T a3072; T a3073; T a3074; T a3075; T a3076; T a3077; T a3078; T a3079; + T a3080; T a3081; T a3082; T a3083; T a3084; T a3085; T a3086; T a3087; T a3088; T a3089; + T a3090; T a3091; T a3092; T a3093; T a3094; T a3095; T a3096; T a3097; T a3098; T a3099; + T a3100; T a3101; T a3102; T a3103; T a3104; T a3105; T a3106; T a3107; T a3108; T a3109; + T a3110; T a3111; T a3112; T a3113; T a3114; T a3115; T a3116; T a3117; T a3118; T a3119; + T a3120; T a3121; T a3122; T a3123; T a3124; T a3125; T a3126; T a3127; T a3128; T a3129; + T a3130; T a3131; T a3132; T a3133; T a3134; T a3135; T a3136; T a3137; T a3138; T a3139; + T a3140; T a3141; T a3142; T a3143; T a3144; T a3145; T a3146; T a3147; T a3148; T a3149; + T a3150; T a3151; T a3152; T a3153; T a3154; T a3155; T a3156; T a3157; T a3158; T a3159; + T a3160; T a3161; T a3162; T a3163; T a3164; T a3165; T a3166; T a3167; T a3168; T a3169; + T a3170; T a3171; T a3172; T a3173; T a3174; T a3175; T a3176; T a3177; T a3178; T a3179; + T a3180; T a3181; T a3182; T a3183; T a3184; T a3185; T a3186; T a3187; T a3188; T a3189; + T a3190; T a3191; T a3192; T a3193; T a3194; T a3195; T a3196; T a3197; T a3198; T a3199; + T a3200; T a3201; T a3202; T a3203; T a3204; T a3205; T a3206; T a3207; T a3208; T a3209; + T a3210; T a3211; T a3212; T a3213; T a3214; T a3215; T a3216; T a3217; T a3218; T a3219; + T a3220; T a3221; T a3222; T a3223; T a3224; T a3225; T a3226; T a3227; T a3228; T a3229; + T a3230; T a3231; T a3232; T a3233; T a3234; T a3235; T a3236; T a3237; T a3238; T a3239; + T a3240; T a3241; T a3242; T a3243; T a3244; T a3245; T a3246; T a3247; T a3248; T a3249; + T a3250; T a3251; T a3252; T a3253; T a3254; T a3255; T a3256; T a3257; T a3258; T a3259; + T a3260; T a3261; T a3262; T a3263; T a3264; T a3265; T a3266; T a3267; T a3268; T a3269; + T a3270; T a3271; T a3272; T a3273; T a3274; T a3275; T a3276; T a3277; T a3278; T a3279; + T a3280; T a3281; T a3282; T a3283; T a3284; T a3285; T a3286; T a3287; T a3288; T a3289; + T a3290; T a3291; T a3292; T a3293; T a3294; T a3295; T a3296; T a3297; T a3298; T a3299; + T a3300; T a3301; T a3302; T a3303; T a3304; T a3305; T a3306; T a3307; T a3308; T a3309; + T a3310; T a3311; T a3312; T a3313; T a3314; T a3315; T a3316; T a3317; T a3318; T a3319; + T a3320; T a3321; T a3322; T a3323; T a3324; T a3325; T a3326; T a3327; T a3328; T a3329; + T a3330; T a3331; T a3332; T a3333; T a3334; T a3335; T a3336; T a3337; T a3338; T a3339; + T a3340; T a3341; T a3342; T a3343; T a3344; T a3345; T a3346; T a3347; T a3348; T a3349; + T a3350; T a3351; T a3352; T a3353; T a3354; T a3355; T a3356; T a3357; T a3358; T a3359; + T a3360; T a3361; T a3362; T a3363; T a3364; T a3365; T a3366; T a3367; T a3368; T a3369; + T a3370; T a3371; T a3372; T a3373; T a3374; T a3375; T a3376; T a3377; T a3378; T a3379; + T a3380; T a3381; T a3382; T a3383; T a3384; T a3385; T a3386; T a3387; T a3388; T a3389; + T a3390; T a3391; T a3392; T a3393; T a3394; T a3395; T a3396; T a3397; T a3398; T a3399; + T a3400; T a3401; T a3402; T a3403; T a3404; T a3405; T a3406; T a3407; T a3408; T a3409; + T a3410; T a3411; T a3412; T a3413; T a3414; T a3415; T a3416; T a3417; T a3418; T a3419; + T a3420; T a3421; T a3422; T a3423; T a3424; T a3425; T a3426; T a3427; T a3428; T a3429; + T a3430; T a3431; T a3432; T a3433; T a3434; T a3435; T a3436; T a3437; T a3438; T a3439; + T a3440; T a3441; T a3442; T a3443; T a3444; T a3445; T a3446; T a3447; T a3448; T a3449; + T a3450; T a3451; T a3452; T a3453; T a3454; T a3455; T a3456; T a3457; T a3458; T a3459; + T a3460; T a3461; T a3462; T a3463; T a3464; T a3465; T a3466; T a3467; T a3468; T a3469; + T a3470; T a3471; T a3472; T a3473; T a3474; T a3475; T a3476; T a3477; T a3478; T a3479; + T a3480; T a3481; T a3482; T a3483; T a3484; T a3485; T a3486; T a3487; T a3488; T a3489; + T a3490; T a3491; T a3492; T a3493; T a3494; T a3495; T a3496; T a3497; T a3498; T a3499; + T a3500; T a3501; T a3502; T a3503; T a3504; T a3505; T a3506; T a3507; T a3508; T a3509; + T a3510; T a3511; T a3512; T a3513; T a3514; T a3515; T a3516; T a3517; T a3518; T a3519; + T a3520; T a3521; T a3522; T a3523; T a3524; T a3525; T a3526; T a3527; T a3528; T a3529; + T a3530; T a3531; T a3532; T a3533; T a3534; T a3535; T a3536; T a3537; T a3538; T a3539; + T a3540; T a3541; T a3542; T a3543; T a3544; T a3545; T a3546; T a3547; T a3548; T a3549; + T a3550; T a3551; T a3552; T a3553; T a3554; T a3555; T a3556; T a3557; T a3558; T a3559; + T a3560; T a3561; T a3562; T a3563; T a3564; T a3565; T a3566; T a3567; T a3568; T a3569; + T a3570; T a3571; T a3572; T a3573; T a3574; T a3575; T a3576; T a3577; T a3578; T a3579; + T a3580; T a3581; T a3582; T a3583; T a3584; T a3585; T a3586; T a3587; T a3588; T a3589; + T a3590; T a3591; T a3592; T a3593; T a3594; T a3595; T a3596; T a3597; T a3598; T a3599; + T a3600; T a3601; T a3602; T a3603; T a3604; T a3605; T a3606; T a3607; T a3608; T a3609; + T a3610; T a3611; T a3612; T a3613; T a3614; T a3615; T a3616; T a3617; T a3618; T a3619; + T a3620; T a3621; T a3622; T a3623; T a3624; T a3625; T a3626; T a3627; T a3628; T a3629; + T a3630; T a3631; T a3632; T a3633; T a3634; T a3635; T a3636; T a3637; T a3638; T a3639; + T a3640; T a3641; T a3642; T a3643; T a3644; T a3645; T a3646; T a3647; T a3648; T a3649; + T a3650; T a3651; T a3652; T a3653; T a3654; T a3655; T a3656; T a3657; T a3658; T a3659; + T a3660; T a3661; T a3662; T a3663; T a3664; T a3665; T a3666; T a3667; T a3668; T a3669; + T a3670; T a3671; T a3672; T a3673; T a3674; T a3675; T a3676; T a3677; T a3678; T a3679; + T a3680; T a3681; T a3682; T a3683; T a3684; T a3685; T a3686; T a3687; T a3688; T a3689; + T a3690; T a3691; T a3692; T a3693; T a3694; T a3695; T a3696; T a3697; T a3698; T a3699; + T a3700; T a3701; T a3702; T a3703; T a3704; T a3705; T a3706; T a3707; T a3708; T a3709; + T a3710; T a3711; T a3712; T a3713; T a3714; T a3715; T a3716; T a3717; T a3718; T a3719; + T a3720; T a3721; T a3722; T a3723; T a3724; T a3725; T a3726; T a3727; T a3728; T a3729; + T a3730; T a3731; T a3732; T a3733; T a3734; T a3735; T a3736; T a3737; T a3738; T a3739; + T a3740; T a3741; T a3742; T a3743; T a3744; T a3745; T a3746; T a3747; T a3748; T a3749; + T a3750; T a3751; T a3752; T a3753; T a3754; T a3755; T a3756; T a3757; T a3758; T a3759; + T a3760; T a3761; T a3762; T a3763; T a3764; T a3765; T a3766; T a3767; T a3768; T a3769; + T a3770; T a3771; T a3772; T a3773; T a3774; T a3775; T a3776; T a3777; T a3778; T a3779; + T a3780; T a3781; T a3782; T a3783; T a3784; T a3785; T a3786; T a3787; T a3788; T a3789; + T a3790; T a3791; T a3792; T a3793; T a3794; T a3795; T a3796; T a3797; T a3798; T a3799; + T a3800; T a3801; T a3802; T a3803; T a3804; T a3805; T a3806; T a3807; T a3808; T a3809; + T a3810; T a3811; T a3812; T a3813; T a3814; T a3815; T a3816; T a3817; T a3818; T a3819; + T a3820; T a3821; T a3822; T a3823; T a3824; T a3825; T a3826; T a3827; T a3828; T a3829; + T a3830; T a3831; T a3832; T a3833; T a3834; T a3835; T a3836; T a3837; T a3838; T a3839; + T a3840; T a3841; T a3842; T a3843; T a3844; T a3845; T a3846; T a3847; T a3848; T a3849; + T a3850; T a3851; T a3852; T a3853; T a3854; T a3855; T a3856; T a3857; T a3858; T a3859; + T a3860; T a3861; T a3862; T a3863; T a3864; T a3865; T a3866; T a3867; T a3868; T a3869; + T a3870; T a3871; T a3872; T a3873; T a3874; T a3875; T a3876; T a3877; T a3878; T a3879; + T a3880; T a3881; T a3882; T a3883; T a3884; T a3885; T a3886; T a3887; T a3888; T a3889; + T a3890; T a3891; T a3892; T a3893; T a3894; T a3895; T a3896; T a3897; T a3898; T a3899; + T a3900; T a3901; T a3902; T a3903; T a3904; T a3905; T a3906; T a3907; T a3908; T a3909; + T a3910; T a3911; T a3912; T a3913; T a3914; T a3915; T a3916; T a3917; T a3918; T a3919; + T a3920; T a3921; T a3922; T a3923; T a3924; T a3925; T a3926; T a3927; T a3928; T a3929; + T a3930; T a3931; T a3932; T a3933; T a3934; T a3935; T a3936; T a3937; T a3938; T a3939; + T a3940; T a3941; T a3942; T a3943; T a3944; T a3945; T a3946; T a3947; T a3948; T a3949; + T a3950; T a3951; T a3952; T a3953; T a3954; T a3955; T a3956; T a3957; T a3958; T a3959; + T a3960; T a3961; T a3962; T a3963; T a3964; T a3965; T a3966; T a3967; T a3968; T a3969; + T a3970; T a3971; T a3972; T a3973; T a3974; T a3975; T a3976; T a3977; T a3978; T a3979; + T a3980; T a3981; T a3982; T a3983; T a3984; T a3985; T a3986; T a3987; T a3988; T a3989; + T a3990; T a3991; T a3992; T a3993; T a3994; T a3995; T a3996; T a3997; T a3998; T a3999; +}; + +A::A() {} diff --git a/gcc/testsuite/g++.dg/eh/cleanup2.C b/gcc/testsuite/g++.dg/eh/cleanup2.C new file mode 100644 index 000000000..9c9c5ad2c --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/cleanup2.C @@ -0,0 +1,46 @@ +// PR c++/12491 +// { dg-do compile } +// { dg-options "-O2" } + +// The return statements are necessary to trigger this bug. + +class Object +{ +public: + virtual ~Object (void) { return; } +}; + +class AutoPtr +{ +public: + ~AutoPtr (void) { delete m_rep; return; } +private: + const Object *m_rep; +}; + +class Handle +{ +public: + ~Handle (void) { return; } +private: + AutoPtr m_rep; +}; + +class HandleOf:public Handle +{ +public: + ~HandleOf (void) { return; } +}; + +class Error +{ +public: + ~Error (void); +private: + HandleOf m_hndl; +}; + +Error::~Error (void) +{ + return; +} diff --git a/gcc/testsuite/g++.dg/eh/cleanup3.C b/gcc/testsuite/g++.dg/eh/cleanup3.C new file mode 100644 index 000000000..79935dede --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/cleanup3.C @@ -0,0 +1,20 @@ +// C++/4794 +// This test used to hang in has_cleanups +// Contributed by: <fritz@intrinsity.com> +/* { dg-do compile } */ + +void foo (int a,int b,int c,int d,int e,int f,int g,int h,int i,int j,int k, + int l,int m,int n,int o,int p,int q,int r,int s,int t,int u,int v,int w, + int x,int y,int z,int aa,int ab,int ac) +{ +if (!((((ac != 0) + (d != 0) + (c != 0) + (f != 0) + (x != 0) + (y != 0) + + (z != 0) + (aa != 0) + (ab != 0) + (g != 0) + (b != 0) + (a != 0) + + (h != 0) + (e != 0) + (p != 0) + (q != 0) + (n != 0) + (r != 0) + + (o != 0) + (v != 0) + (w != 0) + (t != 0) + (u != 0) + (s != 0) + + (k != 0) + (l != 0) + (m != 0) + (i != 0) + (j != 0)) <= 1))) + { + return; + } +} + + diff --git a/gcc/testsuite/g++.dg/eh/cleanup4.C b/gcc/testsuite/g++.dg/eh/cleanup4.C new file mode 100644 index 000000000..ba2d891c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/cleanup4.C @@ -0,0 +1,17 @@ +// PR 16254 +// { dg-do compile } +// We lost a CLEANUP_POINT_EXPR, leading to a crash destroying temp of A. + +struct A +{ + ~A (); + A (int); +}; + +int bar (const A &); + +void +foo (int i) +{ + int format[1] = { bar (A (i)) }; +} diff --git a/gcc/testsuite/g++.dg/eh/cleanup5.C b/gcc/testsuite/g++.dg/eh/cleanup5.C new file mode 100644 index 000000000..e74d06793 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/cleanup5.C @@ -0,0 +1,17 @@ +// PR 17907 +// { dg-do compile } +// { dg-options "" } +// We lost a CLEANUP_POINT_EXPR, leading to a crash destroying temp of A. + + +struct String { + ~String(); + int size() const; +}; +struct CodingSystem { + String convertOut() const; +}; +void inputOpened(CodingSystem *outputCodingSystem) +{ + char filePath[outputCodingSystem->convertOut().size()]; +} diff --git a/gcc/testsuite/g++.dg/eh/comdat1.C b/gcc/testsuite/g++.dg/eh/comdat1.C new file mode 100644 index 000000000..4a1180511 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/comdat1.C @@ -0,0 +1,42 @@ +// PR target/29487 +// { dg-do link } +// { dg-options "-O2" } + +/* This function is not defined. The compiler should optimize away + all calls to it. */ +extern void undefined () throw (); + +extern void f1(); + +inline void f2() { + f1(); +} + +/* This function will be COMDAT if not inlined. */ +inline void f1() {} + +/* This function will be COMDAT. */ +template <typename T> +void f3() { + if (false) + throw 3; +} + +inline void f4() { + if (false) + throw 7; +} + +int main () { + try { + f1(); + f2(); + f3<int>(); + f4(); + } catch (...) { + /* The compiler should recognize that none of the functions above + can throw exceptions, and therefore remove this code as + unreachable. */ + undefined (); + } +} diff --git a/gcc/testsuite/g++.dg/eh/cond1.C b/gcc/testsuite/g++.dg/eh/cond1.C new file mode 100644 index 000000000..4f494267e --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/cond1.C @@ -0,0 +1,64 @@ +// PR c++/7050 +// { dg-do run } + +extern "C" void abort(void); + +#define CI(stmt) try { stmt; abort(); } catch (int) { } + +struct has_destructor +{ + ~has_destructor() { } +}; + +struct no_destructor +{ +}; + +int PI(int& i) { return i++; } + +int main(int argc, char *argv[]) +{ + (argc+1 ? has_destructor() : throw 0); + CI((argc+1 ? throw 0 : has_destructor())); + CI((0 ? has_destructor() : throw 0)); + CI((1 ? throw 0 : has_destructor())); + (0 ? throw 0 : has_destructor()); + (1 ? has_destructor() : throw 0); + + (argc+1 ? no_destructor() : throw 0); + CI((argc+1 ? throw 0 : no_destructor())); + CI((0 ? no_destructor() : throw 0)); + CI((1 ? throw 0 : no_destructor())); + (0 ? throw 0 : no_destructor()); + (1 ? no_destructor() : throw 0); + + int i = 1; + CI(throw PI(i)); + if (i != 2) abort(); + + (1 ? 0 : throw PI(i)); + if (i != 2) abort(); + + CI(0 ? 0 : throw PI(i)); + if (i != 3) abort(); + + CI(0 ? has_destructor() : throw PI(i)); + if (i != 4) abort(); + (argc+1 ? has_destructor() : throw PI(i)); + if (i != 4) abort(); + + i = 1; + CI(throw i++); + if (i != 2) abort(); + + (1 ? 0 : throw i++); + if (i != 2) abort(); + + CI(0 ? 0 : throw i++); + if (i != 3) abort(); + + CI(0 ? has_destructor() : throw i++); + if (i != 4) abort(); + (argc+1 ? has_destructor() : throw i++); + if (i != 4) abort(); +} diff --git a/gcc/testsuite/g++.dg/eh/cond2.C b/gcc/testsuite/g++.dg/eh/cond2.C new file mode 100644 index 000000000..e4b45f7a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/cond2.C @@ -0,0 +1,19 @@ +// PR c++/14083 + +struct A { + A() throw() { } + A(const A&) throw() { } +}; + +struct X { + A a; + X(); + X& operator=(const X& __str); +}; + +bool operator==(const X& __lhs, const char* __rhs); + +int main() { + X x; + x=="" ? x : throw 1; +} diff --git a/gcc/testsuite/g++.dg/eh/cond3.C b/gcc/testsuite/g++.dg/eh/cond3.C new file mode 100644 index 000000000..0af4ecdad --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/cond3.C @@ -0,0 +1,10 @@ +// PR c++/24996 +// Bug: the cleanup for the A temporary was confusing the gimplifier +// because of the TRY_CATCH_EXPR for the exception object. + +struct A { A(int); ~A(); }; +struct B { B(A); ~B(); }; +void foo(bool b) +{ + throw b ? B(1) : B(1); +} diff --git a/gcc/testsuite/g++.dg/eh/cond4.C b/gcc/testsuite/g++.dg/eh/cond4.C new file mode 100644 index 000000000..a8d1cfbf3 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/cond4.C @@ -0,0 +1,32 @@ +// Runtime version of cond3.C. We call terminate when the A cleanup throws +// because we've already initialized the exception object. +// { dg-do run } + +#include <exception> +#include <cstdlib> + +void my_terminate () +{ + std::exit (0); +} + +struct A { + A(int) { } + ~A() { throw 1; }; +}; +struct B { + B(A) { } + ~B() { } +}; +bool b; + +int main() +{ + std::set_terminate (my_terminate); + try + { + throw b ? B(1) : B(1); + } + catch (...) { } + return 1; +} diff --git a/gcc/testsuite/g++.dg/eh/cond5.C b/gcc/testsuite/g++.dg/eh/cond5.C new file mode 100644 index 000000000..3f0c59964 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/cond5.C @@ -0,0 +1,43 @@ +// PR c++/49165 +// { dg-do run } + +extern "C" void abort (); + +int +foo (bool x, int y) +{ + if (y < 10 && (x ? true : throw 1)) + y++; + if (y > 20 || (x ? true : throw 2)) + y++; + return y; +} + +int +main () +{ + if (foo (true, 0) != 2 + || foo (true, 10) != 11 + || foo (false, 30) != 31) + abort (); + try + { + foo (false, 0); + abort (); + } + catch (int i) + { + if (i != 1) + abort (); + } + try + { + foo (false, 10); + abort (); + } + catch (int i) + { + if (i != 2) + abort (); + } +} diff --git a/gcc/testsuite/g++.dg/eh/cond6.C b/gcc/testsuite/g++.dg/eh/cond6.C new file mode 100644 index 000000000..1eed63ec8 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/cond6.C @@ -0,0 +1,43 @@ +// PR c++/49165 +// { dg-do run } + +extern "C" void abort (); + +int +foo (bool x, int y) +{ + if (y < 10 && (x ? 1 : throw 1)) + y++; + if (y > 20 || (x ? 1 : throw 2)) + y++; + return y; +} + +int +main () +{ + if (foo (true, 0) != 2 + || foo (true, 10) != 11 + || foo (false, 30) != 31) + abort (); + try + { + foo (false, 0); + abort (); + } + catch (int i) + { + if (i != 1) + abort (); + } + try + { + foo (false, 10); + abort (); + } + catch (int i) + { + if (i != 2) + abort (); + } +} diff --git a/gcc/testsuite/g++.dg/eh/crash1.C b/gcc/testsuite/g++.dg/eh/crash1.C new file mode 100644 index 000000000..4cbcbd3ec --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/crash1.C @@ -0,0 +1,5 @@ +extern "C" void __cxa_throw (void *, void *, void (*) (void *) ); + +void foo(){ + throw 1; +} diff --git a/gcc/testsuite/g++.dg/eh/crossjump1.C b/gcc/testsuite/g++.dg/eh/crossjump1.C new file mode 100644 index 000000000..ccb0ffb21 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/crossjump1.C @@ -0,0 +1,31 @@ +// This testcase failed on s390, because cross-jumping merged 2 calls, +// one with REG_EH_REGION note with no handlers (ie. termination) +// and one without REG_EH_REGION note. +// { dg-do run } +// { dg-options "-O2" } + +#include <exception> +#include <string> + +struct E : public std::exception +{ + std::string m; + E () : m ("test") { } + ~E () throw() { } +}; + +struct C : public E { }; + +void foo () +{ + throw C (); +} + +int main () +{ + try + { + foo (); + } + catch (...) { } +} diff --git a/gcc/testsuite/g++.dg/eh/ctor1.C b/gcc/testsuite/g++.dg/eh/ctor1.C new file mode 100644 index 000000000..43b735f0b --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/ctor1.C @@ -0,0 +1,42 @@ +// { dg-do run } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Dec 2001 <nathan@nathan@codesourcery.com> + +// PR 411 + +bool was_f_in_Bar_destroyed=false; + +struct Foo +{ + ~Foo() + { + was_f_in_Bar_destroyed=true; + } +}; + +struct Bar +{ + ~Bar() + { + throw 1; + } + + Foo f; +}; + +int main() +{ + try + { + Bar f; + } + catch(int i) + { + if(was_f_in_Bar_destroyed) + { + return 0; + } + } + return 1; +} diff --git a/gcc/testsuite/g++.dg/eh/ctor2.C b/gcc/testsuite/g++.dg/eh/ctor2.C new file mode 100644 index 000000000..e2ebad7ce --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/ctor2.C @@ -0,0 +1,42 @@ +// PR c++/4460 +// Test that the cleanup for fully-constructed subobjects when a +// constructor throws gets the right address for a virtual base. + +// { dg-do run } + +int r; +void *p; + +struct VBase +{ + virtual void f () {} + VBase() { p = this; } + ~VBase() { if (p != this) r = 1; } +}; + +struct StreamBase +{ + virtual ~StreamBase() {} +}; + +struct Stream : public virtual VBase, public StreamBase +{ + Stream() {} + virtual ~Stream() {} +}; + +struct DerivedStream : public Stream +{ + DerivedStream() { throw 1; } +}; + +int main() { + + try + { + DerivedStream str; + } + catch (...) { } + + return r; +} diff --git a/gcc/testsuite/g++.dg/eh/ctor3.C b/gcc/testsuite/g++.dg/eh/ctor3.C new file mode 100644 index 000000000..378c07edf --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/ctor3.C @@ -0,0 +1,18 @@ +// PR C++/18984 +// We just to ICE as we did not add a +// deference to invisible by reference +// variable + +// { dg-do compile } + + +struct Str +{ + Str(const char *chars); + Str& operator=(const char *chars); + virtual operator char*() const; +}; +Str _localName(Str fullname) +{ + return (char*)fullname; +} diff --git a/gcc/testsuite/g++.dg/eh/dead1.C b/gcc/testsuite/g++.dg/eh/dead1.C new file mode 100644 index 000000000..88ae92264 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/dead1.C @@ -0,0 +1,20 @@ +// PR 6320 +// Rechained the MUST_NOT_THROW region in the wrong order wrt the +// TRY/CATCH while removing them and got confused. +// { dg-do compile } + +struct S { + ~S(); +}; + +void foo() +{ + try { + return; + } + catch (int) { + } + catch (...) { + S s; + } +} diff --git a/gcc/testsuite/g++.dg/eh/defarg1.C b/gcc/testsuite/g++.dg/eh/defarg1.C new file mode 100644 index 000000000..5c6e4df49 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/defarg1.C @@ -0,0 +1,10 @@ +// PR c++/50424 +// { dg-do run } + +int f() { throw 1; } +void g( int = f() ) { } +void h() { g(); } +int main() +{ + try { h(); } catch (int) { } +} diff --git a/gcc/testsuite/g++.dg/eh/delayslot1.C b/gcc/testsuite/g++.dg/eh/delayslot1.C new file mode 100644 index 000000000..ddc960e6d --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/delayslot1.C @@ -0,0 +1,47 @@ +// PR target/12301 +// Origin: Colin Hirsch <gcc@cohi.at> +// Testcase by Christian Ehrhardt <ehrhardt@mathematik.uni-ulm.de> + +// This used to fail on SPARC because the reorg pass moved an insn +// across a function call that can throw internally, in order to put +// it in a delay slot. + +// { dg-do run } +// { dg-options "-O" } + +struct S{ + char *c; + char data[100]; + S () : c (data) {}; + S (const S& s) { + c = data; + data[0] = s.c[0]; + } +}; + +S real_cast () +{ + throw 3; +} + +S cast_helper(S& debug) +{ + try { + return real_cast(); + } + catch (int e) { + throw debug; + } +} + +int main() +{ + S tmp; + + try { + cast_helper (tmp); + } + catch (S& e) {} + + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/div.C b/gcc/testsuite/g++.dg/eh/div.C new file mode 100644 index 000000000..14d7536ce --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/div.C @@ -0,0 +1,13 @@ +// { dg-do link } +// { dg-options "-Os" } +/* PR target/28014: main references unsigned divide, and the unwinder + references signed divide. + If libgcc contains an object which defines both, and linking is done with + a space-optimized library that defines these functions in separate objects, + you end up with the function for unsigned divide defined twice. */ +int +main (int c, char **argv) + +{ + return 0xffffU/c; +} diff --git a/gcc/testsuite/g++.dg/eh/dtor1.C b/gcc/testsuite/g++.dg/eh/dtor1.C new file mode 100644 index 000000000..4fafdde24 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/dtor1.C @@ -0,0 +1,35 @@ +// PR c++/411 + +// Test that a fully-constructed base is destroyed before transferring +// control to the handler of a function-try-block. + +// { dg-do run } + +int ad; +int r; + +struct A { + ~A() { ++ad; } +}; + +struct B: public A { + ~B(); +}; + +B::~B () +try + { + throw 1; + } +catch (...) + { + if (!ad) + r = 1; + return; + } + +int main () +{ + { B b; } + return r; +} diff --git a/gcc/testsuite/g++.dg/eh/dtor2.C b/gcc/testsuite/g++.dg/eh/dtor2.C new file mode 100644 index 000000000..9555b3789 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/dtor2.C @@ -0,0 +1,30 @@ +// PR c++/12751 +// tree-ssa eh lowering bug ran a destructor twice for one object +// { dg-do run } + +static int check; + +struct Y { + Y(); + ~Y(); +}; + +void foo() { + Y y1; + Y y2; + switch(0) { + case 1: { + Y y3; + return; + } + } +} + +Y::Y() { ++check; } +Y::~Y() { --check; } + +int main() +{ + foo (); + return check; +} diff --git a/gcc/testsuite/g++.dg/eh/ehopt1.C b/gcc/testsuite/g++.dg/eh/ehopt1.C new file mode 100644 index 000000000..163d76e81 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/ehopt1.C @@ -0,0 +1,44 @@ +// ehopt was only copying one statement from the cleanup of the B temporary +// into the following try block, so we lost its destructor call. + +// { dg-do run } + +template <class T, class U> +class A; + +bool b; +int count; + +template <> +class A<int, int> +{ +public: + A(int) { ++count; if (b) throw 1; } + A(const A&) { ++count; if (b) throw 1; } + ~A() { --count; if (b) throw 1; } +}; + +typedef A<int, int> B; + +template <> +class A<void *, void *> +{ +public: + A() { if (b) throw 1; } + A(const B&) { if (b) throw 1; } + ~A() { if (b) throw 1; } +}; + +typedef A<void *, void *> C; + +void f() { if (b) throw 1; } + +int +main (void) +{ + { + C a(1); + f(); + } + return count; +} diff --git a/gcc/testsuite/g++.dg/eh/elide1.C b/gcc/testsuite/g++.dg/eh/elide1.C new file mode 100644 index 000000000..94d2a6982 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/elide1.C @@ -0,0 +1,30 @@ +// PR c++/13944 + +// Bug: When eliding the copy from the A temporary into the exception +// object, we extended the throw prohibition to the constructor for the +// temporary. This is wrong; the throw from A() should propagate normally +// regardless of the elision of the temporary. + +// { dg-do run } + +struct A +{ + A() { throw 0; } +}; + +int main() +{ + try + { + throw A(); + } + catch(int i) + { + return i; + } + catch (...) + { + return 2; + } + return 3; +} diff --git a/gcc/testsuite/g++.dg/eh/elide2.C b/gcc/testsuite/g++.dg/eh/elide2.C new file mode 100644 index 000000000..7d65d9ee6 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/elide2.C @@ -0,0 +1,31 @@ +// PR c++/13944 + +// Verify that we don't call terminate() if initializing the exception +// object throws. + +// { dg-do run } + +struct A +{ + A() { } + A(const A&) { throw 1; } +}; + +A a; + +int main() +{ + try + { + throw a; + } + catch (int) + { + return 0; + } + catch (A&) + { + return 2; + } + return 3; +} diff --git a/gcc/testsuite/g++.dg/eh/filter1.C b/gcc/testsuite/g++.dg/eh/filter1.C new file mode 100644 index 000000000..6ff0574c2 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/filter1.C @@ -0,0 +1,43 @@ +// Test that cleanups get run when a catch filter fails to match. +// { dg-do run } + +extern "C" void exit(int); +extern "C" void abort(); + +struct a +{ + a(); + ~a(); +}; + +struct e1 {}; +struct e2 {}; + +void +ex_test () +{ + a aa; + try + { + throw e1 (); + } + catch (e2 &) + { + } +} + +int +main () +{ + try + { + ex_test (); + } + catch (...) + { + } + abort (); +} + +a::a() { } +a::~a() { exit (0); } diff --git a/gcc/testsuite/g++.dg/eh/filter2.C b/gcc/testsuite/g++.dg/eh/filter2.C new file mode 100644 index 000000000..fe87cc9a3 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/filter2.C @@ -0,0 +1,59 @@ +// Test that terminate gets run when a catch filter fails to match while +// running destructors. Original bug depended on a::~a being inlined. +// { dg-do run } +// { dg-options -O } + +#include <exception> +#include <cstdlib> + +struct e1 {}; +struct e2 {}; + +struct a +{ + a () { } + + ~a () + { + try + { + throw e1(); + } + catch (e2 &) + { + } + } +}; + +void +ex_test () +{ + a aa; + try + { + throw e1 (); + } + catch (e2 &) + { + } +} + +void my_terminate () +{ + std::exit (0); +} + +int +main () +{ + std::set_terminate (my_terminate); + + try + { + ex_test (); + } + catch (...) + { + } + abort (); +} diff --git a/gcc/testsuite/g++.dg/eh/forced1.C b/gcc/testsuite/g++.dg/eh/forced1.C new file mode 100644 index 000000000..b0200813e --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/forced1.C @@ -0,0 +1,82 @@ +// HP-UX libunwind.so doesn't provide _UA_END_OF_STACK. +// { dg-do run { xfail "ia64-hp-hpux11.*" } } + +// Test that forced unwinding runs all cleanups. Also tests that +// rethrowing doesn't call the exception object destructor. + +#include <unwind.h> +#include <stdlib.h> +#include <string.h> + +static int test = 0; + +static _Unwind_Reason_Code +force_unwind_stop (int version, _Unwind_Action actions, + _Unwind_Exception_Class exc_class, + struct _Unwind_Exception *exc_obj, + struct _Unwind_Context *context, + void *stop_parameter) +{ + if (actions & _UA_END_OF_STACK) + { + if (test != 15) + abort (); + exit (0); + } + + return _URC_NO_REASON; +} + +static void +force_unwind_cleanup (_Unwind_Reason_Code, struct _Unwind_Exception *) +{ + abort (); +} + +static void force_unwind () +{ + _Unwind_Exception *exc = new _Unwind_Exception; + // exception_class might not be a scalar. + memset (&exc->exception_class, 0, sizeof (exc->exception_class)); + exc->exception_cleanup = force_unwind_cleanup; + +#ifndef __USING_SJLJ_EXCEPTIONS__ + _Unwind_ForcedUnwind (exc, force_unwind_stop, 0); +#else + _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0); +#endif + + abort (); +} + +struct S +{ + int bit; + S(int b) : bit(b) { } + ~S() { test |= bit; } +}; + +static __attribute__ ((noinline)) void doit () +{ + try { + S four(4); + + try { + S one(1); + force_unwind (); + } catch(...) { + test |= 2; + throw; + } + + } catch(...) { + test |= 8; + throw; + } +} + +int main() +{ + doit (); + abort (); +} diff --git a/gcc/testsuite/g++.dg/eh/forced2.C b/gcc/testsuite/g++.dg/eh/forced2.C new file mode 100644 index 000000000..54586a006 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/forced2.C @@ -0,0 +1,53 @@ +// HP-UX libunwind.so doesn't provide _UA_END_OF_STACK. +// { dg-do run { xfail "ia64-hp-hpux11.*" } } + +// Test that leaving the catch block without rethrowing +// does call the exception object destructor. + +#include <unwind.h> +#include <stdlib.h> +#include <string.h> + +static _Unwind_Reason_Code +force_unwind_stop (int version, _Unwind_Action actions, + _Unwind_Exception_Class exc_class, + struct _Unwind_Exception *exc_obj, + struct _Unwind_Context *context, + void *stop_parameter) +{ + if (actions & _UA_END_OF_STACK) + abort (); + return _URC_NO_REASON; +} + +static void +force_unwind_cleanup (_Unwind_Reason_Code, struct _Unwind_Exception *) +{ + exit (0); +} + +static void +force_unwind () +{ + _Unwind_Exception *exc = new _Unwind_Exception; + // exception_class might not be a scalar. + memset (&exc->exception_class, 0, sizeof (exc->exception_class)); + exc->exception_cleanup = force_unwind_cleanup; + +#ifndef __USING_SJLJ_EXCEPTIONS__ + _Unwind_ForcedUnwind (exc, force_unwind_stop, 0); +#else + _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0); +#endif + + abort (); +} + +int main() +{ + try { + force_unwind (); + } catch (...) { + } + abort (); +} diff --git a/gcc/testsuite/g++.dg/eh/forced3.C b/gcc/testsuite/g++.dg/eh/forced3.C new file mode 100644 index 000000000..b8f47df4a --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/forced3.C @@ -0,0 +1,58 @@ +// HP-UX libunwind.so doesn't provide _UA_END_OF_STACK. +// { dg-do run { xfail "ia64-hp-hpux11.*" } } + +// Test that forced unwinding calls std::unexpected going +// through a nothrow function. + +#include <unwind.h> +#include <stdlib.h> +#include <exception> +#include <string.h> + +static _Unwind_Reason_Code +force_unwind_stop (int version, _Unwind_Action actions, + _Unwind_Exception_Class exc_class, + struct _Unwind_Exception *exc_obj, + struct _Unwind_Context *context, + void *stop_parameter) +{ + if (actions & _UA_END_OF_STACK) + abort (); + return _URC_NO_REASON; +} + +static void __attribute__((noreturn)) +force_unwind () +{ + _Unwind_Exception *exc = new _Unwind_Exception; + // exception_class might not be a scalar. + memset (&exc->exception_class, 0, sizeof (exc->exception_class)); + exc->exception_cleanup = 0; + +#ifndef __USING_SJLJ_EXCEPTIONS__ + _Unwind_ForcedUnwind (exc, force_unwind_stop, 0); +#else + _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0); +#endif + + abort (); +} + +static void +handle_unexpected () +{ + exit (0); +} + +static void +doit () throw() +{ + force_unwind (); +} + +int main() +{ + std::set_unexpected (handle_unexpected); + doit (); + abort (); +} diff --git a/gcc/testsuite/g++.dg/eh/forced4.C b/gcc/testsuite/g++.dg/eh/forced4.C new file mode 100644 index 000000000..17fd94a40 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/forced4.C @@ -0,0 +1,52 @@ +// HP-UX libunwind.so doesn't provide _UA_END_OF_STACK. +// { dg-do run { xfail "ia64-hp-hpux11.*" } } + +// Test that forced unwinding does not call std::unexpected going +// throw a function with a non-empty exception spec. + +#include <unwind.h> +#include <stdlib.h> +#include <string.h> + +static _Unwind_Reason_Code +force_unwind_stop (int version, _Unwind_Action actions, + _Unwind_Exception_Class exc_class, + struct _Unwind_Exception *exc_obj, + struct _Unwind_Context *context, + void *stop_parameter) +{ + if (actions & _UA_END_OF_STACK) + abort (); + return _URC_NO_REASON; +} + +static void __attribute__((noreturn)) +force_unwind () +{ + _Unwind_Exception *exc = new _Unwind_Exception; + // exception_class might not be a scalar. + memset (&exc->exception_class, 0, sizeof (exc->exception_class)); + exc->exception_cleanup = 0; + +#ifndef __USING_SJLJ_EXCEPTIONS__ + _Unwind_ForcedUnwind (exc, force_unwind_stop, 0); +#else + _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0); +#endif + + abort (); +} + +static void +doit () throw(int) +{ + force_unwind (); +} + +int main() +{ + try { + doit (); + } catch (...) { + } +} diff --git a/gcc/testsuite/g++.dg/eh/fp-regs.C b/gcc/testsuite/g++.dg/eh/fp-regs.C new file mode 100644 index 000000000..b91c0f9a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/fp-regs.C @@ -0,0 +1,94 @@ +// PR 20670: f29 corrupted when unwind stack. This tries to test that FP +// registers are properly saved and restored by defining 20 different FP +// local variables. +// { dg-do run } +// { dg-options "-O" } +#include <stdlib.h> + +double zero = 0.0; +double another_zero = 0.0; + +int +sub (void) +{ + throw (0); +} + +int +main (void) +{ + double a, b, c, d, e, f, g, h, i, j; + double a1, b1, c1, d1, e1, f1, g1, h1, i1, j1; + + a = zero; + b = a + 1; + c = b + 1; + d = c + 1; + e = d + 1; + f = e + 1; + g = f + 1; + h = g + 1; + i = h + 1; + j = i + 1; + + a1 = another_zero; + b1 = a1 + 1; + c1 = b1 + 1; + d1 = c1 + 1; + e1 = d1 + 1; + f1 = e1 + 1; + g1 = f1 + 1; + h1 = g1 + 1; + i1 = h1 + 1; + j1 = i1 + 1; + + try + { + sub (); + } + catch (...) + { + if (a != 0.0) + abort (); + if (b != 1.0) + abort (); + if (c != 2.0) + abort (); + if (d != 3.0) + abort (); + if (e != 4.0) + abort (); + if (f != 5.0) + abort (); + if (g != 6.0) + abort (); + if (h != 7.0) + abort (); + if (i != 8.0) + abort (); + if (j != 9.0) + abort (); + + if (a1 != 0.0) + abort (); + if (b1 != 1.0) + abort (); + if (c1 != 2.0) + abort (); + if (d1 != 3.0) + abort (); + if (e1 != 4.0) + abort (); + if (f1 != 5.0) + abort (); + if (g1 != 6.0) + abort (); + if (h1 != 7.0) + abort (); + if (i1 != 8.0) + abort (); + if (j1 != 9.0) + abort (); + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/gcsec1.C b/gcc/testsuite/g++.dg/eh/gcsec1.C new file mode 100644 index 000000000..5dfe02a6b --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/gcsec1.C @@ -0,0 +1,45 @@ +/* PR other/29639 */ +/* AIX gld supports garbage collection. But AIX gcc does not support + -ffunction-sections or -fdata-sections. */ +/* { dg-do run { xfail rs6000-*-aix* powerpc*-*-aix* } } */ +/* { dg-require-gc-sections "" } */ +/* { dg-options "-ffunction-sections -Wl,--gc-sections" } */ + +extern "C" void abort (void); + +int g = 0; + +void raise_exception() +{ + throw 1; +} + +void used() +{ + try { + raise_exception (); + } + catch (int) { + g = 1; + } +} + +void unused() +{ + try { + raise_exception (); + } + catch (int) { + g = 1; + } +} + +int main() +{ + used (); + + if (g != 1) + abort (); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/goto1.C b/gcc/testsuite/g++.dg/eh/goto1.C new file mode 100644 index 000000000..f3e3e4216 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/goto1.C @@ -0,0 +1,34 @@ +extern "C" void abort (); + +static int count; + +struct S { + S() { ++count; } + ~S() { --count; } +}; + +int foo(int p) +{ + S s1; + { + S s2; + if (p) + goto L; + else + return 1; + } + foo (p); + L: + return 0; +} + +int main() +{ + foo(0); + if (count != 0) + abort (); + foo(1); + if (count != 0) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/ia64-1.C b/gcc/testsuite/g++.dg/eh/ia64-1.C new file mode 100644 index 000000000..17ef7f8b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/ia64-1.C @@ -0,0 +1,59 @@ +// Test whether call saved float and branch regs are restored properly +// We can't do this test for branch regs in ILP32 mode. +// { dg-do run { target ia64-*-* } } +// { dg-options "-O2" } + +extern "C" void abort (void); + +#ifdef __LP64__ +char buf[128]; +#endif + +void __attribute__((noinline)) +bar (void) +{ + throw 1; +} + +void __attribute__((noinline)) +foo (void) +{ + bar (); + bar (); +} + +int +main (void) +{ + register double f2 __asm ("f2"); + register double f3 __asm ("f3"); + register double f4 __asm ("f4"); + register double f5 __asm ("f5"); + register double f16 __asm ("f16"); + register double f17 __asm ("f17"); +#ifdef __LP64__ + register void *b1 __asm ("b1"); + register void *b2 __asm ("b2"); + register void *b3 __asm ("b3"); + register void *b4 __asm ("b4"); + register void *b5 __asm ("b5"); +#endif + f2 = 12.0; f3 = 13.0; f4 = 14.0; f5 = 15.0; f16 = 16.0; f17 = 17.0; +#ifdef __LP64__ + b1 = &buf[1]; b2 = &buf[2]; b3 = &buf[3]; b4 = &buf[4]; b5 = &buf[5]; +#endif + try + { + foo (); + } + catch (...) {} + if (f2 != 12.0 || f3 != 13.0 || f4 != 14.0 + || f5 != 15.0 || f16 != 16.0 || f17 != 17.0) + abort (); +#ifdef __LP64__ + if (b1 != &buf[1] || b2 != &buf[2] || b3 != &buf[3] + || b4 != &buf[4] || b5 != &buf[5]) + abort (); +#endif + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/ia64-2.C b/gcc/testsuite/g++.dg/eh/ia64-2.C new file mode 100644 index 000000000..aa005d8ed --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/ia64-2.C @@ -0,0 +1,58 @@ +// PR target/30230 +// This testcase failed on IA-64, where end of an EH region ended +// in the middle of a bundle (with br.call insn in first or second +// slot of .bbb/.mbb bundles and EH region end right after it). +// But br.call returns to the start of the next bundlem so during +// unwinding the call was considered to be outside of the EH region +// while it should have been inside. +// { dg-do run } +// { dg-require-weak "" } +// { dg-options "-O2" } + +struct A {}; +struct B { virtual ~B(); }; +B::~B () {} +struct C { void foo (short &, B &); }; +struct D { void *d1; C *d2; virtual void virt (void) {} }; +struct E { D *e1; B *e2; }; +struct F { void bar (void *, B &); }; +F *p __attribute__((weak)); +volatile int r; + +void C::foo (short &x, B &) +{ + if (r) + throw A (); + x = 1; +} + +void F::bar (void *, B &) +{ + throw A (); +} + +void baz (E &x) +{ + short g = 0; + B b = *x.e2; + x.e1->d2->foo (g, b); + if (g) + p->bar(x.e1->d1, b); +} + +int main () +{ + F g; + D s; + E h; + p = &g; + h.e1 = &s; + try + { + baz (h); + } + catch (A &) + { + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/init-temp1.C b/gcc/testsuite/g++.dg/eh/init-temp1.C new file mode 100644 index 000000000..529014f49 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/init-temp1.C @@ -0,0 +1,54 @@ +// PR c++/15764 +// { dg-do run } + +extern "C" void abort (); + +int thrown; + +int as; +struct a { + a () { ++as; } + ~a () { --as; if (thrown++ == 0) throw 42; } +}; + +int f (a const&) { return 1; } +int f (a const&, a const&) { return 1; } + +int bs; +int as_sav; +struct b { + b (...) { ++bs; } + ~b () { --bs; as_sav = as; } +}; + +bool p; +void g() +{ + if (p) throw 42; +} + +int main () { + thrown = 0; + try { + b tmp(f (a(), a())); + + g(); + } + catch (...) {} + + // We throw when the first a is destroyed, which should destroy b before + // the other a. + if (as_sav != 1) + abort (); + + thrown = 0; + try { + b tmp(f (a())); + + g(); + } + catch (...) {} + + if (bs != 0) + abort (); +} diff --git a/gcc/testsuite/g++.dg/eh/init-temp2.C b/gcc/testsuite/g++.dg/eh/init-temp2.C new file mode 100644 index 000000000..6a58dda1f --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/init-temp2.C @@ -0,0 +1,31 @@ +// PR c++/34196 +// { dg-options "-O -Wuninitialized" } + +template <class _Tp> class AutoPtr +{ + _Tp* _M_ptr; + +public: + explicit AutoPtr(_Tp* __p = 0) : _M_ptr(__p) {} + + ~AutoPtr() { delete _M_ptr; } +}; + +struct A +{ + A() { } + ~A() { throw 1.0; } +}; + +struct B +{ + virtual ~B(); +}; + +B* f (const A &s) { throw 1; } + +int +main() +{ + AutoPtr<B> wt(f(A())); +} diff --git a/gcc/testsuite/g++.dg/eh/loop1.C b/gcc/testsuite/g++.dg/eh/loop1.C new file mode 100644 index 000000000..b9b230e0f --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/loop1.C @@ -0,0 +1,30 @@ +// Verify that loop optimization takes into account the exception edge +// and does not increment I before the call. +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort(); +static void bar(char *); + +static void foo(unsigned long element_count, char *ptr) +{ + unsigned long i; + try { + for (i = 0; i != element_count; i++, ptr += 8) + bar (ptr); + } + catch (...) { + if (i) + abort (); + } +} + +static void bar(char *) +{ + throw 1; +} + +int main() +{ + foo(2, 0); +} diff --git a/gcc/testsuite/g++.dg/eh/loop2.C b/gcc/testsuite/g++.dg/eh/loop2.C new file mode 100644 index 000000000..1e85fa1af --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/loop2.C @@ -0,0 +1,11 @@ +// Test that breaking out of a handler works. +// { dg-do run } + +int main () +{ + while (1) + { + try { throw 1; } + catch (...) { break; } + } +} diff --git a/gcc/testsuite/g++.dg/eh/nested-try.C b/gcc/testsuite/g++.dg/eh/nested-try.C new file mode 100644 index 000000000..5796f9a28 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/nested-try.C @@ -0,0 +1,25 @@ +// { dg-do compile } +// Nested try statements shadowing each other was crashing in EH edge redirection. +// PR middle-end/40043 +struct A +{ + ~A(); + void foo(); +}; + +void bar() +{ + A a; + + try + { + A b; + + try + { + b.foo(); + } + catch (int) {} + } + catch (int) {} +} diff --git a/gcc/testsuite/g++.dg/eh/new1.C b/gcc/testsuite/g++.dg/eh/new1.C new file mode 100644 index 000000000..0f86fccdc --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/new1.C @@ -0,0 +1,40 @@ +// PR c++/5757 +// Test that when a constructor throws in a new-expression, we pass the +// right pointer to operator delete. + +// { dg-do run } + +#include <new> + +int ret = 1; + +void *ptr; +void * operator new[] (std::size_t s) throw (std::bad_alloc) +{ + ptr = operator new (s); + return ptr; +} + +void operator delete[] (void *p) throw () +{ + if (p == ptr) + ret = 0; + operator delete (p); +} + +struct A +{ + A() { throw 1; } + ~A() {} +}; + +int +main () +{ + try + { + A *p = new A[4]; + } + catch (...) {} + return ret; +} diff --git a/gcc/testsuite/g++.dg/eh/nrv1.C b/gcc/testsuite/g++.dg/eh/nrv1.C new file mode 100644 index 000000000..e2457e87e --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/nrv1.C @@ -0,0 +1,25 @@ +// PR c++/5636 +// Bug: the named return value optimization interfered with EH cleanups. + +int c, d; + +struct A +{ + A() { ++c; } + ~A() { ++d; } +}; + +A f() +{ + A nrv; + throw 42; + return nrv; +} + +int main() +{ + try + { A a = f(); } + catch (...) { } + return (d < c); +} diff --git a/gcc/testsuite/g++.dg/eh/omit-frame-pointer.C b/gcc/testsuite/g++.dg/eh/omit-frame-pointer.C new file mode 100644 index 000000000..3792e11fe --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/omit-frame-pointer.C @@ -0,0 +1,25 @@ +// { dg-do run } +// { dg-options -fomit-frame-pointer } + +#include <iostream> + +class Bug +{ +}; + +int throw_bug() +{ + throw Bug(); + + return 0; +} + +int main() +{ + try { + std::cout << throw_bug(); + } catch (Bug bug) { + }; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/omit-frame-pointer2.C b/gcc/testsuite/g++.dg/eh/omit-frame-pointer2.C new file mode 100644 index 000000000..78026b518 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/omit-frame-pointer2.C @@ -0,0 +1,34 @@ +// Reduced from PR c++/5246, PR c++/2447 +// { dg-options "-O -fomit-frame-pointer" } +// { dg-do run } + +void step (int) +{ + void *sp = __builtin_alloca (0); +} + +void f2 (void) +{ + step (2); + throw int(); +} + +void f1 (void) +{ + try + { + step (1); + f2 (); + step (-1); + } + catch (int) + { + step (3); + } +} + +int main () +{ + f1 (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/pr29166.C b/gcc/testsuite/g++.dg/eh/pr29166.C new file mode 100644 index 000000000..432b64e98 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/pr29166.C @@ -0,0 +1,197 @@ +// PR 29166: r4-r7 corrupted when unwinding. +// { dg-do run } + +class Ex +{ +public: + int val; + + Ex( int v ) + : val( v ) + { } + +}; + +void doIt() +{ + int OFF( 1000 ); + register int v1=OFF+1,v2=OFF+2,v3=OFF+3,v4=OFF+4,v5=OFF+5,v6=OFF+6,v7=OFF+7,v8=OFF+8,v9=OFF+9,v10=OFF+10; + register int v11=OFF+11,v12=OFF+12,v13=OFF+13,v14=OFF+14,v15=OFF+15,v16=OFF+16,v17=OFF+17,v18=OFF+18,v19=OFF+19,v20=OFF+20; + register int v21=OFF+21,v22=OFF+22,v23=OFF+23,v24=OFF+24,v25=OFF+25,v26=OFF+26,v27=OFF+27,v28=OFF+28,v29=OFF+29,v30=OFF+30; + register int v31=OFF+31,v32=OFF+32,v33=OFF+33,v34=OFF+34,v35=OFF+35,v36=OFF+36,v37=OFF+37,v38=OFF+38,v39=OFF+39,v40=OFF+40; + register int v41=OFF+41,v42=OFF+42,v43=OFF+43,v44=OFF+44,v45=OFF+45,v46=OFF+46,v47=OFF+47,v48=OFF+48,v49=OFF+49,v50=OFF+50; + register int v51=OFF+51,v52=OFF+52,v53=OFF+53,v54=OFF+54,v55=OFF+55,v56=OFF+56,v57=OFF+57,v58=OFF+58,v59=OFF+59,v60=OFF+60; + register int v61=OFF+61,v62=OFF+62,v63=OFF+63,v64=OFF+64,v65=OFF+65,v66=OFF+66,v67=OFF+67,v68=OFF+68,v69=OFF+69,v70=OFF+70; + register int v71=OFF+71,v72=OFF+72,v73=OFF+73,v74=OFF+74,v75=OFF+75,v76=OFF+76,v77=OFF+77,v78=OFF+78,v79=OFF+79,v80=OFF+80; + register int v81=OFF+81,v82=OFF+82,v83=OFF+83,v84=OFF+84,v85=OFF+85,v86=OFF+86,v87=OFF+87,v88=OFF+88,v89=OFF+89,v90=OFF+90; + register int v91=OFF+91,v92=OFF+92,v93=OFF+93,v94=OFF+94,v95=OFF+95,v96=OFF+96,v97=OFF+97,v98=OFF+98,v99=OFF+99,v100=OFF+100; + register int v101=OFF+101,v102=OFF+102,v103=OFF+103,v104=OFF+104,v105=OFF+105,v106=OFF+106,v107=OFF+107,v108=OFF+108,v109=OFF+109,v110=OFF+110; + register int v111=OFF+111,v112=OFF+112,v113=OFF+113,v114=OFF+114,v115=OFF+115,v116=OFF+116,v117=OFF+117,v118=OFF+118,v119=OFF+119,v120=OFF+120; + register int v121=OFF+121,v122=OFF+122,v123=OFF+123,v124=OFF+124,v125=OFF+125,v126=OFF+126,v127=OFF+127,v128=OFF+128,v129=OFF+129,v130=OFF+130; + register int v131=OFF+131,v132=OFF+132,v133=OFF+133,v134=OFF+134,v135=OFF+135,v136=OFF+136,v137=OFF+137,v138=OFF+138,v139=OFF+139,v140=OFF+140; + register int v141=OFF+141,v142=OFF+142,v143=OFF+143,v144=OFF+144,v145=OFF+145,v146=OFF+146,v147=OFF+147,v148=OFF+148,v149=OFF+149,v150=OFF+150; + register int v151=OFF+151,v152=OFF+152,v153=OFF+153,v154=OFF+154,v155=OFF+155,v156=OFF+156,v157=OFF+157,v158=OFF+158,v159=OFF+159,v160=OFF+160; + register int v161=OFF+161,v162=OFF+162,v163=OFF+163,v164=OFF+164,v165=OFF+165,v166=OFF+166,v167=OFF+167,v168=OFF+168,v169=OFF+169,v170=OFF+170; + register int v171=OFF+171,v172=OFF+172,v173=OFF+173,v174=OFF+174,v175=OFF+175,v176=OFF+176,v177=OFF+177,v178=OFF+178,v179=OFF+179,v180=OFF+180; + register int v181=OFF+181,v182=OFF+182,v183=OFF+183,v184=OFF+184,v185=OFF+185,v186=OFF+186,v187=OFF+187,v188=OFF+188,v189=OFF+189,v190=OFF+190; + register int v191=OFF+191,v192=OFF+192,v193=OFF+193,v194=OFF+194,v195=OFF+195,v196=OFF+196,v197=OFF+197,v198=OFF+198,v199=OFF+199,v200=OFF+200; + register int v201=OFF+201,v202=OFF+202,v203=OFF+203,v204=OFF+204,v205=OFF+205,v206=OFF+206,v207=OFF+207,v208=OFF+208,v209=OFF+209,v210=OFF+210; + register int v211=OFF+211,v212=OFF+212,v213=OFF+213,v214=OFF+214,v215=OFF+215,v216=OFF+216,v217=OFF+217,v218=OFF+218,v219=OFF+219,v220=OFF+220; + register int v231=OFF+231,v232=OFF+232,v233=OFF+233,v234=OFF+234,v235=OFF+235,v236=OFF+236,v237=OFF+237,v238=OFF+238,v239=OFF+239,v240=OFF+240; + register int v241=OFF+241,v242=OFF+242,v243=OFF+243,v244=OFF+244,v245=OFF+245,v246=OFF+246,v247=OFF+247,v248=OFF+248,v249=OFF+249,v250=OFF+250; + register int v251=OFF+251,v252=OFF+252,v253=OFF+253,v254=OFF+254,v255=OFF+255,v256=OFF+256,v257=OFF+257,v258=OFF+258,v259=OFF+259,v260=OFF+260; + register int v261=OFF+261,v262=OFF+262,v263=OFF+263,v264=OFF+264,v265=OFF+265,v266=OFF+266,v267=OFF+267,v268=OFF+268,v269=OFF+269,v270=OFF+270; + register int v271=OFF+271,v272=OFF+272,v273=OFF+273,v274=OFF+274,v275=OFF+275,v276=OFF+276,v277=OFF+277,v278=OFF+278,v279=OFF+279,v280=OFF+280; + register int v281=OFF+281,v282=OFF+282,v283=OFF+283,v284=OFF+284,v285=OFF+285,v286=OFF+286,v287=OFF+287,v288=OFF+288,v289=OFF+289,v290=OFF+290; + register int v291=OFF+291,v292=OFF+292,v293=OFF+293,v294=OFF+294,v295=OFF+295,v296=OFF+296,v297=OFF+297,v298=OFF+298,v299=OFF+299,v300=OFF+300; + + register int sum = 0; + sum +=v1+v2+v3+v4+v5+v6+v7+v8+v9+v10; + sum +=v11+v12+v13+v14+v15+v16+v17+v18+v19+v20; + sum +=v21+v22+v23+v24+v25+v26+v27+v28+v29+v30; + sum +=v31+v32+v33+v34+v35+v36+v37+v38+v39+v40; + sum +=v41+v42+v43+v44+v45+v46+v47+v48+v49+v50; + sum +=v51+v52+v53+v54+v55+v56+v57+v58+v59+v60; + sum +=v61+v62+v63+v64+v65+v66+v67+v68+v69+v70; + sum +=v71+v72+v73+v74+v75+v76+v77+v78+v79+v80; + sum +=v81+v82+v83+v84+v85+v86+v87+v88+v89+v90; + sum +=v91+v92+v93+v94+v95+v96+v97+v98+v99+v100; + sum +=v101+v102+v103+v104+v105+v106+v107+v108+v109+v110; + sum +=v111+v112+v113+v114+v115+v116+v117+v118+v119+v120; + sum +=v121+v122+v123+v124+v125+v126+v127+v128+v129+v130; + sum +=v131+v132+v133+v134+v135+v136+v137+v138+v139+v140; + sum +=v141+v142+v143+v144+v145+v146+v147+v148+v149+v150; + sum +=v151+v152+v153+v154+v155+v156+v157+v158+v159+v160; + sum +=v161+v162+v163+v164+v165+v166+v167+v168+v169+v170; + sum +=v171+v172+v173+v174+v175+v176+v177+v178+v179+v180; + sum +=v181+v182+v183+v184+v185+v186+v187+v188+v189+v190; + sum +=v191+v192+v193+v194+v195+v196+v197+v198+v199+v200; + sum +=v201+v202+v203+v204+v205+v206+v207+v208+v209+v210; + sum +=v211+v212+v213+v214+v215+v216+v217+v218+v219+v220; + sum +=v231+v232+v233+v234+v235+v236+v237+v238+v239+v240; + sum +=v241+v242+v243+v244+v245+v246+v247+v248+v249+v250; + sum +=v251+v252+v253+v254+v255+v256+v257+v258+v259+v260; + sum +=v261+v262+v263+v264+v265+v266+v267+v268+v269+v270; + sum +=v271+v272+v273+v274+v275+v276+v277+v278+v279+v280; + sum +=v281+v282+v283+v284+v285+v286+v287+v288+v289+v290; + sum +=v291+v292+v293+v294+v295+v296+v297+v298+v299+v300; + + throw Ex( sum ); +} + +void test() +{ + try { + doIt(); + } catch( Ex& ) { } +} + +int main(int argc, char** argv) +{ + int OFF(0); + register int v1=OFF+1,v2=OFF+2,v3=OFF+3,v4=OFF+4,v5=OFF+5,v6=OFF+6,v7=OFF+7,v8=OFF+8,v9=OFF+9,v10=OFF+10; + register int v11=OFF+11,v12=OFF+12,v13=OFF+13,v14=OFF+14,v15=OFF+15,v16=OFF+16,v17=OFF+17,v18=OFF+18,v19=OFF+19,v20=OFF+20; + register int v21=OFF+21,v22=OFF+22,v23=OFF+23,v24=OFF+24,v25=OFF+25,v26=OFF+26,v27=OFF+27,v28=OFF+28,v29=OFF+29,v30=OFF+30; + register int v31=OFF+31,v32=OFF+32,v33=OFF+33,v34=OFF+34,v35=OFF+35,v36=OFF+36,v37=OFF+37,v38=OFF+38,v39=OFF+39,v40=OFF+40; + register int v41=OFF+41,v42=OFF+42,v43=OFF+43,v44=OFF+44,v45=OFF+45,v46=OFF+46,v47=OFF+47,v48=OFF+48,v49=OFF+49,v50=OFF+50; + register int v51=OFF+51,v52=OFF+52,v53=OFF+53,v54=OFF+54,v55=OFF+55,v56=OFF+56,v57=OFF+57,v58=OFF+58,v59=OFF+59,v60=OFF+60; + register int v61=OFF+61,v62=OFF+62,v63=OFF+63,v64=OFF+64,v65=OFF+65,v66=OFF+66,v67=OFF+67,v68=OFF+68,v69=OFF+69,v70=OFF+70; + register int v71=OFF+71,v72=OFF+72,v73=OFF+73,v74=OFF+74,v75=OFF+75,v76=OFF+76,v77=OFF+77,v78=OFF+78,v79=OFF+79,v80=OFF+80; + register int v81=OFF+81,v82=OFF+82,v83=OFF+83,v84=OFF+84,v85=OFF+85,v86=OFF+86,v87=OFF+87,v88=OFF+88,v89=OFF+89,v90=OFF+90; + register int v91=OFF+91,v92=OFF+92,v93=OFF+93,v94=OFF+94,v95=OFF+95,v96=OFF+96,v97=OFF+97,v98=OFF+98,v99=OFF+99,v100=OFF+100; + register int v101=OFF+101,v102=OFF+102,v103=OFF+103,v104=OFF+104,v105=OFF+105,v106=OFF+106,v107=OFF+107,v108=OFF+108,v109=OFF+109,v110=OFF+110; + register int v111=OFF+111,v112=OFF+112,v113=OFF+113,v114=OFF+114,v115=OFF+115,v116=OFF+116,v117=OFF+117,v118=OFF+118,v119=OFF+119,v120=OFF+120; + register int v121=OFF+121,v122=OFF+122,v123=OFF+123,v124=OFF+124,v125=OFF+125,v126=OFF+126,v127=OFF+127,v128=OFF+128,v129=OFF+129,v130=OFF+130; + register int v131=OFF+131,v132=OFF+132,v133=OFF+133,v134=OFF+134,v135=OFF+135,v136=OFF+136,v137=OFF+137,v138=OFF+138,v139=OFF+139,v140=OFF+140; + register int v141=OFF+141,v142=OFF+142,v143=OFF+143,v144=OFF+144,v145=OFF+145,v146=OFF+146,v147=OFF+147,v148=OFF+148,v149=OFF+149,v150=OFF+150; + register int v151=OFF+151,v152=OFF+152,v153=OFF+153,v154=OFF+154,v155=OFF+155,v156=OFF+156,v157=OFF+157,v158=OFF+158,v159=OFF+159,v160=OFF+160; + register int v161=OFF+161,v162=OFF+162,v163=OFF+163,v164=OFF+164,v165=OFF+165,v166=OFF+166,v167=OFF+167,v168=OFF+168,v169=OFF+169,v170=OFF+170; + register int v171=OFF+171,v172=OFF+172,v173=OFF+173,v174=OFF+174,v175=OFF+175,v176=OFF+176,v177=OFF+177,v178=OFF+178,v179=OFF+179,v180=OFF+180; + register int v181=OFF+181,v182=OFF+182,v183=OFF+183,v184=OFF+184,v185=OFF+185,v186=OFF+186,v187=OFF+187,v188=OFF+188,v189=OFF+189,v190=OFF+190; + register int v191=OFF+191,v192=OFF+192,v193=OFF+193,v194=OFF+194,v195=OFF+195,v196=OFF+196,v197=OFF+197,v198=OFF+198,v199=OFF+199,v200=OFF+200; + register int v201=OFF+201,v202=OFF+202,v203=OFF+203,v204=OFF+204,v205=OFF+205,v206=OFF+206,v207=OFF+207,v208=OFF+208,v209=OFF+209,v210=OFF+210; + register int v211=OFF+211,v212=OFF+212,v213=OFF+213,v214=OFF+214,v215=OFF+215,v216=OFF+216,v217=OFF+217,v218=OFF+218,v219=OFF+219,v220=OFF+220; + register int v231=OFF+231,v232=OFF+232,v233=OFF+233,v234=OFF+234,v235=OFF+235,v236=OFF+236,v237=OFF+237,v238=OFF+238,v239=OFF+239,v240=OFF+240; + register int v241=OFF+241,v242=OFF+242,v243=OFF+243,v244=OFF+244,v245=OFF+245,v246=OFF+246,v247=OFF+247,v248=OFF+248,v249=OFF+249,v250=OFF+250; + register int v251=OFF+251,v252=OFF+252,v253=OFF+253,v254=OFF+254,v255=OFF+255,v256=OFF+256,v257=OFF+257,v258=OFF+258,v259=OFF+259,v260=OFF+260; + register int v261=OFF+261,v262=OFF+262,v263=OFF+263,v264=OFF+264,v265=OFF+265,v266=OFF+266,v267=OFF+267,v268=OFF+268,v269=OFF+269,v270=OFF+270; + register int v271=OFF+271,v272=OFF+272,v273=OFF+273,v274=OFF+274,v275=OFF+275,v276=OFF+276,v277=OFF+277,v278=OFF+278,v279=OFF+279,v280=OFF+280; + register int v281=OFF+281,v282=OFF+282,v283=OFF+283,v284=OFF+284,v285=OFF+285,v286=OFF+286,v287=OFF+287,v288=OFF+288,v289=OFF+289,v290=OFF+290; + register int v291=OFF+291,v292=OFF+292,v293=OFF+293,v294=OFF+294,v295=OFF+295,v296=OFF+296,v297=OFF+297,v298=OFF+298,v299=OFF+299,v300=OFF+300; + + int sum_before, sum_after; + + { + int sum( 0 ); + sum +=v1+v2+v3+v4+v5+v6+v7+v8+v9+v10; + sum +=v11+v12+v13+v14+v15+v16+v17+v18+v19+v20; + sum +=v21+v22+v23+v24+v25+v26+v27+v28+v29+v30; + sum +=v31+v32+v33+v34+v35+v36+v37+v38+v39+v40; + sum +=v41+v42+v43+v44+v45+v46+v47+v48+v49+v50; + sum +=v51+v52+v53+v54+v55+v56+v57+v58+v59+v60; + sum +=v61+v62+v63+v64+v65+v66+v67+v68+v69+v70; + sum +=v71+v72+v73+v74+v75+v76+v77+v78+v79+v80; + sum +=v81+v82+v83+v84+v85+v86+v87+v88+v89+v90; + sum +=v91+v92+v93+v94+v95+v96+v97+v98+v99+v100; + sum +=v101+v102+v103+v104+v105+v106+v107+v108+v109+v110; + sum +=v111+v112+v113+v114+v115+v116+v117+v118+v119+v120; + sum +=v121+v122+v123+v124+v125+v126+v127+v128+v129+v130; + sum +=v131+v132+v133+v134+v135+v136+v137+v138+v139+v140; + sum +=v141+v142+v143+v144+v145+v146+v147+v148+v149+v150; + sum +=v151+v152+v153+v154+v155+v156+v157+v158+v159+v160; + sum +=v161+v162+v163+v164+v165+v166+v167+v168+v169+v170; + sum +=v171+v172+v173+v174+v175+v176+v177+v178+v179+v180; + sum +=v181+v182+v183+v184+v185+v186+v187+v188+v189+v190; + sum +=v191+v192+v193+v194+v195+v196+v197+v198+v199+v200; + sum +=v201+v202+v203+v204+v205+v206+v207+v208+v209+v210; + sum +=v211+v212+v213+v214+v215+v216+v217+v218+v219+v220; + sum +=v231+v232+v233+v234+v235+v236+v237+v238+v239+v240; + sum +=v241+v242+v243+v244+v245+v246+v247+v248+v249+v250; + sum +=v251+v252+v253+v254+v255+v256+v257+v258+v259+v260; + sum +=v261+v262+v263+v264+v265+v266+v267+v268+v269+v270; + sum +=v271+v272+v273+v274+v275+v276+v277+v278+v279+v280; + sum +=v281+v282+v283+v284+v285+v286+v287+v288+v289+v290; + sum +=v291+v292+v293+v294+v295+v296+v297+v298+v299+v300; + + sum_before = sum; + } + + test(); + + { + int sum( 0 ); + sum +=v1+v2+v3+v4+v5+v6+v7+v8+v9+v10; + sum +=v11+v12+v13+v14+v15+v16+v17+v18+v19+v20; + sum +=v21+v22+v23+v24+v25+v26+v27+v28+v29+v30; + sum +=v31+v32+v33+v34+v35+v36+v37+v38+v39+v40; + sum +=v41+v42+v43+v44+v45+v46+v47+v48+v49+v50; + sum +=v51+v52+v53+v54+v55+v56+v57+v58+v59+v60; + sum +=v61+v62+v63+v64+v65+v66+v67+v68+v69+v70; + sum +=v71+v72+v73+v74+v75+v76+v77+v78+v79+v80; + sum +=v81+v82+v83+v84+v85+v86+v87+v88+v89+v90; + sum +=v91+v92+v93+v94+v95+v96+v97+v98+v99+v100; + sum +=v101+v102+v103+v104+v105+v106+v107+v108+v109+v110; + sum +=v111+v112+v113+v114+v115+v116+v117+v118+v119+v120; + sum +=v121+v122+v123+v124+v125+v126+v127+v128+v129+v130; + sum +=v131+v132+v133+v134+v135+v136+v137+v138+v139+v140; + sum +=v141+v142+v143+v144+v145+v146+v147+v148+v149+v150; + sum +=v151+v152+v153+v154+v155+v156+v157+v158+v159+v160; + sum +=v161+v162+v163+v164+v165+v166+v167+v168+v169+v170; + sum +=v171+v172+v173+v174+v175+v176+v177+v178+v179+v180; + sum +=v181+v182+v183+v184+v185+v186+v187+v188+v189+v190; + sum +=v191+v192+v193+v194+v195+v196+v197+v198+v199+v200; + sum +=v201+v202+v203+v204+v205+v206+v207+v208+v209+v210; + sum +=v211+v212+v213+v214+v215+v216+v217+v218+v219+v220; + sum +=v231+v232+v233+v234+v235+v236+v237+v238+v239+v240; + sum +=v241+v242+v243+v244+v245+v246+v247+v248+v249+v250; + sum +=v251+v252+v253+v254+v255+v256+v257+v258+v259+v260; + sum +=v261+v262+v263+v264+v265+v266+v267+v268+v269+v270; + sum +=v271+v272+v273+v274+v275+v276+v277+v278+v279+v280; + sum +=v281+v282+v283+v284+v285+v286+v287+v288+v289+v290; + sum +=v291+v292+v293+v294+v295+v296+v297+v298+v299+v300; + + sum_after = sum; + } + + return sum_before != sum_after; +} diff --git a/gcc/testsuite/g++.dg/eh/pr38662.C b/gcc/testsuite/g++.dg/eh/pr38662.C new file mode 100644 index 000000000..5da0f9763 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/pr38662.C @@ -0,0 +1,13 @@ +// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ilp32 } } } +class E { }; + +class T { + int foo(bool a) throw (E) __attribute__((regparm(1))); + int bar(bool b) __attribute__((regparm(1))); +}; + +int T::bar(bool b) +{ + return (b ? 1 : 2); +} + diff --git a/gcc/testsuite/g++.dg/eh/pr41819.C b/gcc/testsuite/g++.dg/eh/pr41819.C new file mode 100644 index 000000000..07894a299 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/pr41819.C @@ -0,0 +1,21 @@ +// { dg-do compile } +// { dg-options "-fno-exceptions" } + +struct S { ~S(); }; +extern void bar(); + +void f0() +{ + S s; + bar(); +} + +void f1() +{ + try {} catch (...) {} // { dg-error "" } +} + +void f2() throw(int) +{ + bar(); +} diff --git a/gcc/testsuite/g++.dg/eh/pr42859.C b/gcc/testsuite/g++.dg/eh/pr42859.C new file mode 100644 index 000000000..a9f1473bc --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/pr42859.C @@ -0,0 +1,23 @@ +// { dg-do compile } + +void start (void); +void +ptw32_terminate (void) +{ + try + { + try + { + start (); + } + catch (int) + { + } + catch (int) + { + } + } + catch (int) + { + } +} diff --git a/gcc/testsuite/g++.dg/eh/pr43365.C b/gcc/testsuite/g++.dg/eh/pr43365.C new file mode 100644 index 000000000..32346d501 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/pr43365.C @@ -0,0 +1,30 @@ +extern "C" void abort(); + +class Counter +{ +public: + static int count; + ~Counter() { count += 1; } +}; + +int Counter::count = 0; + +void func() +{ + Counter c; + + try { + throw 1; + } + catch (const int&) { + return; + } +} + +int main() +{ + func(); + if (Counter::count != 1) + abort(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/pr45569.C b/gcc/testsuite/g++.dg/eh/pr45569.C new file mode 100644 index 000000000..2c100d2b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/pr45569.C @@ -0,0 +1,23 @@ +// { dg-do compile } +// { dg-options "-O -fnon-call-exceptions" } + +float f (); +_Complex float g (); + +void +i (_Complex float); + +float j () +{ + _Complex float x = 0; + try + { + x = f (); + } + catch ( ...) + { + x += g (); + } + i (x); +} + diff --git a/gcc/testsuite/g++.dg/eh/registers1.C b/gcc/testsuite/g++.dg/eh/registers1.C new file mode 100644 index 000000000..6633e834d --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/registers1.C @@ -0,0 +1,138 @@ +// Try to check that registers are preserved when the stack is unwound. +// { dg-do run } +// { dg-options -O2 } + +extern "C" void exit(int); +extern "C" void abort(); + +// This test case triggers up to DEPTH recursive calls to function +// foo(), These calls are numbered so that 0 is the innermost, 1 the +// second innermost, and so on. Each call caches NUM_VARS elements of +// both DOUBLE_SRC and INT_SRC and applies a trivial operation to each +// cached value. The innermost foo() call will throw an integer call +// number. The specified call should store its cached values in +// DOUBLE_DEST and INT_DEST, which main() will check. +const int num_vars = 16; +const int depth = 3; + +float float_src[num_vars * depth]; +float float_dest[num_vars]; + +int int_src[num_vars * depth]; +int int_dest[num_vars]; + +void foo (int level, int throw_to) +{ + float *fsrc = &float_src[level * num_vars]; + float f00 = *fsrc++ + 1.0f; + float f01 = *fsrc++ + 1.0f; + float f02 = *fsrc++ + 1.0f; + float f03 = *fsrc++ + 1.0f; + float f04 = *fsrc++ + 1.0f; + float f05 = *fsrc++ + 1.0f; + float f06 = *fsrc++ + 1.0f; + float f07 = *fsrc++ + 1.0f; + float f08 = *fsrc++ + 1.0f; + float f09 = *fsrc++ + 1.0f; + float f10 = *fsrc++ + 1.0f; + float f11 = *fsrc++ + 1.0f; + float f12 = *fsrc++ + 1.0f; + float f13 = *fsrc++ + 1.0f; + float f14 = *fsrc++ + 1.0f; + float f15 = *fsrc++ + 1.0f; + + int *isrc = &int_src[level * num_vars]; + int i00 = *isrc++ + 1; + int i01 = *isrc++ + 1; + int i02 = *isrc++ + 1; + int i03 = *isrc++ + 1; + int i04 = *isrc++ + 1; + int i05 = *isrc++ + 1; + int i06 = *isrc++ + 1; + int i07 = *isrc++ + 1; + int i08 = *isrc++ + 1; + int i09 = *isrc++ + 1; + int i10 = *isrc++ + 1; + int i11 = *isrc++ + 1; + int i12 = *isrc++ + 1; + int i13 = *isrc++ + 1; + int i14 = *isrc++ + 1; + int i15 = *isrc++ + 1; + + try + { + if (level == 0) + throw throw_to; + else + foo (level - 1, throw_to); + } + catch (int i) + { + if (i == level) + { + float *fdest = float_dest; + *fdest++ = f00; + *fdest++ = f01; + *fdest++ = f02; + *fdest++ = f03; + *fdest++ = f04; + *fdest++ = f05; + *fdest++ = f06; + *fdest++ = f07; + *fdest++ = f08; + *fdest++ = f09; + *fdest++ = f10; + *fdest++ = f11; + *fdest++ = f12; + *fdest++ = f13; + *fdest++ = f14; + *fdest++ = f15; + + int *idest = int_dest; + *idest++ = i00; + *idest++ = i01; + *idest++ = i02; + *idest++ = i03; + *idest++ = i04; + *idest++ = i05; + *idest++ = i06; + *idest++ = i07; + *idest++ = i08; + *idest++ = i09; + *idest++ = i10; + *idest++ = i11; + *idest++ = i12; + *idest++ = i13; + *idest++ = i14; + *idest++ = i15; + } + else + { + throw; + } + } +} + +int main () +{ + for (int i = 0; i < depth * num_vars; i++) + { + int_src[i] = i * i; + float_src[i] = i * 2.0f; + } + for (int level = 0; level < depth; level++) + for (int throw_to = 0; throw_to <= level; throw_to++) + { + foo (level, throw_to); + float *fsrc = &float_src[throw_to * num_vars]; + int *isrc = &int_src[throw_to * num_vars]; + for (int i = 0; i < num_vars; i++) + { + if (int_dest[i] != isrc[i] + 1) + abort (); + if (float_dest[i] != fsrc[i] + 1.0f) + abort (); + } + } + exit (0); +} diff --git a/gcc/testsuite/g++.dg/eh/scope1.C b/gcc/testsuite/g++.dg/eh/scope1.C new file mode 100644 index 000000000..276e0d6e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/scope1.C @@ -0,0 +1,71 @@ +// Test that we've scoped the destructor properly for variables declared +// in a conditional. +// { dg-do run } + +extern "C" void abort (); + +class C +{ + bool live; + public: + C(); + C(const C &); + ~C (); + operator bool() const; +}; + +void f1 () +{ + while (C br = C()) abort (); +} + +void f2 () +{ + for (; C br = C(); ) abort (); +} + +void f3 () +{ + if (C br = C()) abort (); +} + +void f4 () +{ + switch (C br = C()) + { + default: + abort (); + case false: + break; + } +} + +int main() +{ + f1(); f2(); f3(); f4(); + return 0; +} + +C::C() +{ + live = true; +} + +C::C(const C &o) +{ + if (!o.live) + abort (); + live = true; +} + +C::~C() +{ + live = false; +} + +C::operator bool() const +{ + if (!live) + abort (); + return false; +} diff --git a/gcc/testsuite/g++.dg/eh/shadow1.C b/gcc/testsuite/g++.dg/eh/shadow1.C new file mode 100644 index 000000000..15f666a2c --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/shadow1.C @@ -0,0 +1,32 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Oct 2004 <nathan@codesourcery.com> + +// We forgot to ignore current context and friends when determing +// which exceptions shadowed eachother. + +struct E; + +struct B {}; + +struct D : private B +{ + friend class E; + + static B *baz (D *); + virtual void V () throw (B); // { dg-error "overriding" "" } +}; + +struct E : public D +{ + virtual void V () throw (D); // { dg-error "looser throw" "" } +}; + +B* foo (D *); + +B *D::baz (D *p) +{ + try {foo (p);} + catch (B const &b) {} + catch (D const &d) {} + return p; +} diff --git a/gcc/testsuite/g++.dg/eh/simd-1.C b/gcc/testsuite/g++.dg/eh/simd-1.C new file mode 100644 index 000000000..5029ded24 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/simd-1.C @@ -0,0 +1,50 @@ +// Test EH when V2SI SIMD registers are involved. +// Contributed by Aldy Hernandez (aldy@quesejoda.com). +// { dg-options "-O -Wno-abi" } +// { dg-options "-O -w" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } +// { dg-do run } + +typedef int __attribute__((vector_size (8))) vecint; + +vecint vecfunc (vecint beachbum) +{ + return beachbum; +} + +void f3 (void) +{ + /* Force a use of a V2SI register if available. On the PPC/E500, + this will cause the compiler to save the registers in this + function in 64-bits. */ + vecint foobar = (vecint) {0, 0}; + foobar = vecfunc (foobar); + + throw int(); +} + +void f2 (void) +{ + vecint foobar = (vecint) {0, 0}; + foobar = vecfunc (foobar); + + f3 (); +} + +void f1 (void) +{ + int i; + try + { + f2 (); + } + catch (int) + { + i = 9; + } +} + +int main () +{ + f1 (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/simd-2.C b/gcc/testsuite/g++.dg/eh/simd-2.C new file mode 100644 index 000000000..2761061c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/simd-2.C @@ -0,0 +1,54 @@ +// Test EH when V4SI SIMD registers are involved. +// Contributed by Aldy Hernandez (aldy@quesejoda.com). +// { dg-options "-O -Wno-abi" } +// { dg-options "-O -w -msse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } +// { dg-options "-O -w" { target powerpc*-*-* } } +// { dg-options "-O -w -maltivec" { target { powerpc*-*-* && vmx_hw } } } +// { dg-do run } +// { dg-require-effective-target sse_runtime { target { { i?86-*-* x86_64-*-* } && ilp32 } } } + +#include "check-vect.h" + +typedef int __attribute__((vector_size (16))) vecint; + +vecint vecfunc (vecint beachbum) +{ + return beachbum; +} + +void f3 (void) +{ + vecint foobar = (vecint) {0, 0}; + foobar = vecfunc (foobar); + + throw int(); +} + +void f2 (void) +{ + vecint foobar = (vecint) {0, 0}; + foobar = vecfunc (foobar); + + f3 (); +} + +void f1 (void) +{ + int i; + try + { + f2 (); + } + catch (int) + { + i = 9; + } +} + +int main () +{ + /* Exit with zero if the hardware does not support AltiVec instructions. */ + check_vect (); + f1 (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/simd-3.C b/gcc/testsuite/g++.dg/eh/simd-3.C new file mode 100644 index 000000000..5ac75c932 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/simd-3.C @@ -0,0 +1,65 @@ +// { dg-options "-O" } +// { dg-options "-O -maltivec" { target { powerpc*-*-darwin* && powerpc_altivec_ok } } } +// { dg-do run } + +#include <cstdlib> +#include <cstring> + +typedef int __attribute__((vector_size(16))) v; + +v vv[32]; +volatile v vt = { 1, 2, 3, 4 }; + +void clobber_vrs(void) { }; + +void (*volatile fp)() = clobber_vrs; + +void thrower(void) +{ + v v00 = vv[ 0]; + v v01 = vv[ 1]; + v v02 = vv[ 2]; + v v03 = vv[ 3]; + v v04 = vv[ 4]; + v v05 = vv[ 5]; + v v06 = vv[ 6]; + v v07 = vv[ 7]; + v v08 = vv[ 8]; + v v09 = vv[ 9]; + v v10 = vv[10]; + v v11 = vv[11]; + v v12 = vv[12]; + + fp(); + + vv[ 0] = v00; + vv[ 1] = v01; + vv[ 2] = v02; + vv[ 3] = v03; + vv[ 4] = v04; + vv[ 5] = v05; + vv[ 6] = v06; + vv[ 7] = v07; + vv[ 8] = v08; + vv[ 9] = v09; + vv[10] = v10; + vv[11] = v11; + vv[12] = v12; + + throw 3; +} + +v v2; + +int main(void) +{ + v v1 = vt; + try { + thrower(); + } catch (int x) { + } + v2 = v1; + if (memcmp (&v2, (v *)&vt, sizeof (v2)) != 0) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/simd-4.C b/gcc/testsuite/g++.dg/eh/simd-4.C new file mode 100644 index 000000000..8c9b58bf8 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/simd-4.C @@ -0,0 +1,70 @@ +/* { dg-do run { target powerpc*-*-darwin* } } */ +/* { dg-options "-fexceptions -fnon-call-exceptions -O -maltivec" } */ + +#include <cstdlib> +#include <cstring> +#include <signal.h> + +typedef int __attribute__((vector_size(16))) v; + +v vv[32]; +volatile v vt = { 1, 2, 3, 4 }; + +void clobber_vrs(void) { }; + +void (*volatile fp)() = clobber_vrs; + +void thrower(int sig) +{ + v v00 = vv[ 0]; + v v01 = vv[ 1]; + v v02 = vv[ 2]; + v v03 = vv[ 3]; + v v04 = vv[ 4]; + v v05 = vv[ 5]; + v v06 = vv[ 6]; + v v07 = vv[ 7]; + v v08 = vv[ 8]; + v v09 = vv[ 9]; + v v10 = vv[10]; + v v11 = vv[11]; + v v12 = vv[12]; + + fp(); + + vv[ 0] = v00; + vv[ 1] = v01; + vv[ 2] = v02; + vv[ 3] = v03; + vv[ 4] = v04; + vv[ 5] = v05; + vv[ 6] = v06; + vv[ 7] = v07; + vv[ 8] = v08; + vv[ 9] = v09; + vv[10] = v10; + vv[11] = v11; + vv[12] = v12; + + throw 3; +} + +v v2; + +int main(void) +{ + v v1 = vt; + if (signal (SIGBUS, thrower) == SIG_ERR) + abort (); + if (signal (SIGSEGV, thrower) == SIG_ERR) + abort (); + try { + *(volatile int *)0 = 0; + abort (); + } catch (int x) { + } + v2 = v1; + if (memcmp (&v2, (v *)&vt, sizeof (v2)) != 0) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/simd-5.C b/gcc/testsuite/g++.dg/eh/simd-5.C new file mode 100644 index 000000000..71e117ead --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/simd-5.C @@ -0,0 +1,44 @@ +// Test EH with V2SI SIMD registers actually restores correct values. +// Origin: Joseph Myers <joseph@codesourcery.com> +// { dg-options "-O" } +// { dg-do run { target { powerpc_spe && { ! *-*-vxworks* } } } } + +extern "C" void abort (void); +extern "C" int memcmp (const void *, const void *, __SIZE_TYPE__); +typedef int __attribute__((vector_size (8))) v2si; + +v2si a = { 1, 2 }; +v2si b = { 3, 4 }; +v2si c = { 4, 6 }; +volatile v2si r; +v2si r2; + +void +f () +{ + register v2si v asm("r15"); + v = __builtin_spe_evaddw (b, c); + asm volatile ("" : "+r" (v)); + r = v; + throw 1; +} + +int +main () +{ + register v2si v asm("r15"); + v = __builtin_spe_evaddw (a, b); + asm volatile ("" : "+r" (v)); + try + { + f (); + } + catch (int) + { + r = v; + r2 = r; + if (memcmp (&r2, &c, sizeof (v2si))) + abort (); + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/spbp.C b/gcc/testsuite/g++.dg/eh/spbp.C new file mode 100644 index 000000000..a781622ef --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/spbp.C @@ -0,0 +1,27 @@ +/* { dg-do run } */ +/* { dg-options "-gdwarf-2" } */ +/* { dg-skip-if "No Dwarf" { { *-*-aix* alpha*-dec-osf* hppa*-*-hpux* } && { ! hppa*64*-*-* } } { "*" } { "" } } */ + +/* This was a bug on x86-darwin, where the register numbering for SP + and BP was swapped (it's easy to do because on that port it's + different for eh_frame and debug_frame). */ + +#include <stdlib.h> + +void f1(int t) +{ + char u[t]; + throw 1; +} + +int main() +{ + bool b = true; + try { + f1(100); + } catch (int x) { + if (b) + exit (0); + } + abort (); +} diff --git a/gcc/testsuite/g++.dg/eh/spec1.C b/gcc/testsuite/g++.dg/eh/spec1.C new file mode 100644 index 000000000..0bd0cbc03 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/spec1.C @@ -0,0 +1,5 @@ +// Check that we allow an exception specification on a reference-to-function. +// { dg-do compile } + +void f () throw (); +void (&fp)() throw () = f; diff --git a/gcc/testsuite/g++.dg/eh/spec10.C b/gcc/testsuite/g++.dg/eh/spec10.C new file mode 100644 index 000000000..a62d24e66 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/spec10.C @@ -0,0 +1,31 @@ +// Make sure that we call terminate when a throw() spec is violated even +// with -fnothrow-opt. The function pointers are there to make sure that +// the compiler doesn't get clever about optimizing the calls based on +// knowledge about the called functions. + +// { dg-options "-fnothrow-opt" } +// { dg-do run } + +#include <exception> +#include <cstdlib> + +void my_terminate () +{ + std::exit (0); +} + +void g() { throw 1; } +void (*p1)() = g; +void f() throw() { p1(); } +void (*p2)() = f; +void h() { p2(); } + +int main() +{ + std::set_terminate (my_terminate); + + try { h(); } + catch (int) { } + + return 1; +} diff --git a/gcc/testsuite/g++.dg/eh/spec11.C b/gcc/testsuite/g++.dg/eh/spec11.C new file mode 100644 index 000000000..4615a6405 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/spec11.C @@ -0,0 +1,19 @@ +// Make sure that we force an LSDA for a throw() spec with -fnothrow-opt so +// that the personality routine will call terminate. Also check that we +// optimize away the EH cleanup for var because the personality routine +// will call terminate before unwinding: there should not be an EH region +// (i.e. LEHB/LEHE labels) around the call to g(). + +// { dg-final { scan-assembler-not "_ZSt9terminatev" } } +// { dg-final { scan-assembler-not "EHB" } } +// { dg-final { scan-assembler "LSDA" } } + +// { dg-options "-fnothrow-opt" } + +struct A { ~A(); }; +void g(); +void f() throw() +{ + A var; + g(); +} diff --git a/gcc/testsuite/g++.dg/eh/spec2.C b/gcc/testsuite/g++.dg/eh/spec2.C new file mode 100644 index 000000000..64807dd26 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/spec2.C @@ -0,0 +1,10 @@ +// { dg-do compile } + +struct S { void f (void); }; + +typedef void f1 (void) throw (int); // { dg-error "exception" } +typedef void (*f2) (void) throw (int); // { dg-error "exception" } +typedef void (S::*f3) (void) throw (int); // { dg-error "exception" } + +void (*f4) (void) throw (int); +void (S::*f5) (void) throw (int); diff --git a/gcc/testsuite/g++.dg/eh/spec3.C b/gcc/testsuite/g++.dg/eh/spec3.C new file mode 100644 index 000000000..20bcfc33e --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/spec3.C @@ -0,0 +1,24 @@ +// PR c++/4381 +// Test that exception-specs work properly for classes with virtual bases. + +// { dg-do run } + +class Base {}; + +struct A : virtual public Base +{ + A() {} +}; + +struct B {}; + +void func() throw (B,A) +{ + throw A(); +} + +int main(void) +{ + try { func(); } + catch (A& a) { } +} diff --git a/gcc/testsuite/g++.dg/eh/spec4.C b/gcc/testsuite/g++.dg/eh/spec4.C new file mode 100644 index 000000000..8edd3a1c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/spec4.C @@ -0,0 +1,17 @@ +// PR c++/5104 +// Test that a function with a throw spec is a valid template argument. + +#include <exception> + +typedef void (*HandlerFunction)(); +typedef HandlerFunction (*SetHandlerFunction)(HandlerFunction); + +template <SetHandlerFunction set_function> +class HandlerStack { +public: + static void defaultHandler(); +}; + +typedef HandlerStack<std::set_terminate> Terminate; + +template<> void Terminate::defaultHandler() {} diff --git a/gcc/testsuite/g++.dg/eh/spec5.C b/gcc/testsuite/g++.dg/eh/spec5.C new file mode 100644 index 000000000..be8f327c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/spec5.C @@ -0,0 +1,22 @@ +// Test for extension to allow incomplete types in an +// exception-specification for a declaration. + +// { dg-do run } +// { dg-options "-fpermissive -w" } + +struct A; + +struct B +{ + void f () throw (A); +}; + +struct A {}; + +void B::f () throw (A) {} + +int main () +{ + B b; + b.f(); +} diff --git a/gcc/testsuite/g++.dg/eh/spec6.C b/gcc/testsuite/g++.dg/eh/spec6.C new file mode 100644 index 000000000..eb1177b07 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/spec6.C @@ -0,0 +1,19 @@ +// Test that we don't allow incomplete types in an exception-specification +// for a definition, or at a call site. + +// { dg-options "-fpermissive -w" } + +struct A; // { dg-error "" } + +struct B +{ + void f () throw (A); +}; + +void B::f () throw (A) {} // { dg-error "A" } + +int main () +{ + B b; + b.f(); // { dg-error "A" } +} diff --git a/gcc/testsuite/g++.dg/eh/spec7.C b/gcc/testsuite/g++.dg/eh/spec7.C new file mode 100644 index 000000000..08586a2af --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/spec7.C @@ -0,0 +1,35 @@ +// PR 14535 +// { dg-do run } +// { dg-options "-O -finline" } +// +// Original test case failure required that Raiser constructor be inlined. + +extern "C" void abort(); +bool destructor_called = false; + +struct B { + virtual void Run(){}; +}; + +struct D : public B { + virtual void Run() + { + struct O { + ~O() { destructor_called = true; }; + } o; + + struct Raiser { + Raiser() throw( int ) {throw 1;}; + } raiser; + }; +}; + +int main() { + try { + D d; + static_cast<B&>(d).Run(); + } catch (...) {} + + if (!destructor_called) + abort (); +} diff --git a/gcc/testsuite/g++.dg/eh/spec8.C b/gcc/testsuite/g++.dg/eh/spec8.C new file mode 100644 index 000000000..72dadff22 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/spec8.C @@ -0,0 +1,11 @@ +// PR c++/24817 + +struct exception {}; + +template <typename T> void foo() throw(exception); // { dg-error "declaration" } +template <typename T> void foo(); // { dg-error "exception" } + +struct bar +{ + template <typename T> friend void foo(); // { dg-error "exception" } +}; diff --git a/gcc/testsuite/g++.dg/eh/spec9.C b/gcc/testsuite/g++.dg/eh/spec9.C new file mode 100644 index 000000000..9e00d1c75 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/spec9.C @@ -0,0 +1,19 @@ +// PR c++/15745 +// { dg-do run } + +typedef int IntArray[10]; +IntArray i; + +void test_array() throw (IntArray) +{ + throw i; +} + +int main () +{ + try + { + test_array(); + } + catch (IntArray) {} +} diff --git a/gcc/testsuite/g++.dg/eh/stabilize.C b/gcc/testsuite/g++.dg/eh/stabilize.C new file mode 100644 index 000000000..df47cab0c --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/stabilize.C @@ -0,0 +1,26 @@ +// PR c++/8186 + +// Bug: In f, convert_for_arg_passing wrapped the A TARGET_EXPR in an +// ADDR_EXPR for passing by invisible ref. stabilize_throw_expr copied the +// resulting pointer into a temporary. cp_convert_parm_for_inlining then +// dereferences it and tries to initialize B::am with the INDIRECT_REF, +// which calls for a bitwise copy. Which is broken. + +// { dg-options "-O" } + +struct A +{ + A(); + A(const A&); + A& operator=(const A&); +}; + +struct B { + A am; + B(A a) { am = a; } +}; + +void f () +{ + throw B(A()); +} diff --git a/gcc/testsuite/g++.dg/eh/subreg-1.C b/gcc/testsuite/g++.dg/eh/subreg-1.C new file mode 100644 index 000000000..1ac976dae --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/subreg-1.C @@ -0,0 +1,41 @@ +/* The lower-subreg pass would ICE on this test case with + TODO_verify_flow on 32-bit PowerPC. It didn't handle REG_EH_REGION + notes correctly. This is reduced from interpret.cc in libjava. */ + +/* { dg-do compile } */ +/* { dg-options "-O2 -fnon-call-exceptions" } */ + +union _Jv_word +{ + double *o; + int i; + int ia[1]; +}; +union _Jv_word2 +{ + int ia[2]; + double d; +}; + +class _Jv_InterpMethod +{ + static void run_debug (_Jv_word *); +}; + +void +_Jv_InterpMethod::run_debug (_Jv_word *sp) +{ + try + { + { + int index = ((int) (--sp)->i); + double *arr = (double *) ((--sp)->o); + _Jv_word2 w2; + w2.d = arr[index]; + (sp++)->ia[0] = w2.ia[0]; + } + } + catch (int * ex) + { + } +} diff --git a/gcc/testsuite/g++.dg/eh/synth1.C b/gcc/testsuite/g++.dg/eh/synth1.C new file mode 100644 index 000000000..ac3cab8b1 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/synth1.C @@ -0,0 +1,27 @@ +// PR c++/6179 + +// Bug: we tried to look at the fields of 'const A' to determine the proper +// exception specification for the synthesized copy constructor, but +// TYPE_FIELDS hadn't been set yet, so we incorrectly got a throw() spec. + +struct B +{ + B () {} + B (const B&) { throw 1; } +}; + +struct A; +void f (const A &) {} +struct A +{ + B b; +}; + +int main () +{ + A a; + try + { A a2 (a); } + catch (...) + { } +} diff --git a/gcc/testsuite/g++.dg/eh/synth2.C b/gcc/testsuite/g++.dg/eh/synth2.C new file mode 100644 index 000000000..2da814db9 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/synth2.C @@ -0,0 +1,24 @@ +// PR c++/24580 +// { dg-do run } + +struct vbase {}; + +struct foo : virtual vbase +{ + foo() + { + throw "exception in foo ctor"; + } +}; + +struct bar : public foo {}; + +int main() +{ + try + { + bar a; + } + catch ( ... ) { } + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/table.C b/gcc/testsuite/g++.dg/eh/table.C new file mode 100644 index 000000000..6f36bc6cf --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/table.C @@ -0,0 +1,33 @@ +// { dg-do compile { target *-*-darwin* } } +// { dg-final { scan-assembler "GCC_except_table0" } } +void needed(); +void unneeded(); + +class Bar +{ +public: + Bar() {} + virtual ~Bar() {} + + void unneeded(); +}; + +void needed() +{ + Bar b; +} + +//#if 0 +void unneeded() +{ + Bar b; + b.unneeded(); +} +//#endif + +int main() +{ + needed(); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/template1.C b/gcc/testsuite/g++.dg/eh/template1.C new file mode 100644 index 000000000..2cbf9c698 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/template1.C @@ -0,0 +1,38 @@ +// Test whether exception specifier dependent on template parameter +// is accepted during template decl processing. +// { dg-do run } + +extern "C" void abort(); + +class A {}; + +template <class T> +struct B +{ + typedef A E; +}; + +template <class T> +struct C +{ + typedef B<T> D; + typedef typename D::E E; + void f() throw(E) { throw E(); } +}; + +int main() +{ + int caught = 0; + try + { + C<int> x; + x.f(); + } + catch (A) + { + ++caught; + } + if (caught != 1) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/template2.C b/gcc/testsuite/g++.dg/eh/template2.C new file mode 100644 index 000000000..ed3893286 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/template2.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// { dg-options -O2 } + +template<class T> struct O { + O(T *p) : q(p) { } + T *q; +}; +struct W { + virtual ~W(); +}; +struct S : public W { + S (int *); +}; +W *bar(int); +S::S (int *x) +{ + for (int *p = x; *p; p++) + O<W> i (bar (*p)); +} diff --git a/gcc/testsuite/g++.dg/eh/terminate1.C b/gcc/testsuite/g++.dg/eh/terminate1.C new file mode 100644 index 000000000..43cc19eaf --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/terminate1.C @@ -0,0 +1,29 @@ +// PR c++/44127 + +// This is basically the same test as g++.eh/terminate1.C, but that one +// tests runtime behavior and this tests the assembly output. The test +// should call terminate (because initializing the catch parm throws), but +// from the personality routine, not directly. + +// { dg-final { scan-assembler-not "_ZSt9terminatev" } } + +// Also there should only be two EH call sites: #0 for throw A() and #1 for +// _Unwind_Resume. We don't want call site info for __cxa_end_catch, since +// ~A is trivial. + +// { dg-final { scan-assembler-not "LEHB2" } } + +struct A +{ + A() { } + A (const A&) { throw 1; } +}; + +int main() +{ + try + { + throw A(); + } + catch (A) { } +} diff --git a/gcc/testsuite/g++.dg/eh/throw1.C b/gcc/testsuite/g++.dg/eh/throw1.C new file mode 100644 index 000000000..6a3cb2c35 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/throw1.C @@ -0,0 +1,9 @@ +class S +{ +public: + S(){} +}; + +int foo(char* m1) { + throw (m1 ? S() : S()); +} diff --git a/gcc/testsuite/g++.dg/eh/throw2.C b/gcc/testsuite/g++.dg/eh/throw2.C new file mode 100644 index 000000000..f9da8d7f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/throw2.C @@ -0,0 +1,8 @@ +// PR c++/16851 + +struct A { A(int); }; + +void f(int t) +{ + throw (3,A(t)); +} diff --git a/gcc/testsuite/g++.dg/eh/throw3.C b/gcc/testsuite/g++.dg/eh/throw3.C new file mode 100644 index 000000000..3417eeb3d --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/throw3.C @@ -0,0 +1,8 @@ +// PR c++/19312 + +struct A {}; + +void foo(A a) +{ + throw (A)a; +} diff --git a/gcc/testsuite/g++.dg/eh/uncaught1.C b/gcc/testsuite/g++.dg/eh/uncaught1.C new file mode 100644 index 000000000..afbf5af4d --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/uncaught1.C @@ -0,0 +1,84 @@ +// PR libstdc++/10606 +// { dg-do run } +// { dg-options "-fuse-cxa-get-exception-ptr" { target powerpc*-*-darwin* } } + +#include <exception> +#include <cstdlib> + + +struct Check { + int obj1, obj2; + bool state; +}; + +static Check const data[] = { + { 0, 0, false }, // construct [0] + { 1, 0, true }, // [1] = [0] + { 0, 0, true }, // destruct [0] + { 2, 1, true }, // [2] = [1] + { 2, 2, true }, // destruct [2] + { 3, 1, true }, // [3] = [1] + { 3, 3, false }, // destruct [3] + { 1, 1, false }, // destruct [1] + { 9, 9, false } // end-of-data +}; + +static int pos = 0; + +static void test(int obj1, int obj2, bool state) +{ + if (obj1 != data[pos].obj1) abort (); + if (obj2 != data[pos].obj2) abort (); + if (state != data[pos].state) abort (); + pos++; +} + + +struct S { + int id; + S (); + S (const S &); + ~S (); +}; + +static int next_id = 0; + +S::S() + : id (next_id++) +{ + test (id, id, std::uncaught_exception ()); +} + +S::S(const S &x) + : id (next_id++) +{ + test (id, x.id, std::uncaught_exception ()); +} + +S::~S() +{ + test (id, id, std::uncaught_exception ()); +} + +extern void foo (S *); + +int main() +{ + try + { + try + { + S s0; + throw s0; // s1 is the exception object + } + catch (S s2) + { + throw; + } + } + catch (S s3) + { + } + + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/uncaught2.C b/gcc/testsuite/g++.dg/eh/uncaught2.C new file mode 100644 index 000000000..a99b2d7f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/uncaught2.C @@ -0,0 +1,84 @@ +// { dg-do compile } +// { dg-final { scan-assembler-not "__cxa_get_exception" } } +// { dg-options "-fno-use-cxa-get-exception-ptr" } + +#include <exception> +#include <cstdlib> + + +struct Check { + int obj1, obj2; + bool state; +}; + +static Check const data[] = { + { 0, 0, false }, // construct [0] + { 1, 0, true }, // [1] = [0] + { 0, 0, true }, // destruct [0] + { 2, 1, true }, // [2] = [1] + { 2, 2, true }, // destruct [2] + { 3, 1, true }, // [3] = [1] + { 3, 3, false }, // destruct [3] + { 1, 1, false }, // destruct [1] + { 9, 9, false } // end-of-data +}; + +static int pos = 0; + +static void test(int obj1, int obj2, bool state) +{ + if (obj1 != data[pos].obj1) abort (); + if (obj2 != data[pos].obj2) abort (); + if (state != data[pos].state) abort (); + pos++; +} + + +struct S { + int id; + S (); + S (const S &); + ~S (); +}; + +static int next_id = 0; + +S::S() + : id (next_id++) +{ + test (id, id, std::uncaught_exception ()); +} + +S::S(const S &x) + : id (next_id++) +{ + test (id, x.id, std::uncaught_exception ()); +} + +S::~S() +{ + test (id, id, std::uncaught_exception ()); +} + +extern void foo (S *); + +int main() +{ + try + { + try + { + S s0; + throw s0; // s1 is the exception object + } + catch (S s2) + { + throw; + } + } + catch (S s3) + { + } + + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/uncaught3.C b/gcc/testsuite/g++.dg/eh/uncaught3.C new file mode 100644 index 000000000..4ce4a5337 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/uncaught3.C @@ -0,0 +1,84 @@ +// { dg-do compile { target powerpc*-*-darwin* } } +// { dg-final { scan-assembler-not "__cxa_get_exception" } } +// { dg-options "-mmacosx-version-min=10.4" } + +#include <exception> +#include <cstdlib> + + +struct Check { + int obj1, obj2; + bool state; +}; + +static Check const data[] = { + { 0, 0, false }, // construct [0] + { 1, 0, true }, // [1] = [0] + { 0, 0, true }, // destruct [0] + { 2, 1, true }, // [2] = [1] + { 2, 2, true }, // destruct [2] + { 3, 1, true }, // [3] = [1] + { 3, 3, false }, // destruct [3] + { 1, 1, false }, // destruct [1] + { 9, 9, false } // end-of-data +}; + +static int pos = 0; + +static void test(int obj1, int obj2, bool state) +{ + if (obj1 != data[pos].obj1) abort (); + if (obj2 != data[pos].obj2) abort (); + if (state != data[pos].state) abort (); + pos++; +} + + +struct S { + int id; + S (); + S (const S &); + ~S (); +}; + +static int next_id = 0; + +S::S() + : id (next_id++) +{ + test (id, id, std::uncaught_exception ()); +} + +S::S(const S &x) + : id (next_id++) +{ + test (id, x.id, std::uncaught_exception ()); +} + +S::~S() +{ + test (id, id, std::uncaught_exception ()); +} + +extern void foo (S *); + +int main() +{ + try + { + try + { + S s0; + throw s0; // s1 is the exception object + } + catch (S s2) + { + throw; + } + } + catch (S s3) + { + } + + return 0; +} diff --git a/gcc/testsuite/g++.dg/eh/unexpected1.C b/gcc/testsuite/g++.dg/eh/unexpected1.C new file mode 100644 index 000000000..e5982ffac --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/unexpected1.C @@ -0,0 +1,46 @@ +// PR 3719 +// Test that an unexpected handler can rethrow to categorize. +// { dg-do run } + +#include <exception> + +extern "C" void abort (); + +struct One { }; +struct Two { }; + +static void +handle_unexpected () +{ + try + { + throw; + } + catch (One &) + { + throw Two (); + } +} + +static void +doit () throw (Two) +{ + throw One (); +} + +int main () +{ + std::set_unexpected (handle_unexpected); + + try + { + doit (); + } + catch (Two &) + { + } + catch (...) + { + abort (); + } +} diff --git a/gcc/testsuite/g++.dg/eh/unwind1.C b/gcc/testsuite/g++.dg/eh/unwind1.C new file mode 100644 index 000000000..da7aa98fe --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/unwind1.C @@ -0,0 +1,25 @@ +// PR middle-end/28493 + +extern "C" void abort (); + +struct Command *ptr; + +struct Command { + Command() { ptr = this; } + virtual ~Command() { if (ptr != this) abort(); } +}; + +void tryfunc() +{ + Command cmd; + throw 1; +} + +int main() +{ + try + { + tryfunc(); + } + catch (int) { } +} diff --git a/gcc/testsuite/g++.dg/eh/unwind2.C b/gcc/testsuite/g++.dg/eh/unwind2.C new file mode 100644 index 000000000..d6181c8c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/unwind2.C @@ -0,0 +1,94 @@ +// PR debug/43290 +// { dg-do compile } +// { dg-options "-O2" } +// { dg-options "-O3 -mavx -fPIC -mtune=core2" { target { { i?86-*-* x86_64-*-* } && { ilp32 && fpic } } } } + +namespace std +{ + template <class> struct char_traits; +} +typedef struct { union { char __wchb[4]; }; } mbstate_t; +namespace std +{ + template <typename _StateT> struct fpos + { + long long _M_off; + _StateT _M_state; + fpos (long long):_M_off (), _M_state () { } + _StateT state () { return _M_state; } + }; + typedef fpos <mbstate_t> streampos; +} +namespace std +{ + template <> struct char_traits <char> + { + typedef streampos pos_type; + typedef long long off_type; + typedef mbstate_t state_type; + }; +} +struct pthread_mutex_t; +namespace +{ + enum _Ios_Openmode { _S_in = 3, _S_out }; + enum _Ios_Seekdir { _S_beg }; + struct ios_base + { + typedef _Ios_Openmode openmode; + static const openmode in = _S_in; + static const openmode out = _S_out; + typedef _Ios_Seekdir seekdir; + static const seekdir beg = _S_beg; + }; + template < typename _CharT, typename > struct basic_streambuf + { + typedef _CharT char_type; + char_type * _M_in_beg; + char_type *eback () { return _M_in_beg; } + char_type *gptr () {} + }; +} +namespace std +{ + typedef struct pthread_mutex_t __c_lock; + template <typename> class __basic_file; + template <> struct __basic_file <char> + { + __basic_file (__c_lock * = 0); + bool is_open (); + }; + template <typename _CharT, typename _Traits> struct basic_filebuf : public basic_streambuf <_CharT, _Traits> + { + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + typedef __basic_file < char >__file_type; + typedef typename traits_type::state_type __state_type; + __file_type _M_file; + char_type *_M_pback_cur_save; + bool _M_pback_init; + void _M_destroy_pback () throw () + { + _M_pback_cur_save += this->gptr () != this->eback (); + _M_pback_init = false; + } + bool is_open () throw () { return _M_file.is_open (); } + pos_type seekpos (pos_type, ios_base::openmode = ios_base::in | ios_base::out); + pos_type _M_seek (off_type, ios_base::seekdir, __state_type); + }; + template <typename _CharT, typename _Traits> + typename basic_filebuf <_CharT, _Traits>::pos_type + basic_filebuf <_CharT, _Traits>::seekpos (pos_type __pos, ios_base::openmode) + { + pos_type __ret = (off_type ()); + if (this->is_open ()) + { + _M_destroy_pback (); + __ret = _M_seek (off_type (), ios_base::beg, __pos.state ()); + } + return __ret; + } + template class basic_filebuf <char, char_traits <char> >; +} diff --git a/gcc/testsuite/g++.dg/eh/weak1-a.cc b/gcc/testsuite/g++.dg/eh/weak1-a.cc new file mode 100644 index 000000000..1885fae4e --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/weak1-a.cc @@ -0,0 +1,3 @@ +extern void f() { + throw 7; +} diff --git a/gcc/testsuite/g++.dg/eh/weak1.C b/gcc/testsuite/g++.dg/eh/weak1.C new file mode 100644 index 000000000..f78d1955b --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/weak1.C @@ -0,0 +1,23 @@ +// PR target/29487 +// { dg-do run { xfail { hppa*-*-hpux* && { ! hppa*64*-*-* } } } } +// { dg-require-weak-override "" } +// { dg-additional-sources "weak1-a.cc" } +// { dg-options "-O2" } + +extern __attribute__((weak)) +void f() { +} + +int main () { + try { + f(); + return 1; + } catch (int i) { + /* Although the implementation of f in this file does not throw + any exceptions, it is weak, and may therefore be replaced at + link time. Therefore, the compiler must not optimize away this + catch clause. */ + if (i != 7) + return 2; + } +} diff --git a/gcc/testsuite/g++.dg/expr/anew1.C b/gcc/testsuite/g++.dg/expr/anew1.C new file mode 100644 index 000000000..d7a428880 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/anew1.C @@ -0,0 +1,27 @@ +// { dg-do run } +// PR 11228: array operator new, with zero-initialization and a variable sized array. +// Regression test for PR +// Author: Matt Austern <austern@apple.com> + + +#include <new> +#include <stdlib.h> +#include <string.h> + +int* allocate(int n) +{ + void *p; + p = malloc(n * sizeof (int)); + memset (p, 0xff, n * sizeof(int)); + return new (p) int[n](); +} + +int main() +{ + const int n = 17; + int* p = allocate(n); + for (int i = 0; i < n; ++i) + if (p[i] != 0) + abort (); + exit (0); +} diff --git a/gcc/testsuite/g++.dg/expr/anew2.C b/gcc/testsuite/g++.dg/expr/anew2.C new file mode 100644 index 000000000..fbf2152d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/anew2.C @@ -0,0 +1,27 @@ +// { dg-do run } +// PR 11228: array operator new, with zero-initialization and a variable sized array. +// Regression test for PR +// Author: Matt Austern <austern@apple.com> + + +#include <new> +#include <stdlib.h> +#include <string.h> + +double* allocate(int n) +{ + void *p; + p = malloc(n * sizeof (double)); + memset (p, 0xff, n * sizeof(double)); + return new (p) double[n](); +} + +int main() +{ + const int n = 17; + double* p = allocate(n); + for (int i = 0; i < n; ++i) + if (p[i] != 0.0) + abort (); + exit (0); +} diff --git a/gcc/testsuite/g++.dg/expr/anew3.C b/gcc/testsuite/g++.dg/expr/anew3.C new file mode 100644 index 000000000..9bb64ea4e --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/anew3.C @@ -0,0 +1,32 @@ +// { dg-do run } +// PR 11228: array operator new, with zero-initialization and a variable sized array. +// Regression test for PR +// Author: Matt Austern <austern@apple.com> + +#include <new> +#include <stdlib.h> +#include <string.h> + +struct X +{ + int a; + double b; +}; + +X* allocate(int n) +{ + void *p; + p = malloc(n * sizeof (X)); + memset (p, 0xff, n * sizeof(X)); + return new (p) X[n](); +} + +int main() +{ + const int n = 17; + X* p = allocate(n); + for (int i = 0; i < n; ++i) + if (p[i].a != 0 || p[i].b != 0.0) + abort (); + exit (0); +} diff --git a/gcc/testsuite/g++.dg/expr/anew4.C b/gcc/testsuite/g++.dg/expr/anew4.C new file mode 100644 index 000000000..4ce1d8899 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/anew4.C @@ -0,0 +1,44 @@ +// { dg-do run } +// PR 11228: array operator new, with zero-initialization and a variable sized array. +// Regression test for PR +// Author: Matt Austern <austern@apple.com> + +#include <new> +#include <stdlib.h> +#include <string.h> + +struct B +{ + B(); + int n; +}; + +B::B() +{ + n = 137; +} + + +struct D : public B +{ + double x; +}; + + +D* allocate(int n) +{ + void *p; + p = malloc(n * sizeof (D)); + memset (p, 0xff, n * sizeof(D)); + return new (p) D[n](); +} + +int main() +{ + const int n = 17; + D* p = allocate(n); + for (int i = 0; i < n; ++i) + if (p[i].n != 137 || p[i].x != 0) + abort (); + exit (0); +} diff --git a/gcc/testsuite/g++.dg/expr/assign1.C b/gcc/testsuite/g++.dg/expr/assign1.C new file mode 100644 index 000000000..7eb37e523 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/assign1.C @@ -0,0 +1,34 @@ +// { dg-do run } + +// Contributed by Nathan Sidwell 15 Dec 2003 <nathan@codesourcery.com> +// Origin: Tasso Karkanis <Tasso.Karkanis@rogers.com> +// PR c++/13387. Clobbered tail padding of base + +inline void *operator new (__SIZE_TYPE__, void *ptr) +{ + return ptr; +} + +struct Base { + Base() : i(0), c(0) {} + int i; + char c; +}; + +struct Sub : Base { + Sub () : d(0) {} + char d; +}; + +int main() { + Sub sub; + char base_alias[sizeof (Base)]; + Base *base; + + for (unsigned ix = sizeof base_alias; ix--;) + base_alias[ix] = 0x55; + base = new (&base_alias) Base (); + + static_cast <Base &> (sub) = *base; + return sub.d; +} diff --git a/gcc/testsuite/g++.dg/expr/bitfield1.C b/gcc/testsuite/g++.dg/expr/bitfield1.C new file mode 100644 index 000000000..f3d47417b --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield1.C @@ -0,0 +1,12 @@ +// PR c++/27505 + +struct s { + bool field:8; +}; + +void +foo (struct s *p) +{ + if (!p->field) + ; +} diff --git a/gcc/testsuite/g++.dg/expr/bitfield10.C b/gcc/testsuite/g++.dg/expr/bitfield10.C new file mode 100644 index 000000000..0a6581e32 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield10.C @@ -0,0 +1,16 @@ +// PR c++/37146 +// { dg-do compile } + +enum E { E0 = 0, E1 = 'E' }; + +struct S +{ + E s0 : 8; + enum E foo (bool, E); +}; + +E +S::foo (bool a, E b) +{ + return a ? s0 : b; +} diff --git a/gcc/testsuite/g++.dg/expr/bitfield11.C b/gcc/testsuite/g++.dg/expr/bitfield11.C new file mode 100644 index 000000000..bab303ef3 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield11.C @@ -0,0 +1,13 @@ +// PR c++/37819 +// { dg-do compile } + +struct A +{ + unsigned int a : 1; +}; + +bool +foo (A *x, A *y) +{ + x->a = y ? y->a : true; +} diff --git a/gcc/testsuite/g++.dg/expr/bitfield2.C b/gcc/testsuite/g++.dg/expr/bitfield2.C new file mode 100644 index 000000000..659931530 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield2.C @@ -0,0 +1,9 @@ +// PR c++/27979 + +class Ast +{ + enum AstKind { }; + const AstKind kind : 8; + void foo(AstKind k) { } + void bar(void) { foo(kind); } +}; diff --git a/gcc/testsuite/g++.dg/expr/bitfield3.C b/gcc/testsuite/g++.dg/expr/bitfield3.C new file mode 100644 index 000000000..3221263a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield3.C @@ -0,0 +1,12 @@ +// PR c++/30274 + +struct S { + bool x : 4; +}; + +S s; + +void f() { + s.x--; // { dg-error "Boolean expression" } + --s.x; // { dg-error "Boolean expression" } +} diff --git a/gcc/testsuite/g++.dg/expr/bitfield4.C b/gcc/testsuite/g++.dg/expr/bitfield4.C new file mode 100644 index 000000000..d824964e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield4.C @@ -0,0 +1,19 @@ +// PR c++/30274 +// { dg-do link } + +struct S { + bool x : 4; +}; + +S s; + +template <typename T> +void f(T); + +template <> +void f(bool) {} + +int main() { + f(s.x++); + f(++s.x); +} diff --git a/gcc/testsuite/g++.dg/expr/bitfield5.C b/gcc/testsuite/g++.dg/expr/bitfield5.C new file mode 100644 index 000000000..3d18e159c --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield5.C @@ -0,0 +1,17 @@ +// PR c++/30274 +// { dg-do run } + +struct S { + bool x : 4; +}; + +S s; + +int main() { + s.x++; + if (s.x != 1) + return 1; + ++s.x; + if (s.x != 1) + return 2; +} diff --git a/gcc/testsuite/g++.dg/expr/bitfield6.C b/gcc/testsuite/g++.dg/expr/bitfield6.C new file mode 100644 index 000000000..6f6d559a3 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield6.C @@ -0,0 +1,11 @@ +// PR c++/30274 + +struct S { + bool x : 4; +}; + +S s; + +void f() { + ++s.x = false; +} diff --git a/gcc/testsuite/g++.dg/expr/bitfield7.C b/gcc/testsuite/g++.dg/expr/bitfield7.C new file mode 100644 index 000000000..d274e3e98 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield7.C @@ -0,0 +1,8 @@ +// PR c++/31273 + +enum E { e }; +struct S { + E v:5; +}; +S s; +int main() { if (!s.v) return 0; } diff --git a/gcc/testsuite/g++.dg/expr/bitfield8.C b/gcc/testsuite/g++.dg/expr/bitfield8.C new file mode 100644 index 000000000..566109cdd --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield8.C @@ -0,0 +1,24 @@ +// PR c++/31513 +// { dg-do run } + +extern "C" void abort(); + +struct tree_type { + unsigned int precision : 9; +}; + +void bork(unsigned int i) { + if (i != 7) + abort(); +} + +void foo(struct tree_type *t) +{ + bork(t->precision); +} + +int main() { + tree_type t; + t.precision = 7; + foo(&t); +} diff --git a/gcc/testsuite/g++.dg/expr/bitfield9.C b/gcc/testsuite/g++.dg/expr/bitfield9.C new file mode 100644 index 000000000..177f65b88 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bitfield9.C @@ -0,0 +1,26 @@ +// PR c++/32346 +// { dg-do run } +// { dg-options "-Wno-overflow" } + +extern "C" void abort(); + +struct S { + long long i : 32; +}; + +void f(int i, int j) { + if (i != 0xabcdef01) + abort(); + if (j != 0) + abort(); +} + +void g(S s) { + f(s.i, 0); +} + +int main() { + S s; + s.i = 0xabcdef01; + g(s); +} diff --git a/gcc/testsuite/g++.dg/expr/bool1.C b/gcc/testsuite/g++.dg/expr/bool1.C new file mode 100644 index 000000000..bfb40e330 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bool1.C @@ -0,0 +1,21 @@ +// { dg-do run } +// PR C++/29295 +// make sure that a typedef for a bool will have the +// the same results as a bool itself. + +extern "C" void abort(); +typedef bool my_bool; +int main() +{ + my_bool b = false; + int i; + + b++; + b++; + i = b; + if (i != 1) + abort (); + return 0; +} + + diff --git a/gcc/testsuite/g++.dg/expr/bool2.C b/gcc/testsuite/g++.dg/expr/bool2.C new file mode 100644 index 000000000..39d93c0af --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bool2.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// make sure that a typedef for a bool will have the +// the same results as a bool itself. + + +typedef bool my_bool; +int main() +{ + my_bool b = false; + b--; // { dg-error "" } + return 0; +} + diff --git a/gcc/testsuite/g++.dg/expr/bool3.C b/gcc/testsuite/g++.dg/expr/bool3.C new file mode 100644 index 000000000..61669e27b --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bool3.C @@ -0,0 +1,21 @@ +// { dg-do run } +// PR C++/29295 +// make sure that a typedef for a bool will have the +// the same results as a bool itself. + +extern "C" void abort(); +typedef volatile bool my_bool; +int main() +{ + my_bool b = false; + int i; + + b++; + b++; + i = b; + if (i != 1) + abort (); + return 0; +} + + diff --git a/gcc/testsuite/g++.dg/expr/bool4.C b/gcc/testsuite/g++.dg/expr/bool4.C new file mode 100644 index 000000000..dce51ec33 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bool4.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// make sure that a typedef for a bool will have the +// the same results as a bool itself. + + +typedef volatile bool my_bool; +int main() +{ + my_bool b = false; + b--; // { dg-error "" } + return 0; +} + diff --git a/gcc/testsuite/g++.dg/expr/bound-mem-fun.C b/gcc/testsuite/g++.dg/expr/bound-mem-fun.C new file mode 100644 index 000000000..b31bba13c --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/bound-mem-fun.C @@ -0,0 +1,18 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/38228 +// { dg-do compile } + +struct A +{ + A (); + template<typename T> A(T); +}; + +struct B +{ + int foo(); +}; + +A a = B().*(&B::foo); // { dg-error "invalid use of non-static member function" } + + diff --git a/gcc/testsuite/g++.dg/expr/call1.C b/gcc/testsuite/g++.dg/expr/call1.C new file mode 100644 index 000000000..42d18db56 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/call1.C @@ -0,0 +1,16 @@ +namespace NS_1 { + struct A {}; + struct foo {}; +} + +namespace NS_2 { + template <typename T> void foo(T); + + template <typename T> + void bar() { + NS_1::A a; + NS_2::foo(a); + } + + template void bar<int>(); +} diff --git a/gcc/testsuite/g++.dg/expr/call2.C b/gcc/testsuite/g++.dg/expr/call2.C new file mode 100644 index 000000000..3b7398a8b --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/call2.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 11 Sep 2003 <nathan@codesourcery.com> +// Origin: Wolfgang Bangerth <bangerth@dealii.org> +// PR c++/12184. ICE + +class C; +class D; +bool mm(D); + +void g(C& f) { + mm(f); // { dg-error "parameter" "" } +} diff --git a/gcc/testsuite/g++.dg/expr/call3.C b/gcc/testsuite/g++.dg/expr/call3.C new file mode 100644 index 000000000..13bca7170 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/call3.C @@ -0,0 +1,12 @@ +// PR c++/26036 +// Origin: <ben@pc-doctor.com> +// { dg-do compile } + +struct A +{ + int i; +}; + +A foo(int); /* { dg-message "note: declared here" } */ + +int j = foo().i; // { dg-error "too few arguments" } diff --git a/gcc/testsuite/g++.dg/expr/call4.C b/gcc/testsuite/g++.dg/expr/call4.C new file mode 100644 index 000000000..b4f2d60be --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/call4.C @@ -0,0 +1,27 @@ +// { dg-do compile } + +// Copyright (C) 2007 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 22 Jul 2007 <nathan@codesourcery.com> + +// Origin: Danny Boelens <danny.boelens@artwork-systems.com> +// PR 32839. Default arguments propagated through the type system to +// an indirect call. + +template<typename T> +struct TPL +{ + enum Whatever {e1, e2}; + + static void Quux (int i = e1 | e2); +}; + +template <typename F> +void DoIt (F fun) +{ + fun (); // { dg-error "too few arguments" } +} + +void Foo () +{ + DoIt (&TPL<int>::Quux); +} diff --git a/gcc/testsuite/g++.dg/expr/call5.C b/gcc/testsuite/g++.dg/expr/call5.C new file mode 100644 index 000000000..023ad81f0 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/call5.C @@ -0,0 +1,19 @@ +// { dg-do compile } + +// Copyright (C) 2007 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 22 Jul 2007 <nathan@codesourcery.com> + +// PR 32839. Default arguments propagated through the type system to +// an indirect call. + +void Quux (int i = 0); +void Baz (int i); + +void Foo () +{ + __typeof (Quux) *q = Baz; + + q (); // { dg-error "too few arguments" } +} + + diff --git a/gcc/testsuite/g++.dg/expr/cast1.C b/gcc/testsuite/g++.dg/expr/cast1.C new file mode 100644 index 000000000..ee1adcc3d --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast1.C @@ -0,0 +1,3 @@ +struct S; // { dg-error "forward" } + +void f(S* p) { ((S) (*p)); } // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/expr/cast10.C b/gcc/testsuite/g++.dg/expr/cast10.C new file mode 100644 index 000000000..cd3e0fc3c --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast10.C @@ -0,0 +1,10 @@ +// { dg-do compile } +// This used to error out because we would try to convert m to a short. + + +struct a {}; +void b() { + int a::*m; + a *c; + short p = reinterpret_cast<char*>(&(c->*m)) - reinterpret_cast<char*>(c); +} diff --git a/gcc/testsuite/g++.dg/expr/cast2.C b/gcc/testsuite/g++.dg/expr/cast2.C new file mode 100644 index 000000000..1ccda2b48 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast2.C @@ -0,0 +1,5 @@ +void (*p)(); + +void f() { + (void *)p; // { dg-warning "forbids cast" } +} diff --git a/gcc/testsuite/g++.dg/expr/cast3.C b/gcc/testsuite/g++.dg/expr/cast3.C new file mode 100644 index 000000000..2ca56c269 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast3.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +enum MyState +{ + QUIT = 0, + START, + STOP, + PAUSE +}; + +double GetDouble() +{ + return 1.0; +} + +int main() +{ + MyState the_state; + + the_state = (MyState)GetDouble(); // { dg-bogus "invalid cast" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/expr/cast4.C b/gcc/testsuite/g++.dg/expr/cast4.C new file mode 100644 index 000000000..e9f529b11 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast4.C @@ -0,0 +1,25 @@ +// { dg-do run } +// PR c++/22132 + +extern "C" void abort (); + +struct foo { + int a; + int b; +}; + +class Foobar : public foo { +public: + Foobar() { a = 1; b = 2; } + virtual ~Foobar() {} +}; + +Foobar obj; +const Foobar* objPtr = &obj; +foo* f = (foo*)objPtr; + +int main () { + if (f->a != 1 || f->b != 2) + abort (); +} + diff --git a/gcc/testsuite/g++.dg/expr/cast6.C b/gcc/testsuite/g++.dg/expr/cast6.C new file mode 100644 index 000000000..434a04669 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast6.C @@ -0,0 +1,6 @@ +void f(int &); +void f(const int &); +int main() { + volatile int x = 2; + f((int)x); +} diff --git a/gcc/testsuite/g++.dg/expr/cast7.C b/gcc/testsuite/g++.dg/expr/cast7.C new file mode 100644 index 000000000..c948919e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast7.C @@ -0,0 +1,13 @@ +// PR c++/27177 + +struct X {}; + +struct Y : virtual X {}; +struct Z : virtual X {}; + +struct A : Y, Z {}; + +struct B : A +{ + static const int i = sizeof((Z*)(B*)0); +}; diff --git a/gcc/testsuite/g++.dg/expr/cast8.C b/gcc/testsuite/g++.dg/expr/cast8.C new file mode 100644 index 000000000..9f1ce36f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast8.C @@ -0,0 +1,11 @@ +// PR c++/29886 + +struct A { + static int x[1]; +}; + +void foo(int i) +{ + if (int(A::x[i])) {} +} + diff --git a/gcc/testsuite/g++.dg/expr/cast9.C b/gcc/testsuite/g++.dg/expr/cast9.C new file mode 100644 index 000000000..150183a38 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cast9.C @@ -0,0 +1,12 @@ +// PR c++/27177 + +struct Z {}; +struct A : Z {}; + +Z* implicitToZ (Z*); + +struct B : A +{ + static const int i = sizeof(implicitToZ((B*)0)); +}; + diff --git a/gcc/testsuite/g++.dg/expr/comma1.C b/gcc/testsuite/g++.dg/expr/comma1.C new file mode 100644 index 000000000..5424ce1a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/comma1.C @@ -0,0 +1,21 @@ +// { dg-do run } + +extern "C" void abort (); + +struct gtst +{ + unsigned char data[2]; +}; + +static struct gtst s; + +int main(int argc, char *argv[]) +{ + unsigned char * pc; + struct gtst * ps; + ps = &s; + pc = (ps->data[0]='A', ps->data); + if (&s.data[0] != pc) + abort(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/expr/cond1.C b/gcc/testsuite/g++.dg/expr/cond1.C new file mode 100644 index 000000000..8fb3c0f4f --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cond1.C @@ -0,0 +1,28 @@ +// { dg-do run } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 17 Oct 2002 <nathan@codesourcery.com> + +// PR 7209. We didn't SAVE_EXPR in the right place + +char a[2][1][16]={ + {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, + {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}}; + +int f() {return 0;} + +char * Foo (int d) +{ + char *c1; + + c1=a[d==0 ? 0 : 1][f()]; + + return c1; +} + +int main () +{ + if (Foo (0) != (void *)a) + return 1; + return 0; +} diff --git a/gcc/testsuite/g++.dg/expr/cond2.C b/gcc/testsuite/g++.dg/expr/cond2.C new file mode 100644 index 000000000..68a26a22f --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cond2.C @@ -0,0 +1,12 @@ +struct Term { }; +struct Boolean : Term { + explicit Boolean(bool); +}; +struct IsZero : Term { + Term *eval(); +}; +Term* +IsZero::eval() +{ + return true ? new Boolean(false) : this; // { dg-error "conditional expression" } +} diff --git a/gcc/testsuite/g++.dg/expr/cond3.C b/gcc/testsuite/g++.dg/expr/cond3.C new file mode 100644 index 000000000..50a4d9a13 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cond3.C @@ -0,0 +1,6 @@ +const int i = 7; +const int j = 3; + +void f(bool b) { + &(b ? i : j); +} diff --git a/gcc/testsuite/g++.dg/expr/cond4.C b/gcc/testsuite/g++.dg/expr/cond4.C new file mode 100644 index 000000000..fff5c8b18 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cond4.C @@ -0,0 +1,16 @@ +// PR c++/13971 + +struct QChar { + static const QChar null; +}; +struct QCharRef { + operator QChar() const; +}; +struct QString { + QCharRef operator[](int i); +}; + +QChar fillParagraph(QString s, int psi) { + return psi ? QChar::null : s[psi]; +} + diff --git a/gcc/testsuite/g++.dg/expr/cond6.C b/gcc/testsuite/g++.dg/expr/cond6.C new file mode 100644 index 000000000..943aa85a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cond6.C @@ -0,0 +1,24 @@ +// { dg-do run } + +extern "C" void abort (); + +struct B { + B() {} + B(const B& b) { abort (); } +}; + +struct D : public B { + D() {} + D(const D& d) : B() {} +}; + +D d; +B b; + +D f() { + return d; +} + +int main () { + b = (true ? f() : b); +} diff --git a/gcc/testsuite/g++.dg/expr/cond7.C b/gcc/testsuite/g++.dg/expr/cond7.C new file mode 100644 index 000000000..05e8eab44 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cond7.C @@ -0,0 +1,12 @@ +// PR c++/19148 + +struct QChar { + QChar (char c); + QChar (const QChar &); + unsigned short ucs; +}; + +void f(QChar *uc, unsigned short ch, QChar replacement) +{ + *uc++ = ((ch) ? QChar((1)) : replacement); +} diff --git a/gcc/testsuite/g++.dg/expr/cond8.C b/gcc/testsuite/g++.dg/expr/cond8.C new file mode 100644 index 000000000..11708ec0f --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cond8.C @@ -0,0 +1,13 @@ +// PR c++/22434 +// { dg-options "" } + +struct A +{ + A(void*); // { dg-error "initializing" } + ~A(); +}; + +void foo(const int i, bool b) +{ + b ? A(0) : i; // { dg-error "conversion" } +} diff --git a/gcc/testsuite/g++.dg/expr/cond9.C b/gcc/testsuite/g++.dg/expr/cond9.C new file mode 100644 index 000000000..e8e1397c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/cond9.C @@ -0,0 +1,12 @@ +// PR c++/27666 + +struct A { // { dg-message "A" } + A(int); // { dg-message "A" } +}; + +void foo(volatile A a) { + 1 ? a : 0; // { dg-error "match|temporary" } + // { dg-message "candidate" "candidate note" { target *-*-* } 8 } + 1 ? 0 : a; // { dg-error "match|temporary" } + // { dg-message "candidate" "candidate note" { target *-*-* } 10 } +} diff --git a/gcc/testsuite/g++.dg/expr/copy1.C b/gcc/testsuite/g++.dg/expr/copy1.C new file mode 100644 index 000000000..57036d3f0 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/copy1.C @@ -0,0 +1,28 @@ +// PR c++/14035 +// { dg-do run } + +extern "C" void abort(); + +struct Blob { + int x, y; + Blob() { } + Blob(const Blob &b) { abort (); } +}; +struct Blobby : public Blob { }; + +struct Wooly { + operator const Blobby & () + { + return myBlobby; + } + Blobby myBlobby; +}; + +void catcher(const Blob &blo) +{ } + +int main() +{ + Wooly wooly; + catcher((const Blob &)wooly); +} diff --git a/gcc/testsuite/g++.dg/expr/crash-1.C b/gcc/testsuite/g++.dg/expr/crash-1.C new file mode 100644 index 000000000..d8d689fd6 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/crash-1.C @@ -0,0 +1,15 @@ +// C++ PR/10476 +// Origin: larsbj@gullik.net and bangerth@dealii.org + + +struct X { + X(); + X(const X& __str); +}; +X const bar(); +void foo() +{ + X y; + (true ? y : bar()); +} + diff --git a/gcc/testsuite/g++.dg/expr/crash2.C b/gcc/testsuite/g++.dg/expr/crash2.C new file mode 100644 index 000000000..5379bb159 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/crash2.C @@ -0,0 +1,14 @@ +// PR c++/14267 + +class foo { +public: static int& x; +}; +int temp; +int& foo::x=temp; + +int main() { + int x = 3; + &foo::x = x; // { dg-error "" } + return 0; +} + diff --git a/gcc/testsuite/g++.dg/expr/dtor1.C b/gcc/testsuite/g++.dg/expr/dtor1.C new file mode 100644 index 000000000..0775a93c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/dtor1.C @@ -0,0 +1,7 @@ +class Foo; // { dg-error "" } + +void +bar(void* p) +{ + static_cast<Foo*>(p)->~Foo(); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/expr/dtor2.C b/gcc/testsuite/g++.dg/expr/dtor2.C new file mode 100644 index 000000000..5f372424e --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/dtor2.C @@ -0,0 +1,6 @@ +typedef const int I; +int i; + +void f() { + i.I::~I(); +} diff --git a/gcc/testsuite/g++.dg/expr/dtor3.C b/gcc/testsuite/g++.dg/expr/dtor3.C new file mode 100644 index 000000000..036e9f2a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/dtor3.C @@ -0,0 +1,10 @@ +struct B { + ~B(); +}; +struct D : public B { + ~D(); +}; + +void f(D d) { + d.B::~B(); +} diff --git a/gcc/testsuite/g++.dg/expr/dtor4.C b/gcc/testsuite/g++.dg/expr/dtor4.C new file mode 100644 index 000000000..7aed80a69 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/dtor4.C @@ -0,0 +1,10 @@ +typedef int C; +typedef double D; + +void +f () +{ + C o; + + o.D::~C (); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/expr/enum1.C b/gcc/testsuite/g++.dg/expr/enum1.C new file mode 100644 index 000000000..40dc5faf6 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/enum1.C @@ -0,0 +1,10 @@ +// { dg-do run } + +extern "C" void abort(); +int main() +{ + enum { shelf = 4 } t = shelf; + if (!(t & shelf)) + abort (); +} + diff --git a/gcc/testsuite/g++.dg/expr/for1.C b/gcc/testsuite/g++.dg/expr/for1.C new file mode 100644 index 000000000..baffd424a --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/for1.C @@ -0,0 +1,14 @@ +// PR c++/13663 + +struct S { + void f(); +}; + +void g(int); +void g(double); + +void h () { + S s; + for (;;s.f); // { dg-error "" } + for (;;g); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/expr/for2.C b/gcc/testsuite/g++.dg/expr/for2.C new file mode 100644 index 000000000..52f769641 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/for2.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// PR c++/17661 +// We used to try to create a temprary for the condition +// expression in the for which was wrong. + + +struct C +{ + C (const C &x); +}; +C &f(); +void breakme (C j, bool k) +{ + for (;; k ? j : f()) ; +} diff --git a/gcc/testsuite/g++.dg/expr/incomplete1.C b/gcc/testsuite/g++.dg/expr/incomplete1.C new file mode 100644 index 000000000..03e363a3d --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/incomplete1.C @@ -0,0 +1,14 @@ +// PR 10202 +// { dg-do compile } +// { dg-options -O0 } + +extern struct _smtp_account smtp_accounts[]; +typedef struct _smtp_account { + int flags; +} Smtp_Account; + +void get_smtp_host_info () +{ + if (smtp_accounts[0].flags & 0x01) + get_smtp_host_info(); +} diff --git a/gcc/testsuite/g++.dg/expr/lval1.C b/gcc/testsuite/g++.dg/expr/lval1.C new file mode 100644 index 000000000..bed47d8e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/lval1.C @@ -0,0 +1,7 @@ +// Contributed by Matt Austern <austern@apple.com> + +void f () +{ + int n; + (char) n = 1; // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/expr/lval2.C b/gcc/testsuite/g++.dg/expr/lval2.C new file mode 100644 index 000000000..5d062f1c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/lval2.C @@ -0,0 +1,27 @@ +// PR c++/19199 + +// { dg-do run } + +// We used to turn the COND_EXPR lvalue into a MIN_EXPR rvalue, and +// then return a reference to a temporary in qMin. + +#include <assert.h> + +enum Foo { A, B }; + +template<typename T> T &qMin(T &a, T &b) +{ + return a < b ? a : b; +} + +int main (int, char **) +{ + Foo f = A; + Foo g = B; + Foo &h = qMin(f, g); + assert (&h == &f || &h == &g); + const Foo &i = qMin((const Foo&)f, (const Foo&)g); + assert (&i == &f || &i == &g); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/expr/lval3.C b/gcc/testsuite/g++.dg/expr/lval3.C new file mode 100644 index 000000000..f106e6961 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/lval3.C @@ -0,0 +1,9 @@ +// i++ is never an lvalue +void +f() +{ + bool i = 0; + i++ = 3; // { dg-error "" } +} + + diff --git a/gcc/testsuite/g++.dg/expr/lval4.C b/gcc/testsuite/g++.dg/expr/lval4.C new file mode 100644 index 000000000..c66e2f6af --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/lval4.C @@ -0,0 +1,9 @@ +// ++i is always an lvalue +void +f() +{ + bool i = 0; + ++i = 3; +} + + diff --git a/gcc/testsuite/g++.dg/expr/member-of-incomplete-type-1.C b/gcc/testsuite/g++.dg/expr/member-of-incomplete-type-1.C new file mode 100644 index 000000000..9fe65bc97 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/member-of-incomplete-type-1.C @@ -0,0 +1,12 @@ +// Copyright (C) 2002 Free Software Foundation +// Origin: jmr@fulcrummicro.com +// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net> + + +struct A; + +int main() +{ + A::g(); // { dg-error "incomplete" "" } +} + diff --git a/gcc/testsuite/g++.dg/expr/minmax.C b/gcc/testsuite/g++.dg/expr/minmax.C new file mode 100644 index 000000000..407a92bb4 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/minmax.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +void f(void) +{ + int a, b; + (a >? b) = 1; // { dg-error "" } +} + + +void g(void) +{ + int a, b; + (a <? b) = 1; // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/expr/overflow1.C b/gcc/testsuite/g++.dg/expr/overflow1.C new file mode 100644 index 000000000..b67b4e42e --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/overflow1.C @@ -0,0 +1,8 @@ +#include <limits.h> + +enum E { + A = (unsigned char)-1, /* OK */ + B = (signed char)UCHAR_MAX, /* implementation-defined */ + C = INT_MAX+1, /* undefined (C)/ill-formed (C++) { dg-message "" } */ + D = UINT_MAX+1 /* OK */ +}; diff --git a/gcc/testsuite/g++.dg/expr/pmf-1.C b/gcc/testsuite/g++.dg/expr/pmf-1.C new file mode 100644 index 000000000..3dd01c6b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/pmf-1.C @@ -0,0 +1,20 @@ +// C++ PR/2521 +// Copyright (C) 2002 Free Software Foundation +// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net> + +// { dg-do compile } + +struct A +{ + void f(); + void foo(void (A::*)(int)); // { dg-message "void A::foo|no known conversion" "" } + template<typename T> + void g(T); + void h() + { + void (A::*p)() = &A::f; + void (A::*q)() = &(A::f); // { dg-error "parenthesized" "" } + foo(&g<int>); // { dg-error "no matching" "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 17 } + } +}; diff --git a/gcc/testsuite/g++.dg/expr/pr19355-1.C b/gcc/testsuite/g++.dg/expr/pr19355-1.C new file mode 100644 index 000000000..ce11b8188 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/pr19355-1.C @@ -0,0 +1,11 @@ +// PR c++/19355 +// { dg-do compile } + +typedef bool Boolean; +extern Boolean is_nil (); +void f(void) +{ + unsigned int ilen; + if(!((ilen > 0 ? !is_nil () : 1))) {} +} + diff --git a/gcc/testsuite/g++.dg/expr/pr29066.C b/gcc/testsuite/g++.dg/expr/pr29066.C new file mode 100644 index 000000000..8bf6bb0a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/pr29066.C @@ -0,0 +1,42 @@ +// PR c++/29066 +// Test pointer to member function comparison +// { dg-do run } + +extern "C" void abort (void); + +struct X +{ + virtual void a(void)=0; +}; + +struct Z : public X +{ + void a(void) {} +}; + + +void f(X *obj) +{ + void (X::*xp)(void) = 0; + void (X::*xp2)(void) = 0; + + xp = &X::a; + + if (xp == xp2) + { + abort(); + } + + if (xp == 0) + { + abort(); + } +} + +int main(int argc, char* argv[]) +{ + Z myobj; + + f(&myobj); + return 0; +} diff --git a/gcc/testsuite/g++.dg/expr/ptrmem1.C b/gcc/testsuite/g++.dg/expr/ptrmem1.C new file mode 100644 index 000000000..146143a1e --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/ptrmem1.C @@ -0,0 +1,33 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 2 Aug 2003 <nathan@codesourcery.com> + +// PR 11766. ICE + +template<typename T> +struct normal_iterator +{ + normal_iterator(const T& __i); +}; + + +template<typename _Tp> +struct vector +{ + void end() const { normal_iterator<const _Tp*> (this->pt); } + void size() const { end(); } + _Tp* pt; +}; + + + +struct MuonTag { + typedef void (MuonTag::*Selector)(); +}; + +void foo() +{ + vector<MuonTag::Selector> _selectors; + _selectors.size(); +} diff --git a/gcc/testsuite/g++.dg/expr/ptrmem4.C b/gcc/testsuite/g++.dg/expr/ptrmem4.C new file mode 100644 index 000000000..0803c9e63 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/ptrmem4.C @@ -0,0 +1,16 @@ +// PR c++/15471 +// { dg-do run } + +struct myclass { + unsigned a; + union { + unsigned x; + }; +}; + +int main () { + myclass foo; + unsigned myclass::* member = &myclass::x; + if (&(foo.*member) != &foo.x) + return 1; +} diff --git a/gcc/testsuite/g++.dg/expr/ptrmem5.C b/gcc/testsuite/g++.dg/expr/ptrmem5.C new file mode 100644 index 000000000..e36983d02 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/ptrmem5.C @@ -0,0 +1,7 @@ +// PR c++/15696 + +struct A {}; + +typedef void (A::*ftype)(); + +void foo() { A().*ftype(); } // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/expr/ptrmem6.C b/gcc/testsuite/g++.dg/expr/ptrmem6.C new file mode 100644 index 000000000..0c75385fb --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/ptrmem6.C @@ -0,0 +1,12 @@ +// PR C++/21614 +// { dg-additional-sources "ptrmem6a.C" } +// { dg-do run } + +extern struct Z *p; +extern int (Z::*m) (); + +int main () { + if ((p->*m)() == 7) + return 0; + return 1; +} diff --git a/gcc/testsuite/g++.dg/expr/ptrmem6a.C b/gcc/testsuite/g++.dg/expr/ptrmem6a.C new file mode 100644 index 000000000..8dad81c58 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/ptrmem6a.C @@ -0,0 +1,9 @@ +struct Z { + int f(); +}; + +int Z::f() { return 7; } + +struct Z z; +int (Z::*m)() = &Z::f; +struct Z*p = &z; diff --git a/gcc/testsuite/g++.dg/expr/ptrmem7.C b/gcc/testsuite/g++.dg/expr/ptrmem7.C new file mode 100644 index 000000000..a94990e54 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/ptrmem7.C @@ -0,0 +1,21 @@ +// PR c++/22545 + +struct A { + int member; + A() : member(13) {} +}; + +A a; + +struct B { + operator A*() { return &a; } +}; + +B b; + +int A::* member_pntr = &A::member; + +int main() +{ + return b ->* member_pntr; +} diff --git a/gcc/testsuite/g++.dg/expr/return1.C b/gcc/testsuite/g++.dg/expr/return1.C new file mode 100644 index 000000000..7a64988e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/return1.C @@ -0,0 +1,9 @@ +// PR c++/18545 + +struct A; + +A foo() // { dg-error "" } +{ + A a; // { dg-error "" } + return a; +} diff --git a/gcc/testsuite/g++.dg/expr/sizeof1.C b/gcc/testsuite/g++.dg/expr/sizeof1.C new file mode 100644 index 000000000..fa84481fa --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/sizeof1.C @@ -0,0 +1,7 @@ +// PR c++/12989 + +struct A +{ + int foo() { return sizeof(bar); } // { dg-error "" } + int bar(); +}; diff --git a/gcc/testsuite/g++.dg/expr/sizeof2.C b/gcc/testsuite/g++.dg/expr/sizeof2.C new file mode 100644 index 000000000..ca14ff79f --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/sizeof2.C @@ -0,0 +1,30 @@ +// { dg-do compile } +// Contributed by Wolfgang Bangerth <bangerth at ticam dot utexas dot edu> +// PR c++/9259: Allow non-qualified member calls in sizeof expressions. + +template <bool> struct StaticAssert; +template <> struct StaticAssert<true> {}; + +struct S +{ + static int check (); + static double check2 (); + static const int value = sizeof(check()); + static const int value2 = sizeof(check2()); +}; + +template <class> +struct T +{ + static int check (); + static double check2 (); + static const int value = sizeof(check()); + static const int value2 = sizeof(check2()); +}; + +StaticAssert<(S::value == sizeof(int))> s; +StaticAssert<(S::value2 == sizeof(double))> s2; + +StaticAssert<(T<void>::value == sizeof(int))> t; +StaticAssert<(T<void>::value2 == sizeof(double))> t2; + diff --git a/gcc/testsuite/g++.dg/expr/sizeof3.C b/gcc/testsuite/g++.dg/expr/sizeof3.C new file mode 100644 index 000000000..31338b0b1 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/sizeof3.C @@ -0,0 +1,4 @@ +// PR c++/15337 + +class CCC; +int main() { sizeof(CCC); return 0; } // { dg-error ".*CCC.*" } diff --git a/gcc/testsuite/g++.dg/expr/static_cast1.C b/gcc/testsuite/g++.dg/expr/static_cast1.C new file mode 100644 index 000000000..f1d88bff3 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/static_cast1.C @@ -0,0 +1,5 @@ +void foo(int x) +{ + static_cast<const unsigned int&>(x); +} + diff --git a/gcc/testsuite/g++.dg/expr/static_cast2.C b/gcc/testsuite/g++.dg/expr/static_cast2.C new file mode 100644 index 000000000..7b5d46ded --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/static_cast2.C @@ -0,0 +1,7 @@ +struct B {}; + +int main () { + B a; + (1 ? static_cast<B&>(a) : + *static_cast<B*>(&a)); +} diff --git a/gcc/testsuite/g++.dg/expr/static_cast3.C b/gcc/testsuite/g++.dg/expr/static_cast3.C new file mode 100644 index 000000000..744648c3f --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/static_cast3.C @@ -0,0 +1,24 @@ +template <class T> struct static_abort {}; + +template <class E> +struct any +{ + const E& self() const { return static_cast<const E&>(*this); } +}; + +struct range : public any<range> +{ + range() {} + + template <class U> + range(const U&) + { + typedef typename static_abort<U>::ret t; + } +}; + +int main() +{ + const any<range>& r = *new range(); + r.self(); +} diff --git a/gcc/testsuite/g++.dg/expr/static_cast4.C b/gcc/testsuite/g++.dg/expr/static_cast4.C new file mode 100644 index 000000000..cea7f4873 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/static_cast4.C @@ -0,0 +1,11 @@ +class C { +public: + explicit C(int) {} +}; + +int main() +{ + int i = 0; + static_cast<C>(i); + return 0; +} diff --git a/gcc/testsuite/g++.dg/expr/static_cast5.C b/gcc/testsuite/g++.dg/expr/static_cast5.C new file mode 100644 index 000000000..1a51f1516 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/static_cast5.C @@ -0,0 +1,17 @@ +void ambig() +{ + struct A {}; + struct B : A {}; + struct C : A {}; + struct D : B, C {}; + + D d; + A* ap = static_cast<B*> (&d); + D* db = static_cast<D*> (ap); // { dg-error "" } + + D& dr1 = static_cast<D&> (*ap); // { dg-error "" } + + A& ar = static_cast<C&> (d); + D& dr = static_cast<D&> (ar); // { dg-error "" } +} + diff --git a/gcc/testsuite/g++.dg/expr/static_cast6.C b/gcc/testsuite/g++.dg/expr/static_cast6.C new file mode 100644 index 000000000..90f32f1d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/static_cast6.C @@ -0,0 +1,15 @@ +// PR c++/21853 + +struct blah { + int a; +}; + +int main( int argc, char ** argv ) { + int blah::* ptdma = &blah::a; + + const void *ptdmv = static_cast< void * >( &ptdma ); + + int blah::* const ptdmb = * static_cast< int blah::* const * >( ptdmv ); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/expr/static_cast7.C b/gcc/testsuite/g++.dg/expr/static_cast7.C new file mode 100644 index 000000000..bced805bc --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/static_cast7.C @@ -0,0 +1,10 @@ +// Regression test for bug 39415 (and its duplicate 44916). +struct S {}; +struct T : S {}; +int f(const T*) {} +void f(T*); +int main() { + S* s(0); + int a = f(static_cast<const T*>(s)); + int b = f(static_cast<const T*>(0)); +} diff --git a/gcc/testsuite/g++.dg/expr/stdarg1.C b/gcc/testsuite/g++.dg/expr/stdarg1.C new file mode 100644 index 000000000..85b6f7460 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/stdarg1.C @@ -0,0 +1,13 @@ +// PR c++/23840 + +#include <stdarg.h> +struct S +{ + int f(int); +}; +void f(int i, ...) +{ + va_list ap; + va_start (ap, i); + va_arg (ap, S).f(0); +} diff --git a/gcc/testsuite/g++.dg/expr/stdarg2.C b/gcc/testsuite/g++.dg/expr/stdarg2.C new file mode 100644 index 000000000..cf2eabcb1 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/stdarg2.C @@ -0,0 +1,30 @@ +// PR target/26141 + +#include <stdarg.h> + +struct S +{ + double a; +}; + +void +foo (int z, ...) +{ + struct S arg; + va_list ap; + arg = va_arg (ap, struct S); +} + + +struct T +{ + __complex__ float a; +}; + +void +bar (int z, ...) +{ + struct T arg; + va_list ap; + arg = va_arg (ap, struct T); +} diff --git a/gcc/testsuite/g++.dg/expr/stmt-expr-1.C b/gcc/testsuite/g++.dg/expr/stmt-expr-1.C new file mode 100644 index 000000000..c4db5157f --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/stmt-expr-1.C @@ -0,0 +1,36 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/40866 +// { dg-options "-std=gnu++98" } +// { dg-do compile } + +template <typename T> class QForeachContainer { +public: + QForeachContainer(); + int brk; + typename T::const_iterator i; +}; + +template <typename T> class QList { +public: + class const_iterator { + public: + const_iterator(const const_iterator &o); + const_iterator &operator++(); + }; +}; + +class QAction; +class QWidget { +public: + QList<QAction*> actions() const; +}; +class myDialog : public QWidget { + myDialog(); +}; + +myDialog::myDialog() +{ + QForeachContainer<__typeof__(actions())> _container_; + ({++_container_.brk; ++_container_.i;}); +} + diff --git a/gcc/testsuite/g++.dg/expr/string-1.C b/gcc/testsuite/g++.dg/expr/string-1.C new file mode 100644 index 000000000..9a0a5ff7b --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/string-1.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// This testcase used to seg fault (PR c++/38648) + +// { dg-prune-output "initializer lists" } + +char a[1]; + +int foo( +{ + a = ""; // { dg-error "" } + return 0; // { dg-error "" } +} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/expr/string-2.C b/gcc/testsuite/g++.dg/expr/string-2.C new file mode 100644 index 000000000..252fa7036 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/string-2.C @@ -0,0 +1,10 @@ +// { dg-do compile } +// This testcase used to seg fault (PR c++/38648) + +char a[1]; + +int foo(a = "") // { dg-error "invalid array assignment" } +{ // { dg-error "" } + return 0; +} + diff --git a/gcc/testsuite/g++.dg/expr/unary1.C b/gcc/testsuite/g++.dg/expr/unary1.C new file mode 100644 index 000000000..4ea230f01 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/unary1.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// Unary plus (but not unary minus) can be applied to pointer types + +void *p; + +void f(void) +{ + -p; // { dg-error "wrong type argument" } + +p; +} + +template <int> +void g(void) +{ + -p; // { dg-error "wrong type argument" } + +p; +} diff --git a/gcc/testsuite/g++.dg/expr/unary2.C b/gcc/testsuite/g++.dg/expr/unary2.C new file mode 100644 index 000000000..841881591 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/unary2.C @@ -0,0 +1,20 @@ +// { dg-do compile } +// Unary plus/minus are not lvalues. + +// In templates we require an instantiation to emit the diagnostic. This +// is wrong and it is PR 18474. + +int n; + +void f(void) +{ + -n = 0; // { dg-error "lvalue" } + +n = 0; // { dg-error "lvalue" } +} + +template <int> +void g(void) +{ + -n = 0; // { dg-error "lvalue" "" { xfail *-*-* } } + +n = 0; // { dg-error "lvalue" "" { xfail *-*-* } } +} diff --git a/gcc/testsuite/g++.dg/expr/unary3.C b/gcc/testsuite/g++.dg/expr/unary3.C new file mode 100644 index 000000000..abca0322d --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/unary3.C @@ -0,0 +1,11 @@ +// PR c++/41131 +// { dg-do compile } + +struct X { enum E { a = 100 }; }; + +int +main () +{ + X x; + (void) &x.a; // { dg-error "lvalue required" } +} diff --git a/gcc/testsuite/g++.dg/expr/volatile1.C b/gcc/testsuite/g++.dg/expr/volatile1.C new file mode 100644 index 000000000..712c9e0fb --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/volatile1.C @@ -0,0 +1,9 @@ +// PR c++/23167 + +struct dom +{ + static int tostr(); + void eval_old() volatile{tostr();} + ~dom() throw(); +}; + diff --git a/gcc/testsuite/g++.dg/ext/alias-canon.C b/gcc/testsuite/g++.dg/ext/alias-canon.C new file mode 100644 index 000000000..843dec00c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/alias-canon.C @@ -0,0 +1,41 @@ +// PR c++/34935 +/* { dg-do compile } */ +/* { dg-final { scan-assembler "_Z1fi" } } */ +/* { dg-final { scan-assembler "_Z1fb" } } */ +/* { dg-final { scan-assembler "_Z1fd" } } */ +/* { dg-final { scan-assembler "_Z1ff" } } */ +/* { dg-final { scan-assembler "_Z1fw" } } */ + +typedef int INT __attribute((may_alias)); + +void f(int); +void f(INT) { } + +typedef bool BOOL __attribute((may_alias)); + +void f(bool); +void f(BOOL) { } + +typedef float FLOAT __attribute((may_alias)); + +void f(float); +void f(FLOAT) { } + +typedef double DOUBLE __attribute((may_alias)); + +void f(double); +void f(DOUBLE) {} + +typedef wchar_t WCHAR_T __attribute((may_alias)); + +void f(wchar_t); +void f(WCHAR_T) {} + +void test() +{ + f(0); + f(true); + f(1.0f); + f(1.0); + f(L'f'); +} diff --git a/gcc/testsuite/g++.dg/ext/alias-canon2.C b/gcc/testsuite/g++.dg/ext/alias-canon2.C new file mode 100644 index 000000000..4833db852 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/alias-canon2.C @@ -0,0 +1,36 @@ +// { dg-do compile } +// PR c++/37553 +typedef unsigned int ui32; +__extension__ typedef unsigned long long int ui64; + +typedef ui32 __attribute__ ((__may_alias__)) ui32a; +typedef ui64 __attribute__ ((__may_alias__)) ui64a; + +union u_u32 +{ + ui32a v; +} __attribute__ ((__may_alias__)); + +union u_u64 +{ + ui64a v; + struct + { + union u_u32 lo32, hi32; + } u; +} __attribute__ ((__may_alias__)); + +void +out_long (ui64 longVal) +{ + if ((*(union u_u64 *) &longVal).u.lo32.v < 0x10000000ul) + { + if ((ui32) ((*(union u_u64 *) &longVal).u.lo32.v) < 0x4000u) + { + /* do something useful */ + } + } +} + +void f(ui32 *) { } +void f(ui32a *) { } diff --git a/gcc/testsuite/g++.dg/ext/alias-mangle.C b/gcc/testsuite/g++.dg/ext/alias-mangle.C new file mode 100644 index 000000000..a7706e996 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/alias-mangle.C @@ -0,0 +1,11 @@ +// PR c++/34936 +// { dg-do compile } +/* { dg-final { scan-assembler "_ZN1AIdEC1Ev" } } */ +typedef double X __attribute((may_alias)) ; + +template<typename> struct A +{ + A(); +}; + +A<X> a; diff --git a/gcc/testsuite/g++.dg/ext/align1.C b/gcc/testsuite/g++.dg/ext/align1.C new file mode 100644 index 000000000..6c960c396 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/align1.C @@ -0,0 +1,21 @@ +// Test that __attribute__ ((aligned)) is preserved. +// The alignment used to be 64 but Cygwin does not +// support an alignment greater than 16 and COFF +// not support an alignment greater than 4. + +extern "C" int printf (const char *, ...); + +typedef float at[4][4] __attribute__ ((aligned)); + +float dummy[4][4][15]; + +static volatile at a1[15]; + +float f1 __attribute__ ((aligned)); + +int +main (void) +{ + printf ("%d %d\n", __alignof (a1), __alignof (f1)); + return (__alignof (a1) < __alignof (f1)); +} diff --git a/gcc/testsuite/g++.dg/ext/align2.C b/gcc/testsuite/g++.dg/ext/align2.C new file mode 100644 index 000000000..da54bd938 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/align2.C @@ -0,0 +1,14 @@ +// PR c++/10179 + +struct __attribute((aligned(__alignof(double)))) A +{ /* empty */ }; + +struct T : public A +{ + char c; +}; + +template<bool> struct StaticAssert; +template<> struct StaticAssert<true> {}; + +StaticAssert<__alignof(T) == __alignof(double)> d; diff --git a/gcc/testsuite/g++.dg/ext/alignof1.C b/gcc/testsuite/g++.dg/ext/alignof1.C new file mode 100644 index 000000000..36661c1f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/alignof1.C @@ -0,0 +1,19 @@ +// { dg-do run } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Gabriel Dos Reis <gdr@codesourcery.com>, 2002-07-20 +// Bug PR/7363. + +template<typename T> +int my_alignof() +{ + return __alignof__ (T); +} + +template<typename> + struct X { }; + +int main() +{ + return !my_alignof<X<void> >(); +} diff --git a/gcc/testsuite/g++.dg/ext/alignof2.C b/gcc/testsuite/g++.dg/ext/alignof2.C new file mode 100644 index 000000000..8bc8a9c01 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/alignof2.C @@ -0,0 +1,25 @@ +// PRs 16387 and 16389 +// We were treating alignof (sa.a) as alignof (typeof (sa.a)), which is +// wrong for some fields. + +// { dg-do run } + +extern "C" void abort(); + +struct A +{ + double a; +} sa; + +struct B +{ + char c; + double b; +} sb; + +int main() +{ + if (__alignof (sa) != __alignof (sa.a) + || __alignof (sb) != __alignof (sb.b)) + abort(); +} diff --git a/gcc/testsuite/g++.dg/ext/altivec-1.C b/gcc/testsuite/g++.dg/ext/altivec-1.C new file mode 100644 index 000000000..cd7c3aad2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-1.C @@ -0,0 +1,16 @@ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec" } */ + +#include <altivec.h> + +int main() +{ + return 0; +} + +class F32vec4 { +public: + vector float val; + vector float operator++(void) { return val;} +}; diff --git a/gcc/testsuite/g++.dg/ext/altivec-10.C b/gcc/testsuite/g++.dg/ext/altivec-10.C new file mode 100644 index 000000000..7f7d2b013 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-10.C @@ -0,0 +1,22 @@ +/* This is a compile-only test for interaction of "-maltivec" and "-save-temps". */ +/* Author: Ziemowit Laski <zlaski@apple.com>. */ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-save-temps -maltivec" } */ + +#include <altivec.h> + +#define vector_float vector float +#define vector_float_foo vector float foo +#define vector_float_bar_eq vector float bar = + +/* NB: Keep the following split across three lines. */ +vector +int +a1 = { 100, 200, 300, 400 }; + +vector_float f1 = { 1.0, 2.0, 3.0, 4.0 }; +vector_float_foo = { 3.0, 4.0, 5.0, 6.0 }; +vector_float_bar_eq { 8.0, 7.0, 6.0, 5.0 }; + +/* { dg-final { cleanup-saved-temps } } */ diff --git a/gcc/testsuite/g++.dg/ext/altivec-11.C b/gcc/testsuite/g++.dg/ext/altivec-11.C new file mode 100644 index 000000000..ff3016953 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-11.C @@ -0,0 +1,12 @@ +/* Test handling of literal constant for dss operation. */ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec" } */ + +#include <altivec.h> + +void +foo () +{ + vec_dss (1); +} diff --git a/gcc/testsuite/g++.dg/ext/altivec-12.C b/gcc/testsuite/g++.dg/ext/altivec-12.C new file mode 100644 index 000000000..6f21da961 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-12.C @@ -0,0 +1,19 @@ +/* Test vec_dst* functions with float pointer as first argument. */ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec" } */ + +#include <altivec.h> + +extern int i; +extern float *fp; +extern vector float vf; + +void +foo () +{ + vec_dst (fp, i, 1); + vec_dstst (fp, i, 1); + vec_dststt (fp, i, 1); + vec_dstt (fp, i, 1); +} diff --git a/gcc/testsuite/g++.dg/ext/altivec-13.C b/gcc/testsuite/g++.dg/ext/altivec-13.C new file mode 100644 index 000000000..abc05af62 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-13.C @@ -0,0 +1,59 @@ +/* Check that vec_step can be used with const vector types. This + test is derived from parts of gcc.dg/vmx/8-02.c from Motorola's + AltiVec testsuite. */ + +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec" } */ + +#include <altivec.h> + +extern vector unsigned char vuc; +extern vector signed char vsc; +extern vector bool char vbc; +extern vector unsigned short vus; +extern vector signed short vss; +extern vector bool short vbs; +extern vector unsigned int vui; +extern vector signed int vsi; +extern vector bool int vbi; +extern vector pixel vp; +extern vector float vf; +extern const vector unsigned char cvuc; +extern const vector signed char cvsc; +extern const vector bool char cvbc; +extern const vector unsigned short cvus; +extern const vector signed short cvss; +extern const vector bool short cvbs; +extern const vector unsigned int cvui; +extern const vector signed int cvsi; +extern const vector bool int cvbi; +extern const vector pixel cvp; +extern const vector float cvf; + +void +foo (void) +{ + int i_vuc = vec_step (vuc); + int i_vsc = vec_step (vsc); + int i_vbc = vec_step (vbc); + int i_vus = vec_step (vus); + int i_vss = vec_step (vss); + int i_vbs = vec_step (vbs); + int i_vui = vec_step (vui); + int i_vsi = vec_step (vsi); + int i_vbi = vec_step (vbi); + int i_vp = vec_step (vp); + int i_vf = vec_step (vf); + int i_cvuc = vec_step (cvuc); + int i_cvsc = vec_step (cvsc); + int i_cvbc = vec_step (cvbc); + int i_cvus = vec_step (cvus); + int i_cvss = vec_step (cvss); + int i_cvbs = vec_step (cvbs); + int i_cvui = vec_step (cvui); + int i_cvsi = vec_step (cvsi); + int i_cvbi = vec_step (cvbi); + int i_cvp = vec_step (cvp); + int i_cvf = vec_step (cvf); +} diff --git a/gcc/testsuite/g++.dg/ext/altivec-14.C b/gcc/testsuite/g++.dg/ext/altivec-14.C new file mode 100644 index 000000000..e5dd81c75 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-14.C @@ -0,0 +1,13 @@ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec" } */ + +void f (__attribute__((altivec (vector__))) signed int * a, + __attribute__((altivec (vector__))) signed int * const b); + +int +foo (void) +{ + __attribute__((altivec (vector__))) signed int a[1], b[1]; + f (a, b); +} diff --git a/gcc/testsuite/g++.dg/ext/altivec-15.C b/gcc/testsuite/g++.dg/ext/altivec-15.C new file mode 100644 index 000000000..d8e982db4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-15.C @@ -0,0 +1,16 @@ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec -mno-vsx" } */ + +/* This test was added for an internal compiler error. The number and + content of error messages is irrelevant. */ + +struct SubData +{ + inline const Float Clamp(Float f, Float f0, Float f1) // { dg-error "" } + } + inline const void SinCos(Float angle, Float& sine, Float& cosine) // { dg-error "" } + { + C0 = __builtin_vec_splat(_simdCosEstCoefficients, 0); + C1 = __builtin_vec_splat(_simdCosEstCoefficients, 1); + diff --git a/gcc/testsuite/g++.dg/ext/altivec-16.C b/gcc/testsuite/g++.dg/ext/altivec-16.C new file mode 100644 index 000000000..91230d261 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-16.C @@ -0,0 +1,19 @@ +// PR c++/36662 +// { dg-do compile { target powerpc*-*-* } } +// { dg-require-effective-target powerpc_altivec_ok } +// { dg-options "-maltivec" } + +#define vector __attribute__((altivec (vector__))) + +template <typename c> struct S {}; + +template <> struct S<vector float> +{ + static vector float zero; +}; + +template <int> +void g (void) +{ + vector float t = S<vector float>::zero; +} diff --git a/gcc/testsuite/g++.dg/ext/altivec-17.C b/gcc/testsuite/g++.dg/ext/altivec-17.C new file mode 100644 index 000000000..099f8742e --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-17.C @@ -0,0 +1,16 @@ +// { dg-do compile { target powerpc*-*-* } } +// { dg-require-effective-target powerpc_altivec_ok } +// { dg-options "-maltivec" } + +// Make sure that bool vectors have distinct names to int vectors + +#define vector__ __attribute__((altivec (vector__))) +#define bool__ __attribute__((altivec(bool__))) + +typedef vector__ unsigned int simd_type; +typedef vector__ bool__ int bool_simd_type; + +void Foo (bool_simd_type const &a) +{ + simd_type const &v = a; // { dg-error "invalid initialization of reference of type" } +} diff --git a/gcc/testsuite/g++.dg/ext/altivec-2.C b/gcc/testsuite/g++.dg/ext/altivec-2.C new file mode 100644 index 000000000..eb8a92942 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-2.C @@ -0,0 +1,25 @@ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec -Wall -Wno-unused-but-set-variable" } */ + +/* This test checks if AltiVec builtins accept const-qualified + arguments. */ + +#include <altivec.h> + +vector unsigned char use_lvsl; + +int main (int argc, const char * argv[]) +{ + int i = 0; + const float cf = 1.0; + vector float v; + const vector float cv = (vector float){1.0, 2.0, 3.0, 4.0}; + + vec_dst(&cv, i, 0); + v = vec_ld(0, &cv); + v = vec_lde(0, &cf); + use_lvsl = vec_lvsl(0, &cf); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/altivec-3.C b/gcc/testsuite/g++.dg/ext/altivec-3.C new file mode 100644 index 000000000..151132059 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-3.C @@ -0,0 +1,137 @@ +/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */ +/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec" } */ + +/* Test for correct handling of AltiVec constants passed + through '...' (va_arg). */ + +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> + +#include <altivec.h> + +#define CHECK_INVARIANT(expr) \ + if (!(expr)) { \ + printf ("ASSERT FAILED: %d: %s\n", __LINE__, #expr); \ + abort (); \ + } + +struct foo { int x; int y; }; +struct vfoo { int x; __vector signed int v; int y; }; +union u { __vector signed int v; signed int i[4]; }; + +struct foo x_g = { 3, 4}; +struct vfoo vx_g = { 10, {11, 12, 13, 14}, 15 }; +__vector signed int v_g = {22, 23, 24, 25}; +struct vfoo vx2_g = { 30, {31, 32, 33, 34}, 35 }; +__vector signed int v2_g = {40, 41, 42, 43}; +int i_1 = 99, i_2 = 33; +double d_2 = 1.5, d_3 = 1.75; +double ld_1 = 1.25; + +void bar (int i, ... ) +{ + struct foo xi; + double d; + double ld; + float f; + char c; + short s; + va_list ap; + va_start(ap, i); + xi = va_arg(ap, struct foo); + s = (short)va_arg(ap, int); + f = (float)va_arg(ap, double); + ld = va_arg(ap, double); + c = (char)va_arg(ap, int); + d = va_arg(ap, double); + va_end(ap); + + CHECK_INVARIANT (xi.x == x_g.x && xi.y == x_g.y); + CHECK_INVARIANT (s == (short)i_2); + CHECK_INVARIANT (f == (float)d_2); + CHECK_INVARIANT (ld == ld_1); + CHECK_INVARIANT (c == (char)i_1); + CHECK_INVARIANT (d == d_3); +} + +void baz (int i, ... ) +{ + struct vfoo vx, vx2; + __vector signed int v_i, v2_i; + int j, k, l; + va_list ap; + va_start(ap, i); + v_i = va_arg(ap, __vector signed int); + j = va_arg(ap, int); + vx = va_arg(ap, struct vfoo); + k = va_arg(ap, int); + v2_i = va_arg(ap, __vector signed int); + l = va_arg(ap, int); + vx2 = va_arg(ap, struct vfoo); + va_end(ap); + + CHECK_INVARIANT (vec_all_eq (v_i, v_g)); + CHECK_INVARIANT (j == i_1); + CHECK_INVARIANT (vx.x == vx_g.x); + CHECK_INVARIANT (vec_all_eq (vx.v, vx_g.v)); + CHECK_INVARIANT (vx.y == vx_g.y); + CHECK_INVARIANT (k == i_1); + CHECK_INVARIANT (vec_all_eq (v2_i, v2_g)); + CHECK_INVARIANT (l == i_1); + CHECK_INVARIANT (vx2.x == vx2_g.x); + CHECK_INVARIANT (vec_all_eq (vx2.v, vx2_g.v)); + CHECK_INVARIANT (vx2.y == vx2_g.y); +} + +void quux (int i, ... ) +{ + __vector signed int v_i, v2_i; + union u vi, v2i; + va_list ap; + va_start(ap, i); + v_i = va_arg(ap, __vector signed int); + v2_i = va_arg(ap, __vector signed int); + va_end(ap); + vi.v = v_i; + v2i.v = v2_i; + + CHECK_INVARIANT (vec_all_eq (v_i, v_g)); + CHECK_INVARIANT (vec_all_eq (v2_i, v_g)); + CHECK_INVARIANT (vec_all_eq (vi.v, v_g)); + CHECK_INVARIANT (vec_all_eq (v2i.v, v_g)); +} + +void baz2 (int i, ... ) +{ + struct vfoo vx; + union u vxi; + va_list ap; + va_start(ap, i); + vx = va_arg(ap, struct vfoo); + va_end(ap); + vxi.v = vx.v; + + CHECK_INVARIANT (vx.x == vx_g.x); + CHECK_INVARIANT (vec_all_eq (vx.v, vx_g.v)); + CHECK_INVARIANT (vx.y == vx_g.y); + CHECK_INVARIANT (vec_all_eq (vxi.v, vx_g.v)); +} + +void main1(void) +{ + CHECK_INVARIANT (sizeof(struct foo) == 8 && sizeof(struct vfoo) == 48); + + bar(i_1, x_g, (short)i_2, (float)d_2, ld_1, (char)i_1, d_3); + baz(i_1, v_g, i_1, vx_g, i_1, v2_g, i_1, vx2_g); + quux(i_1, v_g, v_g); + baz2(i_1, vx_g); +} + +int main(void) +{ + main1(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/altivec-4.C b/gcc/testsuite/g++.dg/ext/altivec-4.C new file mode 100644 index 000000000..86a2615dc --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-4.C @@ -0,0 +1,12 @@ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec" } */ + +/* PR c++/14425 */ + +#include <altivec.h> + +vector unsigned int splat0(vector unsigned int x) +{ + return vec_splat(x, 0); +} diff --git a/gcc/testsuite/g++.dg/ext/altivec-5.C b/gcc/testsuite/g++.dg/ext/altivec-5.C new file mode 100644 index 000000000..04c26e80f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-5.C @@ -0,0 +1,16 @@ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec" } */ + +/* PR c++/14426 */ + +#include <altivec.h> + +vector unsigned int splat0u() +{ + return vec_splat_u32(0); +} +vector int splat0s() +{ + return vec_splat_s32(0); +} diff --git a/gcc/testsuite/g++.dg/ext/altivec-6.C b/gcc/testsuite/g++.dg/ext/altivec-6.C new file mode 100644 index 000000000..63ae0b0b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-6.C @@ -0,0 +1,28 @@ +/* Test for correct handling of literal arguments. */ +/* Author: Ziemowit Laski <zlaski@apple.com> */ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec" } */ + +#include <altivec.h> + +void foo(void) { + const unsigned char *buf; + vector pixel vp = { 3, 4, 5, 6 }; + vector bool int vbi = { 1, 0, 1, 0 }; + vector bool short vbs = { 1, 0, 1, 0, 1, 0, 1, 0 }; + vector bool char vbc = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }; + vector signed char vsc; + int a = 3; + + vec_dst(buf, a, 1); + vec_dstst(buf, a, 2); + vec_dststt(buf, a, 3); + vec_dststt(buf, a, 2); + + vp = vec_sld(vp, vp, 5); + vbc = vec_splat(vbc, 7); + vbs = vec_splat(vbs, 12); + vp = vec_splat(vp, 17); + vbi = vec_splat(vbi, 31); +} diff --git a/gcc/testsuite/g++.dg/ext/altivec-7.C b/gcc/testsuite/g++.dg/ext/altivec-7.C new file mode 100644 index 000000000..7c458fb00 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-7.C @@ -0,0 +1,36 @@ +/* Test for AltiVec type overloading and name mangling. */ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec" } */ + +#include <altivec.h> + +void foo(vector unsigned char) { } +void foo(vector signed char) { } +void foo(vector bool char) { } +void foo(vector unsigned short) { } +void foo(vector signed short) { } +void foo(vector bool short) { } +void foo(vector unsigned int) { } +void foo(vector signed int) { } +void foo(vector bool int) { } +void foo(vector float) { } +void foo(vector pixel) { } +void foo(int) { } +void foo(unsigned int) { } +void foo(float) { } + +/* { dg-final { scan-assembler "_Z3fooU8__vectorh" } } */ +/* { dg-final { scan-assembler "_Z3fooU8__vectora" } } */ +/* { dg-final { scan-assembler "_Z3fooU8__vectorU6__boolc" } } */ +/* { dg-final { scan-assembler "_Z3fooU8__vectort" } } */ +/* { dg-final { scan-assembler "_Z3fooU8__vectors" } } */ +/* { dg-final { scan-assembler "_Z3fooU8__vectorU6__bools" } } */ +/* { dg-final { scan-assembler "_Z3fooU8__vectorj" } } */ +/* { dg-final { scan-assembler "_Z3fooU8__vectori" } } */ +/* { dg-final { scan-assembler "_Z3fooU8__vectorU6__booli" } } */ +/* { dg-final { scan-assembler "_Z3fooU8__vectorf" } } */ +/* { dg-final { scan-assembler "_Z3fooU8__vectoru7__pixel" } } */ +/* { dg-final { scan-assembler "_Z3fooi" } } */ +/* { dg-final { scan-assembler "_Z3fooj" } } */ +/* { dg-final { scan-assembler "_Z3foof" } } */ diff --git a/gcc/testsuite/g++.dg/ext/altivec-8.C b/gcc/testsuite/g++.dg/ext/altivec-8.C new file mode 100644 index 000000000..3c5a76e06 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-8.C @@ -0,0 +1,21 @@ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec" } */ +/* Author: Ziemowit Laski <zlaski@apple.com> */ + +/* This test case exercises intrinsic/argument combinations that, + while not in the Motorola AltiVec PIM, have nevertheless crept + into the AltiVec vernacular over the years. */ + +#include <altivec.h> + +void foo (void) +{ + vector bool int boolVec1 = (vector bool int) vec_splat_u32(3); + vector bool short boolVec2 = (vector bool short) vec_splat_u16(3); + vector bool char boolVec3 = (vector bool char) vec_splat_u8(3); + + boolVec1 = vec_sld( boolVec1, boolVec1, 4 ); + boolVec2 = vec_sld( boolVec2, boolVec2, 2 ); + boolVec3 = vec_sld( boolVec3, boolVec3, 1 ); +} diff --git a/gcc/testsuite/g++.dg/ext/altivec-9.C b/gcc/testsuite/g++.dg/ext/altivec-9.C new file mode 100644 index 000000000..174ae63ed --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-9.C @@ -0,0 +1,14 @@ +/* Test for AltiVec function vec_ld, passing a pointer to const vector */ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec" } */ + +#include <altivec.h> + +typedef vector unsigned char vuc_t; +const vuc_t* p; +vector unsigned char test_vec_ld() +{ + return vec_ld(0,p); +} + diff --git a/gcc/testsuite/g++.dg/ext/altivec-cell-1.C b/gcc/testsuite/g++.dg/ext/altivec-cell-1.C new file mode 100644 index 000000000..16d311c3b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-cell-1.C @@ -0,0 +1,94 @@ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec" } */ + +/* Basic test for the new VMX intrinsics. */ +#include <altivec.h> + +int f(vector int a, int b) +{ + return vec_extract (a, b); +} +short f1(vector short a, int b) +{ + return vec_extract (a, b); +} +vector short f2(vector short a, int b) +{ + return vec_insert (b, a, b); +} +vector float f3(vector float a, int b) +{ + return vec_insert (b, a, b); +} + +float g(void); + +vector float f4(float b, int t) +{ + return vec_promote (g(), t); +} +vector float f5(float b) +{ + return vec_splats (g()); +} + + + + +template <int> +int tf(vector int a, int b) +{ + return vec_extract (a, b); +} +template <int> +short tf1(vector short a, int b) +{ + return vec_extract (a, b); +} +template <int> +vector short tf2(vector short a, int b) +{ + return vec_insert (b, a, b); +} +template <int> +vector float tf3(vector float a, int b) +{ + return vec_insert (b, a, b); +} + +template <int> +vector float tf4(float b, int t) +{ + return vec_promote (g(), t); +} +template <int> +vector float tf5(float b) +{ + return vec_splats (g()); +} + +int t(vector int a, int b) +{ + return tf<1>(a, b); +} +short t1(vector short a, int b) +{ + return tf1<1>(a, b); +} +vector short t2(vector short a, int b) +{ + return tf2<1>(a, b); +} +vector float t3(vector float a, int b) +{ + return tf3<1>(a, b); +} +vector float t4(float b, int t) +{ + return tf4<1>(b, t); +} +vector float t5(float b) +{ + return tf5<1>(b); +} diff --git a/gcc/testsuite/g++.dg/ext/altivec-cell-2.C b/gcc/testsuite/g++.dg/ext/altivec-cell-2.C new file mode 100644 index 000000000..f0d3433cd --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-cell-2.C @@ -0,0 +1,141 @@ +/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */ +/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec" } */ +/* Test the vec_extract VMX intrinsics. */ +#include <altivec.h> + +extern "C" void abort (void); + +vector int a = {0, 1, 2, 3}; +vector short b = {0, 1, 2, 3, 4, 5, 6, 7}; + +int f(vector int a, int b) +{ + return vec_extract (a, b); +} + +int f0 (vector int a) +{ + return vec_extract (a, 0); +} +int f1 (vector int a) +{ + return vec_extract (a, 1); +} +int f2 (vector int a) +{ + return vec_extract (a, 2); +} +int f3 (vector int a) +{ + return vec_extract (a, 3); +} +int f4 (vector int a) +{ + return vec_extract (a, 4); +} + +int g(vector short a, int b) +{ + return vec_extract (a, b); +} + +int g0 (vector short a) +{ + return vec_extract (a, 0); +} +int g1 (vector short a) +{ + return vec_extract (a, 1); +} +int g2 (vector short a) +{ + return vec_extract (a, 2); +} +int g3 (vector short a) +{ + return vec_extract (a, 3); +} + +int g4 (vector short a) +{ + return vec_extract (a, 4); +} +int g5 (vector short a) +{ + return vec_extract (a, 5); +} +int g6 (vector short a) +{ + return vec_extract (a, 6); +} +int g7 (vector short a) +{ + return vec_extract (a, 7); +} +int g8 (vector short a) +{ + return vec_extract (a, 8); +} +int main1(void) __attribute__((noinline)); +int main1(void) +{ + int i; + /* Check vec_extract with a non constant element numbering */ + for(i=0;i<10;i++) + { + if (f(a, i) != (i&0x3)) + abort (); + } + + /* Check vec_extract with a constant element numbering */ + if (f0(a) != 0) + abort (); + if (f1(a) != 1) + abort (); + if (f2(a) != 2) + abort (); + if (f3(a) != 3) + abort (); + /* Check that vec_extract works with a constant element higher than + the number of elements. */ + if (f4(a) != 0) + abort (); + + /* Check vec_extract with a non constant element numbering */ + for(i=0;i<10;i++) + { + if (g(b, i) != (i&0x7)) + abort (); + } + + /* Check vec_extract with a constant element numbering */ + if (g0(b) != 0) + abort (); + if (g1(b) != 1) + abort (); + if (g2(b) != 2) + abort (); + if (g3(b) != 3) + abort (); + if (g4(b) != 4) + abort (); + if (g5(b) != 5) + abort (); + if (g6(b) != 6) + abort (); + if (g7(b) != 7) + abort (); + /* Check that vec_extract works with a constant element higher than + the number of elements. */ + if (g8(b) != 0) + abort (); + + return 0; +} + +int main(void) +{ + return main1 (); +} diff --git a/gcc/testsuite/g++.dg/ext/altivec-cell-3.C b/gcc/testsuite/g++.dg/ext/altivec-cell-3.C new file mode 100644 index 000000000..bd7e774e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-cell-3.C @@ -0,0 +1,37 @@ +/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */ +/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec" } */ +/* Test the vec_splats and vec_promote VMX intrinsics. */ +#include <altivec.h> + +extern "C" void abort (void); + +vector int a = {0, 0, 0, 0}; +int main1(int t) __attribute__((noinline)); +int main1(int t) +{ + int i; + vector int b = vec_splats(0); + if (__builtin_memcmp (&a, &b, sizeof(vector int))) + abort (); + + b = vec_splats(t); + if (__builtin_memcmp (&a, &b, sizeof(vector int))) + abort (); + + b = vec_promote(0, 1); + if (vec_extract (b, 1) != 0) + abort (); + + b = vec_promote(t, t); + if (vec_extract (b, t) != 0) + abort (); + + return 0; +} + +int main(void) +{ + return main1 (0); +} diff --git a/gcc/testsuite/g++.dg/ext/altivec-cell-4.C b/gcc/testsuite/g++.dg/ext/altivec-cell-4.C new file mode 100644 index 000000000..7d91adbb3 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-cell-4.C @@ -0,0 +1,42 @@ +/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */ +/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec" } */ + +/* Test the vec_splats and vec_promote VMX intrinsics. */ +#include <altivec.h> + +extern "C" void abort (void); + +vector int a[] = {{0, 0, 0, 0}, {1,0,0,0}, {1,2,0,0},{1,2,3,0},{1,2,3,4},{5,2,3,4},{5,6,3,4}}; +vector int c = {0,6,3,4}; +vector int d = {0,0,3,4}; +int main1(int t) __attribute__((noinline)); +int main1(int t) +{ + int i; + vector int b = vec_splats(0); + for(i = 0;i<sizeof(a)/sizeof(a[0])-1;i++) + { + if (__builtin_memcmp (&b, &a[i], sizeof(vector int))) + abort (); + b = vec_insert(i+1, b, i); + } + if (__builtin_memcmp (&b, &a[i], sizeof(vector int))) + abort (); + + b = vec_insert(0, b, 0); + if (__builtin_memcmp (&b, &c, sizeof(vector int))) + abort (); + + b = vec_insert(0, b, 1); + if (__builtin_memcmp (&b, &d, sizeof(vector int))) + abort (); + + return 0; +} + +int main(void) +{ + return main1 (0); +} diff --git a/gcc/testsuite/g++.dg/ext/altivec-cell-5.C b/gcc/testsuite/g++.dg/ext/altivec-cell-5.C new file mode 100644 index 000000000..95f109d1a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-cell-5.C @@ -0,0 +1,25 @@ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec" } */ + +/* Basic test for the new VMX intrinsics and error messages. */ +#include <altivec.h> + +int main(int argc, char **argv) +{ +vector float t; + vec_promote(); /* { dg-error "vec_promote only accepts 2" } */ + vec_promote(1.0f); /* { dg-error "vec_promote only accepts 2" } */ + vec_promote(1.0f, 2, 3); /* { dg-error "vec_promote only accepts 2" } */ + vec_extract (); /* { dg-error "vec_extract only accepts 2" } */ + vec_extract (t); /* { dg-error "vec_extract only accepts 2" } */ + vec_extract (t, 2); + vec_extract (t, 2, 5, 6); /* { dg-error "vec_extract only accepts 2" } */ + vec_splats (); /* { dg-error "vec_splats only accepts 1" } */ + vec_splats (t, 3); /* { dg-error "vec_splats only accepts 1" } */ + vec_insert (); /* { dg-error "vec_insert only accepts 3" } */ + vec_insert (t); /* { dg-error "vec_insert only accepts 3" } */ + vec_insert (t, 3); /* { dg-error "vec_insert only accepts 3" } */ + vec_insert (t, 3, 2, 4, 6, 6); /* { dg-error "vec_insert only accepts 3" } */ + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/altivec-types-1.C b/gcc/testsuite/g++.dg/ext/altivec-types-1.C new file mode 100644 index 000000000..f54aeec46 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-types-1.C @@ -0,0 +1,88 @@ +/* { dg-do compile { target powerpc*-*-linux* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec -mno-vsx -std=c++98" } */ + +/* Valid AltiVec vector types should be accepted with no warnings. */ + +__vector char vc; +__vector unsigned char vuc; +__vector signed char vsc; +__vector __bool char vbc; +__vector short vh; +__vector signed short vsh; +__vector unsigned short vuh; +__vector short int vhi; +__vector signed short int vshi; +__vector unsigned short int vuhi; +__vector __bool short vbh; +__vector __bool short int vbhi; +__vector int vi; +__vector unsigned int vui; +__vector signed int vsi; +__vector __bool int vbi; +__vector unsigned vuj; +__vector signed vsj; +__vector __bool vbj; +__vector float vf; + +/* These should be rejected as invalid AltiVec types. */ + +__vector bool vb; /* { dg-error "AltiVec types" "" } */ +__vector long long vll; /* { dg-error "AltiVec types" "" } */ +__vector unsigned long long vull; /* { dg-error "AltiVec types" "" } */ +__vector signed long long vsll; /* { dg-error "AltiVec types" "" } */ +__vector __bool long long vbll; /* { dg-error "AltiVec types" "" } */ +__vector long long int vlli; /* { dg-error "AltiVec types" "" } */ +__vector unsigned long long int vulli; /* { dg-error "AltiVec types" "" } */ +__vector signed long long int vslli; /* { dg-error "AltiVec types" "" } */ +__vector __bool long long int vblli; /* { dg-error "AltiVec types" "" } */ +__vector double vd1; /* { dg-error "AltiVec types" "" } */ +__vector long double vld; /* { dg-error "AltiVec types" "" } */ +__vector _Complex float vcf; /* { dg-error "AltiVec types" "" } */ +__vector _Complex double vcd; /* { dg-error "AltiVec types" "" } */ +__vector _Complex long double vcld; /* { dg-error "AltiVec types" "" } */ +__vector _Complex signed char vcsc; /* { dg-error "AltiVec types" "" } */ +__vector _Complex unsigned char vcuc; /* { dg-error "AltiVec types" "" } */ +__vector _Complex short vcss; /* { dg-error "AltiVec types" "" } */ +__vector _Complex unsigned short vcus; /* { dg-error "AltiVec types" "" } */ +__vector _Complex int vcsi; /* { dg-error "AltiVec types" "" } */ +__vector _Complex unsigned int vcui; /* { dg-error "AltiVec types" "" } */ +__vector _Complex long vcsl; /* { dg-error "AltiVec types" "" } */ +__vector _Complex unsigned long vcul; /* { dg-error "AltiVec types" "" } */ +__vector _Complex long long vcsll; /* { dg-error "AltiVec types" "" } */ +__vector _Complex unsigned long long vcull; /* { dg-error "AltiVec types" "" } */ +__vector __complex float v_cf; /* { dg-error "AltiVec types" "" } */ +__vector __complex double v_cd; /* { dg-error "AltiVec types" "" } */ +__vector __complex long double v_cld; /* { dg-error "AltiVec types" "" } */ +__vector __complex signed char v_csc; /* { dg-error "AltiVec types" "" } */ +__vector __complex unsigned char v_cuc; /* { dg-error "AltiVec types" "" } */ +__vector __complex short v_css; /* { dg-error "AltiVec types" "" } */ +__vector __complex unsigned short v_cus; /* { dg-error "AltiVec types" "" } */ +__vector __complex int v_csi; /* { dg-error "AltiVec types" "" } */ +__vector __complex unsigned int v_cui; /* { dg-error "AltiVec types" "" } */ +__vector __complex long v_csl; /* { dg-error "AltiVec types" "" } */ +__vector __complex unsigned long v_cul; /* { dg-error "AltiVec types" "" } */ +__vector __complex long long v_csll; /* { dg-error "AltiVec types" "" } */ +__vector __complex unsigned long long v_cull; /* { dg-error "AltiVec types" "" } */ + +/* These should be rejected because the component types are invalid. We + don't care about the actual error messages here. */ + +__vector __bool unsigned char vbuc; /* { dg-error "" "" } */ +__vector __bool signed char vbsc; /* { dg-error "" "" } */ +__vector __bool unsigned short vbuh; /* { dg-error "" "" } */ +__vector __bool signed short vbsh; /* { dg-error "" "" } */ +__vector __bool unsigned int vbui; /* { dg-error "" "" } */ +__vector __bool signed int vbsi; /* { dg-error "" "" } */ +__vector __bool unsigned vbuj; /* { dg-error "" "" } */ +__vector __bool signed vbsj; /* { dg-error "" "" } */ +__vector signed float vsf; /* { dg-error "" "" } */ +__vector unsigned float vuf; /* { dg-error "" "" } */ +__vector short float vsf; /* { dg-error "" "" } */ +__vector signed double vsd; /* { dg-error "" "" } */ +__vector unsigned double vud; /* { dg-error "" "" } */ +__vector short double vsd; /* { dg-error "" "" } */ +__vector __bool float vbf; /* { dg-error "" "" } */ +__vector __bool double vbd; /* { dg-error "" "" } */ +__vector __bool short float blf; /* { dg-error "" "" } */ +__vector __bool short double vlbd; /* { dg-error "" "" } */ diff --git a/gcc/testsuite/g++.dg/ext/altivec-types-2.C b/gcc/testsuite/g++.dg/ext/altivec-types-2.C new file mode 100644 index 000000000..cee6c8f26 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-types-2.C @@ -0,0 +1,14 @@ +/* { dg-do compile { target powerpc*-*-linux* } } */ +/* { dg-require-effective-target ilp32 } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec -mno-vsx" } */ + +/* These should get warnings for 32-bit code. */ + +__vector long vl; /* { dg-warning "deprecated" "" } */ +__vector unsigned long vul; /* { dg-warning "deprecated" "" } */ +__vector signed long vsl; /* { dg-warning "deprecated" "" } */ +__vector __bool long int vbli; /* { dg-warning "deprecated" "" } */ +__vector long int vli; /* { dg-warning "deprecated" "" } */ +__vector unsigned long int vuli; /* { dg-warning "deprecated" "" } */ +__vector signed long int vsli; /* { dg-warning "deprecated" "" } */ diff --git a/gcc/testsuite/g++.dg/ext/altivec-types-3.C b/gcc/testsuite/g++.dg/ext/altivec-types-3.C new file mode 100644 index 000000000..6bea9a145 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-types-3.C @@ -0,0 +1,14 @@ +/* { dg-do compile { target powerpc*-*-linux* } } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-maltivec -mno-vsx" } */ + +/* These should be rejected for 64-bit code. */ + +__vector long vl; /* { dg-error "invalid for 64" "" } */ +__vector unsigned long vul; /* { dg-error "invalid for 64" "" } */ +__vector signed long vsl; /* { dg-error "invalid for 64" "" } */ +__vector __bool long int vbli; /* { dg-error "invalid for 64" "" } */ +__vector long int vli; /* { dg-error "invalid for 64" "" } */ +__vector unsigned long int vuli; /* { dg-error "invalid for 64" "" } */ +__vector signed long int vsli; /* { dg-error "invalid for 64" "" } */ diff --git a/gcc/testsuite/g++.dg/ext/altivec-types-4.C b/gcc/testsuite/g++.dg/ext/altivec-types-4.C new file mode 100644 index 000000000..b937f3cf1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/altivec-types-4.C @@ -0,0 +1,15 @@ +/* { dg-do compile { target powerpc*-*-linux* } } */ +/* { dg-require-effective-target ilp32 } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec -mno-vsx -mno-warn-altivec-long" } */ + +/* These should not get warnings for 32-bit code when the warning is + disabled. */ + +__vector long vl; +__vector unsigned long vul; +__vector signed long vsl; +__vector __bool long int vbli; +__vector long int vli; +__vector unsigned long int vuli; +__vector signed long int vsli; diff --git a/gcc/testsuite/g++.dg/ext/always_inline-1.C b/gcc/testsuite/g++.dg/ext/always_inline-1.C new file mode 100644 index 000000000..284fd17a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/always_inline-1.C @@ -0,0 +1,26 @@ +// { dg-options "-O0" } +// { dg-do compile } +// PR C++/34715 + + +namespace X +{ + template <class T> + const T& min(const T& a, const T& b); + + template <class T> + inline __attribute__ ((always_inline)) const T& min(const T& a, const T& b) + { + return a < b ? a : b; + } +} +template <class T> +inline __attribute__ ((always_inline)) T y(const T& a, const T& b) +{ + return X::min(a, b); +} +int main() +{ + int a = 0, b = 0; + return y(a, b); +} diff --git a/gcc/testsuite/g++.dg/ext/always_inline-2.C b/gcc/testsuite/g++.dg/ext/always_inline-2.C new file mode 100644 index 000000000..31123c192 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/always_inline-2.C @@ -0,0 +1,26 @@ +// { dg-options "-O0" } +// { dg-do compile } +// PR C++/34715 + + +namespace X +{ + template <class T> + const T& min123(const T& a, const T& b); +} + + +template <class T> +inline __attribute__ ((always_inline)) const T& X::min123(const T& a, const T& b) +{ + return a < b ? a : b; +} +int main() +{ + int a, b; + return X::min123(a, b); +} + + + +// { dg-final { scan-assembler-not "min123" } } diff --git a/gcc/testsuite/g++.dg/ext/always_inline-3.C b/gcc/testsuite/g++.dg/ext/always_inline-3.C new file mode 100644 index 000000000..e008932bf --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/always_inline-3.C @@ -0,0 +1,26 @@ +// { dg-options "-O0" } +// { dg-do compile } +// PR C++/34715 + + +namespace X +{ + template <class T> + inline __attribute__ ((always_inline)) const T& min123(const T& a, const T& b); +} + + +template <class T> +inline __attribute__ ((always_inline)) const T& X::min123(const T& a, const T& b) +{ + return a < b ? a : b; +} +int main() +{ + int a, b; + return X::min123(a, b); +} + + + +// { dg-final { scan-assembler-not "min123" } } diff --git a/gcc/testsuite/g++.dg/ext/always_inline-4.C b/gcc/testsuite/g++.dg/ext/always_inline-4.C new file mode 100644 index 000000000..e95076193 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/always_inline-4.C @@ -0,0 +1,20 @@ +// { dg-options "-O0" } +// { dg-do compile } +// PR C++/34715 + + template <class T> + const T& min123(const T& a, const T& b); +template <class T> +inline __attribute__ ((always_inline)) const T& +min123(const T& a, const T& b) +{ + return a < b ? a : b; +} +int main() +{ + int a, b; + return min123(a, b); +} + + +// { dg-final { scan-assembler-not "min123" } } diff --git a/gcc/testsuite/g++.dg/ext/always_inline-5.C b/gcc/testsuite/g++.dg/ext/always_inline-5.C new file mode 100644 index 000000000..73caa094f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/always_inline-5.C @@ -0,0 +1,28 @@ +// { dg-do compile } +struct f +{ + inline f(void); + inline void f1(void); + int a; +}; + +inline __attribute__((always_inline)) f::f(void) +{ + a++; +} + +inline __attribute__((always_inline)) void f::f1(void) +{ + a++; +} + +void g(void) +{ + f a, b, c, d; + a.f1(); +} + +// f::f() should be inlined even at -O0 +// { dg-final { scan-assembler-not "_ZN1fC1Ev" } } +// Likewise for f::f1() +// { dg-final { scan-assembler-not "_ZN1f2f1Ev" } } diff --git a/gcc/testsuite/g++.dg/ext/anon-struct1.C b/gcc/testsuite/g++.dg/ext/anon-struct1.C new file mode 100644 index 000000000..0a682db1a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/anon-struct1.C @@ -0,0 +1,50 @@ +/* { dg-options "-ansi -pedantic -pedantic-errors" } */ +/* In strict ISO C++ mode, we don't recognize the anonymous struct + extension or any Microsoft C extensions. */ + +struct A { char a; }; + +struct B { + struct A; /* forward decl of B::A. */ + char b; +}; +char testB[sizeof(B) == sizeof(A) ? 1 : -1]; + +struct C { + struct D { char d; }; /* decl of C::D. */ + char c; +}; +char testC[sizeof(C) == sizeof(A) ? 1 : -1]; +char testD[sizeof(C::D) == sizeof(A) ? 1 : -1]; + +/* GNU extension. */ +struct E { + struct { char z; }; /* { dg-error "prohibits anonymous structs" } */ + char e; +}; + +typedef struct A typedef_A; +struct F { + typedef_A; /* { dg-error "does not declare anything" } */ + char f; +}; +char testF[sizeof(struct F) == sizeof(struct A) ? 1 : -1]; + +/* __extension__ enables GNU C mode for the duration of the declaration. */ +__extension__ struct G { + struct { char z; }; + char g; +}; +char testG[sizeof(G) == 2 * sizeof(A) ? 1 : -1]; + +struct H { + __extension__ struct { char z; }; + char h; +}; +char testH[sizeof(H) == 2 * sizeof(A) ? 1 : -1]; + +/* Make sure __extension__ gets turned back off. */ +struct I { + struct { char z; }; /* { dg-error "prohibits anonymous structs" } */ + char i; +}; diff --git a/gcc/testsuite/g++.dg/ext/anon-struct2.C b/gcc/testsuite/g++.dg/ext/anon-struct2.C new file mode 100644 index 000000000..0c629ed48 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/anon-struct2.C @@ -0,0 +1,46 @@ +/* { dg-options "" } */ +/* In GNU C++ mode, we recognize the anonymous struct extension, + but not Microsoft C extensions. */ + +struct A { char a; }; + +struct B { + struct A; /* forward decl of B::A. */ + char b; +}; +char testB[sizeof(B) == sizeof(A) ? 1 : -1]; + +struct C { + struct D { char d; }; /* decl of C::D. */ + char c; +}; +char testC[sizeof(C) == sizeof(A) ? 1 : -1]; +char testD[sizeof(C::D) == sizeof(A) ? 1 : -1]; + +/* GNU extension. */ +struct E { + struct { char z; }; + char e; +}; +char testE[sizeof(E) == 2 * sizeof(A) ? 1 : -1]; +char testEz[sizeof( ((E *)0)->z )]; + +typedef struct A typedef_A; +struct F { + typedef_A; /* { dg-error "does not declare anything" } */ + char f; +}; +char testF[sizeof(F) == sizeof(A) ? 1 : -1]; + +/* Test that __extension__ does the right thing coming _from_ GNU C mode. */ +__extension__ struct G { + struct { char z; }; + char g; +}; +char testG[sizeof(G) == 2 * sizeof(A) ? 1 : -1]; + +struct H { + struct { char z; }; + char h; +}; +char testH[sizeof(H) == 2 * sizeof(A) ? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/ext/anon-struct3.C b/gcc/testsuite/g++.dg/ext/anon-struct3.C new file mode 100644 index 000000000..1460d6c12 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/anon-struct3.C @@ -0,0 +1,34 @@ +/* { dg-options "-fms-extensions" } */ +/* Verify that enabling Microsoft mode doesn't twist C++ as much as + their corresponding C extensions. Checked vs + Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86 + */ + +struct A { char a; }; + +struct B { + struct A; /* forward decl of B::A. */ + char b; +}; +char testB[sizeof(B) == sizeof(A) ? 1 : -1]; + +struct C { + struct D { char d; }; /* decl of C::D. */ + char c; +}; +char testC[sizeof(C) == sizeof(A) ? 1 : -1]; +char testD[sizeof(C::D) == sizeof(A) ? 1 : -1]; + +struct E { + struct { char z; }; + char e; +}; +char testE[sizeof(E) == 2 * sizeof(A) ? 1 : -1]; +char testEz[sizeof( ((E *)0)->z )]; + +typedef struct A typedef_A; +struct F { + typedef_A; /* { dg-error "does not declare anything" } */ + char f; +}; +char testF[sizeof(F) == sizeof(A) ? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/ext/anon-struct4.C b/gcc/testsuite/g++.dg/ext/anon-struct4.C new file mode 100644 index 000000000..fa5bd4b3d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/anon-struct4.C @@ -0,0 +1,5 @@ +// PR c++/14401 + +struct { struct { int& i ; } bar ; } foo ; // { dg-error "uninitialized" "uninit" } +// { dg-warning "anonymous" "anon" { target *-*-* } 3 } +// { dg-message "should be initialized" "ref-uninit" { target *-*-* } 3 } diff --git a/gcc/testsuite/g++.dg/ext/anon-struct5.C b/gcc/testsuite/g++.dg/ext/anon-struct5.C new file mode 100644 index 000000000..8b697ccbc --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/anon-struct5.C @@ -0,0 +1,13 @@ +// PR c++/30302 + +struct A +{ + struct { static int i; }; // { dg-error "prohibits anonymous structs|an anonymous struct" } + void foo() { i; } +}; + +struct B +{ + union { static int i; }; // { dg-error "an anonymous union|member of a union" } + void foo() { i; } +}; diff --git a/gcc/testsuite/g++.dg/ext/anon-struct6.C b/gcc/testsuite/g++.dg/ext/anon-struct6.C new file mode 100644 index 000000000..11a7bbd60 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/anon-struct6.C @@ -0,0 +1,10 @@ +// PR c++/33460 + +struct A +{ + struct + { // { dg-error "anonymous struct cannot have function members" } + struct { static int i; }; // { dg-error "prohibits anonymous structs|non-static data members" } + void foo() { i; } + }; // { dg-error "prohibits anonymous structs" } +}; diff --git a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-1.C b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-1.C new file mode 100644 index 000000000..0c601e68c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-1.C @@ -0,0 +1,5 @@ +/* Test various operators on __fp16 and mixed __fp16/float operands. */ +/* { dg-do run { target arm*-*-* } } */ +/* { dg-options "-mfp16-format=ieee" } */ + +#include "arm-fp16-ops.h" diff --git a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-2.C b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-2.C new file mode 100644 index 000000000..244e31082 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-2.C @@ -0,0 +1,5 @@ +/* Test various operators on __fp16 and mixed __fp16/float operands. */ +/* { dg-do run { target arm*-*-* } } */ +/* { dg-options "-mfp16-format=ieee -ffast-math" } */ + +#include "arm-fp16-ops.h" diff --git a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-3.C b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-3.C new file mode 100644 index 000000000..8f9ab64bc --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-3.C @@ -0,0 +1,5 @@ +/* Test various operators on __fp16 and mixed __fp16/float operands. */ +/* { dg-do run { target arm*-*-* } } */ +/* { dg-options "-mfp16-format=alternative" } */ + +#include "arm-fp16-ops.h" diff --git a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-4.C b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-4.C new file mode 100644 index 000000000..4877f392c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-4.C @@ -0,0 +1,5 @@ +/* Test various operators on __fp16 and mixed __fp16/float operands. */ +/* { dg-do run { target arm*-*-* } } */ +/* { dg-options "-mfp16-format=alternative -ffast-math" } */ + +#include "arm-fp16-ops.h" diff --git a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-5.C b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-5.C new file mode 100644 index 000000000..92bc8a9c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-5.C @@ -0,0 +1,15 @@ +/* Test various operators on __fp16 and mixed __fp16/float operands. */ +/* { dg-do compile { target arm*-*-* } } */ +/* { dg-require-effective-target arm_fp16_ok } */ +/* { dg-options "-mfp16-format=ieee" } */ +/* { dg-add-options arm_fp16 } */ + +#include "arm-fp16-ops.h" + +/* We've specified options for hardware float, including fp16 support, so + we should not see any calls to libfuncs here. */ +/* { dg-final { scan-assembler-not "\tbl\t__.*hf2" } } */ +/* { dg-final { scan-assembler-not "\tbl\t__.*hf3" } } */ +/* { dg-final { scan-assembler-not "\tbl\t__gnu_h\[a-z\]*_ieee" } } */ +/* { dg-final { scan-assembler-not "\tbl\t__gnu_h2f_ieee" } } */ +/* { dg-final { scan-assembler-not "\tbl\t__gnu_f2h_ieee" } } */ diff --git a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-6.C b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-6.C new file mode 100644 index 000000000..ae40b1e86 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-6.C @@ -0,0 +1,15 @@ +/* Test various operators on __fp16 and mixed __fp16/float operands. */ +/* { dg-do compile { target arm*-*-* } } */ +/* { dg-require-effective-target arm_fp16_ok } */ +/* { dg-options "-mfp16-format=ieee -ffast-math" } */ +/* { dg-add-options arm_fp16 } */ + +#include "arm-fp16-ops.h" + +/* We've specified options for hardware float, including fp16 support, so + we should not see any calls to libfuncs here. */ +/* { dg-final { scan-assembler-not "\tbl\t__.*hf2" } } */ +/* { dg-final { scan-assembler-not "\tbl\t__.*hf3" } } */ +/* { dg-final { scan-assembler-not "\tbl\t__gnu_h\[a-z\]*_ieee" } } */ +/* { dg-final { scan-assembler-not "\tbl\t__gnu_h2f_ieee" } } */ +/* { dg-final { scan-assembler-not "\tbl\t__gnu_f2h_ieee" } } */ diff --git a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-7.C b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-7.C new file mode 100644 index 000000000..ed8089bd6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-7.C @@ -0,0 +1,13 @@ +/* Test various operators on __fp16 and mixed __fp16/float operands. */ +/* { dg-do compile { target arm*-*-* } } */ +/* { dg-require-effective-target arm_neon_ok } */ +/* { dg-options "-mfp16-format=ieee" } */ +/* { dg-add-options arm_neon } */ + +#include "arm-fp16-ops.h" + +/* We've specified options for hardware float, so we should not see any + calls to libfuncs here except for those to the conversion functions. */ +/* { dg-final { scan-assembler-not "\tbl\t__.*hf2" } } */ +/* { dg-final { scan-assembler-not "\tbl\t__.*hf3" } } */ +/* { dg-final { scan-assembler-not "\tbl\t__gnu_h\[a-z\]*_ieee" } } */ diff --git a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-8.C b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-8.C new file mode 100644 index 000000000..b138ca187 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops-8.C @@ -0,0 +1,13 @@ +/* Test various operators on __fp16 and mixed __fp16/float operands. */ +/* { dg-do compile { target arm*-*-* } } */ +/* { dg-require-effective-target arm_neon_ok } */ +/* { dg-options "-mfp16-format=ieee -ffast-math" } */ +/* { dg-add-options arm_neon } */ + +#include "arm-fp16-ops.h" + +/* We've specified options for hardware float, so we should not see any + calls to libfuncs here except for those to the conversion functions. */ +/* { dg-final { scan-assembler-not "\tbl\t__.*hf2" } } */ +/* { dg-final { scan-assembler-not "\tbl\t__.*hf3" } } */ +/* { dg-final { scan-assembler-not "\tbl\t__gnu_h\[a-z\]*_ieee" } } */ diff --git a/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h new file mode 100644 index 000000000..320494ee7 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/arm-fp16/arm-fp16-ops.h @@ -0,0 +1,135 @@ +/* Test various operators on __fp16 and mixed __fp16/float operands. */ + +#include <assert.h> + +#define CHECK(e,r) assert ((e) == r) +#define CHECK2(e,r) (assert ((e) == r), temp = (e), assert (temp == r)) +#define TEST(e) assert (e) +#define TESTNOT(e) assert (!(e)) + +volatile __fp16 h0 = 0.0; +volatile __fp16 h1 = 1.0; +volatile __fp16 h42 = 42.0; +volatile __fp16 hm2 = -2.0; +volatile __fp16 temp; + +volatile float f0 = 0.0; +volatile float f1 = 1.0; +volatile float f42 = 42.0; +volatile float fm2 = -2.0; + +int main (void) +{ + TEST (h1); + TESTNOT (h0); + TEST (!h0); + TESTNOT (!h1); + + CHECK2 (-h1, -1.0); + CHECK2 (+h1, 1.0); + + CHECK (h1++, 1.0); + CHECK (h1, 2.0); + CHECK (++h1, 3.0); + CHECK (h1, 3.0); + + CHECK (--h1, 2.0); + CHECK (h1, 2.0); + CHECK (h1--, 2.0); + CHECK (h1, 1.0); + + CHECK2 (h42 * hm2, -84.0); + CHECK2 (h42 * (__fp16) -2.0, -84.0); + CHECK2 (h42 * fm2, -84.0); + CHECK2 (f42 * hm2, -84.0); + + CHECK2 (h42 / hm2, -21.0); + CHECK2 (h42 / (__fp16) -2.0, -21.0); + CHECK2 (h42 / fm2, -21.0); + CHECK2 (f42 / hm2, -21.0); + + CHECK2 (hm2 + h42, 40.0); + CHECK2 ((__fp16)-2.0 + h42, 40.0); + CHECK2 (hm2 + f42, 40.0); + CHECK2 (fm2 + h42, 40.0); + + CHECK2 (hm2 - h42, -44.0); + CHECK2 ((__fp16)-2.0 - h42, -44.0); + CHECK2 (hm2 - f42, -44.0); + CHECK2 (fm2 - h42, -44.0); + + TEST (hm2 < h42); + TEST (hm2 < (__fp16)42.0); + TEST (hm2 < f42); + TEST (fm2 < h42); + + TEST (h42 > hm2); + TEST ((__fp16)42.0 > hm2); + TEST (h42 > fm2); + TEST (f42 > hm2); + + TEST (hm2 <= h42); + TEST (hm2 <= (__fp16)42.0); + TEST (hm2 <= f42); + TEST (fm2 <= h42); + + TEST (h42 >= hm2); + TEST (h42 >= (__fp16)-2.0); + TEST (h42 >= fm2); + TEST (f42 >= hm2); + + TESTNOT (h1 == hm2); + TEST (h1 == h1); + TEST (h1 == (__fp16)1.0); + TEST (h1 == f1); + TEST (f1 == h1); + + TEST (h1 != hm2); + TESTNOT (h1 != h1); + TESTNOT (h1 != (__fp16)1.0); + TESTNOT (h1 != f1); + TESTNOT (f1 != h1); + + CHECK2 ((h1 ? hm2 : h42), -2.0); + CHECK2 ((h0 ? hm2 : h42), 42.0); + + CHECK (h0 = h42, 42.0); + CHECK (h0, 42.0); + CHECK (h0 = (__fp16)-2.0, -2.0); + CHECK (h0, -2.0); + CHECK (h0 = f0, 0.0); + CHECK (h0, 0.0); + + CHECK (h0 += h1, 1.0); + CHECK (h0, 1.0); + CHECK (h0 += (__fp16)1.0, 2.0); + CHECK (h0, 2.0); + CHECK (h0 += fm2, 0.0); + CHECK (h0, 0.0); + + CHECK (h0 -= h1, -1.0); + CHECK (h0, -1.0); + CHECK (h0 -= (__fp16)1.0, -2.0); + CHECK (h0, -2.0); + CHECK (h0 -= fm2, 0.0); + CHECK (h0, 0.0); + + h0 = hm2; + CHECK (h0 *= hm2, 4.0); + CHECK (h0, 4.0); + CHECK (h0 *= (__fp16)-2.0, -8.0); + CHECK (h0, -8.0); + CHECK (h0 *= fm2, 16.0); + CHECK (h0, 16.0); + + CHECK (h0 /= hm2, -8.0); + CHECK (h0, -8.0); + CHECK (h0 /= (__fp16)-2.0, 4.0); + CHECK (h0, 4.0); + CHECK (h0 /= fm2, -2.0); + CHECK (h0, -2.0); + + CHECK ((h0, h1), 1.0); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-mangle-1.C b/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-mangle-1.C new file mode 100644 index 000000000..25a872af6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-mangle-1.C @@ -0,0 +1,14 @@ +/* { dg-do compile { target arm*-*-* } } */ +/* { dg-options "-mfp16-format=ieee" } */ + +/* Test mangling */ + +/* { dg-final { scan-assembler "\t.global\t_Z1fPDh" } } */ +void f (__fp16 *x) { } + +/* { dg-final { scan-assembler "\t.global\t_Z1gPDhS_" } } */ +void g (__fp16 *x, __fp16 *y) { } + +/* { dg-final { scan-assembler "\t.global\t_ZN1SIDhDhE1iE" } } */ +template <typename T, typename U> struct S { static int i; }; +template <> int S<__fp16, __fp16>::i = 3; diff --git a/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-overload-1.C b/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-overload-1.C new file mode 100644 index 000000000..bf0139d7c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-overload-1.C @@ -0,0 +1,16 @@ +/* { dg-do compile { target arm*-*-* } } */ +/* { dg-options "-mfp16-format=ieee" } */ + +/* __fp16 values are autoconverted to float and should therefore be treated + * just like float for overloading purposes. */ + +extern int frobnify (float x); +extern int frobnify (double x); + +int g (void) +{ + return frobnify ((__fp16)1.0); +} + +/* { dg-final { scan-assembler "_Z8frobnifyf" } } */ +/* { dg-final { scan-assembler-not " _Z8frobnifyd" } } */ diff --git a/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-param-1.C b/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-param-1.C new file mode 100644 index 000000000..03feb1a4d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-param-1.C @@ -0,0 +1,10 @@ +/* { dg-do compile { target arm*-*-* } } */ +/* { dg-options "-mfp16-format=ieee" } */ + +/* Functions cannot have parameters of type __fp16. */ +extern void f (__fp16); /* { dg-error "parameters cannot have __fp16 type" } */ +extern void (*pf) (__fp16); /* { dg-error "parameters cannot have __fp16 type" } */ + +/* These should be OK. */ +extern void g (__fp16 *); +extern void (*pg) (__fp16 *); diff --git a/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-return-1.C b/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-return-1.C new file mode 100644 index 000000000..406dfacd3 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/arm-fp16/fp16-return-1.C @@ -0,0 +1,10 @@ +/* { dg-do compile { target arm*-*-* } } */ +/* { dg-options "-mfp16-format=ieee" } */ + +/* Functions cannot return type __fp16. */ +extern __fp16 f (void); /* { dg-error "cannot return __fp16" } */ +extern __fp16 (*pf) (void); /* { dg-error "cannot return __fp16" } */ + +/* These should be OK. */ +extern __fp16 *g (void); +extern __fp16 *(*pg) (void); diff --git a/gcc/testsuite/g++.dg/ext/array1.C b/gcc/testsuite/g++.dg/ext/array1.C new file mode 100644 index 000000000..7e54dc919 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/array1.C @@ -0,0 +1,14 @@ +// PR c++/13574 +// { dg-options "" } + +class A { +public: + A() : argc(0), argv() { }; +private: + int argc; + char* argv[]; +}; + +int main() { + A y; +} diff --git a/gcc/testsuite/g++.dg/ext/array2.C b/gcc/testsuite/g++.dg/ext/array2.C new file mode 100644 index 000000000..2d645ca94 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/array2.C @@ -0,0 +1,18 @@ +// { dg-do compile } + +// Avoid -pedantic-error default +// { dg-options "" } + +// PR 19989 - dependent array of size 0 fails to compile. + +template<int I> struct A +{ + static const int zero = 0; +}; + +template<int N> struct B +{ + int x[A<N>::zero]; +}; + +B<0> b; diff --git a/gcc/testsuite/g++.dg/ext/asm1.C b/gcc/testsuite/g++.dg/ext/asm1.C new file mode 100644 index 000000000..dd4aede24 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asm1.C @@ -0,0 +1,56 @@ +// Check that the 3.1 named operand syntax can be used in template functions. + +struct arg1 { + int value; + static const int info = 99; +}; + +struct arg2 { + int value; + static const int info = 11; +}; + +template<int j> +int foo (void) +{ + int i; + asm ("# foo on %[third] %[second] %[fourth] %[first]" + : [first] "=r" (i) + : [second] "i" (j), + [third] "i" (j + 2), + [fourth] "i" (100)); + return i; +} + +template<class TYPE> +TYPE bar (TYPE t) +{ + asm ("# bar on %[first] %[second] %[third]" + : [first] "=r" (t.value) + : [second] "i[first]" (t.value), + [third] "i" (t.info)); + return t; +} + +template<class TYPE> +struct S { + static void frob (TYPE t) + { + asm ("# frob on %[arg]" :: [arg] "i" (t.info)); + } +}; + +void test () +{ + arg1 x; + arg2 y; + + foo<42> (); + bar (x); + bar (y); + S<arg1>::frob (x); +} + +// { dg-final { scan-assembler "foo on" } } +// { dg-final { scan-assembler "bar on" } } +// { dg-final { scan-assembler "frob on" } } diff --git a/gcc/testsuite/g++.dg/ext/asm10.C b/gcc/testsuite/g++.dg/ext/asm10.C new file mode 100644 index 000000000..b95027c8c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asm10.C @@ -0,0 +1,14 @@ +// PR inline-asm/32109 +// { dg-do compile } +// { dg-options "-O2" } + +struct A { int i[3]; ~A (); }; +struct A a; +struct B { struct A c; int i; B (); } b; + +B::B () +{ + __asm ("" : : "r" (a)); // { dg-error "impossible constraint|non-memory input" } + __asm ("" : : "r" (b.c)); // { dg-error "impossible constraint|non-memory input" } + __asm ("" : : "r" (c)); // { dg-error "impossible constraint|non-memory input" } +} diff --git a/gcc/testsuite/g++.dg/ext/asm11.C b/gcc/testsuite/g++.dg/ext/asm11.C new file mode 100644 index 000000000..7939aacc0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asm11.C @@ -0,0 +1,20 @@ +// PR c/37772 +// { dg-do compile } +// { dg-options "" } + +void +foo () +{ + int i; + asm (); // { dg-error "expected string-literal before" } + asm (1); // { dg-error "expected string-literal before" } + asm (int); // { dg-error "expected string-literal before" } + asm (: "=r" (i)); // { dg-error "expected string-literal before" } + asm (1 : "=r" (i)); // { dg-error "expected string-literal before" } + asm (int : "=r" (i)); // { dg-error "expected string-literal before" } + asm (: : "r" (i)); // { dg-error "expected string-literal before" } + asm (1 : : "r" (i)); // { dg-error "expected string-literal before" } + asm (int : : "r" (i)); // { dg-error "expected string-literal before" } + asm (: : : "memory"); // { dg-error "expected string-literal before" } + asm (1 : : : "memory"); // { dg-error "expected string-literal before" } +} diff --git a/gcc/testsuite/g++.dg/ext/asm2.C b/gcc/testsuite/g++.dg/ext/asm2.C new file mode 100644 index 000000000..6cec382c8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asm2.C @@ -0,0 +1,12 @@ +// Bug: in a template, we forgot that this was a simple asm, and decided +// that %edi was a malformed operand specifier. + +template <class T> class I { +public: + void f() { asm ("# mov %edi, %esi" ); } +}; + +int main () { + I<int> x; + x.f(); +} diff --git a/gcc/testsuite/g++.dg/ext/asm3.C b/gcc/testsuite/g++.dg/ext/asm3.C new file mode 100644 index 000000000..090218fe6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asm3.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 16 Sep 2002 <nathan@codesourcery.com> + +// PR 7015. ICE with asms + +int two(int in) +{ + register int out; + __asm__ ("" : "r" (out) : "r" (in)); + return out; +} + +// { dg-message "error:" "" { target *-*-* } 11 } diff --git a/gcc/testsuite/g++.dg/ext/asm4.C b/gcc/testsuite/g++.dg/ext/asm4.C new file mode 100644 index 000000000..2726d8e42 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asm4.C @@ -0,0 +1,4 @@ +void f () +{ + __asm__ __volatile__ ("" : : ); +} diff --git a/gcc/testsuite/g++.dg/ext/asm5.C b/gcc/testsuite/g++.dg/ext/asm5.C new file mode 100644 index 000000000..9395395ed --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asm5.C @@ -0,0 +1,35 @@ +void f (int i) +{ + __asm__("" : ); + __asm__("" : "+g" (i)); + + __asm__("" :: ); + __asm__("" :: "g" (i)); + + __asm__("" : : ); + __asm__("" : "+g" (i) : ); + __asm__("" : : "g" (i)); + __asm__("" : "+g" (i) : "g" (i)); + + __asm__("" ::: ); + __asm__("" ::: "memory"); + + __asm__("" : :: ); + __asm__("" : "+g" (i) :: ); + __asm__("" : :: "memory"); + __asm__("" : "+g" (i) :: "memory"); + + __asm__("" :: : ); + __asm__("" :: "g" (i) : ); + __asm__("" :: : "memory"); + __asm__("" :: "g" (i) : "memory"); + + __asm__("" : : : ); + __asm__("" : "+g" (i) : : ); + __asm__("" : : "g" (i) : ); + __asm__("" : : : "memory"); + __asm__("" : "+g" (i) : "g" (i) : ); + __asm__("" : "+g" (i) : : "memory"); + __asm__("" : : "g" (i) : "memory"); + __asm__("" : "+g" (i) : "g" (i) : "memory"); +} diff --git a/gcc/testsuite/g++.dg/ext/asm6.C b/gcc/testsuite/g++.dg/ext/asm6.C new file mode 100644 index 000000000..96ef9d385 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asm6.C @@ -0,0 +1,11 @@ +struct A +{ + ~A(); +}; +int foo(A); +void bar() +{ + A a; + asm("" : : "r"(foo(a)) );//<-- cleanup needed here. +} + diff --git a/gcc/testsuite/g++.dg/ext/asm7.C b/gcc/testsuite/g++.dg/ext/asm7.C new file mode 100644 index 000000000..a5cad0073 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asm7.C @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +const int i = 0; + +void f(void) +{ + __asm__ __volatile__ ("" : "=m" (i)); /* { dg-error "read-only variable" } */ +} + +void g(const int set) +{ + __asm__ __volatile__ ("" : "=r" (set)); /* { dg-error "read-only parameter" } */ +} + + diff --git a/gcc/testsuite/g++.dg/ext/asm8.C b/gcc/testsuite/g++.dg/ext/asm8.C new file mode 100644 index 000000000..0b1be7da7 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asm8.C @@ -0,0 +1,16 @@ +/* { dg-do compile } */ + +/* Test that asm with no outputs are treated as volatile. */ + +void f(int x) +{ + __asm__ ("extended asm not discarded" : : "r" (x)); +} + +void g (void) +{ + __asm__ ("simple asm not discarded"); +} +/* { dg-final { scan-assembler "extended asm not discarded" } } */ +/* { dg-final { scan-assembler "simple asm not discarded" } } */ + diff --git a/gcc/testsuite/g++.dg/ext/asm9.C b/gcc/testsuite/g++.dg/ext/asm9.C new file mode 100644 index 000000000..9daa01bbf --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asm9.C @@ -0,0 +1,7 @@ +// PR 27451 +// { dg-do compile } + +void foo() +{ + asm("" ::: X); // { dg-error "before" } +} diff --git a/gcc/testsuite/g++.dg/ext/asmgoto1.C b/gcc/testsuite/g++.dg/ext/asmgoto1.C new file mode 100644 index 000000000..dda516797 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asmgoto1.C @@ -0,0 +1,32 @@ +// PR middle-end/44102 +// { dg-do compile } +// { dg-options "-O2" } + +void baz (void); +struct A { A (); ~A (); }; + +static inline int +foo (void) +{ + asm goto ("" : : : : l1, l2); + __builtin_unreachable (); + l1: + return 1; + l2: + return 0; +} + +int +bar (int x) +{ + if (x == 5) + { + A a, b; + baz (); + } + if (foo () || x == 6) + x = 1; + else + x = 2; + return x; +} diff --git a/gcc/testsuite/g++.dg/ext/asmspec1.C b/gcc/testsuite/g++.dg/ext/asmspec1.C new file mode 100644 index 000000000..0661136fe --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asmspec1.C @@ -0,0 +1,8 @@ +// PR c++/28343 +// { dg-do compile } + +struct A +{ + int i __asm__(int); // { dg-error "expected" } + static int j __asm__(int); // { dg-error "expected" } +}; diff --git a/gcc/testsuite/g++.dg/ext/asmspecInvalid.C b/gcc/testsuite/g++.dg/ext/asmspecInvalid.C new file mode 100644 index 000000000..4c528a0f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asmspecInvalid.C @@ -0,0 +1,18 @@ +// tests that the asm directive is correctly handled for static fields +// in structures and classes. This only applies to C++; such +// directives generate errors in C. Assembler directives for local +// variables should be tested by the C test suite. +// +// Contributed by Robert Bowdidge (bowdidge@apple.com) 14 Oct 2003 + +// { dg-do compile } + +struct Foo { + // This should reference a variable called bar + int i __asm__("bar"); /* { dg-error "specifiers are not permitted" } */ +}; + +int main (void ) { + int j = 0; + return j; +} diff --git a/gcc/testsuite/g++.dg/ext/asmspecValid.C b/gcc/testsuite/g++.dg/ext/asmspecValid.C new file mode 100644 index 000000000..98d98b46f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asmspecValid.C @@ -0,0 +1,43 @@ +// tests that the asm directive is correctly handled for static fields +// in structures and classes. This only applies to C++; such +// directives generate errors in C. Assembler directives for local +// variables should be tested by the C test suite. +// +// Contributed by Robert Bowdidge (bowdidge@apple.com) 14 Oct 2003 + +// { dg-do compile } + +struct Foo { + // This should reference a variable called bar + static int i __asm__("bar"); +}; + + +class Bar { +public: + static int i __asm__("theRealI"); + static int j __asm__("theRealJ"); + int boof; +}; + +class Baz : public Bar { +public: + static char *ptr __asm__ ("theRealString"); +}; + +int main (int argc, char **argv) { + struct Foo myFoo; + Bar b; + myFoo.i = 1; + Foo::i = 2; + Baz::j = 10; + Baz::ptr = 0; + b.i = 1; + return (b.i); +} + + +/* { dg-final {scan-assembler "bar"} } */ +/* { dg-final {scan-assembler "theRealString"} } */ +/* { dg-final {scan-assembler "theRealI" } } */ +/* { dg-final {scan-assembler "theRealJ" } } */ diff --git a/gcc/testsuite/g++.dg/ext/attr-alias-1.C b/gcc/testsuite/g++.dg/ext/attr-alias-1.C new file mode 100644 index 000000000..1427267e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attr-alias-1.C @@ -0,0 +1,37 @@ +/* { dg-do run } */ +/* { dg-require-alias "" } */ + +#include <typeinfo> + +struct Klass +{ + int implementation () const; + int magic () const; +}; + +int Klass::implementation (void) const +{ + return 0; +} + +int Klass::magic () const + __attribute__ ((alias ("_ZNK5Klass14implementationEv"))); + +int __attribute__ ((noinline)) + Foo (Klass const *ptr) +{ + if (ptr->magic () != 0) + return 1; + + if (typeid (*ptr) != typeid (Klass)) + return 2; + + return 0; +} + +int main () +{ + Klass obj; + + return Foo (&obj); +} diff --git a/gcc/testsuite/g++.dg/ext/attr-alias-2.C b/gcc/testsuite/g++.dg/ext/attr-alias-2.C new file mode 100644 index 000000000..61a132f77 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attr-alias-2.C @@ -0,0 +1,37 @@ +/* { dg-do run } */ +/* { dg-require-alias "" } */ + +#include <typeinfo> + +struct Klass +{ + int implementation () const; + virtual int magic () const; +}; + +int Klass::implementation (void) const +{ + return 0; +} + +int Klass::magic () const + __attribute__ ((alias ("_ZNK5Klass14implementationEv"))); + +int __attribute__ ((noinline)) + Foo (Klass const *ptr) +{ + if (ptr->magic () != 0) + return 1; + + if (typeid (*ptr) != typeid (Klass)) + return 2; + + return 0; +} + +int main () +{ + Klass obj; + + return Foo (&obj); +} diff --git a/gcc/testsuite/g++.dg/ext/attr-ifunc-1.C b/gcc/testsuite/g++.dg/ext/attr-ifunc-1.C new file mode 100644 index 000000000..d41fa7d32 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attr-ifunc-1.C @@ -0,0 +1,34 @@ +/* { dg-do run } */ +/* { dg-require-ifunc "" } */ +/* { dg-options "-Wno-pmf-conversions" } */ + +#include <stdio.h> + +struct Klass +{ + int implementation (); + int magic (); + static void *resolver (); +}; + +int Klass::implementation (void) +{ + printf ("'ere I am JH\n"); + return 0; +} + +void *Klass::resolver (void) +{ + int (Klass::*pmf) () = &Klass::implementation; + + return (void *)(int (*)(Klass *))(((Klass *)0)->*pmf); +} + +int Klass::magic (void) __attribute__ ((ifunc ("_ZN5Klass8resolverEv"))); + +int main () +{ + Klass obj; + + return obj.magic () != 0; +} diff --git a/gcc/testsuite/g++.dg/ext/attr-ifunc-2.C b/gcc/testsuite/g++.dg/ext/attr-ifunc-2.C new file mode 100644 index 000000000..e205a2a6a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attr-ifunc-2.C @@ -0,0 +1,38 @@ +/* { dg-do run } */ +/* { dg-require-ifunc "" } */ +/* { dg-options "-Wno-pmf-conversions" } */ + +#include <stdio.h> + +struct Klass +{ + int implementation (); + int magic (); + static void *resolver (); +}; + +int Klass::implementation (void) +{ + printf ("'ere I am JH\n"); + return 0; +} + +void *Klass::resolver (void) +{ + int (Klass::*pmf) () = &Klass::implementation; + + return (void *)(int (*)(Klass *))(((Klass *)0)->*pmf); +} + +int Klass::magic (void) __attribute__ ((ifunc ("_ZN5Klass8resolverEv"))); + +struct Klassier : Klass +{ +}; + +int main () +{ + Klassier obj; + + return obj.magic () != 0; +} diff --git a/gcc/testsuite/g++.dg/ext/attr-ifunc-3.C b/gcc/testsuite/g++.dg/ext/attr-ifunc-3.C new file mode 100644 index 000000000..ba65976b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attr-ifunc-3.C @@ -0,0 +1,39 @@ +/* { dg-do run } */ +/* { dg-require-ifunc "" } */ +/* { dg-options "-Wno-pmf-conversions" } */ + +#include <stdio.h> + +struct Klass +{ + int implementation (); + int magic (); + static void *resolver (); +}; + +int Klass::implementation (void) +{ + printf ("'ere I am JH\n"); + return 0; +} + +void *Klass::resolver (void) +{ + int (Klass::*pmf) () = &Klass::implementation; + + return (void *)(int (*)(Klass *))(((Klass *)0)->*pmf); +} + +int Klass::magic (void) __attribute__ ((ifunc ("_ZN5Klass8resolverEv"))); + +int Foo (Klass &obj, int (Klass::*pmf) ()) +{ + return (obj.*pmf) (); +} + +int main () +{ + Klass obj; + + return Foo (obj, &Klass::magic) != 0; +} diff --git a/gcc/testsuite/g++.dg/ext/attr-ifunc-4.C b/gcc/testsuite/g++.dg/ext/attr-ifunc-4.C new file mode 100644 index 000000000..0cae41028 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attr-ifunc-4.C @@ -0,0 +1,44 @@ +/* { dg-do run } */ +/* { dg-require-ifunc "" } */ +/* { dg-options "-Wno-pmf-conversions" } */ + +#include <stdio.h> + +struct Klass +{ + virtual int magic () = 0; +}; + +struct Klassier : Klass +{ + int implementation (); + int magic (); + static void *resolver (); +}; + +int Klassier::implementation (void) +{ + printf ("'ere I am JH\n"); + return 0; +} + +void *Klassier::resolver (void) +{ + int (Klassier::*pmf) () = &Klassier::implementation; + + return (void *)(int (*)(Klassier *))(((Klassier *)0)->*pmf); +} + +int Klassier::magic (void) __attribute__ ((ifunc ("_ZN8Klassier8resolverEv"))); + +int __attribute__ ((weak)) Foo (Klass &base) +{ + return base.magic (); +} + +int main () +{ + Klassier obj; + + return Foo (obj) != 0; +} diff --git a/gcc/testsuite/g++.dg/ext/attrib1.C b/gcc/testsuite/g++.dg/ext/attrib1.C new file mode 100644 index 000000000..2bd69e82a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib1.C @@ -0,0 +1,10 @@ +// Test for interpretation of attribute immediately before function name. +// Origin: Joseph Myers <jsm28@cam.ac.uk> +// { dg-do compile } + +// An attribute immediately before the function name should in this +// case properly apply to the return type, but compatibility with +// existing code using this form requires it to apply to the function +// type instead in the case of attributes applying to function types, +// and to the declaration in the case of attributes applying to declarations. +int ****__attribute__((format(printf, 1, 2))) foo(const char *, ...); diff --git a/gcc/testsuite/g++.dg/ext/attrib10.C b/gcc/testsuite/g++.dg/ext/attrib10.C new file mode 100644 index 000000000..42d967dde --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib10.C @@ -0,0 +1,8 @@ +// PR c++/12795 +// { dg-require-alias "" } + +void foo() +{ + extern void bar () __attribute__ ((__alias__ ("BAR"))); // { dg-warning "ignored" } + bar (); +} diff --git a/gcc/testsuite/g++.dg/ext/attrib11.C b/gcc/testsuite/g++.dg/ext/attrib11.C new file mode 100644 index 000000000..26bc7907c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib11.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-Wall" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Dec 2003 <nathan@codesourcery.com> + + +// PR c++/13507, spurious warning due to attribute clobbering +extern "C" { + extern int printf (__const char *__restrict __format, ...) throw (); + extern int scanf (__const char *__restrict __format, ...) throw (); +} + +void foo(unsigned int x) +{ + printf ("%d\n", x); +} diff --git a/gcc/testsuite/g++.dg/ext/attrib12.C b/gcc/testsuite/g++.dg/ext/attrib12.C new file mode 100644 index 000000000..aea93781d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib12.C @@ -0,0 +1,16 @@ +// PR c++/13791 + +template <typename T> struct O { + struct __attribute__((packed)) I { + int i; + char c; + }; + + I* foo(); +}; + +template <typename T> +typename O<T>::I* +O<T>::foo() { return 0; } + +template class O<int>; diff --git a/gcc/testsuite/g++.dg/ext/attrib13.C b/gcc/testsuite/g++.dg/ext/attrib13.C new file mode 100644 index 000000000..22ea97ae7 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib13.C @@ -0,0 +1,4 @@ +// PR c++/13854 + +extern char *rindex (__const char *__s, int __c) throw () __attribute__ ((__pure__)); +extern char *rindex (__const char *__s, int __c) throw () __attribute__ ((__pure__)); diff --git a/gcc/testsuite/g++.dg/ext/attrib14.C b/gcc/testsuite/g++.dg/ext/attrib14.C new file mode 100644 index 000000000..c7e5f7a9f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib14.C @@ -0,0 +1,13 @@ +// PR c++/13170 +// The bogus attribute is ignored, but was in TYPE_ATTRIBUTES during +// parsing of the class, causing some variants to have it and some not. + +struct __attribute__((bogus)) A +{ // { dg-warning "ignored" "" } + virtual ~A(); + void foo(const A&); + void bar(const A&); +}; + +void A::foo(const A&) {} +void A::bar(const A& a) { foo(a); } diff --git a/gcc/testsuite/g++.dg/ext/attrib15.C b/gcc/testsuite/g++.dg/ext/attrib15.C new file mode 100644 index 000000000..05de12cce --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib15.C @@ -0,0 +1,9 @@ +// PR c++/15317 + +struct A +{ + A(char); +}; +A::A(__attribute__((unused)) char i2) +{} + diff --git a/gcc/testsuite/g++.dg/ext/attrib16.C b/gcc/testsuite/g++.dg/ext/attrib16.C new file mode 100644 index 000000000..2e73fca70 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib16.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// Origin: <rguenth at tat dot physik dot uni-tuebingen dot de> +// PR c++/10479: use of non dependent expressions in attributes in templates + +template <int i> +struct foo2 { + float bar __attribute__((aligned(__alignof__(double)))); +}; diff --git a/gcc/testsuite/g++.dg/ext/attrib17.C b/gcc/testsuite/g++.dg/ext/attrib17.C new file mode 100644 index 000000000..43cf264f5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib17.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// Origin: Benjamin Kosnik <bkoz at gcc dot gnu dot org> +// PR c++/17743: Attributes applied to typedefs. + +struct A { + typedef char layout_type[sizeof(double)] + __attribute__((aligned(__alignof__(double)))); + layout_type data; +}; + +struct B { + typedef char layout_type[sizeof(double)]; + layout_type data __attribute__((aligned(__alignof__(double)))); +}; + +template<bool> struct StaticAssert; +template<> struct StaticAssert<true> {}; + +StaticAssert<__alignof__(A) == __alignof__(B)> a1; diff --git a/gcc/testsuite/g++.dg/ext/attrib18.C b/gcc/testsuite/g++.dg/ext/attrib18.C new file mode 100644 index 000000000..ab9fea095 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib18.C @@ -0,0 +1,10 @@ +// PR c++/17542 +// Test that we warn when an attribute preceding the class-key is ignored. +// { dg-do compile } + +__attribute__ ((packed)) struct A // { dg-warning "attribute" } +{ + char c; + int x; + void f(); +}; diff --git a/gcc/testsuite/g++.dg/ext/attrib19.C b/gcc/testsuite/g++.dg/ext/attrib19.C new file mode 100644 index 000000000..f1362c3b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib19.C @@ -0,0 +1,10 @@ +// PR c++/19739 + +void Dummy() __attribute__(( , )); +void Dummy() {} + +int main (int argc, char **argv) +{ + Dummy(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/attrib2.C b/gcc/testsuite/g++.dg/ext/attrib2.C new file mode 100644 index 000000000..a7563f388 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib2.C @@ -0,0 +1,12 @@ +// Test that an early attribute doesn't confuse uses of a class. +// { dg-do compile } + +struct __attribute__ ((packed)) A +{ + void f () const; +}; + +void +A::f () const +{ +} diff --git a/gcc/testsuite/g++.dg/ext/attrib20.C b/gcc/testsuite/g++.dg/ext/attrib20.C new file mode 100644 index 000000000..25b27f307 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib20.C @@ -0,0 +1,23 @@ +// { dg-do compile } +// { dg-options "-g" } +// Origin: <jan at etpmod dot phys dot tue dot nl> +// PR c++/19508: avoid attributes for template parameters + +template <typename T> +struct BVector +{ + typedef T T2; + typedef T value_type __attribute__ ((aligned(8))); // { dg-bogus "attribute" "attribute" } + typedef T2 value_type2 __attribute__ ((aligned(8))); // { dg-bogus "attribute" "attribute" } + value_type v; +}; +BVector<int> m; + +template <template <class> class T> +struct BV2 +{ + typedef T<float> value_type __attribute__((aligned(8))); // { dg-bogus "attribute" "attribute" } + value_type v; +}; +BV2<BVector> m2; + diff --git a/gcc/testsuite/g++.dg/ext/attrib21.C b/gcc/testsuite/g++.dg/ext/attrib21.C new file mode 100644 index 000000000..2fc5800b0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib21.C @@ -0,0 +1,17 @@ +// PR c++/20763 + +typedef void *voidp; + +struct S +{ + char a; + voidp __attribute__ ((aligned (16))) b; +}; + +struct T +{ + char a; + void *__attribute__ ((aligned (16))) b; +}; + +int f[sizeof (struct S) != sizeof (struct T) ? -1 : 1]; diff --git a/gcc/testsuite/g++.dg/ext/attrib22.C b/gcc/testsuite/g++.dg/ext/attrib22.C new file mode 100644 index 000000000..5304a35d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib22.C @@ -0,0 +1,6 @@ +// PR c++/27648 + +void f() +{ + static_cast<float *__attribute((unused))>(0); // { dg-error "expected" } +} diff --git a/gcc/testsuite/g++.dg/ext/attrib23.C b/gcc/testsuite/g++.dg/ext/attrib23.C new file mode 100644 index 000000000..0a2c58689 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib23.C @@ -0,0 +1,11 @@ +// PR c++/28112 +// { dg-do compile } + +int i __attribute__((init_priority(;))); // { dg-error "before" } +int j __attribute__((vector_size(;))); // { dg-error "before" } +int k __attribute__((visibility(;))); // { dg-error "before" } +struct A {} __attribute__((aligned(;))); // { dg-error "before" } +struct B {} __attribute__((mode(;))); // { dg-error "before" } +void foo() __attribute__((alias(;))); // { dg-error "before" } +void bar() __attribute__((nonnull(;))); // { dg-error "before" } +void baz() __attribute__((section(;))); // { dg-error "before" } diff --git a/gcc/testsuite/g++.dg/ext/attrib24.C b/gcc/testsuite/g++.dg/ext/attrib24.C new file mode 100644 index 000000000..208809a3f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib24.C @@ -0,0 +1,4 @@ +// PR c++/28387 +// { dg-do compile } + +enum __attribute__((unused)) E; // { dg-error "without previous declaration" } diff --git a/gcc/testsuite/g++.dg/ext/attrib25.C b/gcc/testsuite/g++.dg/ext/attrib25.C new file mode 100644 index 000000000..aeffdffe3 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib25.C @@ -0,0 +1,11 @@ +// PR c++/28559 + +template<typename T> struct A +{ + struct B; +}; + +struct C +{ + template<typename T> friend struct __attribute__((packed)) A<T>::B; // { dg-warning "uninstantiated" } +}; diff --git a/gcc/testsuite/g++.dg/ext/attrib26.C b/gcc/testsuite/g++.dg/ext/attrib26.C new file mode 100644 index 000000000..dedf43a02 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib26.C @@ -0,0 +1,14 @@ +// PR c++/28659 +// The attribute was causing us to get confused in merge_types when +// combining the template type with an uninstantiated version. + +template<class T> +struct __attribute__((aligned(1))) A +{ + A& operator=(const A &t); +}; + +template<class T> +A<T>& A<T>::operator=(const A<T> &t) +{ +} diff --git a/gcc/testsuite/g++.dg/ext/attrib27.C b/gcc/testsuite/g++.dg/ext/attrib27.C new file mode 100644 index 000000000..4f629aa53 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib27.C @@ -0,0 +1,5 @@ +//PR c++/29980 + +struct A { typedef int X; }; // { dg-error "previous declaration" } + +struct __attribute__((unused)) A::X; // { dg-error "typedef-name" } diff --git a/gcc/testsuite/g++.dg/ext/attrib28.C b/gcc/testsuite/g++.dg/ext/attrib28.C new file mode 100644 index 000000000..2f18d4184 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib28.C @@ -0,0 +1,12 @@ +// PR c++/28558 +// { dg-options "" } + +struct A +{ + A(int) { } +}; + +int main() +{ + A a = (A __attribute__((unused)))0; // { dg-warning "attribute" } +} diff --git a/gcc/testsuite/g++.dg/ext/attrib29.C b/gcc/testsuite/g++.dg/ext/attrib29.C new file mode 100644 index 000000000..710a5ce27 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib29.C @@ -0,0 +1,10 @@ +// PR c++/33506 +// { dg-do compile } + +extern int f1 (char *) __attribute__ ((warn_unused_result)); +extern int f2 (char *) throw () __attribute__ ((warn_unused_result)); +extern int f2 (char *) throw (); + +extern int f3 (char *) __attribute__ ((nonnull (1))); +extern int f4 (char *) throw () __attribute__ ((nonnull (1))); +extern int f4 (char *) throw (); diff --git a/gcc/testsuite/g++.dg/ext/attrib3.C b/gcc/testsuite/g++.dg/ext/attrib3.C new file mode 100644 index 000000000..17a904c09 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib3.C @@ -0,0 +1,21 @@ +// Test that attributes work in a variety of situations. +// { dg-options -O } +// { dg-do run } + +#define attrib __attribute ((mode (QI))) + +attrib signed int a; // attributes before type are broken +static attrib unsigned int b; + +int foo(attrib int o) // attribute arguments are broken +{ + return (sizeof (a) != 1 + || sizeof (b) != 1 + || sizeof (o) != 1 + || sizeof ((attrib signed int) b) != 1); +} + +int main () +{ + return foo (42); +} diff --git a/gcc/testsuite/g++.dg/ext/attrib30.C b/gcc/testsuite/g++.dg/ext/attrib30.C new file mode 100644 index 000000000..fd2826a60 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib30.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// PR c++/35074 +template<typename T> struct A +{ + void foo() const; +} __attribute((aligned(4))); + +template<typename T> void A<T>::foo() const {} diff --git a/gcc/testsuite/g++.dg/ext/attrib31.C b/gcc/testsuite/g++.dg/ext/attrib31.C new file mode 100644 index 000000000..c614ed4f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib31.C @@ -0,0 +1,15 @@ +// PR c++/35097 + +template<int> struct A; + +template<> struct A<0> +{ + typedef int X __attribute((aligned(4))); +}; + +template<typename T> void foo(const A<0>::X&, T); + +void bar() +{ + foo(A<0>::X(), 0); +} diff --git a/gcc/testsuite/g++.dg/ext/attrib32.C b/gcc/testsuite/g++.dg/ext/attrib32.C new file mode 100644 index 000000000..77f71ded8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib32.C @@ -0,0 +1,36 @@ +// PR c++/35315 + +typedef union { int i; } U __attribute__((transparent_union)); + +static void foo(U) {} +static void foo(int) {} + +void bar() +{ + foo(0); +} + +typedef union U1 { int i; } U2 __attribute__((transparent_union)); + +static void foo2(U1) {} +static void foo2(U2) {} + +void bar2(U1 u1, U2 u2) +{ + foo2(u1); + foo2(u2); +} + +// PR c++/36410 +struct A +{ + typedef union + { + int i; + } B __attribute__((transparent_union)); +}; + +void foo(A::B b) +{ + b.i; +} diff --git a/gcc/testsuite/g++.dg/ext/attrib33.C b/gcc/testsuite/g++.dg/ext/attrib33.C new file mode 100644 index 000000000..55bfc4cad --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib33.C @@ -0,0 +1,19 @@ +// PR c++/35546 +// { dg-do compile } +// { dg-options "-g" } + +template <int N> +struct T +{ + void foo (char const * ...) __attribute__ ((format (printf,2,3))); +}; + +template struct T<3>; + +template <typename T> +struct U +{ + typedef T __attribute__((mode (SI))) V; +}; + +U<int>::V v; diff --git a/gcc/testsuite/g++.dg/ext/attrib34.C b/gcc/testsuite/g++.dg/ext/attrib34.C new file mode 100644 index 000000000..f4794143d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib34.C @@ -0,0 +1,19 @@ +// PR c/37171 +// { dg-do compile } +// { dg-options "-O2 -fdump-tree-optimized" } + +unsigned int f1 () __attribute__((const)); +unsigned int f2 () __attribute__((__const)); +unsigned int f3 () __attribute__((__const__)); + +unsigned int f4 () +{ + return f1 () + f1 () + f1 () + f1 () + + f2 () + f2 () + f2 () + f2 () + + f3 () + f3 () + f3 () + f3 (); +} + +// { dg-final { scan-tree-dump-times "= f1 \\(\\)" 1 "optimized" } } +// { dg-final { scan-tree-dump-times "= f2 \\(\\)" 1 "optimized" } } +// { dg-final { scan-tree-dump-times "= f3 \\(\\)" 1 "optimized" } } +// { dg-final { cleanup-tree-dump "optimized" } } diff --git a/gcc/testsuite/g++.dg/ext/attrib35.C b/gcc/testsuite/g++.dg/ext/attrib35.C new file mode 100644 index 000000000..e60a59dff --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib35.C @@ -0,0 +1,20 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-options "-O3 -msse2" } +// { dg-require-effective-target sse2 } + +// You can make NON-template typedefs with a large alignment. +typedef double AlignedDoubleType __attribute__((aligned(16))); + +template <typename RealType> +RealType f(const RealType* p) +{ + // But if you use a template parameter it complains. + typedef RealType AlignedRealType __attribute__((aligned(16))); + + return p[0]; +} + +double f2(const double* p) +{ + return f<double>(p); +} diff --git a/gcc/testsuite/g++.dg/ext/attrib36.C b/gcc/testsuite/g++.dg/ext/attrib36.C new file mode 100644 index 000000000..5434cb9ef --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib36.C @@ -0,0 +1,20 @@ +// PR c++/43031 +// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ilp32 } } } + +class T; +class L { }; +class P : public L +{ + typedef void (__attribute__((__stdcall__)) T::*F) (L*); + void f(bool aAdd); +}; +class T +{ +public: + virtual void __attribute__((__stdcall__)) A(L *listener) = 0; + virtual void __attribute__((__stdcall__)) R(L *listener) = 0; +}; +void P::f(bool aAdd) +{ + F addRemoveEventListener = (aAdd ? &T::A : &T::R); +} diff --git a/gcc/testsuite/g++.dg/ext/attrib37.C b/gcc/testsuite/g++.dg/ext/attrib37.C new file mode 100644 index 000000000..d12c176af --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib37.C @@ -0,0 +1,14 @@ +// PR c++/43093 +// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ilp32 } } } + +struct S { + int x; + S(const S &s) {} +}; + +S __attribute__((__stdcall__)) getS(); + +void test() +{ + S s = getS(); +} diff --git a/gcc/testsuite/g++.dg/ext/attrib38.C b/gcc/testsuite/g++.dg/ext/attrib38.C new file mode 100644 index 000000000..be3c7f2ba --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib38.C @@ -0,0 +1,11 @@ +// PR c++/36625 + +template <int N> +struct A { + struct S { short f[3]; } __attribute__ ((aligned (N))); +}; + +int main () +{ + A<4>::S s; +} diff --git a/gcc/testsuite/g++.dg/ext/attrib39.C b/gcc/testsuite/g++.dg/ext/attrib39.C new file mode 100644 index 000000000..22a742942 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib39.C @@ -0,0 +1,9 @@ +// PR debug/43370 +// { dg-options "-g" } + +int fragile_block(void) { + typedef __attribute__ ((aligned (16))) struct { + int i; + } XmmUint16; + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/attrib4.C b/gcc/testsuite/g++.dg/ext/attrib4.C new file mode 100644 index 000000000..68cc74155 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib4.C @@ -0,0 +1,31 @@ +// Test for syntax support of various attribute permutations. + +int +__attribute__((noreturn)) +__attribute__((unused)) +one(void); // OK + +__attribute__((noreturn)) +__attribute__((unused)) +int +two(void); // OK + +int +__attribute__((unused)) +three (void) +__attribute__((noreturn)); // OK + +__attribute__((unused)) +int +four (void) +__attribute__((noreturn)); // OK + +int +five(void) +__attribute__((noreturn)) +__attribute__((unused)); // OK + +__attribute__((noreturn)) +int +__attribute__((unused)) // parse error before '__attribute__' in C++ +six (void); // OK in C diff --git a/gcc/testsuite/g++.dg/ext/attrib40.C b/gcc/testsuite/g++.dg/ext/attrib40.C new file mode 100644 index 000000000..9c3f76159 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib40.C @@ -0,0 +1,4 @@ +// PR c++/46803 + +int strftime(char *, int, const char *, const struct tm *) + __attribute__ ((__bounded__(__string__,1,2))); // { dg-warning "ignored" } diff --git a/gcc/testsuite/g++.dg/ext/attrib5.C b/gcc/testsuite/g++.dg/ext/attrib5.C new file mode 100644 index 000000000..f67510dab --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib5.C @@ -0,0 +1,21 @@ +// There were two related problems here, depending on the vintage. At +// one time: +// +// typedef struct A { ... } A __attribute__ ((aligned (16))); +// +// would cause original_types to go into an infinite loop. At other +// times, the attributes applied to an explicit typedef would be lost +// (check_b3 would have a negative size). + +// First check that the declaration is accepted and has an effect. +typedef struct A { int i; } A __attribute__ ((aligned (16))); +int check_A[__alignof__ (A) >= 16 ? 1 : -1]; + +// Check that the alignment is only applied to the typedef. +struct B { int i; }; +struct B b1; +typedef struct B B __attribute__((aligned (16))); +struct B b2; +B b3; +int check_b1[__alignof__ (b1) == __alignof__ (b2) ? 1 : -1]; +int check_b3[__alignof__ (b3) >= 16 ? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/ext/attrib6.C b/gcc/testsuite/g++.dg/ext/attrib6.C new file mode 100644 index 000000000..2bdb180d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib6.C @@ -0,0 +1,21 @@ +// Copyright (C) 2002 Free Software Foundation. +// +// Test that the nothrow attribute is working correctly. +// +// Written by Richard Henderson, 26 May 2002. + +// { dg-do link } +extern void foo() __attribute__((nothrow)); +extern void link_error(); + +int main() +{ + try { + foo(); + } catch (...) { + link_error(); + } +} + +void foo() { } + diff --git a/gcc/testsuite/g++.dg/ext/attrib7.C b/gcc/testsuite/g++.dg/ext/attrib7.C new file mode 100644 index 000000000..fa16fdd98 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib7.C @@ -0,0 +1,3 @@ +// { dg-options "-Wunused-parameter" } + +void f (int i __attribute__((__unused__))) {} diff --git a/gcc/testsuite/g++.dg/ext/attrib8.C b/gcc/testsuite/g++.dg/ext/attrib8.C new file mode 100644 index 000000000..7d99132c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib8.C @@ -0,0 +1,11 @@ +// PR 8656 +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target ilp32 } + +extern int * (__attribute__((stdcall)) *fooPtr)( void); +int * __attribute__((stdcall)) myFn01( void) { return 0; } + +void snafu( void) +{ + fooPtr = myFn01; +} diff --git a/gcc/testsuite/g++.dg/ext/attrib9.C b/gcc/testsuite/g++.dg/ext/attrib9.C new file mode 100644 index 000000000..6672f7525 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib9.C @@ -0,0 +1,10 @@ +class __attribute__((unused)) C; +struct __attribute__((unused)) S; +union __attribute__((unused)) U; +enum e {}; +enum __attribute__((unused)) e; // { dg-warning "already defined" } + +struct __attribute((unused)) B *p; // { dg-warning "attributes" } + +template <class T> struct A { }; +struct __attribute((unused)) A<int>; // { dg-warning "attributes" } diff --git a/gcc/testsuite/g++.dg/ext/attribute-test-1.C b/gcc/testsuite/g++.dg/ext/attribute-test-1.C new file mode 100644 index 000000000..7df68930f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attribute-test-1.C @@ -0,0 +1,38 @@ +// { dg-do run } +// { dg-options "" } +// PR c++/13989 + +extern "C" void abort(); + +#define vector __attribute__((vector_size(16))) + +struct Constants { + inline vector unsigned int deadbeef(void) const { + return (vector unsigned int){0xdeadbeef, 0xabababab, 0x55555555, 0x12345678}; + }; +}; + +inline vector unsigned int const_deadbeef(Constants &C) +{ + return C.deadbeef(); +} + +union u { + unsigned int f[4]; + vector unsigned int v; +} data; + +int main() +{ + Constants c; + data.v = const_deadbeef(c); + + if (data.f[0] != 0xdeadbeef || data.f[1] != 0xabababab + || data.f[2] != 0x55555555 || data.f[3] != 0x12345678) + abort(); + + return 0; +} + +/* Ignore a warning that is irrelevant to the purpose of this test. */ +/* { dg-prune-output ".*GCC vector returned by reference.*" } */ diff --git a/gcc/testsuite/g++.dg/ext/attribute-test-2.C b/gcc/testsuite/g++.dg/ext/attribute-test-2.C new file mode 100644 index 000000000..187067318 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attribute-test-2.C @@ -0,0 +1,52 @@ +// { dg-do run } +// { dg-options "-Wno-abi" } +// PR c++/9844 + +extern "C" void abort(); + +#define vector __attribute__((vector_size(16))) + +class vector_holder +{ + char __attribute__((vector_size(16))) vec; + char __attribute__((vector_size(16))) vec1; +public: + operator __attribute__((vector_size(16))) short (void) { + return (__attribute__((vector_size(16))) short) vec; + } + + operator __attribute__((vector_size(16))) unsigned int (void) { + return (__attribute__((vector_size(16))) unsigned int) vec1; + } + + vector_holder () { + vec = (__attribute__((vector_size(16))) char) {'a', 'b', 'c', 'd', 'a', 'b', 'c', 'd', + 'a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'}; + vec1 = (__attribute__((vector_size(16))) char) {'m', 'n', 'o', 'q', 'm', 'n', 'o', 'p', + 'm', 'n', 'o', 'q', 'm', 'n', 'o', 'p'}; + } +}; + +union u { + char f[16]; + vector unsigned int v; + vector short vs; +} data; + + +vector_holder vh; + +int main() +{ + data.vs = (__attribute__((vector_size(16))) short) vh; + if (data.f[0] != 'a' || data.f[15] != 'd') + abort(); + data.v = (__attribute__((vector_size(16))) unsigned int) vh; + if (data.f[0] != 'm' || data.f[15] != 'p') + abort(); + + return 0; +} + +/* Ignore a warning that is irrelevant to the purpose of this test. */ +/* { dg-prune-output ".*GCC vector returned by reference.*" } */ diff --git a/gcc/testsuite/g++.dg/ext/attribute-test-3.C b/gcc/testsuite/g++.dg/ext/attribute-test-3.C new file mode 100644 index 000000000..050cbb4ed --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attribute-test-3.C @@ -0,0 +1,54 @@ +// { dg-do run } + +#define vector __attribute__((vector_size(16))) + +extern "C" void abort(); + +class Star +{ + public: + inline vector float foo() const; + + Star() + { + data.f[0] = 1.0; data.f[1] = 2.0; data.f[2] = 3.0, data.f[3] = 4.0; + } + + private: + union { + float f[4]; + vector float v; + } data; + + friend vector float fTest(const Star &); +}; + +vector float Star::foo() const +{ + return data.v; +} + +vector float fTest(const Star & val) +{ + vector float vf = val.foo(); + return vf; +} + +int main() { + + Star s; + + union u { + float f[4]; + vector float v; + } data; + + data.v = fTest(s); + for (int i=0 ; i < 4; i++) + if (data.f[i] != (float)(i+1)) + abort(); + return 0; +} + +/* Ignore a warning that is irrelevant to the purpose of this test. */ +/* { dg-prune-output ".*GCC vector returned by reference.*" } */ diff --git a/gcc/testsuite/g++.dg/ext/attribute-test-4.C b/gcc/testsuite/g++.dg/ext/attribute-test-4.C new file mode 100644 index 000000000..4783ee8a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attribute-test-4.C @@ -0,0 +1,51 @@ +// { dg-do run } + +#define vector __attribute__((vector_size(16))) + +extern "C" void abort(); + +union U { + float f[4]; + vector float v; +} data; + +class Star +{ + public: + static vector float foo(); + + Star() + { + data.f[0] = 1.0; data.f[1] = 2.0; data.f[2] = 3.0, data.f[3] = 4.0; + } + + private: + friend vector float fTest(); +}; + +vector float Star::foo() +{ + return data.v; +} + +vector float fTest() +{ + vector float vf = Star::foo(); + return vf; +} + +int main() { + + U data; + Star s; + + + data.v = fTest(); + for (int i=0 ; i < 4; i++) + if (data.f[i] != (float)(i+1)) + abort(); + return 0; +} + +/* Ignore a warning that is irrelevant to the purpose of this test. */ +/* { dg-prune-output ".*GCC vector returned by reference.*" } */ diff --git a/gcc/testsuite/g++.dg/ext/bitfield1.C b/gcc/testsuite/g++.dg/ext/bitfield1.C new file mode 100644 index 000000000..25c90df41 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/bitfield1.C @@ -0,0 +1,22 @@ +// PR c++/30328 +// { dg-do link } +// { dg-options "" } + +struct S +{ + signed int a:17; +} x; + +typedef typeof (x.a) foo; + +template <class T> +T* inc(T* p) { return p+1; } + +int main () +{ + foo x[2] = { 1,2 }; + int y[2] = { 1,2 }; + *inc(x); + *inc(y); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/bitfield2.C b/gcc/testsuite/g++.dg/ext/bitfield2.C new file mode 100644 index 000000000..753492ce9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/bitfield2.C @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* Remove pedantic. Allow the GCC extension to use char for bitfields. */ +/* { dg-options "" } */ +/* { dg-options "-mno-ms-bitfields" { target i?86-*-netware } } */ + +struct t /* { dg-message "note: offset of packed bit-field 't::b' has changed in GCC 4.4" "" { target pcc_bitfield_type_matters } } */ +{ + char a:4; + char b:8; + char c:4; +} __attribute__ ((packed)); + +int assrt[sizeof (struct t) == 2 ? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/ext/bitfield3.C b/gcc/testsuite/g++.dg/ext/bitfield3.C new file mode 100644 index 000000000..0a89bdab1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/bitfield3.C @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-Wno-packed-bitfield-compat" } */ +/* { dg-options "-Wno-packed-bitfield-compat -mno-ms-bitfields" { target i?86-*-netware } } */ + +struct t +{ + char a:4; + char b:8; + char c:4; +} __attribute__ ((packed)); + +int assrt[sizeof (struct t) == 2 ? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/ext/bitfield4.C b/gcc/testsuite/g++.dg/ext/bitfield4.C new file mode 100644 index 000000000..7bf855331 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/bitfield4.C @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "" } */ +/* { dg-options "-mno-ms-bitfields" { target i?86-*-netware } } */ + +struct t /* { dg-message "note: offset of packed bit-field 't::b' has changed in GCC 4.4" "" { target pcc_bitfield_type_matters } } */ +{ + char a:4; + char b:8 __attribute__ ((packed)); + char c:4; +}; + +int assrt[sizeof (struct t) == 2 ? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/ext/bitfield5.C b/gcc/testsuite/g++.dg/ext/bitfield5.C new file mode 100644 index 000000000..cb24c65d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/bitfield5.C @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-Wno-packed-bitfield-compat" } */ +/* { dg-options "-Wno-packed-bitfield-compat -mno-ms-bitfields" { target i?86-*-netware } } */ + +struct t +{ + char a:4; + char b:8 __attribute__ ((packed)); + char c:4; +}; + +int assrt[sizeof (struct t) == 2 ? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/ext/boolcomplex-1.c b/gcc/testsuite/g++.dg/ext/boolcomplex-1.c new file mode 100644 index 000000000..d05d9bbd8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/boolcomplex-1.c @@ -0,0 +1,3 @@ +/* { dg-do compile } */ +/* { dg-options "" } */ +bool b = --0i == 0; /* { dg-error "lvalue required as decrement operand" } */ diff --git a/gcc/testsuite/g++.dg/ext/builtin-object-size1.C b/gcc/testsuite/g++.dg/ext/builtin-object-size1.C new file mode 100644 index 000000000..8590a0bbe --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin-object-size1.C @@ -0,0 +1,435 @@ +// { dg-do run } +// { dg-options "-O2" } + +typedef __SIZE_TYPE__ size_t; +extern "C" void abort (); +extern "C" void exit (int); +extern "C" void *malloc (size_t); +extern "C" void free (void *); + +struct A +{ + char a[10]; + int b; + char c[10]; +}; + +void +__attribute__ ((noinline)) +test1 (A *p) +{ + char *c; + if (__builtin_object_size (&p->a, 0) != (size_t) -1) + abort (); + if (__builtin_object_size (&p->a[0], 0) != (size_t) -1) + abort (); + if (__builtin_object_size (&p->a[3], 0) != (size_t) -1) + abort (); + if (__builtin_object_size (&p->b, 0) != (size_t) -1) + abort (); + if (__builtin_object_size (&p->c, 0) != (size_t) -1) + abort (); + c = p->a; + if (__builtin_object_size (c, 0) != (size_t) -1) + abort (); + c = &p->a[0]; + if (__builtin_object_size (c, 0) != (size_t) -1) + abort (); + c = &p->a[3]; + if (__builtin_object_size (c, 0) != (size_t) -1) + abort (); + c = (char *) &p->b; + if (__builtin_object_size (c, 0) != (size_t) -1) + abort (); + c = (char *) &p->c; + if (__builtin_object_size (c, 0) != (size_t) -1) + abort (); + if (__builtin_object_size (&p->a, 1) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3) + abort (); + if (__builtin_object_size (&p->b, 1) != sizeof (p->b)) + abort (); + if (__builtin_object_size (&p->c, 1) != (size_t) -1) + abort (); + c = p->a; + if (__builtin_object_size (c, 1) != sizeof (p->a)) + abort (); + c = &p->a[0]; + if (__builtin_object_size (c, 1) != sizeof (p->a)) + abort (); + c = &p->a[3]; + if (__builtin_object_size (c, 1) != sizeof (p->a) - 3) + abort (); + c = (char *) &p->b; + if (__builtin_object_size (c, 1) != sizeof (p->b)) + abort (); + c = (char *) &p->c; + if (__builtin_object_size (c, 1) != (size_t) -1) + abort (); + if (__builtin_object_size (&p->a, 2) != 0) + abort (); + if (__builtin_object_size (&p->a[0], 2) != 0) + abort (); + if (__builtin_object_size (&p->a[3], 2) != 0) + abort (); + if (__builtin_object_size (&p->b, 2) != 0) + abort (); + if (__builtin_object_size (&p->c, 2) != 0) + abort (); + c = p->a; + if (__builtin_object_size (c, 2) != 0) + abort (); + c = &p->a[0]; + if (__builtin_object_size (c, 2) != 0) + abort (); + c = &p->a[3]; + if (__builtin_object_size (c, 2) != 0) + abort (); + c = (char *) &p->b; + if (__builtin_object_size (c, 2) != 0) + abort (); + c = (char *) &p->c; + if (__builtin_object_size (c, 2) != 0) + abort (); + if (__builtin_object_size (&p->a, 3) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[0], 3) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[3], 3) != sizeof (p->a) - 3) + abort (); + if (__builtin_object_size (&p->b, 3) != sizeof (p->b)) + abort (); + if (__builtin_object_size (&p->c, 3) != 0) + abort (); + c = p->a; + if (__builtin_object_size (c, 3) != sizeof (p->a)) + abort (); + c = &p->a[0]; + if (__builtin_object_size (c, 3) != sizeof (p->a)) + abort (); + c = &p->a[3]; + if (__builtin_object_size (c, 3) != sizeof (p->a) - 3) + abort (); + c = (char *) &p->b; + if (__builtin_object_size (c, 3) != sizeof (p->b)) + abort (); + c = (char *) &p->c; + if (__builtin_object_size (c, 3) != 0) + abort (); +} + +void +__attribute__ ((noinline)) +test2 (void) +{ + char *c; + size_t s = 2 * sizeof (A); + A *p = (A *) malloc (2 * sizeof (A)); + if (__builtin_object_size (&p->a, 0) != s) + abort (); + if (__builtin_object_size (&p->a[0], 0) != s) + abort (); + if (__builtin_object_size (&p->a[3], 0) != s - 3) + abort (); + if (__builtin_object_size (&p->b, 0) != s - __builtin_offsetof (A, b)) + abort (); + if (__builtin_object_size (&p->c, 0) != s - __builtin_offsetof (A, c)) + abort (); + c = p->a; + if (__builtin_object_size (c, 0) != s) + abort (); + c = &p->a[0]; + if (__builtin_object_size (c, 0) != s) + abort (); + c = &p->a[3]; + if (__builtin_object_size (c, 0) != s - 3) + abort (); + c = (char *) &p->b; + if (__builtin_object_size (c, 0) != s - __builtin_offsetof (A, b)) + abort (); + c = (char *) &p->c; + if (__builtin_object_size (c, 0) != s - __builtin_offsetof (A, c)) + abort (); + if (__builtin_object_size (&p->a, 1) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3) + abort (); + if (__builtin_object_size (&p->b, 1) != sizeof (p->b)) + abort (); + if (__builtin_object_size (&p->c, 1) != s - __builtin_offsetof (A, c)) + abort (); + c = p->a; + if (__builtin_object_size (c, 1) != sizeof (p->a)) + abort (); + c = &p->a[0]; + if (__builtin_object_size (c, 1) != sizeof (p->a)) + abort (); + c = &p->a[3]; + if (__builtin_object_size (c, 1) != sizeof (p->a) - 3) + abort (); + c = (char *) &p->b; + if (__builtin_object_size (c, 1) != sizeof (p->b)) + abort (); + c = (char *) &p->c; + if (__builtin_object_size (c, 1) != s - __builtin_offsetof (A, c)) + abort (); + if (__builtin_object_size (&p->a, 2) != s) + abort (); + if (__builtin_object_size (&p->a[0], 2) != s) + abort (); + if (__builtin_object_size (&p->a[3], 2) != s - 3) + abort (); + if (__builtin_object_size (&p->b, 2) != s - __builtin_offsetof (A, b)) + abort (); + if (__builtin_object_size (&p->c, 2) != s - __builtin_offsetof (A, c)) + abort (); + c = p->a; + if (__builtin_object_size (c, 2) != s) + abort (); + c = &p->a[0]; + if (__builtin_object_size (c, 2) != s) + abort (); + c = &p->a[3]; + if (__builtin_object_size (c, 2) != s - 3) + abort (); + c = (char *) &p->b; + if (__builtin_object_size (c, 2) != s - __builtin_offsetof (A, b)) + abort (); + c = (char *) &p->c; + if (__builtin_object_size (c, 2) != s - __builtin_offsetof (A, c)) + abort (); + if (__builtin_object_size (&p->a, 3) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[0], 3) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[3], 3) != sizeof (p->a) - 3) + abort (); + if (__builtin_object_size (&p->b, 3) != sizeof (p->b)) + abort (); + if (__builtin_object_size (&p->c, 3) != s - __builtin_offsetof (A, c)) + abort (); + c = p->a; + if (__builtin_object_size (c, 3) != sizeof (p->a)) + abort (); + c = &p->a[0]; + if (__builtin_object_size (c, 3) != sizeof (p->a)) + abort (); + c = &p->a[3]; + if (__builtin_object_size (c, 3) != sizeof (p->a) - 3) + abort (); + c = (char *) &p->b; + if (__builtin_object_size (c, 3) != sizeof (p->b)) + abort (); + c = (char *) &p->c; + if (__builtin_object_size (c, 3) != s - __builtin_offsetof (A, c)) + abort (); + free (p); +} + +void +__attribute__ ((noinline)) +test3 (void) +{ + char *c; + size_t s; + A *p = (A *) malloc (4); + if (__builtin_object_size (&p->a, 0) != 4) + abort (); + if (__builtin_object_size (&p->a[0], 0) != 4) + abort (); + if (__builtin_object_size (&p->a[3], 0) != 1) + abort (); + if (__builtin_object_size (&p->b, 0) != 0) + abort (); + if (__builtin_object_size (&p->c, 0) != 0) + abort (); + if (__builtin_object_size (&p->a, 1) != 4) + abort (); + if (__builtin_object_size (&p->a[0], 1) != 4) + abort (); + if (__builtin_object_size (&p->a[3], 1) != 1) + abort (); + if (__builtin_object_size (&p->b, 1) != 0) + abort (); + if (__builtin_object_size (&p->c, 1) != 0) + abort (); + free (p); + s = __builtin_offsetof (A, c) + 4; + p = (A *) malloc (s); + if (__builtin_object_size (&p->a, 0) != s) + abort (); + if (__builtin_object_size (&p->a[0], 0) != s) + abort (); + if (__builtin_object_size (&p->a[3], 0) != s - 3) + abort (); + if (__builtin_object_size (&p->b, 0) != s - __builtin_offsetof (A, b)) + abort (); + if (__builtin_object_size (&p->c, 0) != 4) + abort (); + if (__builtin_object_size (&p->a, 1) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3) + abort (); + if (__builtin_object_size (&p->b, 1) != sizeof (p->b)) + abort (); + if (__builtin_object_size (&p->c, 1) != 4) + abort (); + free (p); +} + +struct B +{ + A a[4]; +}; + +void +__attribute__ ((noinline)) +test4 (struct B *q, int i) +{ + if (__builtin_object_size (&q->a[2].a[2], 1) != sizeof (q->a[0].a) - 2) + abort (); + if (__builtin_object_size (&q->a[2].c[2], 1) != sizeof (q->a[0].c) - 2) + abort (); + if (__builtin_object_size (&q->a[3].a[2], 1) != sizeof (q->a[0].a) - 2) + abort (); + if (__builtin_object_size (&q->a[3].c[2], 1) != sizeof (q->a[0].c) - 2) + abort (); + if (__builtin_object_size (&q->a[i].a[2], 1) != sizeof (q->a[0].a) - 2) + abort (); + if (__builtin_object_size (&q->a[i].c[2], 1) != sizeof (q->a[0].c) - 2) + abort (); +} + +struct C +{ + char a[10]; + char b; +}; + +void +__attribute__ ((noinline)) +test5 (struct C *c) +{ + if (__builtin_object_size (&c->b, 0) != (size_t) -1) + abort (); + if (__builtin_object_size (&c->b, 1) != 1) + abort (); + if (__builtin_object_size (&c->b, 2) != 0) + abort (); + if (__builtin_object_size (&c->b, 3) != 1) + abort (); +} + +struct D +{ + int i; + struct D1 + { + char b; + char a[10]; + } j; +}; + +void +__attribute__ ((noinline)) +test6 (struct D *d) +{ + if (__builtin_object_size (&d->j.a[3], 0) != (size_t) -1) + abort (); + if (__builtin_object_size (&d->j.a[3], 1) != sizeof (d->j.a) - 3) + abort (); + if (__builtin_object_size (&d->j.a[3], 2) != 0) + abort (); + if (__builtin_object_size (&d->j.a[3], 3) != sizeof (d->j.a) - 3) + abort (); +} + +struct E +{ + int i; + struct E1 + { + char b; + char a[10]; + } j[1]; +}; + +void +__attribute__ ((noinline)) +test7 (struct E *e) +{ + if (__builtin_object_size (&e->j[0].a[3], 0) != (size_t) -1) + abort (); + if (__builtin_object_size (&e->j[0].a[3], 1) != sizeof (e->j[0].a) - 3) + abort (); + if (__builtin_object_size (&e->j[0].a[3], 2) != 0) + abort (); + if (__builtin_object_size (&e->j[0].a[3], 3) != sizeof (e->j[0].a) - 3) + abort (); + if (__builtin_object_size ((char *) &e->j[0], 0) != (size_t) -1) + abort (); + if (__builtin_object_size ((char *) &e->j[0], 1) != (size_t) -1) + abort (); + if (__builtin_object_size ((char *) &e->j[0], 2) != 0) + abort (); + if (__builtin_object_size ((char *) &e->j[0], 3) != 0) + abort (); +} + +union F +{ + char a[1]; + struct F1 + { + char b; + char c[10]; + } d; +}; + +void +__attribute__ ((noinline)) +test8 (union F *f) +{ + if (__builtin_object_size (&f->d.c[3], 0) != (size_t) -1) + abort (); + if (__builtin_object_size (&f->d.c[3], 1) != (size_t) -1) + abort (); + if (__builtin_object_size (&f->d.c[3], 2) != 0) + abort (); + if (__builtin_object_size (&f->d.c[3], 3) != 0) + abort (); +} + +int +main (void) +{ + A a, *p = &a; + int i = 1; + __asm ("" : "+r" (p)); + test1 (p); + test2 (); + test3 (); + struct B b, *q = &b; + __asm ("" : "+r" (q), "+r" (i)); + test4 (q, i); + struct C c, *cp = &c; + __asm ("" : "+r" (cp)); + test5 (cp); + struct D d, *dp = &d; + __asm ("" : "+r" (dp)); + test6 (dp); + struct E e, *ep = &e; + __asm ("" : "+r" (ep)); + test7 (ep); + union F f, *fp = &f; + __asm ("" : "+r" (fp)); + test8 (fp); + exit (0); +} diff --git a/gcc/testsuite/g++.dg/ext/builtin-object-size2.C b/gcc/testsuite/g++.dg/ext/builtin-object-size2.C new file mode 100644 index 000000000..d79b1b833 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin-object-size2.C @@ -0,0 +1,438 @@ +// { dg-do run } +// { dg-options "-O2" } + +typedef __SIZE_TYPE__ size_t; +extern "C" void abort (); +extern "C" void exit (int); +extern "C" void *malloc (size_t); +extern "C" void free (void *); + +typedef struct A +{ + char a[10]; + int b; + char c[10]; + static int d; +} AT; + +int A::d = 6; + +void +__attribute__ ((noinline)) +test1 (A *p) +{ + char *c; + if (__builtin_object_size (&p->a, 0) != (size_t) -1) + abort (); + if (__builtin_object_size (&p->a[0], 0) != (size_t) -1) + abort (); + if (__builtin_object_size (&p->a[3], 0) != (size_t) -1) + abort (); + if (__builtin_object_size (&p->b, 0) != (size_t) -1) + abort (); + if (__builtin_object_size (&p->c, 0) != (size_t) -1) + abort (); + c = p->a; + if (__builtin_object_size (c, 0) != (size_t) -1) + abort (); + c = &p->a[0]; + if (__builtin_object_size (c, 0) != (size_t) -1) + abort (); + c = &p->a[3]; + if (__builtin_object_size (c, 0) != (size_t) -1) + abort (); + c = (char *) &p->b; + if (__builtin_object_size (c, 0) != (size_t) -1) + abort (); + c = (char *) &p->c; + if (__builtin_object_size (c, 0) != (size_t) -1) + abort (); + if (__builtin_object_size (&p->a, 1) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3) + abort (); + if (__builtin_object_size (&p->b, 1) != sizeof (p->b)) + abort (); + if (__builtin_object_size (&p->c, 1) != (size_t) -1) + abort (); + c = p->a; + if (__builtin_object_size (c, 1) != sizeof (p->a)) + abort (); + c = &p->a[0]; + if (__builtin_object_size (c, 1) != sizeof (p->a)) + abort (); + c = &p->a[3]; + if (__builtin_object_size (c, 1) != sizeof (p->a) - 3) + abort (); + c = (char *) &p->b; + if (__builtin_object_size (c, 1) != sizeof (p->b)) + abort (); + c = (char *) &p->c; + if (__builtin_object_size (c, 1) != (size_t) -1) + abort (); + if (__builtin_object_size (&p->a, 2) != 0) + abort (); + if (__builtin_object_size (&p->a[0], 2) != 0) + abort (); + if (__builtin_object_size (&p->a[3], 2) != 0) + abort (); + if (__builtin_object_size (&p->b, 2) != 0) + abort (); + if (__builtin_object_size (&p->c, 2) != 0) + abort (); + c = p->a; + if (__builtin_object_size (c, 2) != 0) + abort (); + c = &p->a[0]; + if (__builtin_object_size (c, 2) != 0) + abort (); + c = &p->a[3]; + if (__builtin_object_size (c, 2) != 0) + abort (); + c = (char *) &p->b; + if (__builtin_object_size (c, 2) != 0) + abort (); + c = (char *) &p->c; + if (__builtin_object_size (c, 2) != 0) + abort (); + if (__builtin_object_size (&p->a, 3) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[0], 3) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[3], 3) != sizeof (p->a) - 3) + abort (); + if (__builtin_object_size (&p->b, 3) != sizeof (p->b)) + abort (); + if (__builtin_object_size (&p->c, 3) != 0) + abort (); + c = p->a; + if (__builtin_object_size (c, 3) != sizeof (p->a)) + abort (); + c = &p->a[0]; + if (__builtin_object_size (c, 3) != sizeof (p->a)) + abort (); + c = &p->a[3]; + if (__builtin_object_size (c, 3) != sizeof (p->a) - 3) + abort (); + c = (char *) &p->b; + if (__builtin_object_size (c, 3) != sizeof (p->b)) + abort (); + c = (char *) &p->c; + if (__builtin_object_size (c, 3) != 0) + abort (); +} + +void +__attribute__ ((noinline)) +test2 (void) +{ + char *c; + size_t s = 2 * sizeof (A); + A *p = (A *) malloc (2 * sizeof (A)); + if (__builtin_object_size (&p->a, 0) != s) + abort (); + if (__builtin_object_size (&p->a[0], 0) != s) + abort (); + if (__builtin_object_size (&p->a[3], 0) != s - 3) + abort (); + if (__builtin_object_size (&p->b, 0) != s - __builtin_offsetof (A, b)) + abort (); + if (__builtin_object_size (&p->c, 0) != s - __builtin_offsetof (A, c)) + abort (); + c = p->a; + if (__builtin_object_size (c, 0) != s) + abort (); + c = &p->a[0]; + if (__builtin_object_size (c, 0) != s) + abort (); + c = &p->a[3]; + if (__builtin_object_size (c, 0) != s - 3) + abort (); + c = (char *) &p->b; + if (__builtin_object_size (c, 0) != s - __builtin_offsetof (A, b)) + abort (); + c = (char *) &p->c; + if (__builtin_object_size (c, 0) != s - __builtin_offsetof (A, c)) + abort (); + if (__builtin_object_size (&p->a, 1) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3) + abort (); + if (__builtin_object_size (&p->b, 1) != sizeof (p->b)) + abort (); + if (__builtin_object_size (&p->c, 1) != s - __builtin_offsetof (A, c)) + abort (); + c = p->a; + if (__builtin_object_size (c, 1) != sizeof (p->a)) + abort (); + c = &p->a[0]; + if (__builtin_object_size (c, 1) != sizeof (p->a)) + abort (); + c = &p->a[3]; + if (__builtin_object_size (c, 1) != sizeof (p->a) - 3) + abort (); + c = (char *) &p->b; + if (__builtin_object_size (c, 1) != sizeof (p->b)) + abort (); + c = (char *) &p->c; + if (__builtin_object_size (c, 1) != s - __builtin_offsetof (A, c)) + abort (); + if (__builtin_object_size (&p->a, 2) != s) + abort (); + if (__builtin_object_size (&p->a[0], 2) != s) + abort (); + if (__builtin_object_size (&p->a[3], 2) != s - 3) + abort (); + if (__builtin_object_size (&p->b, 2) != s - __builtin_offsetof (A, b)) + abort (); + if (__builtin_object_size (&p->c, 2) != s - __builtin_offsetof (A, c)) + abort (); + c = p->a; + if (__builtin_object_size (c, 2) != s) + abort (); + c = &p->a[0]; + if (__builtin_object_size (c, 2) != s) + abort (); + c = &p->a[3]; + if (__builtin_object_size (c, 2) != s - 3) + abort (); + c = (char *) &p->b; + if (__builtin_object_size (c, 2) != s - __builtin_offsetof (A, b)) + abort (); + c = (char *) &p->c; + if (__builtin_object_size (c, 2) != s - __builtin_offsetof (A, c)) + abort (); + if (__builtin_object_size (&p->a, 3) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[0], 3) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[3], 3) != sizeof (p->a) - 3) + abort (); + if (__builtin_object_size (&p->b, 3) != sizeof (p->b)) + abort (); + if (__builtin_object_size (&p->c, 3) != s - __builtin_offsetof (A, c)) + abort (); + c = p->a; + if (__builtin_object_size (c, 3) != sizeof (p->a)) + abort (); + c = &p->a[0]; + if (__builtin_object_size (c, 3) != sizeof (p->a)) + abort (); + c = &p->a[3]; + if (__builtin_object_size (c, 3) != sizeof (p->a) - 3) + abort (); + c = (char *) &p->b; + if (__builtin_object_size (c, 3) != sizeof (p->b)) + abort (); + c = (char *) &p->c; + if (__builtin_object_size (c, 3) != s - __builtin_offsetof (A, c)) + abort (); + free (p); +} + +void +__attribute__ ((noinline)) +test3 (void) +{ + char *c; + size_t s; + A *p = (A *) malloc (4); + if (__builtin_object_size (&p->a, 0) != 4) + abort (); + if (__builtin_object_size (&p->a[0], 0) != 4) + abort (); + if (__builtin_object_size (&p->a[3], 0) != 1) + abort (); + if (__builtin_object_size (&p->b, 0) != 0) + abort (); + if (__builtin_object_size (&p->c, 0) != 0) + abort (); + if (__builtin_object_size (&p->a, 1) != 4) + abort (); + if (__builtin_object_size (&p->a[0], 1) != 4) + abort (); + if (__builtin_object_size (&p->a[3], 1) != 1) + abort (); + if (__builtin_object_size (&p->b, 1) != 0) + abort (); + if (__builtin_object_size (&p->c, 1) != 0) + abort (); + free (p); + s = __builtin_offsetof (A, c) + 4; + p = (A *) malloc (s); + if (__builtin_object_size (&p->a, 0) != s) + abort (); + if (__builtin_object_size (&p->a[0], 0) != s) + abort (); + if (__builtin_object_size (&p->a[3], 0) != s - 3) + abort (); + if (__builtin_object_size (&p->b, 0) != s - __builtin_offsetof (A, b)) + abort (); + if (__builtin_object_size (&p->c, 0) != 4) + abort (); + if (__builtin_object_size (&p->a, 1) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[0], 1) != sizeof (p->a)) + abort (); + if (__builtin_object_size (&p->a[3], 1) != sizeof (p->a) - 3) + abort (); + if (__builtin_object_size (&p->b, 1) != sizeof (p->b)) + abort (); + if (__builtin_object_size (&p->c, 1) != 4) + abort (); + free (p); +} + +struct B +{ + A a[4]; +}; + +void +__attribute__ ((noinline)) +test4 (struct B *q, int i) +{ + if (__builtin_object_size (&q->a[2].a[2], 1) != sizeof (q->a[0].a) - 2) + abort (); + if (__builtin_object_size (&q->a[2].c[2], 1) != sizeof (q->a[0].c) - 2) + abort (); + if (__builtin_object_size (&q->a[3].a[2], 1) != sizeof (q->a[0].a) - 2) + abort (); + if (__builtin_object_size (&q->a[3].c[2], 1) != sizeof (q->a[0].c) - 2) + abort (); + if (__builtin_object_size (&q->a[i].a[2], 1) != sizeof (q->a[0].a) - 2) + abort (); + if (__builtin_object_size (&q->a[i].c[2], 1) != sizeof (q->a[0].c) - 2) + abort (); +} + +struct C +{ + char a[10]; + char b; +}; + +void +__attribute__ ((noinline)) +test5 (struct C *c) +{ + if (__builtin_object_size (&c->b, 0) != (size_t) -1) + abort (); + if (__builtin_object_size (&c->b, 1) != 1) + abort (); + if (__builtin_object_size (&c->b, 2) != 0) + abort (); + if (__builtin_object_size (&c->b, 3) != 1) + abort (); +} + +struct D +{ + int i; + struct D1 + { + char b; + char a[10]; + } j; +}; + +void +__attribute__ ((noinline)) +test6 (struct D *d) +{ + if (__builtin_object_size (&d->j.a[3], 0) != (size_t) -1) + abort (); + if (__builtin_object_size (&d->j.a[3], 1) != sizeof (d->j.a) - 3) + abort (); + if (__builtin_object_size (&d->j.a[3], 2) != 0) + abort (); + if (__builtin_object_size (&d->j.a[3], 3) != sizeof (d->j.a) - 3) + abort (); +} + +struct E +{ + int i; + struct E1 + { + char b; + char a[10]; + } j[1]; +}; + +void +__attribute__ ((noinline)) +test7 (struct E *e) +{ + if (__builtin_object_size (&e->j[0].a[3], 0) != (size_t) -1) + abort (); + if (__builtin_object_size (&e->j[0].a[3], 1) != sizeof (e->j[0].a) - 3) + abort (); + if (__builtin_object_size (&e->j[0].a[3], 2) != 0) + abort (); + if (__builtin_object_size (&e->j[0].a[3], 3) != sizeof (e->j[0].a) - 3) + abort (); + if (__builtin_object_size ((char *) &e->j[0], 0) != (size_t) -1) + abort (); + if (__builtin_object_size ((char *) &e->j[0], 1) != (size_t) -1) + abort (); + if (__builtin_object_size ((char *) &e->j[0], 2) != 0) + abort (); + if (__builtin_object_size ((char *) &e->j[0], 3) != 0) + abort (); +} + +union F +{ + char a[1]; + struct F1 + { + char b; + char c[10]; + } d; +}; + +void +__attribute__ ((noinline)) +test8 (union F *f) +{ + if (__builtin_object_size (&f->d.c[3], 0) != (size_t) -1) + abort (); + if (__builtin_object_size (&f->d.c[3], 1) != (size_t) -1) + abort (); + if (__builtin_object_size (&f->d.c[3], 2) != 0) + abort (); + if (__builtin_object_size (&f->d.c[3], 3) != 0) + abort (); +} + +int +main (void) +{ + A a, *p = &a; + int i = 1; + __asm ("" : "+r" (p)); + test1 (p); + test2 (); + test3 (); + struct B b, *q = &b; + __asm ("" : "+r" (q), "+r" (i)); + test4 (q, i); + struct C c, *cp = &c; + __asm ("" : "+r" (cp)); + test5 (cp); + struct D d, *dp = &d; + __asm ("" : "+r" (dp)); + test6 (dp); + struct E e, *ep = &e; + __asm ("" : "+r" (ep)); + test7 (ep); + union F f, *fp = &f; + __asm ("" : "+r" (fp)); + test8 (fp); + exit (0); +} diff --git a/gcc/testsuite/g++.dg/ext/builtin1.C b/gcc/testsuite/g++.dg/ext/builtin1.C new file mode 100644 index 000000000..9947c85bf --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin1.C @@ -0,0 +1,10 @@ +// Test whether alternate 'asm' name is applied correctly to +// builtin in global namespace + +// { dg-do compile } +// { dg-options "" } +// { dg-final { scan-assembler "fancy_printf" } } + +extern "C" int printf(const char*, ...) __asm("_fancy_printf"); + +void foo() { printf("abc"); } diff --git a/gcc/testsuite/g++.dg/ext/builtin10.C b/gcc/testsuite/g++.dg/ext/builtin10.C new file mode 100644 index 000000000..8742223a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin10.C @@ -0,0 +1,56 @@ +// { dg-do compile { target correct_iso_cpp_string_wchar_protos } } +// { dg-options "-O2 -fdump-tree-optimized" } + +#include <cstring> + +const void *cv1; +const char *cc1, *cc2, *cc3, *cc4; +void *v1; +char *c1, *c2, *c3, *c4; + +void +f1 (void) +{ + cv1 = memchr ("abcba", 'b', 3); + cc1 = strchr ("abcba", 'b'); + cc2 = strrchr ("abcba", 'b'); + cc3 = strpbrk ("dabc", "abc"); + cc4 = strstr ("aaabc", "abc"); +} + +void +f2 (void) +{ + cv1 = std::memchr ("abcba", 'b', 3); + cc1 = std::strchr ("abcba", 'b'); + cc2 = std::strrchr ("abcba", 'b'); + cc3 = std::strpbrk ("dabc", "abc"); + cc4 = std::strstr ("aaabc", "abc"); +} + +void +f3 (void) +{ + v1 = memchr ((char *)"abcba", 'b', 3); + c1 = strchr ((char *)"abcba", 'b'); + c2 = strrchr ((char *)"abcba", 'b'); + c3 = strpbrk ((char *)"dabc", "abc"); + c4 = strstr ((char *)"aaabc", "abc"); +} + +void +f4 (void) +{ + v1 = std::memchr ((char *)"abcba", 'b', 3); + c1 = std::strchr ((char *)"abcba", 'b'); + c2 = std::strrchr ((char *)"abcba", 'b'); + c3 = std::strpbrk ((char *)"dabc", "abc"); + c4 = std::strstr ((char *)"aaabc", "abc"); +} + +// { dg-final { scan-tree-dump-not "memchr" "optimized" } } +// { dg-final { scan-tree-dump-not "strchr" "optimized" } } +// { dg-final { scan-tree-dump-not "strrchr" "optimized" } } +// { dg-final { scan-tree-dump-not "strpbrk" "optimized" } } +// { dg-final { scan-tree-dump-not "strstr" "optimized" } } +// { dg-final { cleanup-tree-dump "optimized" } } diff --git a/gcc/testsuite/g++.dg/ext/builtin11.C b/gcc/testsuite/g++.dg/ext/builtin11.C new file mode 100644 index 000000000..2749671fb --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin11.C @@ -0,0 +1,9 @@ +// PR c++/40138 +// { dg-options "-Wall" } + +void foo(int i, ...) +{ + V v; // { dg-error "not declared|expected" } + __builtin_va_start(v, i); // { dg-error "not declared" } + i = __builtin_va_arg(v, int); +} diff --git a/gcc/testsuite/g++.dg/ext/builtin2.C b/gcc/testsuite/g++.dg/ext/builtin2.C new file mode 100644 index 000000000..ffa25285b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin2.C @@ -0,0 +1,13 @@ +// PR c++/18514 +// Test whether alternate 'asm' name is applied correctly to +// builtin imported into namespace std. + +// { dg-do compile } +// { dg-options "" } +// { dg-final { scan-assembler "fancy_printf" } } + +extern "C" int printf(const char*, ...) __asm("_fancy_printf"); + +namespace std { using ::printf; } + +namespace std { void foo() { printf("abc"); } } diff --git a/gcc/testsuite/g++.dg/ext/builtin3.C b/gcc/testsuite/g++.dg/ext/builtin3.C new file mode 100644 index 000000000..001d5f784 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin3.C @@ -0,0 +1,14 @@ +// Verify that declaring builtin in namespace std doesn't give us +// declaration in global namespace + +// { dg-do compile } +// { dg-options "" } + +namespace std { +extern "C" int printf(char*, ...); // { dg-message "std::printf" } +} + +void foo() { + printf("abc"); // { dg-error "not declared" } + // { dg-message "suggested alternative" "suggested alternative" { target *-*-* } 12 } +} diff --git a/gcc/testsuite/g++.dg/ext/builtin4.C b/gcc/testsuite/g++.dg/ext/builtin4.C new file mode 100644 index 000000000..8804b53bd --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin4.C @@ -0,0 +1,10 @@ +// Verify that builtin is used when declared in global namespace + +// { dg-do compile } +// { dg-options "-Wall" } + +extern "C" int printf(const char*,...); + +void foo() { + printf("%d"); // { dg-warning "expects a matching" } +} diff --git a/gcc/testsuite/g++.dg/ext/builtin5.C b/gcc/testsuite/g++.dg/ext/builtin5.C new file mode 100644 index 000000000..051224ffd --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin5.C @@ -0,0 +1,12 @@ +// Verify that builtin is used when declared in namespace std + +// { dg-do compile } +// { dg-options "-Wall" } + +namespace std { + extern "C" int printf(const char*,...); +} + +void foo() { + std::printf("%d"); // { dg-warning "expects a matching" } +} diff --git a/gcc/testsuite/g++.dg/ext/builtin6.C b/gcc/testsuite/g++.dg/ext/builtin6.C new file mode 100644 index 000000000..8f405b095 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin6.C @@ -0,0 +1,11 @@ +// PR c++/19044 +// Verify that alternate asm name for builtin named "foo" also gets +// applied to its sibling "__builtin_foo". + +// { dg-do compile } +// { dg-final { scan-assembler "fancy_sin" } } + +extern "C" double sin(double) __asm("_fancy_sin"); + +double foo(double x) { return __builtin_sin(x); } + diff --git a/gcc/testsuite/g++.dg/ext/builtin7.C b/gcc/testsuite/g++.dg/ext/builtin7.C new file mode 100644 index 000000000..dae658abc --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin7.C @@ -0,0 +1,14 @@ +// PR c++/19628 +// Verify that __builtin_constant_p may appear in a constant-expression. + +// { dg-do run } + +int main() +{ + switch (3) { + case (__builtin_constant_p(7) ? 3 : 8): + return 0; + default: + return 1; + } +} diff --git a/gcc/testsuite/g++.dg/ext/builtin8.C b/gcc/testsuite/g++.dg/ext/builtin8.C new file mode 100644 index 000000000..dd4997725 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin8.C @@ -0,0 +1,16 @@ +// PR c++/19628 +// Verify that __builtin_constant_p may appear in a constant-expression. + +// { dg-do compile } + +template <int I> +int f(int x[__builtin_constant_p(I)]) +{ + return x[0]; +} + +int g() +{ + int a[1] = { 7 }; + return f<32>(a); +} diff --git a/gcc/testsuite/g++.dg/ext/builtin9.C b/gcc/testsuite/g++.dg/ext/builtin9.C new file mode 100644 index 000000000..6b2b712de --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin9.C @@ -0,0 +1,3 @@ +// PR c++/21619 +// { dg-options "" } +int f[__builtin_constant_p(&"Hello"[0])?1:-1]; diff --git a/gcc/testsuite/g++.dg/ext/c99struct1.C b/gcc/testsuite/g++.dg/ext/c99struct1.C new file mode 100644 index 000000000..93e84b460 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/c99struct1.C @@ -0,0 +1,12 @@ +// { dg-options "" } +// C99 anon struct variable with array accesses. + +struct s { int a[1]; }; + +void +foo5 (void) +{ + ((struct s) { { 0 } }).a[0] = 1; +} + + diff --git a/gcc/testsuite/g++.dg/ext/case-range1.C b/gcc/testsuite/g++.dg/ext/case-range1.C new file mode 100644 index 000000000..0e313d6b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/case-range1.C @@ -0,0 +1,23 @@ +// { dg-do compile } +// Tests if case ranges (a GNU extension) are accepted +// { dg-options "" } +const int low = -2; +const int high = 15; + +template <typename T> +T f2 (T i) +{ + switch (i) + { + case low ... high : return i + 1; + default : return 0; + } +} + +int f (int i) +{ + switch (i) { + case 1 ... 10: return i + 1; + default: return f2 (i); + } +} diff --git a/gcc/testsuite/g++.dg/ext/case-range2.C b/gcc/testsuite/g++.dg/ext/case-range2.C new file mode 100644 index 000000000..de1f2a7e7 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/case-range2.C @@ -0,0 +1,27 @@ +// { dg-do compile } +// Tests if case ranges (a GNU extension) correctly emit messages +// about overlapping ranges. +// { dg-options "" } + +const int low = -2; +const int high = 15; + +template <typename T> +T f2 (T i) +{ + switch (i) + { + case low ... high : return i + 1; // { dg-error "previously" } + case 5 : return i + 2; // { dg-error "duplicate" } + default : return 0; + } +} + +int f (int i) +{ + switch (i) { + case 1 ... 10: return i + 1; // { dg-error "first entry" } + case 3 ... 5 : return i + 3; // { dg-error "duplicate" } + default: return f2 (i); // { dg-message "instantiated" } + } +} diff --git a/gcc/testsuite/g++.dg/ext/case-range3.C b/gcc/testsuite/g++.dg/ext/case-range3.C new file mode 100644 index 000000000..5a09c12d6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/case-range3.C @@ -0,0 +1,23 @@ +// { dg-do compile } +// Tests if case ranges (a GNU extension) emit errors in ISO mode +// { dg-options "-pedantic" } +const int low = -2; +const int high = 15; + +template <typename T> +T f2 (T i) +{ + switch (i) + { + case low ... high : return i + 1; // { dg-warning "non-standard" } + default : return 0; + } +} + +int f (int i) +{ + switch (i) { + case 1 ... 10: return i + 1; // { dg-warning "non-standard" } + default: return f2 (i); // { dg-message "instantiated" } + } +} diff --git a/gcc/testsuite/g++.dg/ext/cleanup-1.C b/gcc/testsuite/g++.dg/ext/cleanup-1.C new file mode 100644 index 000000000..8e8353754 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/cleanup-1.C @@ -0,0 +1,36 @@ +/* { dg-do compile } */ +/* { dg-options "-Wall" } */ +/* Validate expected warnings and errors. */ + +#define U __attribute__((unused)) +#define C(x) __attribute__((cleanup(x))) + +static int f1(void *x U) { return 0; } +static void f2() { } /* { dg-message "note: declared here" } */ +static void f3(void) { } /* { dg-message "note: declared here" } */ +static void f4(void *x U) { } +static void f5(int *x U) { } +static void f6(double *x U) { } +static void f7(const int *x U) { } +static void f8(const int *x U, int y U) { } /* { dg-message "note: declared here" } */ +static void f9(int x U) { } + +void test(void) +{ + int o1 C(f1); + int o2 C(f2); /* { dg-error "too many arguments" } */ + int o3 C(f3); /* { dg-error "too many arguments" } */ + int o4 C(f4); + int o5 C(f5); + int o6 C(f6); /* { dg-error "cannot convert" } */ + int o7 C(f7); + int o8 C(f8); /* { dg-error "too few arguments" } */ + int o9 C(f9); /* { dg-error "conversion" } */ + int o10 U C(undef); /* { dg-error "not a function" } */ + int o11 U C(o1); /* { dg-error "not a function" } */ + int o12 U C("f1"); /* { dg-error "not an identifier" } */ + static int o13 U C(f1); /* { dg-warning "attribute ignored" } */ +} + +int o14 C(f1); /* { dg-warning "attribute ignored" } */ +void t15(int o U C(f1)) {} /* { dg-warning "attribute ignored" } */ diff --git a/gcc/testsuite/g++.dg/ext/cleanup-10.C b/gcc/testsuite/g++.dg/ext/cleanup-10.C new file mode 100644 index 000000000..eeb607b29 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/cleanup-10.C @@ -0,0 +1,117 @@ +/* { dg-do run { target hppa*-*-hpux* *-*-linux* powerpc*-*-darwin* *-*-darwin[912]* } } */ +/* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */ +/* Verify that cleanups work with exception handling through signal frames + on alternate stack. */ + +#include <unwind.h> +#include <stdlib.h> +#include <signal.h> +#include <unistd.h> +#include <string.h> + +static _Unwind_Reason_Code +force_unwind_stop (int version, _Unwind_Action actions, + _Unwind_Exception_Class exc_class, + struct _Unwind_Exception *exc_obj, + struct _Unwind_Context *context, + void *stop_parameter) +{ + if (actions & _UA_END_OF_STACK) + abort (); + return _URC_NO_REASON; +} + +static void force_unwind () +{ + struct _Unwind_Exception *exc + = (struct _Unwind_Exception *) malloc (sizeof (*exc)); + memset (&exc->exception_class, 0, sizeof (exc->exception_class)); + exc->exception_cleanup = 0; + +#ifndef __USING_SJLJ_EXCEPTIONS__ + _Unwind_ForcedUnwind (exc, force_unwind_stop, 0); +#else + _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0); +#endif + + abort (); +} + +int count; +char *null; + +static void counter (void *p __attribute__((unused))) +{ + ++count; +} + +static void handler (void *p __attribute__((unused))) +{ + if (count != 2) + abort (); + exit (0); +} + +static int __attribute__((noinline)) fn5 () +{ + char dummy __attribute__((cleanup (counter))); + force_unwind (); + return 0; +} + +static void fn4 (int sig, siginfo_t *info, void *ctx) +{ + char dummy __attribute__((cleanup (counter))); + fn5 (); + null = NULL; +} + +static void fn3 () +{ + abort (); +} + +static int __attribute__((noinline)) fn2 () +{ + *null = 0; + fn3 (); + return 0; +} + +static int __attribute__((noinline)) fn1 () +{ + stack_t ss; + struct sigaction s; + + ss.ss_size = 4 * sysconf (_SC_PAGESIZE); + if (ss.ss_size < SIGSTKSZ) + ss.ss_size = SIGSTKSZ; + ss.ss_sp = malloc (ss.ss_size); + if (ss.ss_sp == NULL) + exit (1); + ss.ss_flags = 0; + if (sigaltstack (&ss, NULL) < 0) + exit (1); + + sigemptyset (&s.sa_mask); + s.sa_sigaction = fn4; + s.sa_flags = SA_RESETHAND | SA_ONSTACK; + sigaction (SIGSEGV, &s, NULL); + sigaction (SIGBUS, &s, NULL); + fn2 (); + return 0; +} + +static int __attribute__((noinline)) fn0 () +{ + char dummy __attribute__((cleanup (handler))); + fn1 (); + null = 0; + return 0; +} + +int main() +{ + fn0 (); + abort (); +} diff --git a/gcc/testsuite/g++.dg/ext/cleanup-11.C b/gcc/testsuite/g++.dg/ext/cleanup-11.C new file mode 100644 index 000000000..0b6d11ce2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/cleanup-11.C @@ -0,0 +1,117 @@ +/* { dg-do run { target hppa*-*-hpux* *-*-linux* powerpc*-*-darwin* *-*-darwin[912]* } } */ +/* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */ +/* Verify that cleanups work with exception handling through realtime signal + frames on alternate stack. */ + +#include <unwind.h> +#include <stdlib.h> +#include <signal.h> +#include <unistd.h> +#include <string.h> + +static _Unwind_Reason_Code +force_unwind_stop (int version, _Unwind_Action actions, + _Unwind_Exception_Class exc_class, + struct _Unwind_Exception *exc_obj, + struct _Unwind_Context *context, + void *stop_parameter) +{ + if (actions & _UA_END_OF_STACK) + abort (); + return _URC_NO_REASON; +} + +static void force_unwind () +{ + struct _Unwind_Exception *exc + = (struct _Unwind_Exception*) malloc (sizeof (*exc)); + memset (&exc->exception_class, 0, sizeof (exc->exception_class)); + exc->exception_cleanup = 0; + +#ifndef __USING_SJLJ_EXCEPTIONS__ + _Unwind_ForcedUnwind (exc, force_unwind_stop, 0); +#else + _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0); +#endif + + abort (); +} + +int count; +char *null; + +static void counter (void *p __attribute__((unused))) +{ + ++count; +} + +static void handler (void *p __attribute__((unused))) +{ + if (count != 2) + abort (); + exit (0); +} + +static int __attribute__((noinline)) fn5 () +{ + char dummy __attribute__((cleanup (counter))); + force_unwind (); + return 0; +} + +static void fn4 (int sig, siginfo_t *info, void *ctx) +{ + char dummy __attribute__((cleanup (counter))); + fn5 (); + null = NULL; +} + +static void fn3 () +{ + abort (); +} + +static int __attribute__((noinline)) fn2 () +{ + *null = 0; + fn3 (); + return 0; +} + +static int __attribute__((noinline)) fn1 () +{ + stack_t ss; + struct sigaction s; + + ss.ss_size = 4 * sysconf (_SC_PAGESIZE); + if (ss.ss_size < SIGSTKSZ) + ss.ss_size = SIGSTKSZ; + ss.ss_sp = malloc (ss.ss_size); + if (ss.ss_sp == NULL) + exit (1); + ss.ss_flags = 0; + if (sigaltstack (&ss, NULL) < 0) + exit (1); + + sigemptyset (&s.sa_mask); + s.sa_sigaction = fn4; + s.sa_flags = SA_RESETHAND | SA_ONSTACK | SA_SIGINFO; + sigaction (SIGSEGV, &s, NULL); + sigaction (SIGBUS, &s, NULL); + fn2 (); + return 0; +} + +static int __attribute__((noinline)) fn0 () +{ + char dummy __attribute__((cleanup (handler))); + fn1 (); + null = 0; + return 0; +} + +int main() +{ + fn0 (); + abort (); +} diff --git a/gcc/testsuite/g++.dg/ext/cleanup-2.C b/gcc/testsuite/g++.dg/ext/cleanup-2.C new file mode 100644 index 000000000..d9033b454 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/cleanup-2.C @@ -0,0 +1,22 @@ +/* { dg-do run } */ +/* { dg-options "" } */ +/* Verify that cleanup works in the most basic of ways. */ + +extern "C" void exit(int); +extern "C" void abort(void); + +static void handler(void *p __attribute__((unused))) +{ + exit (0); +} + +static void doit(void) +{ + int x __attribute__((cleanup (handler))); +} + +int main() +{ + doit (); + abort (); +} diff --git a/gcc/testsuite/g++.dg/ext/cleanup-3.C b/gcc/testsuite/g++.dg/ext/cleanup-3.C new file mode 100644 index 000000000..5367c496e --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/cleanup-3.C @@ -0,0 +1,45 @@ +/* { dg-do run } */ +/* { dg-options "" } */ +/* Verify that the cleanup handler receives the proper contents + of the variable. */ + +extern "C" void exit(int); +extern "C" void abort(void); + +static int expected; + +static void +handler(int *p) +{ + if (*p != expected) + abort (); +} + +static void __attribute__((noinline)) +bar(void) +{ +} + +static void doit(int x, int y) +{ + int r __attribute__((cleanup (handler))); + if (x < y) + { + r = 0; + return; + } + + bar(); + r = x + y; +} + +int main() +{ + expected = 0; + doit (1, 2); + + expected = 3; + doit (2, 1); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/cleanup-4.C b/gcc/testsuite/g++.dg/ext/cleanup-4.C new file mode 100644 index 000000000..ae9a6e40f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/cleanup-4.C @@ -0,0 +1,39 @@ +/* { dg-do run } */ +/* { dg-options "" } */ +/* Verify cleanup execution on non-trivial exit from a block. */ + +extern "C" void exit(int); +extern "C" void abort(void); + +static int counter; + +static void +handler(int *p) +{ + counter += *p; +} + +static void __attribute__((noinline)) +bar(void) +{ +} + +static void doit(int n, int n2) +{ + int i; + for (i = 0; i < n; ++i) + { + int dummy __attribute__((cleanup (handler))) = i; + if (i == n2) + break; + bar(); + } +} + +int main() +{ + doit (10, 6); + if (counter != 0 + 1 + 2 + 3 + 4 + 5 + 6) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/cleanup-5.C b/gcc/testsuite/g++.dg/ext/cleanup-5.C new file mode 100644 index 000000000..db4c2bbc8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/cleanup-5.C @@ -0,0 +1,54 @@ +/* HP-UX libunwind.so doesn't provide _UA_END_OF_STACK */ +/* { dg-do run } */ +/* { dg-options "-fexceptions" } */ +/* { dg-skip-if "" { "ia64-*-hpux11.*" } { "*" } { "" } } */ +/* Verify that cleanups work with exception handling. */ + +#include <unwind.h> +#include <stdlib.h> +#include <string.h> + +static _Unwind_Reason_Code +force_unwind_stop (int version, _Unwind_Action actions, + _Unwind_Exception_Class exc_class, + struct _Unwind_Exception *exc_obj, + struct _Unwind_Context *context, + void *stop_parameter) +{ + if (actions & _UA_END_OF_STACK) + abort (); + return _URC_NO_REASON; +} + +static void force_unwind () +{ + struct _Unwind_Exception *exc + = (struct _Unwind_Exception *) malloc (sizeof (*exc)); + memset (&exc->exception_class, 0, sizeof (exc->exception_class)); + exc->exception_cleanup = 0; + +#ifndef __USING_SJLJ_EXCEPTIONS__ + _Unwind_ForcedUnwind (exc, force_unwind_stop, 0); +#else + _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0); +#endif + + abort (); +} + +static void handler (void *p __attribute__((unused))) +{ + exit (0); +} + +static void doit () +{ + char dummy __attribute__((cleanup (handler))); + force_unwind (); +} + +int main() +{ + doit (); + abort (); +} diff --git a/gcc/testsuite/g++.dg/ext/cleanup-6.C b/gcc/testsuite/g++.dg/ext/cleanup-6.C new file mode 100644 index 000000000..4e3d53893 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/cleanup-6.C @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O" } */ +/* Verify that a cleanup marked "inline" gets inlined. */ + +static inline void xyzzy(void *p __attribute__((unused))) +{ +} + +void doit(void) +{ + int x __attribute__((cleanup (xyzzy))); +} + +/* { dg-final { scan-assembler-not "xyzzy" } } */ diff --git a/gcc/testsuite/g++.dg/ext/cleanup-8.C b/gcc/testsuite/g++.dg/ext/cleanup-8.C new file mode 100644 index 000000000..be6676848 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/cleanup-8.C @@ -0,0 +1,100 @@ +/* { dg-do run { target hppa*-*-hpux* *-*-linux* powerpc*-*-darwin* *-*-darwin[912]* } } */ +/* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */ +/* Verify that cleanups work with exception handling through signal + frames. */ + +#include <unwind.h> +#include <stdlib.h> +#include <signal.h> +#include <string.h> + +static _Unwind_Reason_Code +force_unwind_stop (int version, _Unwind_Action actions, + _Unwind_Exception_Class exc_class, + struct _Unwind_Exception *exc_obj, + struct _Unwind_Context *context, + void *stop_parameter) +{ + if (actions & _UA_END_OF_STACK) + abort (); + return _URC_NO_REASON; +} + +static void force_unwind () +{ + struct _Unwind_Exception *exc + = (struct _Unwind_Exception *) malloc (sizeof (*exc)); + memset (&exc->exception_class, 0, sizeof (exc->exception_class)); + exc->exception_cleanup = 0; + +#ifndef __USING_SJLJ_EXCEPTIONS__ + _Unwind_ForcedUnwind (exc, force_unwind_stop, 0); +#else + _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0); +#endif + + abort (); +} + +int count; +char *null; + +static void counter (void *p __attribute__((unused))) +{ + ++count; +} + +static void handler (void *p __attribute__((unused))) +{ + if (count != 2) + abort (); + exit (0); +} + +static int __attribute__((noinline)) fn5 () +{ + char dummy __attribute__((cleanup (counter))); + force_unwind (); + return 0; +} + +static void fn4 (int sig) +{ + char dummy __attribute__((cleanup (counter))); + fn5 (); + null = NULL; +} + +static void fn3 () +{ + abort (); +} + +static int __attribute__((noinline)) fn2 () +{ + *null = 0; + fn3 (); + return 0; +} + +static int __attribute__((noinline)) fn1 () +{ + signal (SIGSEGV, fn4); + signal (SIGBUS, fn4); + fn2 (); + return 0; +} + +static int __attribute__((noinline)) fn0 () +{ + char dummy __attribute__((cleanup (handler))); + fn1 (); + null = 0; + return 0; +} + +int main() +{ + fn0 (); + abort (); +} diff --git a/gcc/testsuite/g++.dg/ext/cleanup-9.C b/gcc/testsuite/g++.dg/ext/cleanup-9.C new file mode 100644 index 000000000..87f828399 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/cleanup-9.C @@ -0,0 +1,104 @@ +/* { dg-do run { target hppa*-*-hpux* *-*-linux* powerpc*-*-darwin* *-*-darwin[912]* } } */ +/* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */ +/* Verify that cleanups work with exception handling through realtime + signal frames. */ + +#include <unwind.h> +#include <stdlib.h> +#include <signal.h> +#include <string.h> + +static _Unwind_Reason_Code +force_unwind_stop (int version, _Unwind_Action actions, + _Unwind_Exception_Class exc_class, + struct _Unwind_Exception *exc_obj, + struct _Unwind_Context *context, + void *stop_parameter) +{ + if (actions & _UA_END_OF_STACK) + abort (); + return _URC_NO_REASON; +} + +static void force_unwind () +{ + struct _Unwind_Exception *exc + = (struct _Unwind_Exception *) malloc (sizeof (*exc)); + memset (&exc->exception_class, 0, sizeof (exc->exception_class)); + exc->exception_cleanup = 0; + +#ifndef __USING_SJLJ_EXCEPTIONS__ + _Unwind_ForcedUnwind (exc, force_unwind_stop, 0); +#else + _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0); +#endif + + abort (); +} + +int count; +char *null; + +static void counter (void *p __attribute__((unused))) +{ + ++count; +} + +static void handler (void *p __attribute__((unused))) +{ + if (count != 2) + abort (); + exit (0); +} + +static int __attribute__((noinline)) fn5 () +{ + char dummy __attribute__((cleanup (counter))); + force_unwind (); + return 0; +} + +static void fn4 (int sig, siginfo_t *info, void *ctx) +{ + char dummy __attribute__((cleanup (counter))); + fn5 (); + null = NULL; +} + +static void fn3 () +{ + abort (); +} + +static int __attribute__((noinline)) fn2 () +{ + *null = 0; + fn3 (); + return 0; +} + +static int __attribute__((noinline)) fn1 () +{ + struct sigaction s; + sigemptyset (&s.sa_mask); + s.sa_sigaction = fn4; + s.sa_flags = SA_RESETHAND | SA_SIGINFO; + sigaction (SIGSEGV, &s, NULL); + sigaction (SIGBUS, &s, NULL); + fn2 (); + return 0; +} + +static int __attribute__((noinline)) fn0 () +{ + char dummy __attribute__((cleanup (handler))); + fn1 (); + null = 0; + return 0; +} + +int main() +{ + fn0 (); + abort (); +} diff --git a/gcc/testsuite/g++.dg/ext/cleanup-dtor.C b/gcc/testsuite/g++.dg/ext/cleanup-dtor.C new file mode 100644 index 000000000..58da64670 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/cleanup-dtor.C @@ -0,0 +1,28 @@ +// Check that destructors are run after cleanup functions. +// { dg-do run } + +extern "C" void abort (); + +int i; + +struct S { + ~S() { + if (i != 1) + abort (); + i = 2; + } +}; + +void f(void *) { + if (i != 0) + abort (); + i = 1; +} + +int main () { + { + S s __attribute__((cleanup (f))); + } + if (i != 2) + abort (); +} diff --git a/gcc/testsuite/g++.dg/ext/complex1.C b/gcc/testsuite/g++.dg/ext/complex1.C new file mode 100644 index 000000000..ac6771106 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complex1.C @@ -0,0 +1,6 @@ +/* { dg-options "" } */ +/* { dg-do compile } */ +// Testing if we can do a new of a complex type +// PR C++/28450 + +void* q = new __complex__ int (); diff --git a/gcc/testsuite/g++.dg/ext/complex2.C b/gcc/testsuite/g++.dg/ext/complex2.C new file mode 100644 index 000000000..c9e8cdce5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complex2.C @@ -0,0 +1,5 @@ +// PR c++/31388 +// { dg-options "" } + +bool b = !0i; + diff --git a/gcc/testsuite/g++.dg/ext/complex3.C b/gcc/testsuite/g++.dg/ext/complex3.C new file mode 100644 index 000000000..062c2d44b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complex3.C @@ -0,0 +1,28 @@ +// PR c++/31780 +// { dg-do run } +// { dg-options "" } + +// Test that we can implicitly convert to _Complex, but that it's worse +// than a scalar arithmetic conversion. + +extern "C" void exit (int); + +int r = 0; + +void f (_Complex int) { ++r; } +void f (double) { } + +void g (_Complex int) { } + +int main() +{ + f (1); + g (1); + + return r; +} + +void bar() +{ + r ? 0i : 0; +} diff --git a/gcc/testsuite/g++.dg/ext/complex4.C b/gcc/testsuite/g++.dg/ext/complex4.C new file mode 100644 index 000000000..78b935670 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complex4.C @@ -0,0 +1,5 @@ +// { dg-do compile } +// This code used to be rejected as there was no conversion from int to float __complex__ + #include <vector> + typedef float __complex__ fcomplex; + std::vector<fcomplex> vfc(10); diff --git a/gcc/testsuite/g++.dg/ext/complex5.C b/gcc/testsuite/g++.dg/ext/complex5.C new file mode 100644 index 000000000..4a29960f5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complex5.C @@ -0,0 +1,6 @@ +/* PR c++/21210 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +typedef float __complex__ fcomplex; +fcomplex cplx = fcomplex(0); diff --git a/gcc/testsuite/g++.dg/ext/complex6.C b/gcc/testsuite/g++.dg/ext/complex6.C new file mode 100644 index 000000000..9a7c50a7a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complex6.C @@ -0,0 +1,10 @@ +// PR c++/46304 +// { dg-options "" } + +template<class T> +void f() +{ + __complex double d = 1.0 + 2.0i; +} + +template void f<int>(); diff --git a/gcc/testsuite/g++.dg/ext/complex7.C b/gcc/testsuite/g++.dg/ext/complex7.C new file mode 100644 index 000000000..9d5463f94 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complex7.C @@ -0,0 +1,6 @@ +// { dg-options "" } + +class A +{ + static const _Complex double x = 1.0 + 2.0i; +}; diff --git a/gcc/testsuite/g++.dg/ext/complit1.C b/gcc/testsuite/g++.dg/ext/complit1.C new file mode 100644 index 000000000..ab2b038fe --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complit1.C @@ -0,0 +1,16 @@ +// PR c++/11063 +// { dg-options "" } + +class Foo +{ +private: + const int val_[2]; + +public: + Foo(int, int); +}; + +Foo::Foo(int v0, int v1) + : val_((int[]) {v0, v1}) // { dg-error "" "" } +{ +} diff --git a/gcc/testsuite/g++.dg/ext/complit10.C b/gcc/testsuite/g++.dg/ext/complit10.C new file mode 100644 index 000000000..7f159f0f7 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complit10.C @@ -0,0 +1,20 @@ +// PR c++/36023 +// { dg-do compile } +// { dg-options "" } + +struct A; + +void +f1 (int i) +{ + (int[i]) { 1 }; // { dg-error "variable-sized compound literal" } + (A[5]) { 1 }; // { dg-error "have incomplete type" } + (A[i]) { 1 }; // { dg-error "have incomplete type" } +} + +void +f2 () +{ + (int[]) { 1 }; + (int[1]) { 1 }; +} diff --git a/gcc/testsuite/g++.dg/ext/complit11.C b/gcc/testsuite/g++.dg/ext/complit11.C new file mode 100644 index 000000000..0662543d9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complit11.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// { dg-options "" } + +struct A { int i; }; + +template<int t> +void foo() +{ + ((struct A) { 0 }).i += 1; // { dg-error "temporary" } +} + +void g(void) +{ + foo<0>(); +} + diff --git a/gcc/testsuite/g++.dg/ext/complit12.C b/gcc/testsuite/g++.dg/ext/complit12.C new file mode 100644 index 000000000..29c9af186 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complit12.C @@ -0,0 +1,65 @@ +// PR c++/40948 +// { dg-do run } +// { dg-options "" } + +int c; +struct M +{ + M () { ++c; } + M (const M&) { ++c; } + ~M () { --c; } +}; + +struct S +{ + S (); + M m[1]; +}; + +S::S () : m ((M[1]) { M () }) +{ +} + +struct T +{ + T (); + M m[4]; +}; + +T::T () : m ((M[4]) { M (), M (), M (), M () }) +{ +} + +typedef M MA[1]; +MA &bar (MA, MA& r) { return r; } + +M f(M m) { return m; } + +int main () +{ + { + M m[1] = (M[1]) { M () }; + if (c != 1) + return 1; + M n = (M) { M () }; + if (c != 2) + return 2; + M o[4] = (M[4]) { M (), M (), M (), M () }; + if (c != 6) + return 3; + S s; + if (c != 7) + return 4; + T t; + if (c != 11) + return 5; + MA ma = bar ((M[2]) { M(), M() }, m); + if (c != 12) + return 7; + M mm[2] = ((M[2]) { f(M()), f(M()) }); + if (c != 14) + return 8; + } + if (c != 0) + return 6; +} diff --git a/gcc/testsuite/g++.dg/ext/complit2.C b/gcc/testsuite/g++.dg/ext/complit2.C new file mode 100644 index 000000000..9fe00c42e --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complit2.C @@ -0,0 +1,22 @@ +// PR c++/12726 +// Origin: Vladimir Zidar <mr_W@mindnever.org> +// Reduced version: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-options "" } + +struct A +{ + A(); + A(const A&); + A(int); +}; + +struct B +{ + A a; +}; + +void foo() +{ + B b; + b = (B){0}; +} diff --git a/gcc/testsuite/g++.dg/ext/complit3.C b/gcc/testsuite/g++.dg/ext/complit3.C new file mode 100644 index 000000000..a54a8bce1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complit3.C @@ -0,0 +1,8 @@ +// { dg-options "" } + +int Compound_Literals_0() +{ + static int y[] = (int []) {1, 2, 3}; // { dg-error "init" } + static int z[] = (int [3]) {1}; // { dg-error "init" } + return y[0]+z[0]; +} diff --git a/gcc/testsuite/g++.dg/ext/complit4.C b/gcc/testsuite/g++.dg/ext/complit4.C new file mode 100644 index 000000000..1448e7a66 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complit4.C @@ -0,0 +1,10 @@ +// PR c++/23172 +// { dg-do run } +// { dg-options "" } + +int i = (int) {7}; + +int main () { + if (i != 7) + return 1; +} diff --git a/gcc/testsuite/g++.dg/ext/complit5.C b/gcc/testsuite/g++.dg/ext/complit5.C new file mode 100644 index 000000000..c406c9980 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complit5.C @@ -0,0 +1,12 @@ +// PR c++/25417 +// { dg-options "" } + +struct object { + int a; + int b; +}; + +void f (int c, int d) +{ + object o = ((object){ a : c, b : d}); +} diff --git a/gcc/testsuite/g++.dg/ext/complit6.C b/gcc/testsuite/g++.dg/ext/complit6.C new file mode 100644 index 000000000..d3187a65b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complit6.C @@ -0,0 +1,19 @@ +// PR c++/20103 +// { dg-options "" } + +struct A +{ + A(const A&); +}; + +struct B +{ + A a; +}; + +void foo(B); + +void bar(A &x) +{ + foo((B){x}); +} diff --git a/gcc/testsuite/g++.dg/ext/complit7.C b/gcc/testsuite/g++.dg/ext/complit7.C new file mode 100644 index 000000000..bceb6d108 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complit7.C @@ -0,0 +1,4 @@ +// PR c++/27807 +// { dg-options "" } + +int i = (int()){0}; // { dg-error "type" } diff --git a/gcc/testsuite/g++.dg/ext/complit8.C b/gcc/testsuite/g++.dg/ext/complit8.C new file mode 100644 index 000000000..97ff563fe --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complit8.C @@ -0,0 +1,12 @@ +// PR c++/27270 +// { dg-options "" } + +template<typename Entry> +struct Array { + Entry *array[32]; + Array () : + array ( (Entry*[1]) { 0, 0 } ) // { dg-error "initializers|incompatible" } + {} +}; + +Array<void*> a; diff --git a/gcc/testsuite/g++.dg/ext/complit9.C b/gcc/testsuite/g++.dg/ext/complit9.C new file mode 100644 index 000000000..5b7fbe75c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complit9.C @@ -0,0 +1,15 @@ +// PR c++/35708 +// { dg-options "" } + +struct object { int one_o; int allocstamp; }; +int pgci_pointable (object obj); +void foo(void); +int main (int argc, char *argv[]) +{ + if (pgci_pointable((object){7,100})) + { + bad_rehash_size: + foo(); + } + goto bad_rehash_size; +} diff --git a/gcc/testsuite/g++.dg/ext/cond1.C b/gcc/testsuite/g++.dg/ext/cond1.C new file mode 100644 index 000000000..ec342121e --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/cond1.C @@ -0,0 +1,4 @@ +// PR c++/12515 +// { dg-do compile } +// { dg-options "" } +template<int> void foo() { 0 ?: 0; } diff --git a/gcc/testsuite/g++.dg/ext/construct1.C b/gcc/testsuite/g++.dg/ext/construct1.C new file mode 100644 index 000000000..6a7d8cee4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/construct1.C @@ -0,0 +1,12 @@ +// PR c++/16717 +// { dg-options "-O2" } + +int i; + +void hello (void) __attribute__ ((constructor)); +void hello (void) { i = 1; } + +int main (void) { + if (i != 1) + return 1; +} diff --git a/gcc/testsuite/g++.dg/ext/conv1.C b/gcc/testsuite/g++.dg/ext/conv1.C new file mode 100644 index 000000000..6c16fe484 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/conv1.C @@ -0,0 +1,19 @@ +// Test for backwards brain-damage compatibility with -fpermissive. +// { dg-options "-fpermissive -w" } + +void f (); +void f (int *); +void g (int); + +int main () +{ + void *v = 1234; + void (*p)() = v; + int i = v; + f (i); + f (v); + g (v); + enum { a } b = i; + void (*p2)(int) = p; + unsigned *ip = &i; +} diff --git a/gcc/testsuite/g++.dg/ext/desig1.C b/gcc/testsuite/g++.dg/ext/desig1.C new file mode 100644 index 000000000..c3ff4c142 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/desig1.C @@ -0,0 +1,24 @@ +// { dg-options "" } + +struct a { + int x; +}; + +struct b { + int x; + int y; +}; + +struct foo { + union { + struct a a; + struct b b; + } u; +}; + +int main(void) +{ + struct foo bar = { u: { b: { x: 0, y: 0, }}}; + (void)bar; + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/dll-MI1.h b/gcc/testsuite/g++.dg/ext/dll-MI1.h new file mode 100644 index 000000000..2f8b83669 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dll-MI1.h @@ -0,0 +1,39 @@ +// Class definitions for dllexport-MI1.C and dllimport-MI1.C + +#ifdef BUILDING_MI_DLL +#define DLL_IMPEXP __attribute__ ((dllexport)) +#else +#define DLL_IMPEXP __attribute__ ((dllimport)) +#endif + + +#define D1_return 1 +#define D2_return 2 + +class DLL_IMPEXP MBase +{ +public: + virtual int vf() const = 0; + virtual ~MBase(); +}; + +class DLL_IMPEXP D1 : virtual public MBase +{ +public: + int vf() const; +}; + +class DLL_IMPEXP D2 : virtual public MBase +{ +public: + D2 (); + D2 (D2 const&); + int vf() const; +}; + +class DLL_IMPEXP MI1 : public D1, public D2 +{ +public: + int vf() const; +}; + diff --git a/gcc/testsuite/g++.dg/ext/dllexport-MI1.C b/gcc/testsuite/g++.dg/ext/dllexport-MI1.C new file mode 100644 index 000000000..08e65ec96 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllexport-MI1.C @@ -0,0 +1,51 @@ +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw*} } +// Test that non-virtual MI thunks are exported. + + +// To build the dll and client app: +// g++ -shared -o MI.dll dllexport-MI1.C +// g++ -o MItest.exe dllimport-MI1.C -L. MI.dll + +#define BUILDING_MI_DLL +#include "dll-MI1.h" + +MBase::~MBase(){} + +int D1::vf() const { return D1_return; } + +D2::D2() { } +D2::D2 (D2 const&) { } +int D2::vf() const { return D2_return; } + +int MI1::vf() const { return D1::vf();} + +// a dllexported object +DLL_IMPEXP MI1 dllMI1; + +// use default copy ctor +DLL_IMPEXP MI1 dllMI1Copy = dllMI1; + +// Scan for export of some methods that are undefined in dllimportMI1.C, + +// { dg-final { scan-assembler "-export:\[\\\\\"\]*_ZNK2D12vfEv" } } +// { dg-final { scan-assembler "-export:\[\\\\\"\]*_ZNK2D22vfEv" } } +// { dg-final { scan-assembler "-export:\[\\\\\"\]*_ZNK3MI12vfEv" } } + +// and MI thunks, + +// { dg-final { scan-assembler "-export:\[\\\\\"\]*_ZThn._NK3MI12vfEv" } } +// { dg-final { scan-assembler "-export:\[\\\\\"\]*_ZTv0_n.._NK2D12vfEv" } } + +// and a vtable data variable. + +// { dg-final { scan-assembler "-export:\[\\\\\"\]*_ZTV2D1\[\\\\\"\]*,data" } } + +// an explicit copy ctor +// { dg-final { scan-assembler "-export:\[\\\\\"\]*_ZN2D2C2ERKS_" } } + +// but not implicit copy ctor generated by compiler +// nor implicit dtor + +// { dg-final { scan-assembler-not "-export:\[\\\\\"\]*_ZN2D1C2ERKS_" } } +// { dg-final { scan-assembler-not "-export:\[\\\\\"\]*_ZN2D1D2Ev" } } + diff --git a/gcc/testsuite/g++.dg/ext/dllexport1.C b/gcc/testsuite/g++.dg/ext/dllexport1.C new file mode 100644 index 000000000..3683d08b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllexport1.C @@ -0,0 +1,23 @@ +// Test that inline functions are exported with -fkeep-inline-functions. +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw*} } +// { dg-options -fkeep-inline-functions } + +__attribute__((dllexport)) inline int foo (int a) { return a;} + + +class __attribute__((dllexport)) Bar +{ + public: + Bar(){}; + int inline_bar(int a) {return a;} + int outline_bar(int a); +}; + +int Bar::outline_bar(int a) {return foo (a);} + + +Bar abar; + +// { dg-final { scan-assembler "\.section\[ \t\]*.drectve\n.*_ZN3Bar11outline_barEi" } } +// { dg-final { scan-assembler " -export:\[\\\\\"\]*_ZN3Bar10inline_barEi" } } +// { dg-final { scan-assembler " -export:\[\\\\\"\]*_Z3fooi" } } diff --git a/gcc/testsuite/g++.dg/ext/dllexport2.C b/gcc/testsuite/g++.dg/ext/dllexport2.C new file mode 100644 index 000000000..71ccf670b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllexport2.C @@ -0,0 +1,52 @@ +// { dg-do link } +// { dg-require-dll "" } +// { dg-additional-sources "dllexport2a.cc" } +// { dg-options "-O2" } + +/* Test that inline functions declared "dllexport" appear in object + files, even if they are not called. + + This behavior is required by the ARM C++ ABI: + + Exporting a function that can be inlined should force the + creation and export of an out-of-line copy of it. + + and should presumably also apply. + + Visual Studio 2005 also honors that rule. */ + +__declspec(dllexport) inline void i1() {} + +__declspec(dllexport) extern inline void e1() {} + +/* It is invalid to declare the function inline after its definition. */ +#if 0 +__declspec(dllexport) void i2() {} +inline void i2(); + +__declspec(dllexport) extern void e2() {} +inline void e2(); +#endif + +__declspec(dllexport) inline void i3() {} +void i3(); + +__declspec(dllexport) inline void e3() {} +extern void e3(); + +__declspec(dllexport) void i4(); +inline void i4() {}; + +__declspec(dllexport) extern void e4(); +inline void e4() {}; + +__declspec(dllexport) inline void i5(); +void i5() {}; + +__declspec(dllexport) inline void e5(); +extern void e5() {}; + +/* Make sure that just declaring the function -- without defining it + -- does not cause errors. */ +__declspec(dllexport) inline void i6(); +__declspec(dllexport) extern inline void e6(); diff --git a/gcc/testsuite/g++.dg/ext/dllexport2a.cc b/gcc/testsuite/g++.dg/ext/dllexport2a.cc new file mode 100644 index 000000000..80caf3217 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllexport2a.cc @@ -0,0 +1,21 @@ +extern void i1(); +extern void i3(); +extern void i4(); +extern void i5(); + +extern void e1(); +extern void e3(); +extern void e4(); +extern void e5(); + +int main () { + i1(); + i3(); + i4(); + i5(); + + e1(); + e3(); + e4(); + e5(); +} diff --git a/gcc/testsuite/g++.dg/ext/dllexport3.C b/gcc/testsuite/g++.dg/ext/dllexport3.C new file mode 100644 index 000000000..206dfc92c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllexport3.C @@ -0,0 +1,19 @@ +// PR c++/42870 +// { dg-do compile { target i?86-*-cygwin *-*-mingw* } } +// { dg-final { scan-assembler "-export:\[\\\\\"\]*_ZN2SaD1Ev" } } + +#define ATTRIBUTE __attribute__ ((dllexport)) +class ATTRIBUTE Sa { + public: + Sa() + {} + ~Sa(); +}; +ATTRIBUTE Sa::~Sa() +{return;} + +bool DllMain(void *a,void*b,int) +{ + Sa s; + return true; +} diff --git a/gcc/testsuite/g++.dg/ext/dllexport4.C b/gcc/testsuite/g++.dg/ext/dllexport4.C new file mode 100644 index 000000000..81c57c3fb --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllexport4.C @@ -0,0 +1,54 @@ +// { dg-do link } +// { dg-require-dll "" } +// { dg-additional-sources "dllexport4a.cc" } +// { dg-options "-O2 -fno-keep-inline-dllexport" } +// { dg-prune-output .*undefined.* } +// { dg-xfail-if "link failure expected" { *-*-* } } + +/* Test that inline functions declared "dllexport" appear in object files, + even if they are not called - except when -fno-keep-inline-dllexport. + + This behavior is required by the ARM C++ ABI: + + Exporting a function that can be inlined should force the + creation and export of an out-of-line copy of it. + + and should presumably also apply. + + Visual Studio 2005 also honors that rule. */ + +__declspec(dllexport) inline void i1() {} + +__declspec(dllexport) extern inline void e1() {} + +/* It is invalid to declare the function inline after its definition. */ +#if 0 +__declspec(dllexport) void i2() {} +inline void i2(); + +__declspec(dllexport) extern void e2() {} +inline void e2(); +#endif + +__declspec(dllexport) inline void i3() {} +void i3(); + +__declspec(dllexport) inline void e3() {} +extern void e3(); + +__declspec(dllexport) void i4(); +inline void i4() {}; + +__declspec(dllexport) extern void e4(); +inline void e4() {}; + +__declspec(dllexport) inline void i5(); +void i5() {}; + +__declspec(dllexport) inline void e5(); +extern void e5() {}; + +/* Make sure that just declaring the function -- without defining it + -- does not cause errors. */ +__declspec(dllexport) inline void i6(); +__declspec(dllexport) extern inline void e6(); diff --git a/gcc/testsuite/g++.dg/ext/dllexport4a.cc b/gcc/testsuite/g++.dg/ext/dllexport4a.cc new file mode 100644 index 000000000..80caf3217 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllexport4a.cc @@ -0,0 +1,21 @@ +extern void i1(); +extern void i3(); +extern void i4(); +extern void i5(); + +extern void e1(); +extern void e3(); +extern void e4(); +extern void e5(); + +int main () { + i1(); + i3(); + i4(); + i5(); + + e1(); + e3(); + e4(); + e5(); +} diff --git a/gcc/testsuite/g++.dg/ext/dllexport5.C b/gcc/testsuite/g++.dg/ext/dllexport5.C new file mode 100755 index 000000000..8b2780731 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllexport5.C @@ -0,0 +1,52 @@ +// { dg-do link } +// { dg-require-dll "" } +// { dg-additional-sources "dllexport5a.cc" } +// { dg-options "-O2 -fkeep-inline-dllexport" } + +/* Test that inline functions declared "dllexport" appear in object files, + even if they are not called, when -fkeep-inline-dllexport is supplied. + + This behavior is required by the ARM C++ ABI: + + Exporting a function that can be inlined should force the + creation and export of an out-of-line copy of it. + + and should presumably also apply. + + Visual Studio 2005 also honors that rule. */ + +__declspec(dllexport) inline void i1() {} + +__declspec(dllexport) extern inline void e1() {} + +/* It is invalid to declare the function inline after its definition. */ +#if 0 +__declspec(dllexport) void i2() {} +inline void i2(); + +__declspec(dllexport) extern void e2() {} +inline void e2(); +#endif + +__declspec(dllexport) inline void i3() {} +void i3(); + +__declspec(dllexport) inline void e3() {} +extern void e3(); + +__declspec(dllexport) void i4(); +inline void i4() {}; + +__declspec(dllexport) extern void e4(); +inline void e4() {}; + +__declspec(dllexport) inline void i5(); +void i5() {}; + +__declspec(dllexport) inline void e5(); +extern void e5() {}; + +/* Make sure that just declaring the function -- without defining it + -- does not cause errors. */ +__declspec(dllexport) inline void i6(); +__declspec(dllexport) extern inline void e6(); diff --git a/gcc/testsuite/g++.dg/ext/dllexport5a.cc b/gcc/testsuite/g++.dg/ext/dllexport5a.cc new file mode 100644 index 000000000..80caf3217 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllexport5a.cc @@ -0,0 +1,21 @@ +extern void i1(); +extern void i3(); +extern void i4(); +extern void i5(); + +extern void e1(); +extern void e3(); +extern void e4(); +extern void e5(); + +int main () { + i1(); + i3(); + i4(); + i5(); + + e1(); + e3(); + e4(); + e5(); +} diff --git a/gcc/testsuite/g++.dg/ext/dllimport-MI1.C b/gcc/testsuite/g++.dg/ext/dllimport-MI1.C new file mode 100644 index 000000000..3f2d05683 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport-MI1.C @@ -0,0 +1,53 @@ +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } } +// Test handling of MI thunks in dllimported classes. + +// To build the dll and client app: +// g++ -shared -o MI.dll dllexport-MI1.C +// g++ -o MItest.exe dllimport-MI1.C -L. MI.dll + +#include <stdlib.h> +#include "dll-MI1.h" + +extern DLL_IMPEXP MI1 dllMI1; + +// This should use the implicit copy ctor for D1 (not imported) +// and the explicit copy ctor for D2 (dll-imported). +MI1 dllMI1LocalCopy = dllMI1; + +class MI2 : public D1, public D2 +{ +public: + int vf() const { return D2::vf();} +}; + +class MI3 : public MI1 +{ +}; + +int main () + +{ + MI1 bar1; + MI2 bar2; + MI3 bar3; + + if (dllMI1.vf() != D1_return) + abort(); + + if (dllMI1LocalCopy.vf() != D1_return) + abort(); + + if (bar1.vf() != D1_return) + abort(); + + if (bar2.vf() != (D2_return)) + abort(); + + if (bar3.vf() != D1_return ) + abort(); +} + +// Scan for import of explicit copy ctor for D2, but no import +// of compiler generated copy ctor for D1. +// { dg-final { scan-assembler "__imp\[_\]*__ZN2D2C2ERKS_" } } +// { dg-final { scan-assembler-not "__imp\[_\]*__ZN2D1C2ERKS_" } } diff --git a/gcc/testsuite/g++.dg/ext/dllimport1.C b/gcc/testsuite/g++.dg/ext/dllimport1.C new file mode 100644 index 000000000..d7ddfe8a2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport1.C @@ -0,0 +1,31 @@ +// PR c++/7910 +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } } +// { dg-options { -Wall -W } } + +class __attribute__((dllimport)) Foo +{ + public: + virtual void dummy_foo_func(void) + {} + void dummy_foo_fun2(); + virtual ~Foo(); // avoid warning +}; + +void Foo::dummy_foo_fun2() // { dg-warning "redeclared without dllimport" } +{ +} + +class Bar : public Foo +{ +public: + ~Bar(); + void dummy_bar_func(); +}; + +Bar::~Bar() +{} + +void Bar::dummy_bar_func() +{} + +// { dg-final { scan-assembler-not "__imp\[_\]*__ZN3Foo14dummy_foo_fun" } } diff --git a/gcc/testsuite/g++.dg/ext/dllimport10.C b/gcc/testsuite/g++.dg/ext/dllimport10.C new file mode 100644 index 000000000..808337661 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport10.C @@ -0,0 +1,16 @@ +// PR c++/5287, c++/11021 +// Inherit a virtual method from a dllimport'd base class. + +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } } + +struct __attribute__((dllimport)) A +{ + virtual void vfunc(void); +}; + +struct B : public A +{ +}; + + +B aB; diff --git a/gcc/testsuite/g++.dg/ext/dllimport11.C b/gcc/testsuite/g++.dg/ext/dllimport11.C new file mode 100644 index 000000000..6d822be22 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport11.C @@ -0,0 +1,15 @@ +// PR target/23589 +// Template member functions do not get dllimport status of class. +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } } + +struct __attribute__((dllimport)) Foo +{ + template <class T> Foo (T); +}; + +void a (int i) +{ + Foo f(i); +} + +template <class T> Foo::Foo (T) {} // no dllimport warnings on definition. diff --git a/gcc/testsuite/g++.dg/ext/dllimport12.C b/gcc/testsuite/g++.dg/ext/dllimport12.C new file mode 100644 index 000000000..ede546f20 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport12.C @@ -0,0 +1,23 @@ +// PR target/27650 +// Don't use dllimport semantics on virtual methods when initializing +// vtables +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } } + +// Use import lib thunk for vtable entry of explicitly virtual method, +struct base +{ + virtual void key_method(); + __attribute__((dllimport)) virtual ~base(); +}; + +void base::key_method() {} + + +// Likewise for an implicitly virtual method. +struct derived : public base +{ + void key_method(); + __attribute__((dllimport)) ~derived(); +}; + +void derived::key_method() {} diff --git a/gcc/testsuite/g++.dg/ext/dllimport13.C b/gcc/testsuite/g++.dg/ext/dllimport13.C new file mode 100644 index 000000000..fa1ffbfdb --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport13.C @@ -0,0 +1,14 @@ +// PR c++/34749 +// Ensure dllimport is handled correctly for friends + +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } } + +int __declspec (dllimport) bar(); +int __declspec (dllimport) baz(); + +class Foo +{ +// MS requires that the dllimport attribute be specified on each declaration + friend int __declspec (dllimport) bar(); + friend int baz(); // { dg-warning "dllimport ignored" } +}; diff --git a/gcc/testsuite/g++.dg/ext/dllimport2.C b/gcc/testsuite/g++.dg/ext/dllimport2.C new file mode 100644 index 000000000..d0de2551a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport2.C @@ -0,0 +1,28 @@ +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } } +// PR c++/9738 Dllimport attribute is overriden by later definition/redeclaration + +void __attribute__((dllimport)) Bar(void); +void __attribute__((dllimport)) Baz(void); +__attribute__((dllimport)) int Biz; +__attribute__((dllimport)) int Boz; + + +void Foo(void) + { + Bar(); + Baz(); + Biz++; + Boz++; + } + +void Baz(void); // { dg-warning "referenced with dll linkage" } +void Bar(void) // { dg-warning "referenced with dll linkage" } + { + } +extern int Biz; // { dg-warning "referenced with dll linkage" } +int Boz; // { dg-warning "referenced with dll linkage" } + +void foo() +{ + Biz++; +} diff --git a/gcc/testsuite/g++.dg/ext/dllimport3.C b/gcc/testsuite/g++.dg/ext/dllimport3.C new file mode 100644 index 000000000..6538232f7 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport3.C @@ -0,0 +1,24 @@ +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } } + +// PR 10148 Dllimport attribute of object is overriden by later +// redefinition without attribute. + +struct Foo +{ + int a; +}; + + __attribute__((dllimport)) struct Foo f; + +void Bar(void) +{ + void* dummy = (void*) &f; +} + +struct Foo f; // { dg-warning "referenced with dll linkage" } + +// Dllimport'd symbols do not have a constant address, so following +// assignment would require static_initialization_and_destruction +// if attribute is retained. + +void* dummy = &f; diff --git a/gcc/testsuite/g++.dg/ext/dllimport4.C b/gcc/testsuite/g++.dg/ext/dllimport4.C new file mode 100644 index 000000000..4d4074cbb --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport4.C @@ -0,0 +1,38 @@ +// Report error if dllimport attribute in definition itself. +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } } + +__attribute__((dllimport)) void bar () { } // { dg-error "definition" } + +__attribute__((dllimport)) int foo = 1; // { dg-error "definition" } + +void faz() +{ + __attribute__((dllimport)) int faa = 1; // { dg-error "definition" } + faa++; +} + +__attribute__((dllimport)) int fee (1); // { dg-error "definition" } + + +// In-class initialization of a static data member is not a definition. +struct F +{ + __attribute__ ((dllimport)) static const int i = 1; // OK +}; + +// Reference the dllimport'd static data member. +void f () +{ + const int* j = &F::i; +} + +struct G +{ + __attribute__ ((dllimport)) static const int i = 1; +}; + +// Define the static data member _without_ the dllimport. +// This should override the prior declaration with dllimport. + +const int G::i; // { dg-warning "dllimport ignored" } + diff --git a/gcc/testsuite/g++.dg/ext/dllimport5.C b/gcc/testsuite/g++.dg/ext/dllimport5.C new file mode 100644 index 000000000..5f1adb1ac --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport5.C @@ -0,0 +1,28 @@ +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } } +// Report error if static symbol definition has dllimport attribute. + +__attribute__((dllimport)) + int impvar; // OK, implicit "extern" + + static __attribute__((dllimport)) + int static_impvar; // { dg-error "external linkage" } + + static __attribute__((dllexport)) +int static_expvar; // { dg-error "external linkage" } + +static __attribute__((dllimport)) +void static_impfun(void); // { dg-error "external linkage" } + +void foo() +{ + __attribute__((dllimport)) + int foovar; // OK, implicit "extern" + foovar++; +} + +void bar() +{ + __attribute__((dllexport)) + int barvar; // { dg-error "external linkage" } + barvar++; +} diff --git a/gcc/testsuite/g++.dg/ext/dllimport6.C b/gcc/testsuite/g++.dg/ext/dllimport6.C new file mode 100644 index 000000000..52b0476c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport6.C @@ -0,0 +1,30 @@ +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } } +// Mark class static members as dllimport. + +struct Baz +{ + Baz(int a_ =0) : a(a_) {} + int a; +}; + +class __attribute__ ((dllimport)) Bar +{ + public: + static const int two = 2; + static const int three; + static const Baz null_baz; +}; + +int foo() +{ + Bar foobar; + const int* baz = &Bar::two; + int a = foobar.two; + int b = foobar.three; + int c = foobar.null_baz.a; + return (a + b + c + *baz); +} + +// { dg-final { scan-assembler __imp\[_\]*__ZN3Bar3twoE } } +// { dg-final { scan-assembler __imp\[_\]*__ZN3Bar5threeE } } +// { dg-final { scan-assembler __imp\[_\]*__ZN3Bar8null_bazE } } diff --git a/gcc/testsuite/g++.dg/ext/dllimport7.C b/gcc/testsuite/g++.dg/ext/dllimport7.C new file mode 100644 index 000000000..0a79b3da3 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport7.C @@ -0,0 +1,34 @@ +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } } + +// Report errors on definition of dllimport'd static data member . + + +struct Baz +{ + Baz(int a_ =0) : a(a_) {} + int a; +}; + +class __declspec(dllimport) Bar +{ + public: + enum {one = 1}; + static const int two = 2; + static const int three; + static const Baz null_baz; +}; + +const int Bar::three = 3; // { dg-warning "redeclared without dllimport" } +// { dg-error "definition of static data" "C++ specific error" { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } 21 } + +const Baz Bar::null_baz; // { dg-warning "redeclared without dllimport" } + +int foo() +{ + Bar foobar; + const int* baz = &Bar::two; + int a = foobar.two; + int b = foobar.three; + int c = foobar.null_baz.a; + return (a + b + c + *baz); +} diff --git a/gcc/testsuite/g++.dg/ext/dllimport8.C b/gcc/testsuite/g++.dg/ext/dllimport8.C new file mode 100644 index 000000000..af605a368 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport8.C @@ -0,0 +1,29 @@ +// PR c++/8378 +// Ignore dllimport of static members if marked inlined. +// or if definition follows declaration in dllimported class. + +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } } +// { dg-options { -Wall -W } } + +struct __attribute__((dllimport)) Foo +{ + static int static_int; + static void static_func1(); + static void static_func2(); + }; + +void Foo::static_func1() // { dg-warning "redeclared without dllimport" } +{ +} + +inline void Foo::static_func2() +{ +} + +void testfoo() +{ + Foo::static_func1(); + Foo::static_func2(); +} + +// { dg-final { scan-assembler-not "__imp_" } } diff --git a/gcc/testsuite/g++.dg/ext/dllimport9.C b/gcc/testsuite/g++.dg/ext/dllimport9.C new file mode 100644 index 000000000..da57ef4bd --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport9.C @@ -0,0 +1,23 @@ +// Handle dllimport attribute for functions declared inline. +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw* x86_64-*-mingw* } } +// { dg-options { -W } } + +inline __attribute__((dllimport)) void bar() { } // { dg-warning "inline" } + +struct __attribute__ ((dllimport)) Blah +{ + void in_blah () { } // Don't warn if member declared inline in class definition. + void out_blah (); +}; + +inline void Blah::out_blah(){ } // Don't warn for inline override of external declaration + +void use_inlines() +{ + Blah aBlah; + bar(); + aBlah.in_blah (); + aBlah.out_blah (); +} + +// { dg-final { scan-assembler-not "__imp_" } } diff --git a/gcc/testsuite/g++.dg/ext/fixed1.C b/gcc/testsuite/g++.dg/ext/fixed1.C new file mode 100644 index 000000000..5a479d689 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/fixed1.C @@ -0,0 +1,8 @@ +// PR c++/35325 +// { dg-options "" } + +template<int> struct A {}; + +template<typename> struct B : A<sizeof(0=0r)> {}; // { dg-error "not supported" } + +template<typename> struct C : A<sizeof(0=0r)> {}; // { dg-error "not supported" } diff --git a/gcc/testsuite/g++.dg/ext/fixed2.C b/gcc/testsuite/g++.dg/ext/fixed2.C new file mode 100644 index 000000000..1ee5538a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/fixed2.C @@ -0,0 +1,7 @@ +// PR c++/35319 +// { dg-options "" } + +void foo() +{ + throw 0r; // { dg-error "not supported" } +} diff --git a/gcc/testsuite/g++.dg/ext/flexary1.C b/gcc/testsuite/g++.dg/ext/flexary1.C new file mode 100644 index 000000000..4033e339d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/flexary1.C @@ -0,0 +1,33 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 22 Jul 2003 <nathan@codesourcery.com> + +// PR c++ 11614 + +typedef int ary_t[]; + +struct test +{ + ary_t *b; + int (*a)[]; // this is not a flexible array member +}; + +void test(void) +{ + struct test s; + int (*a)[] = 0; + ary_t *b = 0; + + a = s.a; + a = s.b; + + s.a = a; + s.b = a; + + b = s.a; + b = s.b; + + s.a = b; + s.b = b; +} diff --git a/gcc/testsuite/g++.dg/ext/flexary2.C b/gcc/testsuite/g++.dg/ext/flexary2.C new file mode 100644 index 000000000..4855b3f57 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/flexary2.C @@ -0,0 +1,11 @@ +// PR c++/46688 +// { dg-options "" } + +struct A { + A(int); +}; + +struct B { + B() {} + A a[]; +}; diff --git a/gcc/testsuite/g++.dg/ext/fnname1.C b/gcc/testsuite/g++.dg/ext/fnname1.C new file mode 100644 index 000000000..521d5a736 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/fnname1.C @@ -0,0 +1,26 @@ +// Test whether __func__ works for namespace-scope C++ functions. + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Matt Austern <austern@apple.com>, 3 Aug 2003 +// { dg-do run } + +namespace xyzzy +{ + const char* ab6(double, void*) + { + return __func__; + } +} + +int main() +{ + const char* s = xyzzy::ab6(2.3, (void*) 0); + bool ok = true; + + ok = ok && s[0] == 'a'; + ok = ok && s[1] == 'b'; + ok = ok && s[2] == '6'; + ok = ok && s[3] == '\0'; + + return ok ? 0 : 1; +} diff --git a/gcc/testsuite/g++.dg/ext/fnname2.C b/gcc/testsuite/g++.dg/ext/fnname2.C new file mode 100644 index 000000000..ea0c1826f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/fnname2.C @@ -0,0 +1,31 @@ +// Test whether __func__ works for ordinary member functions. + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Matt Austern <austern@apple.com>, 3 Aug 2003 +// { dg-do run } + +struct y8a +{ + const char* zqjx(int, char); +}; + +const char* y8a::zqjx(int, char) +{ + return __func__; +} + + +int main() +{ + y8a tmp; + const char* s = tmp.zqjx(16, 'x'); + bool ok = true; + + ok = ok && s[0] == 'z'; + ok = ok && s[1] == 'q'; + ok = ok && s[2] == 'j'; + ok = ok && s[3] == 'x'; + ok = ok && s[4] == '\0'; + + return ok ? 0 : 1; +} diff --git a/gcc/testsuite/g++.dg/ext/fnname3.C b/gcc/testsuite/g++.dg/ext/fnname3.C new file mode 100644 index 000000000..c29170a9a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/fnname3.C @@ -0,0 +1,65 @@ +// Test whether __func__ works for constructors and destructors. + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Matt Austern <austern@apple.com>, 3 Aug 2003 +// { dg-do run } + +struct uk9i +{ + uk9i(); + ~uk9i(); + + static const char* fname; + static bool obj_exists; +}; + +uk9i::uk9i() +{ + obj_exists = true; + fname = __func__; +} + +uk9i::~uk9i() +{ + obj_exists = false; + fname = __func__; +} + +const char* uk9i::fname = 0; +bool uk9i::obj_exists = false; + +int main() +{ + bool ok = true; + + ok = ok && uk9i::fname == 0; + ok = ok && !uk9i::obj_exists; + + { + uk9i tmp; + ok = ok && uk9i::obj_exists; + ok = ok && uk9i::fname != 0; + if (ok) + { + ok = ok && uk9i::fname[0] == 'u'; + ok = ok && uk9i::fname[1] == 'k'; + ok = ok && uk9i::fname[2] == '9'; + ok = ok && uk9i::fname[3] == 'i'; + ok = ok && uk9i::fname[4] == '\0'; + } + } + + ok = ok && !uk9i::obj_exists; + ok = ok && uk9i::fname != 0; + if (ok) + { + ok = ok && uk9i::fname[0] == '~'; + ok = ok && uk9i::fname[1] == 'u'; + ok = ok && uk9i::fname[2] == 'k'; + ok = ok && uk9i::fname[3] == '9'; + ok = ok && uk9i::fname[4] == 'i'; + ok = ok && uk9i::fname[5] == '\0'; + } + + return ok ? 0 : 1; +} diff --git a/gcc/testsuite/g++.dg/ext/forscope1.C b/gcc/testsuite/g++.dg/ext/forscope1.C new file mode 100644 index 000000000..fa6401a3b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/forscope1.C @@ -0,0 +1,27 @@ +// { dg-do compile } +// { dg-options -fno-for-scope } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 4 Sept 2001 <nathan@codesourcery.com> + +// Bug 4206. We were nesting SCOPE_STMTs badly. + + +struct A +{ + A (); + ~A (); +}; + + +void Go( ) +{ + for (int i = 1;;) + { + switch (1) { + default: {} + } + A d; + } + i; +} diff --git a/gcc/testsuite/g++.dg/ext/forscope2.C b/gcc/testsuite/g++.dg/ext/forscope2.C new file mode 100644 index 000000000..b883effb2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/forscope2.C @@ -0,0 +1,27 @@ +// { dg-do compile } +// { dg-options -fpermissive } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 4 Sept 2001 <nathan@codesourcery.com> + +// Bug 4206. We were nesting SCOPE_STMTs badly. + + +struct A +{ + A (); + ~A (); +}; + + +void Go( ) +{ + for (int i = 1;;) // { dg-warning "using obsolete binding" "" } + { + switch (1) { + default: {} + } + A d; + } + i; // { dg-warning "name lookup" "" } +} diff --git a/gcc/testsuite/g++.dg/ext/fpreg1.C b/gcc/testsuite/g++.dg/ext/fpreg1.C new file mode 100644 index 000000000..c5170a4a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/fpreg1.C @@ -0,0 +1,82 @@ +// Test permitted and invalid uses of __fpreg, for C++. +// Origin: Joseph Myers <joseph@codesourcery.com> +// { dg-do compile { target ia64-*-* } } +// { dg-options "" } + +__float80 f80; +double d; +// Default initialized __fpreg is OK. +__fpreg fpreg, fpreg2; +// But explicitly zero-initialized is an invalid conversion. +__fpreg fi = 0; // { dg-error "invalid conversion to '__fpreg'" } + +__fpreg f0 (__fpreg); +int f1 (__float80); + +// __fpreg in a structure is OK. +struct s { + __float80 b; + __fpreg a; +} x; + +void +f (void) +{ + __fpreg *p; + // Valid operations. + fpreg = fpreg2; + fpreg2 = (__fpreg) fpreg; + fpreg = f0 (fpreg2); + fpreg = +fpreg2; + p = &fpreg; + (void) fpreg; + fpreg = x.a; + fpreg2 = (struct s) { 0 }.a; + fpreg = (d ? fpreg : fpreg2); + d = sizeof (fpreg); + (void)(fpreg, fpreg); + // Invalid operations. + ++fpreg; // { dg-error "invalid operation on '__fpreg'" } + --fpreg; // { dg-error "invalid operation on '__fpreg'" } + fpreg++; // { dg-error "invalid operation on '__fpreg'" } + fpreg--; // { dg-error "invalid operation on '__fpreg'" } + fpreg = -fpreg; // { dg-error "invalid operation on '__fpreg'" } + fpreg = ~fpreg; // { dg-error "invalid operation on '__fpreg'" } + d = !fpreg; // { dg-error "invalid operation on '__fpreg'" } + d = *fpreg; // { dg-error "invalid type argument" } + if (fpreg) // { dg-error "invalid conversion from '__fpreg'" } + return; + d = fpreg; // { dg-error "invalid conversion from '__fpreg'" } + d = (double) fpreg; // { dg-error "invalid conversion from '__fpreg'" } + fpreg = (__fpreg) d; // { dg-error "invalid conversion to '__fpreg'" } + fpreg = fpreg * fpreg; // { dg-error "invalid operation on '__fpreg'" } + fpreg = fpreg / fpreg; // { dg-error "invalid operation on '__fpreg'" } + fpreg = fpreg % fpreg; // { dg-error "invalid operation on '__fpreg'" } + fpreg = fpreg + fpreg; // { dg-error "invalid operation on '__fpreg'" } + fpreg = fpreg - fpreg; // { dg-error "invalid operation on '__fpreg'" } + fpreg = fpreg << fpreg; // { dg-error "invalid operation on '__fpreg'" } + fpreg = fpreg >> fpreg; // { dg-error "invalid operation on '__fpreg'" } + d = fpreg < fpreg; // { dg-error "invalid operation on '__fpreg'" } + d = fpreg > fpreg; // { dg-error "invalid operation on '__fpreg'" } + d = fpreg <= fpreg; // { dg-error "invalid operation on '__fpreg'" } + d = fpreg >= fpreg; // { dg-error "invalid operation on '__fpreg'" } + d = fpreg == fpreg; // { dg-error "invalid operation on '__fpreg'" } + d = fpreg != fpreg; // { dg-error "invalid operation on '__fpreg'" } + d = fpreg & fpreg; // { dg-error "invalid operation on '__fpreg'" } + d = fpreg ^ fpreg; // { dg-error "invalid operation on '__fpreg'" } + d = fpreg | fpreg; // { dg-error "invalid operation on '__fpreg'" } + d = fpreg && fpreg; // { dg-error "invalid operation on '__fpreg'" } + d = fpreg || fpreg; // { dg-error "invalid operation on '__fpreg'" } + d = (fpreg ? 1 : 2); // { dg-error "invalid conversion from '__fpreg'" } + fpreg = (d ? fpreg : d); // { dg-error "invalid conversion to '__fpreg'" } + fpreg *= fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" } + fpreg /= fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" } + fpreg %= fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" } + fpreg += fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" } + fpreg -= fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" } + fpreg <<= fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" } + fpreg >>= fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" } + fpreg &= fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" } + fpreg ^= fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" } + fpreg |= fpreg; // { dg-error "invalid operation on '__fpreg'|in evaluation" } +} diff --git a/gcc/testsuite/g++.dg/ext/gnu-inline-anon-namespace.C b/gcc/testsuite/g++.dg/ext/gnu-inline-anon-namespace.C new file mode 100644 index 000000000..b33629dcf --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/gnu-inline-anon-namespace.C @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O" } */ // such that static functions are optimized out +/* { dg-final { scan-assembler-not "func1" } } */ +/* { dg-final { scan-assembler-not "func2" } } */ +/* { dg-final { scan-assembler-not "func3" } } */ +/* { dg-final { scan-assembler-not "func4" } } */ +/* { dg-final { scan-assembler-not "func5" } } */ + +namespace { +#include "gnu-inline-global.C" +} diff --git a/gcc/testsuite/g++.dg/ext/gnu-inline-class-static.C b/gcc/testsuite/g++.dg/ext/gnu-inline-class-static.C new file mode 100644 index 000000000..f22a23c0b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/gnu-inline-class-static.C @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O" } */ // such that static functions are optimized out +/* { dg-final { scan-assembler "func1" } } */ +/* { dg-final { scan-assembler "func2" } } */ +/* { dg-final { scan-assembler-not "func3" } } */ +/* { dg-final { scan-assembler "func4" } } */ +/* { dg-final { scan-assembler "func5" } } */ + +#undef IN_CLASS +#define IN_CLASS gnu_test_static + +struct IN_CLASS { + static int func1(void); + static int func2(void); + static int func3(void); + static int func4(void); + static int func5(void); +}; + +#include "gnu-inline-global.C" diff --git a/gcc/testsuite/g++.dg/ext/gnu-inline-class.C b/gcc/testsuite/g++.dg/ext/gnu-inline-class.C new file mode 100644 index 000000000..71a0b1e36 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/gnu-inline-class.C @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O" } */ // such that static functions are optimized out +/* { dg-final { scan-assembler "func1" } } */ +/* { dg-final { scan-assembler "func2" } } */ +/* { dg-final { scan-assembler-not "func3" } } */ +/* { dg-final { scan-assembler "func4" } } */ +/* { dg-final { scan-assembler "func5" } } */ + +#define IN_CLASS gnu_test + +struct IN_CLASS { + int func1(void); + int func2(void); + int func3(void); + int func4(void); + int func5(void); +}; + +#include "gnu-inline-global.C" diff --git a/gcc/testsuite/g++.dg/ext/gnu-inline-common.h b/gcc/testsuite/g++.dg/ext/gnu-inline-common.h new file mode 100644 index 000000000..87455ae7a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/gnu-inline-common.h @@ -0,0 +1,24 @@ +#ifndef gnu +# define gnu_inline __attribute__((gnu_inline)) inline +#endif + +#define declspec(spec, name) spec int name (void) +#ifdef IN_CLASS +# define decl(spec, name) +#else +# define decl(spec, name) defpfx declspec(spec, name); +#endif +#define def(spec, name, ret) defpfx declspec(spec, name) { return ret; } +#define gnuindef(name, ret) def(gnu_inline, name, ret) + +#ifndef pfx +# ifdef IN_CLASS +# define pfx(x) IN_CLASS::x +# else +# define pfx(x) x +# endif +#endif + +#ifndef defpfx +# define defpfx +#endif diff --git a/gcc/testsuite/g++.dg/ext/gnu-inline-global-redecl.C b/gcc/testsuite/g++.dg/ext/gnu-inline-global-redecl.C new file mode 100644 index 000000000..fc72d26fb --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/gnu-inline-global-redecl.C @@ -0,0 +1,19 @@ +/* Test __attribute__((gnu_inline)). + + Check that we don't get out-of-line definitions for extern inline + gnu_inline functions, regardless of redeclaration. + + */ + +/* { dg-do link } */ +/* { dg-options "-O" } */ // such that static functions are optimized out + +#include "gnu-inline-common.h" + +decl(extern, fn) +gnuindef(fn, 0) +decl(extern, fn) + +int main () { + fn (); +} diff --git a/gcc/testsuite/g++.dg/ext/gnu-inline-global-reject.C b/gcc/testsuite/g++.dg/ext/gnu-inline-global-reject.C new file mode 100644 index 000000000..d9e266095 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/gnu-inline-global-reject.C @@ -0,0 +1,56 @@ +/* Test __attribute__((gnu_inline)). + + Check that we reject various forms of duplicate definitions. +*/ + +/* { dg-do compile } */ +/* { dg-options " -ansi -Wno-long-long" } */ + +#include "gnu-inline-common.h" + +#undef fn +#define fn pfx(func_decl_inline_before) +decl(inline, fn) // { dg-error "previous" "" } +gnuindef(fn, 0) // { dg-error "redeclared" "" } + +#undef fn +#define fn pfx(func_decl_inline_after) +gnuindef(fn, 0) // { dg-error "previous" "" } +decl(inline, fn) // { dg-error "redeclared" "" } + +#undef fn +#define fn pfx(func_def_gnuin_redef) +gnuindef(fn, 0) // { dg-error "previous" "" } +gnuindef(fn, 1) // { dg-error "redefinition" "" } + +#undef fn +#define fn pfx(func_def_inline_redef) +def(inline, fn, 0) // { dg-error "previous" "" } +def(inline, fn, 1) // { dg-error "redefinition" "" } + +#undef fn +#define fn pfx(func_def_inline_after) +gnuindef(fn, 0) // { dg-error "previous" "" } +def(inline, fn, 1) // { dg-error "redeclare" "" } + +#undef fn +#define fn pfx(func_def_inline_before) +def(inline, fn, 0) // { dg-error "previous" "" } +gnuindef(fn, 1) // { dg-error "redefinition" "" } + +#undef fn +#define fn pfx(func_def_before) +def(, fn, 0) // { dg-error "previous" "" } +gnuindef(fn, 1) // { dg-error "redefinition" "" } + +#undef fn +#define fn pfx(func_decl_static_inline_before) +decl(static inline, fn) // { dg-error "previous" "" } +gnuindef(fn, 0) // { dg-error "redeclared" "" } + +#undef fn +#define fn pfx(func_def_static_inline_after) +decl(static, fn) +gnuindef(fn, 0) // { dg-error "previous" "" } +decl(static, fn) +def(static inline, fn, 1) // { dg-error "redeclare" "" } diff --git a/gcc/testsuite/g++.dg/ext/gnu-inline-global.C b/gcc/testsuite/g++.dg/ext/gnu-inline-global.C new file mode 100644 index 000000000..f628073f9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/gnu-inline-global.C @@ -0,0 +1,50 @@ +/* Test __attribute__((gnu_inline)). + + Check that __attribute__((gnu_inline)) has no effect, in the + absence of extern and/or inline. + + Check that we don't get out-of-line definitions for extern inline + gnu_inline functions, regardless of declarations or definitions. + + Check that such functions can be overridden by out-of-line + definitions. + + */ + +/* { dg-do compile } */ +/* { dg-options "-O" } */ // such that static functions are optimized out +/* { dg-final { scan-assembler "func1" } } */ +/* { dg-final { scan-assembler "func2" } } */ +/* { dg-final { scan-assembler-not "func3" } } */ +/* { dg-final { scan-assembler "func4" } } */ +/* { dg-final { scan-assembler-not "func5" } } */ + +#include "gnu-inline-common.h" + +#undef fn +#define fn pfx(func1) // must be emitted out-of-line +gnuindef(fn, 0) +def(, fn, 2) + +#undef fn +#define fn pfx(func2) // must be emitted out-of-line +decl(extern, fn) +gnuindef(fn, 0) +def(, fn, 2) + +#undef fn +#define fn pfx(func3) // must not be emitted +decl(extern, fn) +gnuindef(fn, 0) + +#undef fn +#define fn pfx(func4) // must be emitted out-of-line +decl(extern, fn) +gnuindef(fn, 0) +def(, fn, 1) + +#undef fn +#define fn pfx(func5) // must NOT be emitted, because it's static and unused +decl(static, fn) +gnuindef(fn, 0) +def(, fn, 1) diff --git a/gcc/testsuite/g++.dg/ext/gnu-inline-namespace.C b/gcc/testsuite/g++.dg/ext/gnu-inline-namespace.C new file mode 100644 index 000000000..ce3fea655 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/gnu-inline-namespace.C @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O" } */ // such that static functions are optimized out +/* { dg-final { scan-assembler "func1" } } */ +/* { dg-final { scan-assembler "func2" } } */ +/* { dg-final { scan-assembler-not "func3" } } */ +/* { dg-final { scan-assembler "func4" } } */ +/* { dg-final { scan-assembler-not "func5" } } */ + +namespace gnu_test { +#include "gnu-inline-global.C" +} diff --git a/gcc/testsuite/g++.dg/ext/gnu-inline-template-class.C b/gcc/testsuite/g++.dg/ext/gnu-inline-template-class.C new file mode 100644 index 000000000..9bf36a8d6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/gnu-inline-template-class.C @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-O" } */ // such that static functions are optimized out +/* { dg-final { scan-assembler "func1" } } */ +/* { dg-final { scan-assembler "func2" } } */ +/* { dg-final { scan-assembler-not "func3" } } */ +/* { dg-final { scan-assembler "func4" } } */ +/* { dg-final { scan-assembler "func5" } } */ + +template <typename T> struct gnu_test { + int func1(void); + int func2(void); + int func3(void); + int func4(void); + int func5(void); +}; + +#define defpfx template <typename T> +#define IN_CLASS gnu_test<T> + +#include "gnu-inline-global.C" + +template struct gnu_test<int>; diff --git a/gcc/testsuite/g++.dg/ext/gnu-inline-template-func.C b/gcc/testsuite/g++.dg/ext/gnu-inline-template-func.C new file mode 100644 index 000000000..fb88a2a91 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/gnu-inline-template-func.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O" } */ // such that static functions are optimized out +/* { dg-final { scan-assembler "func1" } } */ +/* { dg-final { scan-assembler "func2" } } */ +/* { dg-final { scan-assembler-not "func3" } } */ +/* { dg-final { scan-assembler "func4" } } */ +/* { dg-final { scan-assembler-not "func5" } } */ + +#define defpfx template <typename T> + +#include "gnu-inline-global.C" + +template int func1<int>(void); +template int func2<int>(void); +template int func3<int>(void); +template int func4<int>(void); +template int func5<int>(void); diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_assign.C b/gcc/testsuite/g++.dg/ext/has_nothrow_assign.C new file mode 100644 index 000000000..e6e9fc6ed --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_nothrow_assign.C @@ -0,0 +1,152 @@ +// { dg-do run } +#include <cassert> + +struct A +{ + double a; + double b; +}; + +struct B +{ + A a; +}; + +struct C +: public A { }; + +struct D +{ + D& operator=(const D&) throw() { return *this; } +}; + +struct E +{ + E& operator=(const E&) throw(int) { return *this; } +}; + +struct E1 +{ + E1& operator=(const E1&) throw(int) { throw int(); return *this; } +}; + +struct F +{ + F() throw(int) { } +}; + +struct G +{ + G() throw(int) { throw int(); } +}; + +struct H +{ + H& operator=(H&) throw(int) { return *this; } +}; + +struct H1 +{ + H1& operator=(H1&) throw(int) { throw int(); return *this; } +}; + +struct I +{ + I& operator=(I&) throw(int) { return *this; } + I& operator=(const I&) throw() { return *this; } +}; + +struct I1 +{ + I1& operator=(I1&) throw(int) { throw int(); return *this; } + I1& operator=(const I1&) throw() { return *this; } +}; + +struct J +{ + J& operator=(J&) throw() { return *this; } + J& operator=(const J&) throw() { return *this; } + J& operator=(volatile J&) throw() { return *this; } + J& operator=(const volatile J&) throw() { return *this; } +}; + +struct K +{ + K& operator=(K&) throw() { return *this; } +}; + +struct L +{ + L& operator=(const L&) throw() { return *this; } +}; + +template<typename T> + bool + f() + { return __has_nothrow_assign(T); } + +template<typename T> + class My + { + public: + bool + f() + { return !!__has_nothrow_assign(T); } + }; + +template<typename T> + class My2 + { + public: + static const bool trait = __has_nothrow_assign(T); + }; + +template<typename T> + const bool My2<T>::trait; + +template<typename T, bool b = __has_nothrow_assign(T)> + struct My3_help + { static const bool trait = b; }; + +template<typename T, bool b> + const bool My3_help<T, b>::trait; + +template<typename T> + class My3 + { + public: + bool + f() + { return My3_help<T>::trait; } + }; + +#define PTEST(T) (__has_nothrow_assign(T) && f<T>() \ + && My<T>().f() && My2<T>::trait && My3<T>().f()) + +#define NTEST(T) (!__has_nothrow_assign(T) && !f<T>() \ + && !My<T>().f() && !My2<T>::trait && !My3<T>().f()) + +int main() +{ + assert (PTEST (int)); + assert (NTEST (int (int))); + assert (NTEST (void)); + assert (PTEST (A)); + assert (PTEST (B)); + assert (PTEST (C)); + assert (PTEST (C[])); + assert (PTEST (D)); + assert (NTEST (E)); + assert (NTEST (E1)); + assert (PTEST (F)); + assert (PTEST (G)); + assert (NTEST (H)); + assert (NTEST (H1)); + assert (NTEST (I)); + assert (NTEST (I1)); + assert (PTEST (J)); + assert (NTEST (const K)); + assert (NTEST (const L)); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_assign_odr.C b/gcc/testsuite/g++.dg/ext/has_nothrow_assign_odr.C new file mode 100644 index 000000000..c2e99ef54 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_nothrow_assign_odr.C @@ -0,0 +1,16 @@ +// PR c++/36870 +// { dg-do run } +#include <cassert> + +struct S { const S& operator= (const S&); }; + +bool f (); + +int main () +{ + assert (__has_nothrow_assign (S) == f ()); +} + +const S& S::operator= (const S&) { } + +bool f () { return __has_nothrow_assign (S); } diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_constructor.C b/gcc/testsuite/g++.dg/ext/has_nothrow_constructor.C new file mode 100644 index 000000000..1f1227c30 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_nothrow_constructor.C @@ -0,0 +1,106 @@ +// { dg-do run } +#include <cassert> + +struct A +{ + double a; + double b; +}; + +struct B +{ + A a; +}; + +struct C +: public A { }; + +struct D +{ + D() throw() { } +}; + +struct E +{ + E() throw(int) { } +}; + +struct E1 +{ + E1() throw(int) { throw int(); } +}; + +struct F +{ + F(const F&) throw() { } +}; + +struct G +{ + G(const G&) throw(int) { throw int(); } +}; + +template<typename T> + bool + f() + { return __has_nothrow_constructor(T); } + +template<typename T> + class My + { + public: + bool + f() + { return !!__has_nothrow_constructor(T); } + }; + +template<typename T> + class My2 + { + public: + static const bool trait = __has_nothrow_constructor(T); + }; + +template<typename T> + const bool My2<T>::trait; + + +template<typename T, bool b = __has_nothrow_constructor(T)> + struct My3_help + { static const bool trait = b; }; + +template<typename T, bool b> + const bool My3_help<T, b>::trait; + +template<typename T> + class My3 + { + public: + bool + f() + { return My3_help<T>::trait; } + }; + +#define PTEST(T) (__has_nothrow_constructor(T) && f<T>() \ + && My<T>().f() && My2<T>::trait && My3<T>().f()) + +#define NTEST(T) (!__has_nothrow_constructor(T) && !f<T>() \ + && !My<T>().f() && !My2<T>::trait && !My3<T>().f()) + +int main() +{ + assert (PTEST (int)); + assert (NTEST (int (int))); + assert (NTEST (void)); + assert (PTEST (A)); + assert (PTEST (B)); + assert (PTEST (C)); + assert (PTEST (C[])); + assert (PTEST (D)); + assert (NTEST (E)); + assert (NTEST (E1)); + assert (NTEST (F)); + assert (NTEST (G)); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_constructor_odr.C b/gcc/testsuite/g++.dg/ext/has_nothrow_constructor_odr.C new file mode 100644 index 000000000..68ca111b0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_nothrow_constructor_odr.C @@ -0,0 +1,16 @@ +// PR c++/36870 +// { dg-do run } +#include <cassert> + +struct S { S (); }; + +bool f (); + +int main () +{ + assert (__has_nothrow_constructor (S) == f ()); +} + +S::S () { } + +bool f () { return __has_nothrow_constructor (S); } diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_copy-1.C b/gcc/testsuite/g++.dg/ext/has_nothrow_copy-1.C new file mode 100644 index 000000000..87785ae5a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_nothrow_copy-1.C @@ -0,0 +1,140 @@ +// { dg-do run } +#include <cassert> + +struct A +{ + double a; + double b; +}; + +struct B +{ + A a; +}; + +struct C +: public A { }; + +struct D +{ + D(const D&) throw() { } +}; + +struct E +{ + E(const E&) throw(int) { } +}; + +struct E1 +{ + E1(const E1&) throw(int) { throw int(); } +}; + +struct F +{ + F() throw() { } +}; + +struct G +{ + G() throw(int) { throw int(); } +}; + +struct H +{ + H(H&) throw(int) { } +}; + +struct H1 +{ + H1(H1&) throw(int) { throw int(); } +}; + +struct I +{ + I(I&) throw(int) { } + I(const I&) throw() { } +}; + +struct I1 +{ + I1(I1&) throw(int) { throw int(); } + I1(const I1&) throw() { } +}; + +struct J +{ + J(J&) throw() { } + J(const J&) throw() { } + J(volatile J&) throw() { } + J(const volatile J&) throw() { } +}; + +template<typename T> + bool + f() + { return __has_nothrow_copy(T); } + +template<typename T> + class My + { + public: + bool + f() + { return !!__has_nothrow_copy(T); } + }; + +template<typename T> + class My2 + { + public: + static const bool trait = __has_nothrow_copy(T); + }; + +template<typename T> + const bool My2<T>::trait; + +template<typename T, bool b = __has_nothrow_copy(T)> + struct My3_help + { static const bool trait = b; }; + +template<typename T, bool b> + const bool My3_help<T, b>::trait; + +template<typename T> + class My3 + { + public: + bool + f() + { return My3_help<T>::trait; } + }; + +#define PTEST(T) (__has_nothrow_copy(T) && f<T>() \ + && My<T>().f() && My2<T>::trait && My3<T>().f()) + +#define NTEST(T) (!__has_nothrow_copy(T) && !f<T>() \ + && !My<T>().f() && !My2<T>::trait && !My3<T>().f()) + +int main() +{ + assert (PTEST (int)); + assert (NTEST (int (int))); + assert (NTEST (void)); + assert (PTEST (A)); + assert (PTEST (B)); + assert (PTEST (C)); + assert (PTEST (C[])); + assert (PTEST (D)); + assert (NTEST (E)); + assert (NTEST (E1)); + assert (PTEST (F)); + assert (PTEST (G)); + assert (NTEST (H)); + assert (NTEST (H1)); + assert (NTEST (I)); + assert (NTEST (I1)); + assert (PTEST (J)); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_copy-2.C b/gcc/testsuite/g++.dg/ext/has_nothrow_copy-2.C new file mode 100644 index 000000000..b2eb203f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_nothrow_copy-2.C @@ -0,0 +1,12 @@ +// PR c++/36871 +// { dg-do run } +#include <cassert> + +struct A { template <class T> A (T) throw (int); }; +struct B { B (B&) throw (); template <class T> B (T) throw (int); }; + +int main () +{ + assert (__has_nothrow_copy (A)); + assert (__has_nothrow_copy (B)); +} diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_copy-3.C b/gcc/testsuite/g++.dg/ext/has_nothrow_copy-3.C new file mode 100644 index 000000000..797004410 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_nothrow_copy-3.C @@ -0,0 +1,13 @@ +// PR c++/36871 +// { dg-do run } +#include <cassert> + +struct F { + F (const F&) throw () { } + template <class T> F (T) throw () { } +}; + +int main () +{ + assert (__has_nothrow_copy (F)); +} diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_copy-4.C b/gcc/testsuite/g++.dg/ext/has_nothrow_copy-4.C new file mode 100644 index 000000000..69e9a6bac --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_nothrow_copy-4.C @@ -0,0 +1,13 @@ +// PR c++/36872 +// { dg-do run } +#include <cassert> + +struct S { + S (const S&) throw (); + S (...) throw (int); +}; + +int main () +{ + assert (__has_nothrow_copy (S)); +} diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_copy-5.C b/gcc/testsuite/g++.dg/ext/has_nothrow_copy-5.C new file mode 100644 index 000000000..b94b338c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_nothrow_copy-5.C @@ -0,0 +1,13 @@ +// PR c++/36872 +// { dg-do run } +#include <cassert> + +struct S { + S (const S&) throw (); + S (int) throw (int); +}; + +int main () +{ + assert (__has_nothrow_copy (S)); +} diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_copy-6.C b/gcc/testsuite/g++.dg/ext/has_nothrow_copy-6.C new file mode 100644 index 000000000..6268ee292 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_nothrow_copy-6.C @@ -0,0 +1,12 @@ +// { dg-do run } +#include <cassert> + +struct S { + S (S&) throw (); + S (const S&, int) throw (int); +}; + +int main () +{ + assert (__has_nothrow_copy (S)); +} diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_copy-7.C b/gcc/testsuite/g++.dg/ext/has_nothrow_copy-7.C new file mode 100644 index 000000000..e0ecef44a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_nothrow_copy-7.C @@ -0,0 +1,13 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } +#include <cassert> + +struct S { + S (const S&) throw (); + S (S&&) throw (int); +}; + +int main () +{ + assert (__has_nothrow_copy (S)); +} diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_copy_odr.C b/gcc/testsuite/g++.dg/ext/has_nothrow_copy_odr.C new file mode 100644 index 000000000..573fd2f80 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_nothrow_copy_odr.C @@ -0,0 +1,16 @@ +// PR c++/36870 +// { dg-do run } +#include <cassert> + +struct S { S (const S&); }; + +bool f (); + +int main () +{ + assert (__has_nothrow_copy (S) == f ()); +} + +S::S (const S&) { } + +bool f () { return __has_nothrow_copy (S); } diff --git a/gcc/testsuite/g++.dg/ext/has_trivial_assign.C b/gcc/testsuite/g++.dg/ext/has_trivial_assign.C new file mode 100644 index 000000000..dce0f8b3a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_trivial_assign.C @@ -0,0 +1,106 @@ +// { dg-do run } +#include <cassert> + +struct A +{ + double a; + double b; +}; + +union U +{ + double a; + double b; +}; + +struct B +{ + B& operator=(const B&) { return *this;} +}; + +struct C +{ + virtual int f() { return 1; } +}; + +struct D +: public B { }; + +struct E +: public A { }; + +struct F +{ + A a; +}; + +struct G +{ + B b; +}; + +template<typename T> + bool + f() + { return __has_trivial_assign(T); } + +template<typename T> + class My + { + public: + bool + f() + { return !!__has_trivial_assign(T); } + }; + +template<typename T> + class My2 + { + public: + static const bool trait = __has_trivial_assign(T); + }; + +template<typename T> + const bool My2<T>::trait; + +template<typename T, bool b = __has_trivial_assign(T)> + struct My3_help + { static const bool trait = b; }; + +template<typename T, bool b> + const bool My3_help<T, b>::trait; + +template<typename T> + class My3 + { + public: + bool + f() + { return My3_help<T>::trait; } + }; + +#define PTEST(T) (__has_trivial_assign(T) && f<T>() \ + && My<T>().f() && My2<T>::trait && My3<T>().f()) + +#define NTEST(T) (!__has_trivial_assign(T) && !f<T>() \ + && !My<T>().f() && !My2<T>::trait && !My3<T>().f()) + +int main() +{ + assert (PTEST (int)); + assert (NTEST (int (int))); + assert (NTEST (void)); + assert (PTEST (A)); + assert (PTEST (U)); + assert (NTEST (B)); + assert (NTEST (C)); + assert (NTEST (D)); + assert (PTEST (E)); + assert (PTEST (E[])); + assert (PTEST (F)); + assert (NTEST (G)); + assert (NTEST (const A)); + assert (NTEST (A&)); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/has_trivial_constructor.C b/gcc/testsuite/g++.dg/ext/has_trivial_constructor.C new file mode 100644 index 000000000..f4addd824 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_trivial_constructor.C @@ -0,0 +1,98 @@ +// { dg-do run } +#include <cassert> + +struct A +{ + double a; + double b; +}; + +union U +{ + double a; + double b; +}; + +struct B +{ + B() { } +}; + +struct C +: public B { }; + +struct D +: public A { }; + +struct E +{ + A a; +}; + +struct F +{ + B b; +}; + +template<typename T> + bool + f() + { return __has_trivial_constructor(T); } + +template<typename T> + class My + { + public: + bool + f() + { return !!__has_trivial_constructor(T); } + }; + +template<typename T> + class My2 + { + public: + static const bool trait = __has_trivial_constructor(T); + }; + +template<typename T> + const bool My2<T>::trait; + +template<typename T, bool b = __has_trivial_constructor(T)> + struct My3_help + { static const bool trait = b; }; + +template<typename T, bool b> + const bool My3_help<T, b>::trait; + +template<typename T> + class My3 + { + public: + bool + f() + { return My3_help<T>::trait; } + }; + +#define PTEST(T) (__has_trivial_constructor(T) && f<T>() \ + && My<T>().f() && My2<T>::trait && My3<T>().f()) + +#define NTEST(T) (!__has_trivial_constructor(T) && !f<T>() \ + && !My<T>().f() && !My2<T>::trait && !My3<T>().f()) + +int main() +{ + assert (PTEST (int)); + assert (NTEST (int (int))); + assert (NTEST (void)); + assert (PTEST (A)); + assert (PTEST (U)); + assert (NTEST (B)); + assert (NTEST (C)); + assert (PTEST (D)); + assert (PTEST (D[])); + assert (PTEST (E)); + assert (NTEST (F)); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/has_trivial_copy.C b/gcc/testsuite/g++.dg/ext/has_trivial_copy.C new file mode 100644 index 000000000..4d2341b17 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_trivial_copy.C @@ -0,0 +1,105 @@ +// { dg-do run } +#include <cassert> + +struct A +{ + double a; + double b; +}; + +union U +{ + double a; + double b; +}; + +struct B +{ + B(const B&) { } +}; + +struct C +{ + virtual int f() { return 1; } +}; + +struct D +: public B { }; + +struct E +: public A { }; + +struct F +{ + A a; +}; + +struct G +{ + B b; +}; + +template<typename T> + bool + f() + { return __has_trivial_copy(T); } + +template<typename T> + class My + { + public: + bool + f() + { return !!__has_trivial_copy(T); } + }; + +template<typename T> + class My2 + { + public: + static const bool trait = __has_trivial_copy(T); + }; + +template<typename T> + const bool My2<T>::trait; + +template<typename T, bool b = __has_trivial_copy(T)> + struct My3_help + { static const bool trait = b; }; + +template<typename T, bool b> + const bool My3_help<T, b>::trait; + +template<typename T> + class My3 + { + public: + bool + f() + { return My3_help<T>::trait; } + }; + +#define PTEST(T) (__has_trivial_copy(T) && f<T>() \ + && My<T>().f() && My2<T>::trait && My3<T>().f()) + +#define NTEST(T) (!__has_trivial_copy(T) && !f<T>() \ + && !My<T>().f() && !My2<T>::trait && !My3<T>().f()) + +int main() +{ + assert (PTEST (int)); + assert (NTEST (int (int))); + assert (NTEST (void)); + assert (PTEST (A)); + assert (PTEST (U)); + assert (NTEST (B)); + assert (NTEST (C)); + assert (NTEST (D)); + assert (PTEST (E)); + assert (PTEST (E[])); + assert (PTEST (F)); + assert (NTEST (G)); + assert (PTEST (B&)); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/has_trivial_destructor-1.C b/gcc/testsuite/g++.dg/ext/has_trivial_destructor-1.C new file mode 100644 index 000000000..2834c238d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_trivial_destructor-1.C @@ -0,0 +1,86 @@ +// { dg-do run } +#include <cassert> + +struct A +{ + double a; + double b; +}; + +union U +{ + double a; + double b; +}; + +struct B +{ + ~B() { } +}; + +struct C +: public B { }; + +struct D +: public A { }; + +template<typename T> + bool + f() + { return __has_trivial_destructor(T); } + +template<typename T> + class My + { + public: + bool + f() + { return !!__has_trivial_destructor(T); } + }; + +template<typename T> + class My2 + { + public: + static const bool trait = __has_trivial_destructor(T); + }; + +template<typename T> + const bool My2<T>::trait; + +template<typename T, bool b = __has_trivial_destructor(T)> + struct My3_help + { static const bool trait = b; }; + +template<typename T, bool b> + const bool My3_help<T, b>::trait; + +template<typename T> + class My3 + { + public: + bool + f() + { return My3_help<T>::trait; } + }; + +#define PTEST(T) (__has_trivial_destructor(T) && f<T>() \ + && My<T>().f() && My2<T>::trait && My3<T>().f()) + +#define NTEST(T) (!__has_trivial_destructor(T) && !f<T>() \ + && !My<T>().f() && !My2<T>::trait && !My3<T>().f()) + +int main() +{ + assert (PTEST (int)); + assert (NTEST (int (int))); + assert (NTEST (void)); + assert (PTEST (A)); + assert (PTEST (U)); + assert (NTEST (B)); + assert (NTEST (C)); + assert (PTEST (D)); + assert (PTEST (D[])); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/has_trivial_destructor-2.C b/gcc/testsuite/g++.dg/ext/has_trivial_destructor-2.C new file mode 100644 index 000000000..f9dacf179 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_trivial_destructor-2.C @@ -0,0 +1,3 @@ +// PR c++/36855 + +typedef char assert_0 [__has_trivial_destructor (int&) ? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/ext/has_virtual_destructor.C b/gcc/testsuite/g++.dg/ext/has_virtual_destructor.C new file mode 100644 index 000000000..62b60aebf --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/has_virtual_destructor.C @@ -0,0 +1,89 @@ +// { dg-do run } +#include <cassert> +#include <exception> + +struct A +{ + double a; + double b; +}; + +union U +{ + double a; + double b; +}; + +struct B +{ + virtual ~B() { } +}; + +struct C +: public B { }; + +struct D +{ + ~D() { } +}; + +template<typename T> + bool + f() + { return __has_virtual_destructor(T); } + +template<typename T> + class My + { + public: + bool + f() + { return !!__has_virtual_destructor(T); } + }; + +template<typename T> + class My2 + { + public: + static const bool trait = __has_virtual_destructor(T); + }; + +template<typename T> + const bool My2<T>::trait; + +template<typename T, bool b = __has_virtual_destructor(T)> + struct My3_help + { static const bool trait = b; }; + +template<typename T, bool b> + const bool My3_help<T, b>::trait; + +template<typename T> + class My3 + { + public: + bool + f() + { return My3_help<T>::trait; } + }; + +#define PTEST(T) (__has_virtual_destructor(T) && f<T>() \ + && My<T>().f() && My2<T>::trait && My3<T>().f()) + +#define NTEST(T) (!__has_virtual_destructor(T) && !f<T>() \ + && !My<T>().f() && !My2<T>::trait && !My3<T>().f()) + +int main() +{ + assert (NTEST (int)); + assert (NTEST (void)); + assert (PTEST (std::exception)); + assert (NTEST (A)); + assert (NTEST (U)); + assert (PTEST (B)); + assert (PTEST (C)); + assert (NTEST (C[])); + assert (NTEST (D)); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/init1.C b/gcc/testsuite/g++.dg/ext/init1.C new file mode 100644 index 000000000..f8d8e8533 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/init1.C @@ -0,0 +1,6 @@ +// PR c++/9623 +// Test for trivial use of named initializer extension +// { dg-options "" } + +struct S { int x; int y; }; +S s = { x:1, y:2 }; diff --git a/gcc/testsuite/g++.dg/ext/injected-ttp.C b/gcc/testsuite/g++.dg/ext/injected-ttp.C new file mode 100644 index 000000000..405bee88c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/injected-ttp.C @@ -0,0 +1,15 @@ +// Test for doing the right thing with injected-class-name used as template +// type argument. This is an extension from DR 176. + +// { dg-options "-pedantic" } + +template <class T> +struct A { }; + +template <template <class> class TTP> +struct B { }; + +struct C: A<int> +{ + B<A> b; // { dg-warning "injected-class-name" } +}; diff --git a/gcc/testsuite/g++.dg/ext/inline1.C b/gcc/testsuite/g++.dg/ext/inline1.C new file mode 100644 index 000000000..7e5f062e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/inline1.C @@ -0,0 +1,34 @@ +// { dg-do compile } +// { dg-options "-O" } +// Make sure inlined non-outlined functions aren't marked weak. +// We'd get a ".weak xyzzy" annotation trigged by the second declaration. + +// { dg-final { scan-assembler-not "weak\[^ \t\]*\[ \t\]_?xyzzy" } } + +// The next check isn't really part of the actual test, just to make +// sure there's no outline-copy of xyzzy, because if that really +// happened, it *should* be marked linkonce or perhaps weak. +// { dg-final { scan-assembler-not "xyzzy" } } + +extern int x; +extern void foo(void); +extern void bar(void); + +extern "C" inline int xyzzy(int a) +{ + foo(); + return a + x; +} + +extern "C" int xyzzy(int); + +extern inline int plugh(int c) +{ + return xyzzy (c); +} + +int y; +void doit(int b) +{ + y = xyzzy (b) + plugh (b); +} diff --git a/gcc/testsuite/g++.dg/ext/instantiate1.C b/gcc/testsuite/g++.dg/ext/instantiate1.C new file mode 100644 index 000000000..1d2a6200b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/instantiate1.C @@ -0,0 +1,24 @@ +// Test that 'extern template' suppresses instantiations. +// { dg-do compile } +// { dg-options "" } + +template <class T> void f (T) { } +extern template void f (int); + +template <class T> struct A { + void f (); +}; +template <class T> void A<T>::f () { } +extern template struct A<int>; + +// { dg-final { scan-assembler-not "\n_?_Z1fIiEvT_(:|\n|\t)" } } +void test_f_int () { f(42); } + +// { dg-final { scan-assembler-not "\n_?_ZN1AIiE1fEv(:|\n|\t)" } } +void test_A_int_f () { A<int> a; a.f (); } + +// { dg-final { scan-assembler "\n_?_Z1fIdEvT_(:|\n|\t)" } } +void test_f_double () { f (2.0); } + +// { dg-final { scan-assembler "\n_?_ZN1AIdE1fEv(:|\n|\t)" } } +void test_A_double_f () { A<double> b; b.f (); } diff --git a/gcc/testsuite/g++.dg/ext/instantiate2.C b/gcc/testsuite/g++.dg/ext/instantiate2.C new file mode 100644 index 000000000..a6292892b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/instantiate2.C @@ -0,0 +1,16 @@ +// Test that 'static template' instantiates statics. +// { dg-do compile } +// { dg-options "-fno-implicit-templates" } + +template <class T> struct A { + static T t; +}; +template <class T> T A<T>::t = 0; +static template struct A<int>; + +// { dg-final { scan-assembler "\n_?_ZN1AIiE1tE(:|\n|\t)" { target { ! *-*-darwin* } } } } +// { dg-final { scan-assembler ".zerofill __DATA,__pu_bss2,__ZN1AIiE1tE" { target *-*-darwin* } } } +void test_int() { A<int>::t = 42; } + +// { dg-final { scan-assembler-not "\n_?_ZN1AIcE1tE(:|\n|\t)" } } +void test_char() { A<char>::t = 42; } diff --git a/gcc/testsuite/g++.dg/ext/instantiate3.C b/gcc/testsuite/g++.dg/ext/instantiate3.C new file mode 100644 index 000000000..ea60d5bf9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/instantiate3.C @@ -0,0 +1,14 @@ +// Test that 'inline template' instantiates the vtable. +// { dg-do compile } +// { dg-options "-O -fno-implicit-templates" } + +template <class T> struct A { + virtual void f () { } +}; +inline template struct A<int>; + +// { dg-final { scan-assembler "\n_?_ZTV1AIiE(:|\n|\t)" } } +A<int> a; + +// { dg-final { scan-assembler-not "\n_?_ZTV1AIcE(:|\n|\t)" } } +A<char> b; diff --git a/gcc/testsuite/g++.dg/ext/interface1.C b/gcc/testsuite/g++.dg/ext/interface1.C new file mode 100644 index 000000000..0f803abc4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface1.C @@ -0,0 +1,7 @@ +// PR c++/22252 +// { dg-do link } +// { dg-additional-sources "interface1a.cc" } +// { dg-options "-fno-inline" } + +#pragma implementation +#include "interface1.h" diff --git a/gcc/testsuite/g++.dg/ext/interface1.h b/gcc/testsuite/g++.dg/ext/interface1.h new file mode 100644 index 000000000..ce91527b8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface1.h @@ -0,0 +1,10 @@ +#pragma interface +struct B +{ + B(){}; + ~B(){} +}; +struct A { + B a; + +}; diff --git a/gcc/testsuite/g++.dg/ext/interface1a.cc b/gcc/testsuite/g++.dg/ext/interface1a.cc new file mode 100644 index 000000000..1859d5ce3 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface1a.cc @@ -0,0 +1,4 @@ +#include "interface1.h" +A a; +int main() {} + diff --git a/gcc/testsuite/g++.dg/ext/interface2.C b/gcc/testsuite/g++.dg/ext/interface2.C new file mode 100644 index 000000000..3b306fdd8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface2.C @@ -0,0 +1,7 @@ +// PR c++/26195 +// { dg-do link } +// { dg-additional-sources "interface2b.cc" } +// { dg-options "-fno-inline" } + +#pragma implementation "interface2-imaginary.h" +#include "interface2a.h" diff --git a/gcc/testsuite/g++.dg/ext/interface2a.h b/gcc/testsuite/g++.dg/ext/interface2a.h new file mode 100644 index 000000000..efde3e24b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface2a.h @@ -0,0 +1,5 @@ +// PR c++/26195 +#pragma interface "interface2-imaginary.h" + +inline void foo1() { } +inline void foo2() { } diff --git a/gcc/testsuite/g++.dg/ext/interface2b.cc b/gcc/testsuite/g++.dg/ext/interface2b.cc new file mode 100644 index 000000000..9109949b8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface2b.cc @@ -0,0 +1,9 @@ +// PR c++/26195 +extern void foo1(); +extern void foo2(); + +int main() +{ + foo1(); + foo2(); +} diff --git a/gcc/testsuite/g++.dg/ext/interface3/dir1/interface3.h b/gcc/testsuite/g++.dg/ext/interface3/dir1/interface3.h new file mode 100644 index 000000000..874be7509 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface3/dir1/interface3.h @@ -0,0 +1,6 @@ +// PR c++/26195 +#pragma interface "dir1/interface3.h" +#include "../dir2/interface3.h" + +inline void f1() { } +inline void f2() { } diff --git a/gcc/testsuite/g++.dg/ext/interface3/dir2/interface3.h b/gcc/testsuite/g++.dg/ext/interface3/dir2/interface3.h new file mode 100644 index 000000000..df6f7cd2f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface3/dir2/interface3.h @@ -0,0 +1,5 @@ +// PR c++/26195 +#pragma interface "dir2/interface3.h" + +inline void g1() { } +inline void g2() { } diff --git a/gcc/testsuite/g++.dg/ext/interface3/interface3a.C b/gcc/testsuite/g++.dg/ext/interface3/interface3a.C new file mode 100644 index 000000000..b324dbef7 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface3/interface3a.C @@ -0,0 +1,7 @@ +// PR c++/26195 +// { dg-do link } +// { dg-additional-sources "interface3a2.cc" } +// { dg-options "-I. -fno-inline" } + +#pragma implementation "dir1/interface3.cc" +#include "dir1/interface3.h" diff --git a/gcc/testsuite/g++.dg/ext/interface3/interface3a2.cc b/gcc/testsuite/g++.dg/ext/interface3/interface3a2.cc new file mode 100644 index 000000000..cbf1ba801 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface3/interface3a2.cc @@ -0,0 +1,9 @@ +// PR c++/26195 +extern void f1(); +extern void f2(); + +int main() +{ + f1(); + f2(); +} diff --git a/gcc/testsuite/g++.dg/ext/interface3/interface3b.C b/gcc/testsuite/g++.dg/ext/interface3/interface3b.C new file mode 100644 index 000000000..03f753209 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface3/interface3b.C @@ -0,0 +1,7 @@ +// PR c++/26195 +// { dg-do link } +// { dg-additional-sources "interface3b2.cc" } +// { dg-options "-fno-inline" } + +#pragma implementation "dir2/interface3.cc" +#include "dir1/interface3.h" diff --git a/gcc/testsuite/g++.dg/ext/interface3/interface3b2.cc b/gcc/testsuite/g++.dg/ext/interface3/interface3b2.cc new file mode 100644 index 000000000..f532adc74 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface3/interface3b2.cc @@ -0,0 +1,9 @@ +// PR c++/26195 +extern void g1(); +extern void g2(); + +int main() +{ + g1(); + g2(); +} diff --git a/gcc/testsuite/g++.dg/ext/interface4.C b/gcc/testsuite/g++.dg/ext/interface4.C new file mode 100644 index 000000000..85bb91283 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface4.C @@ -0,0 +1,13 @@ +/* https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=227376 */ + +/* { dg-do compile } */ +/* { dg-options "-g2" } */ + +/* We used to crash when emitting debug info for type N::A because its + context was a namespace, not a function. */ + +#include "interface4.h" + +void f ( ) { + g ( ); +} diff --git a/gcc/testsuite/g++.dg/ext/interface4.h b/gcc/testsuite/g++.dg/ext/interface4.h new file mode 100644 index 000000000..0971b3722 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface4.h @@ -0,0 +1,8 @@ +#pragma interface +namespace N { + typedef int A; +} +inline void g ( ) { + static N :: A a = 0; + a = a; +} diff --git a/gcc/testsuite/g++.dg/ext/is_abstract.C b/gcc/testsuite/g++.dg/ext/is_abstract.C new file mode 100644 index 000000000..2d7149452 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_abstract.C @@ -0,0 +1,89 @@ +// { dg-do run } +#include <cassert> + +struct A +{ + double a; + double b; +}; + +union U +{ + double a; + double b; +}; + +class B +{ + B(); +}; + +class C +{ + virtual void rotate(int) = 0; +}; + +class D +{ + virtual void rotate(int) { } +}; + +template<typename T> + bool + f() + { return __is_abstract(T); } + +template<typename T> + class My + { + public: + bool + f() + { return !!__is_abstract(T); } + }; + +template<typename T> + class My2 + { + public: + static const bool trait = __is_abstract(T); + }; + +template<typename T> + const bool My2<T>::trait; + +template<typename T, bool b = __is_abstract(T)> + struct My3_help + { static const bool trait = b; }; + +template<typename T, bool b> + const bool My3_help<T, b>::trait; + +template<typename T> + class My3 + { + public: + bool + f() + { return My3_help<T>::trait; } + }; + +#define PTEST(T) (__is_abstract(T) && f<T>() \ + && My<T>().f() && My2<T>::trait && My3<T>().f()) + +#define NTEST(T) (!__is_abstract(T) && !f<T>() \ + && !My<T>().f() && !My2<T>::trait && !My3<T>().f()) + +int main() +{ + assert (NTEST (int)); + assert (NTEST (void)); + assert (NTEST (A)); + assert (NTEST (U)); + assert (NTEST (B)); + assert (NTEST (B[])); + assert (PTEST (C)); + assert (NTEST (D)); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/is_base_of.C b/gcc/testsuite/g++.dg/ext/is_base_of.C new file mode 100644 index 000000000..8afa532e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_base_of.C @@ -0,0 +1,94 @@ +// { dg-do run } +#include <cassert> + +class A1 +{ + double a; + double b; +}; + +class A2 +{ + double a; + double b; +}; + +class B +: private A1 { }; + +class C +: private A1, private A2 { }; + +union U +{ + double a; + double b; +}; + +template<typename T, typename U> + bool + f() + { return __is_base_of(T, U); } + +template<typename T, typename U> + class My + { + public: + bool + f() + { return !!__is_base_of(T, U); } + }; + +template<typename T, typename U> + class My2 + { + public: + static const bool trait = __is_base_of(T, U); + }; + +template<typename T, typename U> + const bool My2<T, U>::trait; + +template<typename T, typename U, bool b = __is_base_of(T, U)> + struct My3_help + { static const bool trait = b; }; + +template<typename T, typename U, bool b> + const bool My3_help<T, U, b>::trait; + +template<typename T, typename U> + class My3 + { + public: + bool + f() + { return My3_help<T, U>::trait; } + }; + +#define PTEST(T, U) (__is_base_of(T, U) && f<T, U>() \ + && My<T, U>().f() && My2<T, U>::trait && My3<T, U>().f()) + +#define NTEST(T, U) (!__is_base_of(T, U) && !f<T, U>() \ + && !My<T, U>().f() && !My2<T, U>::trait && !My3<T, U>().f()) + +int main() +{ + assert (NTEST (int, A1)); + assert (NTEST (A1, void)); + assert (PTEST (A1, A1)); + assert (NTEST (A1*, A1*)); + assert (NTEST (A1&, A1&)); + assert (PTEST (A1, B)); + assert (NTEST (B, A1)); + assert (PTEST (A1, C)); + assert (PTEST (A2, C)); + assert (NTEST (C, A1)); + assert (PTEST (A1, const B)); + assert (NTEST (const B, A1)); + assert (PTEST (A1, volatile C)); + assert (PTEST (volatile A2, const C)); + assert (NTEST (const volatile C, A1)); + assert (NTEST (U, U)); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/is_base_of_diagnostic.C b/gcc/testsuite/g++.dg/ext/is_base_of_diagnostic.C new file mode 100644 index 000000000..8cb1ce38f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_base_of_diagnostic.C @@ -0,0 +1,15 @@ +class A +{ }; + +class B; + +union C +{ }; + +union D; + +void f() +{ + __is_base_of(A, B); // { dg-error "incomplete type" } + __is_base_of(C, D); +} diff --git a/gcc/testsuite/g++.dg/ext/is_class.C b/gcc/testsuite/g++.dg/ext/is_class.C new file mode 100644 index 000000000..6f3982855 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_class.C @@ -0,0 +1,76 @@ +// { dg-do run } +#include <cassert> + +struct A +{ + double a; + double b; +}; + +class B +{ + B() { } +}; + +union U +{ + double a; + double b; +}; + +template<typename T> + bool + f() + { return __is_class(T); } + +template<typename T> + class My + { + public: + bool + f() + { return !!__is_class(T); } + }; + +template<typename T> + class My2 + { + public: + static const bool trait = __is_class(T); + }; + +template<typename T> + const bool My2<T>::trait; + +template<typename T, bool b = __is_class(T)> + struct My3_help + { static const bool trait = b; }; + +template<typename T, bool b> + const bool My3_help<T, b>::trait; + +template<typename T> + class My3 + { + public: + bool + f() + { return My3_help<T>::trait; } + }; + +#define PTEST(T) (__is_class(T) && f<T>() \ + && My<T>().f() && My2<T>::trait && My3<T>().f()) + +#define NTEST(T) (!__is_class(T) && !f<T>() \ + && !My<T>().f() && !My2<T>::trait && !My3<T>().f()) + +int main() +{ + assert (NTEST (int)); + assert (NTEST (void)); + assert (PTEST (A)); + assert (PTEST (B)); + assert (NTEST (U)); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/is_class_error1.C b/gcc/testsuite/g++.dg/ext/is_class_error1.C new file mode 100644 index 000000000..d037ec72b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_class_error1.C @@ -0,0 +1,6 @@ +// PR c++/33212 + +template<int> void foo() +{ + __is_class((int); // { dg-error "type-specifier|primary-expression" } +} diff --git a/gcc/testsuite/g++.dg/ext/is_class_error2.C b/gcc/testsuite/g++.dg/ext/is_class_error2.C new file mode 100644 index 000000000..8649dc441 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_class_error2.C @@ -0,0 +1,22 @@ +// PR c++/33464 + +template<int> void foo() +{ + __has_nothrow_assign(int)(); // { dg-error "'__has_nothrow_assign\\(int\\)' cannot be used" } + __has_trivial_assign(int)(); // { dg-error "'__has_trivial_assign\\(int\\)' cannot be used" } + __has_nothrow_constructor(int)(); // { dg-error "'__has_nothrow_constructor\\(int\\)' cannot be used" } + __has_trivial_constructor(int)(); // { dg-error "'__has_trivial_constructor\\(int\\)' cannot be used" } + __has_nothrow_copy(int)(); // { dg-error "'__has_nothrow_copy\\(int\\)' cannot be used" } + __has_trivial_copy(int)(); // { dg-error "'__has_trivial_copy\\(int\\)' cannot be used" } + __has_trivial_destructor(int)(); // { dg-error "'__has_trivial_destructor\\(int\\)' cannot be used" } + __has_virtual_destructor(int)(); // { dg-error "'__has_virtual_destructor\\(int\\)' cannot be used" } + __is_abstract(int)(); // { dg-error "'__is_abstract\\(int\\)' cannot be used" } + __is_base_of(int, float)(); // { dg-error "'__is_base_of\\(int, float\\)' cannot be used" } + __is_class(int)(); // { dg-error "'__is_class\\(int\\)' cannot be used" } + __is_convertible_to(int, float)(); // { dg-message "unimplemented" } + __is_empty(int)(); // { dg-error "'__is_empty\\(int\\)' cannot be used" } + __is_enum(int)(); // { dg-error "'__is_enum\\(int\\)' cannot be used" } + __is_pod(int)(); // { dg-error "'__is_pod\\(int\\)' cannot be used" } + __is_polymorphic(int)(); // { dg-error "'__is_polymorphic\\(int\\)' cannot be used" } + __is_union(int)(); // { dg-error "'__is_union\\(int\\)' cannot be used" } +} diff --git a/gcc/testsuite/g++.dg/ext/is_empty.C b/gcc/testsuite/g++.dg/ext/is_empty.C new file mode 100644 index 000000000..4c58941b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_empty.C @@ -0,0 +1,78 @@ +// { dg-do run } +#include <cassert> + +struct A +{ + double a; + double b; +}; + +struct B +{ + virtual ~B() { } +}; + +class C +{ }; + +union U +{ }; + +template<typename T> + bool + f() + { return __is_empty(T); } + +template<typename T> + class My + { + public: + bool + f() + { return !!__is_empty(T); } + }; + +template<typename T> + class My2 + { + public: + static const bool trait = __is_empty(T); + }; + +template<typename T> + const bool My2<T>::trait; + +template<typename T, bool b = __is_empty(T)> + struct My3_help + { static const bool trait = b; }; + +template<typename T, bool b> + const bool My3_help<T, b>::trait; + +template<typename T> + class My3 + { + public: + bool + f() + { return My3_help<T>::trait; } + }; + +#define PTEST(T) (__is_empty(T) && f<T>() \ + && My<T>().f() && My2<T>::trait && My3<T>().f()) + +#define NTEST(T) (!__is_empty(T) && !f<T>() \ + && !My<T>().f() && !My2<T>::trait && !My3<T>().f()) + +int main() +{ + assert (NTEST (int)); + assert (NTEST (void)); + assert (NTEST (A)); + assert (NTEST (B)); + assert (PTEST (C)); + assert (NTEST (C[])); + assert (NTEST (U)); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/is_enum.C b/gcc/testsuite/g++.dg/ext/is_enum.C new file mode 100644 index 000000000..4ac1723ed --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_enum.C @@ -0,0 +1,73 @@ +// { dg-do run } +#include <cassert> + +struct A +{ + double a; + double b; +}; + +class B +{ }; + +enum E +{ + e0 +}; + +template<typename T> + bool + f() + { return __is_enum(T); } + +template<typename T> + class My + { + public: + bool + f() + { return !!__is_enum(T); } + }; + +template<typename T> + class My2 + { + public: + static const bool trait = __is_enum(T); + }; + +template<typename T> + const bool My2<T>::trait; + +template<typename T, bool b = __is_enum(T)> + struct My3_help + { static const bool trait = b; }; + +template<typename T, bool b> + const bool My3_help<T, b>::trait; + +template<typename T> + class My3 + { + public: + bool + f() + { return My3_help<T>::trait; } + }; + +#define PTEST(T) (__is_enum(T) && f<T>() \ + && My<T>().f() && My2<T>::trait && My3<T>().f()) + +#define NTEST(T) (!__is_enum(T) && !f<T>() \ + && !My<T>().f() && !My2<T>::trait && !My3<T>().f()) + +int main() +{ + assert (NTEST (int)); + assert (NTEST (void)); + assert (NTEST (A)); + assert (NTEST (B)); + assert (PTEST (E)); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/is_pod.C b/gcc/testsuite/g++.dg/ext/is_pod.C new file mode 100644 index 000000000..939665d8d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_pod.C @@ -0,0 +1,76 @@ +// { dg-do run } +// { dg-options "-std=c++0x" } +#include <cassert> + +struct A +{ + double a; + double b; +}; + +struct B +{ + B() { } +}; + +struct C +: public A { }; + +template<typename T> + bool + f() + { return __is_pod(T); } + +template<typename T> + class My + { + public: + bool + f() + { return !!__is_pod(T); } + }; + +template<typename T> + class My2 + { + public: + static const bool trait = __is_pod(T); + }; + +template<typename T> + const bool My2<T>::trait; + +template<typename T, bool b = __is_pod(T)> + struct My3_help + { static const bool trait = b; }; + +template<typename T, bool b> + const bool My3_help<T, b>::trait; + +template<typename T> + class My3 + { + public: + bool + f() + { return My3_help<T>::trait; } + }; + +#define PTEST(T) (__is_pod(T) && f<T>() \ + && My<T>().f() && My2<T>::trait && My3<T>().f()) + +#define NTEST(T) (!__is_pod(T) && !f<T>() \ + && !My<T>().f() && !My2<T>::trait && !My3<T>().f()) + +int main() +{ + assert (PTEST (int)); + assert (NTEST (void)); + assert (PTEST (A)); + assert (PTEST (A[])); + assert (NTEST (B)); + assert (PTEST (C)); + assert (PTEST (C[])); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/is_pod_98.C b/gcc/testsuite/g++.dg/ext/is_pod_98.C new file mode 100644 index 000000000..80a87c825 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_pod_98.C @@ -0,0 +1,16 @@ +// PR c++/43333 +// { dg-options "-std=c++98" } +// { dg-do run } + +struct strPOD +{ + const char *const foo; + const char *const bar; +}; +extern "C" void abort (void); +int main () +{ + if (!__is_pod (strPOD)) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/is_pod_incomplete.C b/gcc/testsuite/g++.dg/ext/is_pod_incomplete.C new file mode 100644 index 000000000..a30ab1fdd --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_pod_incomplete.C @@ -0,0 +1,8 @@ +// PR c++/32158 +template<typename T> + struct A + { + A() { } + }; + +int t[__is_pod(A<int>)?-1:1]; diff --git a/gcc/testsuite/g++.dg/ext/is_polymorphic.C b/gcc/testsuite/g++.dg/ext/is_polymorphic.C new file mode 100644 index 000000000..462e4b705 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_polymorphic.C @@ -0,0 +1,83 @@ +// { dg-do run } +#include <cassert> +#include <exception> + +struct A +{ + double a; + double b; +}; + +class B +{ + virtual void rotate(int) { } +}; + +class C +: public B { }; + +union U +{ + double a; + double b; +}; + +template<typename T> + bool + f() + { return __is_polymorphic(T); } + +template<typename T> + class My + { + public: + bool + f() + { return !!__is_polymorphic(T); } + }; + +template<typename T> + class My2 + { + public: + static const bool trait = __is_polymorphic(T); + }; + +template<typename T> + const bool My2<T>::trait; + +template<typename T, bool b = __is_polymorphic(T)> + struct My3_help + { static const bool trait = b; }; + +template<typename T, bool b> + const bool My3_help<T, b>::trait; + +template<typename T> + class My3 + { + public: + bool + f() + { return My3_help<T>::trait; } + }; + +#define PTEST(T) (__is_polymorphic(T) && f<T>() \ + && My<T>().f() && My2<T>::trait && My3<T>().f()) + +#define NTEST(T) (!__is_polymorphic(T) && !f<T>() \ + && !My<T>().f() && !My2<T>::trait && !My3<T>().f()) + +int main() +{ + assert (NTEST (int)); + assert (NTEST (void)); + assert (PTEST (std::exception)); + assert (NTEST (A)); + assert (PTEST (B)); + assert (PTEST (C)); + assert (NTEST (C[])); + assert (NTEST (U)); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/is_union.C b/gcc/testsuite/g++.dg/ext/is_union.C new file mode 100644 index 000000000..c95f5a6e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_union.C @@ -0,0 +1,76 @@ +// { dg-do run } +#include <cassert> + +struct A +{ + double a; + double b; +}; + +class B +{ + B() { } +}; + +union U +{ + double a; + double b; +}; + +template<typename T> + bool + f() + { return __is_union(T); } + +template<typename T> + class My + { + public: + bool + f() + { return !!__is_union(T); } + }; + +template<typename T> + class My2 + { + public: + static const bool trait = __is_union(T); + }; + +template<typename T> + const bool My2<T>::trait; + +template<typename T, bool b = __is_union(T)> + struct My3_help + { static const bool trait = b; }; + +template<typename T, bool b> + const bool My3_help<T, b>::trait; + +template<typename T> + class My3 + { + public: + bool + f() + { return My3_help<T>::trait; } + }; + +#define PTEST(T) (__is_union(T) && f<T>() \ + && My<T>().f() && My2<T>::trait && My3<T>().f()) + +#define NTEST(T) (!__is_union(T) && !f<T>() \ + && !My<T>().f() && !My2<T>::trait && !My3<T>().f()) + +int main() +{ + assert (NTEST (int)); + assert (NTEST (void)); + assert (NTEST (A)); + assert (NTEST (B)); + assert (PTEST (U)); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/java-1.C b/gcc/testsuite/g++.dg/ext/java-1.C new file mode 100644 index 000000000..f88e1fcab --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/java-1.C @@ -0,0 +1,26 @@ +// { dg-do compile { target { ! { powerpc-ibm-aix* } } } } +// { dg-options "" } +// Test extern "java" and some throwing of the objects. + +extern "Java" + namespace java + { + namespace lang + { + class Throwable; + class Class; + } +} +typedef class java::lang::Throwable* jthrowable; +typedef class java::lang::Class* jclass; +class java::lang::Throwable { +public: + static jclass class$; +}; +int +_Jv_FindClassFromSignature ( ) + try + { + } + catch (java::lang::Throwable *ncdfe) {} + diff --git a/gcc/testsuite/g++.dg/ext/java-2.C b/gcc/testsuite/g++.dg/ext/java-2.C new file mode 100644 index 000000000..8114517b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/java-2.C @@ -0,0 +1,79 @@ +// PR c++/30293 +// PR c++/30294 +// { dg-do compile { target { ! { powerpc-ibm-aix* } } } } +// { dg-options "" } + +extern "Java" { +typedef __java_byte jbyte; +namespace java { +namespace lang { + class Object {}; + class Class {}; +} +} +typedef struct java::lang::Object* jobject; +typedef java::lang::Class *jclass; +} +extern "C" jobject _Jv_AllocObject (jclass); + +extern "Java" { + struct A { static java::lang::Class class$; }; +} + +struct B { + A a; // { dg-error "has Java class type" } +}; + +void* operator new (__SIZE_TYPE__, void*) throw(); +char buf[1024]; + +A a; // { dg-error "not allocated with" } +A b = A (); // { dg-error "not allocated with" } +A *c = new ((void *) buf) A (); // { dg-error "using placement new" } +A *d = new A (); +jbyte e = 6; + +const A fn1 () // { dg-error "return type has Java class type" } +{ + A a; // { dg-error "not allocated with" } + return a; +} + +A fn2 () // { dg-error "return type has Java class type" } +{ + A a; // { dg-error "not allocated with" } + return a; +} + +A *fn3 () +{ + return new A (); +} + +A &fn4 () +{ + return *c; +} + +jbyte fn5 () +{ + return 7; +} + +void fn6 (A x) // { dg-error "has Java class type" } +{ +} + +void fn7 (const A x) // { dg-error "has Java class type" } +{ +} + +void fn8 (A *x) +{ + (void) x; +} + +void fn9 (jbyte x) +{ + (void) x; +} diff --git a/gcc/testsuite/g++.dg/ext/label1.C b/gcc/testsuite/g++.dg/ext/label1.C new file mode 100644 index 000000000..95fd644e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/label1.C @@ -0,0 +1,10 @@ +// { dg-options "" } + +int main(void) { + static const void* lbls[2][2] = {{&&lbl0, &&lbl0}, {&&lbl0, &&lbl0}}; + goto *lbls[0][0]; + goto *lbls[0][0][0]; // { dg-message "" } + goto *lbls[0]; // { dg-error "" } + lbl0: + ; +} diff --git a/gcc/testsuite/g++.dg/ext/label10.C b/gcc/testsuite/g++.dg/ext/label10.C new file mode 100644 index 000000000..632b2426e --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/label10.C @@ -0,0 +1,17 @@ +// PR c++/33836 +// { dg-do compile } +// { dg-options "" } + +template<int N> struct A +{ + enum { M = && N }; // { dg-error "referenced outside|cannot appear in|not an integer constant" } +}; + +A<0> a; + +void foo () +{ + __label__ P; + enum { O = && P }; // { dg-error "cannot appear in|not an integer constant" } + P:; +} diff --git a/gcc/testsuite/g++.dg/ext/label11.C b/gcc/testsuite/g++.dg/ext/label11.C new file mode 100644 index 000000000..dd9222860 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/label11.C @@ -0,0 +1,46 @@ +// PR c++/38725 +// { dg-do compile } +// { dg-options "" } + +struct A {}; +struct B : virtual A {}; +int vi; +void *vp; + +void +f1 (int i) +{ + goto *i; +} + +void +f2 (B b) +{ + goto *b; // { dg-error "cannot convert" } +} + +template <typename T> +void +f3 (T i) +{ + goto *i; +} + +void +f3a () +{ + f3 (vi); +} + +template <typename T> +void +f4 (T i) +{ + goto *i; +} + +void +f4a () +{ + f4 (vp); +} diff --git a/gcc/testsuite/g++.dg/ext/label12.C b/gcc/testsuite/g++.dg/ext/label12.C new file mode 100644 index 000000000..2585318b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/label12.C @@ -0,0 +1,39 @@ +// PR c++/39028 +// { dg-do compile } +// Origin: Stephan Springl <springl@bfw-online.de> + +void +f () +{ + int i; + for (i = 0; i < 2; i++) + { + __label__ l; + goto l; + l:; + } + while (i++ < 5) + { + __label__ l; + goto l; + l:; + } + do + { + __label__ l; + goto l; + l:; + } + while (i++ < 8); + if (1) + { + __label__ l; + goto l; + l:; + } + { + __label__ l; + goto l; + l:; + } +} diff --git a/gcc/testsuite/g++.dg/ext/label13.C b/gcc/testsuite/g++.dg/ext/label13.C new file mode 100644 index 000000000..d932a9a50 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/label13.C @@ -0,0 +1,22 @@ +// PR c++/41090 +// { dg-do run } +// { dg-options "" } + +int i; +struct C +{ + C(); +}; + +C::C() // { dg-bogus "can never be copied" "" { xfail { { *-apple-darwin* alpha*-dec-osf* } || { hppa*-*-hpux* && { ! hppa*64*-*-* } } } } } +{ + static void *labelref = &&label; + goto *labelref; + label: i = 1; +} + +int main() +{ + C c; + return (i != 1); +} diff --git a/gcc/testsuite/g++.dg/ext/label2.C b/gcc/testsuite/g++.dg/ext/label2.C new file mode 100644 index 000000000..7d11d00f5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/label2.C @@ -0,0 +1,11 @@ +// { dg-options "" } + +template <typename T> +void f() { + l: + void *p[] = { &&l }; + + goto *p[0]; +} + +template void f<int>(); diff --git a/gcc/testsuite/g++.dg/ext/label3.C b/gcc/testsuite/g++.dg/ext/label3.C new file mode 100644 index 000000000..604bfdc12 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/label3.C @@ -0,0 +1,39 @@ +// Bug: we were removing the p = q assignment in dce, and then reinserting +// it *after* the try/catch in out-of-ssa. Oops. + +// testcase reduced from libjava/interpret.cc. + +// { dg-do run } +// { dg-options "-O2" } + +extern "C" int printf (const char *, ...); + +bool b; + +int main() +{ + __label__ one, two, done; + void *labs[] = { &&one, &&two, &&done }; + const void **q = (const void **)labs; + const void **p = q; + + try + { + one: + printf ("one!\n"); + if (b) + throw 42; + goto **p++; + + two: + printf ("two!\n"); + goto **p++; + + done: + printf ("done!\n"); + } + catch (int) + { + printf ("caught!\n"); + } +} diff --git a/gcc/testsuite/g++.dg/ext/label4.C b/gcc/testsuite/g++.dg/ext/label4.C new file mode 100644 index 000000000..93f140f34 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/label4.C @@ -0,0 +1,6 @@ +// PR c++/20563: ICE (--enable-checking), infinite loop (--disable-checking) +// Origin: Giovanni Bajo <giovannibajo@libero.it> + +// { dg-do compile } + +__label__ *l; // { dg-error "not at the beginning of" } diff --git a/gcc/testsuite/g++.dg/ext/label5.C b/gcc/testsuite/g++.dg/ext/label5.C new file mode 100644 index 000000000..fc611cd41 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/label5.C @@ -0,0 +1,6 @@ +// { dg-options "" } +// PR c++/24052 + +struct A { }; +int main() { b: A() && && b; } // { dg-error "A\\(\\) && && *b" } +// { dg-message "candidate|operator&&|no known conversion" "additional" { target *-*-* } 5 } diff --git a/gcc/testsuite/g++.dg/ext/label6.C b/gcc/testsuite/g++.dg/ext/label6.C new file mode 100644 index 000000000..e4b0c37c2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/label6.C @@ -0,0 +1,3 @@ +// PR c++/32108 + +__label__ L; // { dg-error "not at the beginning" } diff --git a/gcc/testsuite/g++.dg/ext/label7.C b/gcc/testsuite/g++.dg/ext/label7.C new file mode 100644 index 000000000..e92dccf5d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/label7.C @@ -0,0 +1,12 @@ +// PR c++/32121 +// { dg-do compile } + +int f (void) +{ + a:; + __label__ a; // { dg-error "not at the beginning" } + int b; + __label__ c; // { dg-error "not at the beginning" } + a:; // { dg-error "duplicate label" } + c:; +} diff --git a/gcc/testsuite/g++.dg/ext/label8.C b/gcc/testsuite/g++.dg/ext/label8.C new file mode 100644 index 000000000..1f6175df3 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/label8.C @@ -0,0 +1,22 @@ +// PR c++/32121 +// { dg-do compile } + +int f (void) +{ + __label__ a, b; + __label__ c; + a:; + b:; + c:; + { + __label__ d; + d:; + if (0) + { + __label__ e; + __label__ f; + f:; + e:; + } + } +} diff --git a/gcc/testsuite/g++.dg/ext/label9.C b/gcc/testsuite/g++.dg/ext/label9.C new file mode 100644 index 000000000..81b385ffe --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/label9.C @@ -0,0 +1,10 @@ +// PR c++/32121 +// { dg-do compile } + +int f (void) +{ + while (1) + __label__ a; // { dg-error "not at the beginning" } + for (;;) + __label__ b; // { dg-error "not at the beginning" } +} diff --git a/gcc/testsuite/g++.dg/ext/lvaddr.C b/gcc/testsuite/g++.dg/ext/lvaddr.C new file mode 100644 index 000000000..5b217d165 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/lvaddr.C @@ -0,0 +1,10 @@ +// Copyright (C) 2002 Free Software Foundation +// Contributed by Matt Austern <austern@apple.com> + +// { dg-do compile } + +void f() +{ + int n; + char* p = &(char) n; // { dg-error "lvalue" } +} diff --git a/gcc/testsuite/g++.dg/ext/lvalue1.C b/gcc/testsuite/g++.dg/ext/lvalue1.C new file mode 100644 index 000000000..bf883eae2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/lvalue1.C @@ -0,0 +1,10 @@ +// Test that we complain about the gcc cast-as-lvalue extension. + +int main () +{ + char c; + + static_cast<int>(c) = 2; // { dg-error "lvalue" "not an lvalue" } + + return c != 2; +} diff --git a/gcc/testsuite/g++.dg/ext/max.C b/gcc/testsuite/g++.dg/ext/max.C new file mode 100644 index 000000000..bc65f1f70 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/max.C @@ -0,0 +1,6 @@ +struct s_t { +}; +void foo(void) { + s_t s; int i; + s<?=i; // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/ext/member-attr.C b/gcc/testsuite/g++.dg/ext/member-attr.C new file mode 100644 index 000000000..2a7e18bf5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/member-attr.C @@ -0,0 +1,14 @@ +/* Test to see if__attribute__'s are handled by inline member functions */ +/* { dg-do compile } */ +/* { dg-options "-fmessage-length=0" } */ + +/* Previously __attribute__'s were handled by the grammar but "dropped + on the floor", these effectively ignoring them. This tests the fix + to see that they are now handled. In this test it should report + that we have an illegal attribute. */ + +class T { + public: + __attribute__ ((garbage1)) void member1(int) {} /* { dg-warning "'garbage1' attribute directive ignored" "" } */ + void __attribute__ ((garbage2)) member2(int) {} /* { dg-warning "'garbage2' attribute directive ignored" "" } */ +}; diff --git a/gcc/testsuite/g++.dg/ext/ms-1.C b/gcc/testsuite/g++.dg/ext/ms-1.C new file mode 100644 index 000000000..3963b7561 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/ms-1.C @@ -0,0 +1,17 @@ + +// MS allows more things to be pointers to member functions +// { dg-options "-fms-extensions" } + +struct X +{ + void Foo (X *); + void Bar (); +}; + +void Quux (void (X::*) ()); + +void X::Foo (X *ptr) // { dg-message "candidate" } +{ + Quux (Foo); // { dg-error "no matches" } + Quux (Bar); +} diff --git a/gcc/testsuite/g++.dg/ext/no-asm-1.C b/gcc/testsuite/g++.dg/ext/no-asm-1.C new file mode 100644 index 000000000..6c4c20439 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/no-asm-1.C @@ -0,0 +1,10 @@ +// { dg-do compile } +// { dg-options "" } + +// Verify that asm and the GNU extension typeof are recognized as +// keywords. + +int asm; // { dg-error "before .asm." } +int typeof; // { dg-error "expected" } +// { dg-error "multiple types" "" { target *-*-* } 8 } +// { dg-error "declaration" "" { target *-*-* } 8 } diff --git a/gcc/testsuite/g++.dg/ext/no-asm-2.C b/gcc/testsuite/g++.dg/ext/no-asm-2.C new file mode 100644 index 000000000..fa614d8e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/no-asm-2.C @@ -0,0 +1,10 @@ +// { dg-do compile } +// { dg-options "-fno-asm" } + +// Verify that the keyword asm and the GNU extension typeof are not +// recognized as keywords when using -fno-asm. Having -fno-asm affect +// a standard C++ keyword seems strange, but that is existing +// behaviour. If that behaviour changes, this test should change. + +int asm; // { dg-bogus "before .asm." } +int typeof; // { dg-bogus "before .typeof." } diff --git a/gcc/testsuite/g++.dg/ext/no-gnu-keywords-1.C b/gcc/testsuite/g++.dg/ext/no-gnu-keywords-1.C new file mode 100644 index 000000000..8dbbd5f34 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/no-gnu-keywords-1.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// { dg-options "-fno-gnu-keywords" } + +// Verify that the keyword asm is recognized and that the GNU +// extension typeof is not recognized as a keyword when using +// -fno-gnu-keywords. + +int asm; // { dg-error "before .asm." } +int typeof; // { dg-bogus "before .typeof." } diff --git a/gcc/testsuite/g++.dg/ext/offsetof1.C b/gcc/testsuite/g++.dg/ext/offsetof1.C new file mode 100644 index 000000000..1468c0a7c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/offsetof1.C @@ -0,0 +1,21 @@ +// PR c++/27601 +// Origin: Patrik Hägglund <patrik.hagglund@bredband.net> +// { dg-do compile } + +struct bar { + static int foo; + static int baz(); +}; + +int a = __builtin_offsetof(bar, foo); // { dg-error "static data member" } +int av = __builtin_offsetof(volatile bar, foo); // { dg-error "static data member" } +int b = __builtin_offsetof(bar, baz); // { dg-error "member function" } +int b0 = __builtin_offsetof(bar, baz[0]); // { dg-error "function" } +int bv0 = __builtin_offsetof(volatile bar, baz[0]); // { dg-error "function" } +int c = __builtin_offsetof(bar, ~bar); // { dg-error "member function" } + +typedef int I; +enum E { }; + +int d = __builtin_offsetof(I, ~I); // { dg-error "destructor" } +int e = __builtin_offsetof(E, ~E); // { dg-error "destructor" } diff --git a/gcc/testsuite/g++.dg/ext/oper1.C b/gcc/testsuite/g++.dg/ext/oper1.C new file mode 100644 index 000000000..7f97d73a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/oper1.C @@ -0,0 +1,19 @@ +// { dg-do run } + +// Copyright 2002 Free Software Foundation +// Contributed by Jason Merrill <jason@redhat.com> + +// Make sure the GNU extension of accepting dropping cv-qualifiers for +// the implicit this argument does not kick in when taking the address +// of an object, since this extension would change the meaning of a +// well-defined program. + +struct A { + A* operator&() { return 0; } +}; + +int main () +{ + const A a = {}; + return (&a == 0); +} diff --git a/gcc/testsuite/g++.dg/ext/packed10.C b/gcc/testsuite/g++.dg/ext/packed10.C new file mode 100644 index 000000000..c4bbb1462 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/packed10.C @@ -0,0 +1,14 @@ +// PR c++/13983, c++/17519 +// The typedef and the array were causing us to miss that A<int> is +// a packed type. + +template <class T> +struct A { + A(); +} __attribute__((packed)); + +typedef A<int> Ai; + +struct B { + Ai a[2]; +} __attribute__((packed)); diff --git a/gcc/testsuite/g++.dg/ext/packed11.C b/gcc/testsuite/g++.dg/ext/packed11.C new file mode 100644 index 000000000..e75845d93 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/packed11.C @@ -0,0 +1,13 @@ +// PR c++/26670 + +struct nonpod { + nonpod(); +}; + +struct nonpod_pack { + nonpod n; // { dg-warning "ignoring packed attribute" } +} __attribute__ ((packed)); + +struct nonpod_pack2 { + nonpod_pack p; // { dg-warning "ignoring packed attribute" } +} __attribute__ ((packed)); diff --git a/gcc/testsuite/g++.dg/ext/packed2.C b/gcc/testsuite/g++.dg/ext/packed2.C new file mode 100644 index 000000000..66f156bac --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/packed2.C @@ -0,0 +1,35 @@ +// PR c++/10091 + +// Original synopsis +// Bug: We were dying because in general, B::a doesn't have enough +// alignment for us to take its address. But if the B is C::b, it does +// have enough alignment, and we should be able to determine that. + +// This only failed on STRICT_ALIGNMENT targets (i.e. not i686) + +// July 2003 +// packing of non-pods is now only allowed if the non-pod is itself +// packed. Also only such pods can be reference bound to non-consts + +struct A { + int i; + + A(); + A(const A&); + A& operator=(const A&); +} __attribute__ ((packed)); + +struct B { + A a; +} __attribute__ ((packed)); + +struct C { + B b; + int j; +}; + +void f (A&); +void g (C& c) +{ + f (c.b.a); +} diff --git a/gcc/testsuite/g++.dg/ext/packed3.C b/gcc/testsuite/g++.dg/ext/packed3.C new file mode 100644 index 000000000..880b5d9b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/packed3.C @@ -0,0 +1,25 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Jul 2003 <nathan@codesourcery.com> + +// Packed fields are unsuitable for direct reference binding. + +struct Unpacked { int i; }; + +void Ref (int &p); +void Ref (Unpacked &p); + +struct __attribute__ ((packed)) Packed +{ + char c; + int i; + Unpacked u; +}; + +void Foo (Packed &p) +{ + Ref (p.i); // { dg-error "cannot bind packed field" "" { target { ! default_packed } } } + Ref (p.u.i); // { dg-error "cannot bind packed field" "" { target { ! default_packed } } } + Ref (p.u); // { dg-error "cannot bind packed field" "" { target { ! default_packed } } } +} diff --git a/gcc/testsuite/g++.dg/ext/packed4.C b/gcc/testsuite/g++.dg/ext/packed4.C new file mode 100644 index 000000000..e5e5e2c08 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/packed4.C @@ -0,0 +1,77 @@ +// { dg-do run { target { ! default_packed } } } +// { dg-options "-w" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Jul 2003 <nathan@codesourcery.com> + +// Packed fields are unsuitable for direct reference binding. + +struct Unpacked { int i; }; + +int ConstRef (int const &p, int const *ptr, int v) +{ + if (p != v) + return 1; + if (&p == ptr) + return 2; + return 0; +} + +int ConstRef (Unpacked const &p, Unpacked const *ptr, int v) +{ + if (p.i != v) + return 1; + if (&p == ptr) + return 2; + return 0; +} + +int Val (int p, int v) +{ + if (p != v) + return 1; + return 0; +} +int Val (Unpacked p, int v) +{ + if (p.i != v) + return 1; + return 0; +} + +struct __attribute__ ((packed)) Packed +{ + char c; + int i; + Unpacked u; + char t; +}; + +int Foo (Packed &p, int i, int ui) +{ + int r; + + if ((r = Val (p.i, i))) + return r; + if ((r = Val (p.u.i, ui))) + return r + 2; + if ((r = Val (p.u, ui))) + return r + 4; + + if ((r = ConstRef (p.i, &p.i, i))) + return r + 6; + + return 0; +} + +int main () +{ + Packed p; + + p.c = 0x12; + p.i = 0x3456789a; + p.u.i = 0xbcdef00f; + p.t = 0xed; + + return Foo (p, 0x3456789a, 0xbcdef00f); +} diff --git a/gcc/testsuite/g++.dg/ext/packed5.C b/gcc/testsuite/g++.dg/ext/packed5.C new file mode 100644 index 000000000..caf14d89c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/packed5.C @@ -0,0 +1,16 @@ +// PR c++/14173 + +struct A; + +void foo(const A&); + +struct A +{ + A(const A&); +}; + +struct B +{ + A a; + A bar() { return a; } +}; diff --git a/gcc/testsuite/g++.dg/ext/packed6.C b/gcc/testsuite/g++.dg/ext/packed6.C new file mode 100644 index 000000000..6a176b624 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/packed6.C @@ -0,0 +1,78 @@ +// PR c++/15209 +// { dg-options "-w" } + +__extension__ typedef __SIZE_TYPE__ size_t; +typedef unsigned char uint8_t; +typedef unsigned short int uint16_t; + +typedef unsigned int uint32_t; +__extension__ typedef unsigned long long int uint64_t; + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; + +struct MAGIC {u8 magic[8];} __attribute__ ((packed)); +struct PACKETTYPE {u8 type[16];} __attribute__ ((packed)); + + +typedef u16 leu16; +typedef u32 leu32; +typedef u64 leu64; + +class MD5Hash +{ +public: + + MD5Hash(void) {}; + + void *print(void) const; + MD5Hash(const MD5Hash &other); + MD5Hash& operator=(const MD5Hash &other); + +public: + u8 hash[16]; +}; + +struct PACKET_HEADER +{ + + MAGIC magic; + leu64 length; + MD5Hash hash; + MD5Hash setid; + PACKETTYPE type; +} __attribute__ ((packed)); + + +struct MAINPACKET +{ + PACKET_HEADER header; + + leu64 blocksize; + leu32 recoverablefilecount; + MD5Hash fileid[0]; + + +} __attribute__ ((packed)); + +struct CriticalPacket +{ + u8 *packetdata; + size_t packetlength; +}; + +class MainPacket : public CriticalPacket +{ + const MD5Hash& SetId(void) const; + + u64 blocksize; + u32 totalfilecount; + u32 recoverablefilecount; +}; + +inline const MD5Hash& MainPacket::SetId(void) const +{ + return ((const MAINPACKET*)packetdata)->header.setid; +} diff --git a/gcc/testsuite/g++.dg/ext/packed7.C b/gcc/testsuite/g++.dg/ext/packed7.C new file mode 100644 index 000000000..e2f74e026 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/packed7.C @@ -0,0 +1,15 @@ +// PR c++/14124 +// A packed enum uses the minimal underlying type. + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Matt Austern <austern@apple.com> + +// { dg-do run } + +enum XXX { xyzzy = 3 } __attribute__((packed)); + +int main() +{ + int enumsize = sizeof(xyzzy); + return (enumsize == 1) ? 0 : 1; +} diff --git a/gcc/testsuite/g++.dg/ext/packed8.C b/gcc/testsuite/g++.dg/ext/packed8.C new file mode 100644 index 000000000..91ee8b3ee --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/packed8.C @@ -0,0 +1,24 @@ +// PR c++/18378 +// NOTE: This test assumes packed structure layout differs from unpacked +// structure layout. This isn't true, e.g., with the default +// arm-none-elf options. +// { dg-options "-mstructure-size-boundary=8" { target arm*-*-* } } + +class A +{ +public: + int i; + + A() {} + A(const A& a) { i = a.i; } +}; + +class B +{ + A a __attribute__((packed)); // { dg-warning "attribute ignored" "" { target default_packed } } + +public: + B() {} + A GetA() { return a; } // { dg-error "" "" { target { ! default_packed } } } +}; + diff --git a/gcc/testsuite/g++.dg/ext/packed9.C b/gcc/testsuite/g++.dg/ext/packed9.C new file mode 100644 index 000000000..ba5d4ab04 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/packed9.C @@ -0,0 +1,20 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Apr 2005 <nathan@codesourcery.com> + +// DR21166. unnecessary error on packed char + +struct s1 { + char c1; +} __attribute__((packed)); + +char& +f(struct s1 *s) +{ + return s->c1; +} + +char * +g(struct s1 *s) +{ + return &s->c1; +} diff --git a/gcc/testsuite/g++.dg/ext/pr17577.C b/gcc/testsuite/g++.dg/ext/pr17577.C new file mode 100644 index 000000000..29b1d17d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr17577.C @@ -0,0 +1,6 @@ +// Test for PR c++/17577. + +/* { dg-do compile } */ + +#include "pr17577.h" +#pragma implementation "pr17577.h" /* { dg-warning "appears after file" } */ diff --git a/gcc/testsuite/g++.dg/ext/pr17577.h b/gcc/testsuite/g++.dg/ext/pr17577.h new file mode 100644 index 000000000..6ff0addb9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr17577.h @@ -0,0 +1,2 @@ +// Test for PR c++/17577. +#pragma interface diff --git a/gcc/testsuite/g++.dg/ext/pr27019.C b/gcc/testsuite/g++.dg/ext/pr27019.C new file mode 100644 index 000000000..c96d51c14 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr27019.C @@ -0,0 +1,11 @@ + +// { dg-do compile } +// { dg-options "" } + +struct A +{ + int i; + int z[1]; +}; + +A a = { z:{} }; // { dg-message "unimplemented" } diff --git a/gcc/testsuite/g++.dg/ext/pr28291.C b/gcc/testsuite/g++.dg/ext/pr28291.C new file mode 100644 index 000000000..1b3b9f40a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr28291.C @@ -0,0 +1,13 @@ + +// Test to make sure we do not ICE on this invalid program. + +// { dg-do compile } +// { dg-options "" } + +struct A +{ + static int i; + int j; +}; + +A a = { i:0 }; // { dg-error "non-static data member" } diff --git a/gcc/testsuite/g++.dg/ext/pr34829.C b/gcc/testsuite/g++.dg/ext/pr34829.C new file mode 100644 index 000000000..d588b5b2b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr34829.C @@ -0,0 +1,22 @@ +// Test for PR c++/34829 +// Placement new should be ok for non-aggregate Java types. + +// { dg-do compile } +// { dg-options "" } + +extern "Java" +{ + typedef __java_byte jbyte; +} + +typedef __SIZE_TYPE__ size_t; + +void *operator new (size_t, void *m) +{ + return m; +} + +jbyte *f(void *memory) +{ + return new (memory) jbyte; +} diff --git a/gcc/testsuite/g++.dg/ext/pr47213.C b/gcc/testsuite/g++.dg/ext/pr47213.C new file mode 100644 index 000000000..193007e83 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr47213.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// { dg-require-visibility "" } +// { dg-options "-fvisibility-ms-compat" } +#include <typeinfo> + +template < typename T > void +bar () +{ + typeid (T); +} + +void +foo () +{ + bar < int () > (); +} diff --git a/gcc/testsuite/g++.dg/ext/pragmaweak1.C b/gcc/testsuite/g++.dg/ext/pragmaweak1.C new file mode 100644 index 000000000..68bf3fce2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pragmaweak1.C @@ -0,0 +1,9 @@ +// PR c++/25999 +// { dg-final { scan-assembler-not "_Z3Foov" } } + +extern "C" { + void Foo(); +} +#pragma weak Random_Symbol +void Foo() { } + diff --git a/gcc/testsuite/g++.dg/ext/pretty1.C b/gcc/testsuite/g++.dg/ext/pretty1.C new file mode 100644 index 000000000..06608ae30 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pretty1.C @@ -0,0 +1,67 @@ +// PR c++/6794 +// Test whether __PRETTY_FUNCTION__ works in templates, functions and +// in initializers at global scope +// { dg-do compile } +// { dg-options "" } + +extern "C" void __assert_fail (const char *, const char *, + unsigned int, const char *) + throw() __attribute__((noreturn)); +extern "C" void abort (void); +extern "C" void exit (int); + +#define str(expr) #expr +#define assert(expr) \ + ((expr) ? 0 : (__assert_fail (str(expr), __FILE__, __LINE__, \ + __PRETTY_FUNCTION__), 0)) + +int __attribute__((noinline)) +foo (void) +{ + return 1; +} + +template<class T> int +bar (T) +{ + return (assert (foo ()), 1); +} + +template<> int +bar<int> (int) +{ + return (assert (foo ()), 2); +} + +int a = (assert (foo ()), 1); +int b = (assert (foo ()), 2); + +int +main () +{ + double c = 1.0; + unsigned char *d = 0; + int e = (assert (foo ()), 3); + + bar (c); + bar (d); + bar (e); +} + +namespace N +{ + int f = (assert (foo ()), 4); +} + +void __attribute__((noinline)) +__assert_fail (const char *cond, const char *file, unsigned int line, + const char *pretty) throw () +{ + abort (); +} + +// { dg-final { scan-assembler "int bar\\(T\\).*with T = int" } } +// { dg-final { scan-assembler "top level" } } +// { dg-final { scan-assembler "int main\\(\\)" } } +// { dg-final { scan-assembler "int bar\\(T\\).*with T = double" } } +// { dg-final { scan-assembler "int bar\\(T\\).*with T = unsigned char\*" } } diff --git a/gcc/testsuite/g++.dg/ext/pretty2.C b/gcc/testsuite/g++.dg/ext/pretty2.C new file mode 100644 index 000000000..0c05da9b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pretty2.C @@ -0,0 +1,61 @@ +// PR c++/6794 +// Test whether __PRETTY_FUNCTION__ works in templates, functions and +// in initializers at global scope +// { dg-do run } +// { dg-options "" } + +extern "C" void __assert_fail (const char *, const char *, + unsigned int, const char *) + throw() __attribute__((noreturn)); +extern "C" void abort (void); +extern "C" void exit (int); + +#define str(expr) #expr +#define assert(expr) \ + ((expr) ? 0 : (__assert_fail (str(expr), __FILE__, __LINE__, \ + __PRETTY_FUNCTION__), 0)) + +int __attribute__((noinline)) +foo (void) +{ + return 1; +} + +template<class T> int +bar (T) +{ + return (assert (foo ()), 1); +} + +template<> int +bar<int> (int) +{ + return (assert (foo ()), 2); +} + +int a = (assert (foo ()), 1); +int b = (assert (foo ()), 2); + +int +main () +{ + double c = 1.0; + unsigned char *d = 0; + int e = (assert (foo ()), 3); + + bar (c); + bar (d); + bar (e); +} + +namespace N +{ + int f = (assert (foo ()), 4); +} + +void __attribute__((noinline)) +__assert_fail (const char *cond, const char *file, unsigned int line, + const char *pretty) throw () +{ + abort (); +} diff --git a/gcc/testsuite/g++.dg/ext/pretty3.C b/gcc/testsuite/g++.dg/ext/pretty3.C new file mode 100644 index 000000000..01b14579a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pretty3.C @@ -0,0 +1,19 @@ +// PR c++/16630 +// { dg-do compile } +// { dg-options "" } +extern "C" int printf (const char*, ...); + +template <class T> +struct B { typedef T X; }; + +template <class U> +struct D +{ + const char* foo (typename B<U>::X) { return __PRETTY_FUNCTION__; } +}; + +int main () +{ + printf ("%s\n", D<int>().foo (0)); +} +// { dg-final { scan-assembler "const char\\* D<U>::foo\\(typename B<U>::X\\)" } } diff --git a/gcc/testsuite/g++.dg/ext/restrict1.C b/gcc/testsuite/g++.dg/ext/restrict1.C new file mode 100644 index 000000000..049af1fa4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/restrict1.C @@ -0,0 +1,7 @@ +// PR c++/6392 +// { dg-do compile } + +struct A +{ + int* __restrict__ data[10]; +}; diff --git a/gcc/testsuite/g++.dg/ext/selectany1.C b/gcc/testsuite/g++.dg/ext/selectany1.C new file mode 100644 index 000000000..e80fe4fd1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/selectany1.C @@ -0,0 +1,20 @@ +// { dg-do compile { target i?86-pc-cygwin } } +// { dg-do compile { target i?86-*-mingw* x86_64-*-mingw* } } + +// Check that selectany attribute puts symbols into link-once sections. + +// { dg-final { scan-assembler "\.section\t\.data\\\$foo\[^\n\]*\n\t\.linkonce discard" } } +// { dg-final { scan-assembler "\.section\t\.data\\\$x\[^\n\]*\n\t\.linkonce discard" } } + +__declspec (selectany) int foo = 1; + +class X +{ +private: + int m_i; +public: + X(int i): m_i(i){} + ~X(){} +}; + +__declspec(selectany) X x(1); diff --git a/gcc/testsuite/g++.dg/ext/selectany2.C b/gcc/testsuite/g++.dg/ext/selectany2.C new file mode 100644 index 000000000..278b32d2f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/selectany2.C @@ -0,0 +1,30 @@ +// { dg-do compile { target i?86-pc-cygwin } } +// { dg-do compile { target i?86-*-mingw* x86_64-*-mingw* } } + +// Check for errors with invalid usage of selectany attribute. + +extern int foo; +__declspec (selectany) int foo = 1; // OK + +struct d +{ + static int foo; +}; +__declspec (selectany) int d::foo = 1; // OK + +struct f +{ + int i; +}; +__declspec (selectany) struct f F= {1}; // OK + +__declspec (selectany) int boo; //{ dg-error "selectany" } + +__declspec (selectany) static int bar = 1; // { dg-error "selectany" } +int use_bar = bar; // Avoid defined but not used warning. + +int baz() +{ + __declspec (selectany) int foo = 1; // { dg-error "selectany" } + return foo; +} diff --git a/gcc/testsuite/g++.dg/ext/spe1.C b/gcc/testsuite/g++.dg/ext/spe1.C new file mode 100644 index 000000000..8b1e630ec --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/spe1.C @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-mcpu=8540 -mspe -mabi=spe -mfloat-gprs=single -O0" } */ +/* { dg-skip-if "not an SPE target" { ! powerpc_spe_nocache } { "*" } { "" } } */ + +typedef int v2si __attribute__ ((vector_size (8))); + +/* The two specializations must be considered different. */ +template <class T> class X { }; +template <> class X<__ev64_opaque__> { }; +template <> class X<v2si> { }; diff --git a/gcc/testsuite/g++.dg/ext/static1.C b/gcc/testsuite/g++.dg/ext/static1.C new file mode 100644 index 000000000..9298b1d57 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/static1.C @@ -0,0 +1,18 @@ +// PR c++/23699 +// { dg-options "" } + +template<typename _CharT > class basic_string; +typedef basic_string<char> string; +template<typename _CharT> +struct basic_string +{ + static const int npos = -1; +}; +template<typename _CharT> +const int basic_string<_CharT>::npos; + +extern template class basic_string<char>; +struct A +{ + static const long npos = string::npos; +}; diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr1.C b/gcc/testsuite/g++.dg/ext/stmtexpr1.C new file mode 100644 index 000000000..fe9f3c3aa --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr1.C @@ -0,0 +1,53 @@ +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Jul 2003 <nathan@codesourcery.com> + +// make sure statement expressions work properly + +// { dg-do run } +// { dg-options "" } + +extern "C" int printf (char const *, ...); +extern "C" void abort (); + +static unsigned order[] = +{ + 1, 101, 2, 102, + 3, 4, 104, 103, + 5, 6, 105, 106, + 7, 107, 8, 408, 9, 109, 108, + 10, 11, 110, 411, 12, 112, 111, + 13, 113, + 14, 214, 114, 114, + 0 +}; + +static unsigned point; + +static void Check (unsigned t, unsigned i, void const *ptr, char const *name) +{ + printf ("%d %d %p %s\n", t, i, ptr, name); + + if (order[point++] != i + t) + abort (); +} + +template <int I> struct A +{ + A () { Check (0, I, this, __PRETTY_FUNCTION__); } + ~A () { Check (100, I, this, __PRETTY_FUNCTION__); } + A (A const &) { Check (200, I, this, __PRETTY_FUNCTION__); } + A &operator= (A const &) { Check (300, I, this, __PRETTY_FUNCTION__); } + void Foo () const { Check (400, I, this, __PRETTY_FUNCTION__); } +}; + +int main () +{ + ({A<1> (); A<2> (); ;}); + ({A<3> (), A<4> (); ;}); + ({A<5> (), A<6> ();}); + ({A <7> (); A<8> (); }).Foo (), A<9> (); + ({A <10> (), A<11> (); }).Foo (), A<12> (); + ({A<13> a; a; ; }); + ({A<14> a; a; }); + Check (0, 0, 0, "end"); +} diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr10.C b/gcc/testsuite/g++.dg/ext/stmtexpr10.C new file mode 100644 index 000000000..f7c5f8f59 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr10.C @@ -0,0 +1,16 @@ +/* { dg-do compile } " */ +/* { dg-options "" } */ + +void foo(int i) +{ + (i ? 1 : 2) = ({ X; }); /* { dg-error "" } */ +} + +struct A +{ + ~A (); + void foo() + { + delete this = ({ X; }); /* { dg-error "" } */ + } +}; diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr11.C b/gcc/testsuite/g++.dg/ext/stmtexpr11.C new file mode 100644 index 000000000..8b5c5f847 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr11.C @@ -0,0 +1,15 @@ +// PR c++/31337 +// { dg-options "" } + +struct A +{ + int i[0]; + A(); + A(const A&); + ~A(); +}; + +void foo() +{ + A a = ({ A(); }); +} diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr12.C b/gcc/testsuite/g++.dg/ext/stmtexpr12.C new file mode 100644 index 000000000..c35f41b0c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr12.C @@ -0,0 +1,7 @@ +// PR c++/29000 +// { dg-options "" } + +template<int> int foo() +{ + return ({foo;})==0; // { dg-error "insufficient context" } +} diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr13.C b/gcc/testsuite/g++.dg/ext/stmtexpr13.C new file mode 100644 index 000000000..978da1584 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr13.C @@ -0,0 +1,9 @@ +// PR c++/35747 +// { dg-do compile } +// { dg-options "" } + +void +foo () +{ + ({ i; ({ i; }); 0; }); // { dg-error "was not declared" } +} diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr2.C b/gcc/testsuite/g++.dg/ext/stmtexpr2.C new file mode 100644 index 000000000..5301103d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr2.C @@ -0,0 +1,51 @@ +// { dg-do run } +// { dg-options "" } + +extern "C" int printf (char const *, ...); +extern "C" void abort (); + +// There are two alternate legal renderings. +static unsigned int alt1[] = { 11, 10, 21, 110, 111, 121 }; +static unsigned int alt2[] = { 10, 11, 21, 111, 110, 121 }; + +static unsigned int pointer = 0; +static unsigned int *which; + +static void Check (unsigned t, unsigned i, void const *ptr, char const *name) +{ + printf ("%d %d %p %s\n", t, i, ptr, name); + + if (pointer > sizeof(alt1)/sizeof(alt1[0])) + abort (); + if (pointer == 0) + { + if (t + i == alt1[0]) + which = &alt1[0]; + else if (t + i == alt2[0]) + which = &alt2[0]; + else + abort (); + } + else if (t + i != which[pointer]) + abort (); + pointer++; +} + +struct A +{ + int I; + + A (int i) : I(i) { Check (0, I, this, __PRETTY_FUNCTION__); } + ~A () { Check (100, I, this, __PRETTY_FUNCTION__); } + A (A const &a) : I(a.I) { Check (200, I, this, __PRETTY_FUNCTION__); } + A &operator= (A const &a) + { I = a.I; Check (300, I, this, __PRETTY_FUNCTION__); return *this; } + void Foo () const { Check (400, I, this, __PRETTY_FUNCTION__); } + A operator+ (A const &a) const + { return A(I + a.I); } +}; + +int main () +{ + ({ A(10) + A(11); }); +} diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr3.C b/gcc/testsuite/g++.dg/ext/stmtexpr3.C new file mode 100644 index 000000000..9a3205c08 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr3.C @@ -0,0 +1,9 @@ +// PR c++/16112 +// { dg-options "" } + +struct A +{ + A(); +}; + +A foo() { return ({ A(); }); } diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr4.C b/gcc/testsuite/g++.dg/ext/stmtexpr4.C new file mode 100644 index 000000000..a37c33ae0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr4.C @@ -0,0 +1,8 @@ +// PR c++/20147 +// { dg-do compile } +// { dg-options "" } + +void foo() +{ + ({x;}); // { dg-error "was not declared" } +} diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr5.C b/gcc/testsuite/g++.dg/ext/stmtexpr5.C new file mode 100644 index 000000000..fc84981ce --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr5.C @@ -0,0 +1,15 @@ +// PR c++/21440 +// { dg-options "" } + +struct Foo { + ~Foo(); + int i; +}; + +void bar() { + Foo foo = ({ + Foo bletch; + bletch.i = 0; + bletch; + }); +} diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr6.C b/gcc/testsuite/g++.dg/ext/stmtexpr6.C new file mode 100644 index 000000000..d2518a64a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr6.C @@ -0,0 +1,11 @@ +// { dg-do run } +// { dg-options "" } + +int a[128]; + +int main() { + // Check that array-to-pointer conversion occurs in a + // statement-expression. + if (sizeof (({ a; })) != sizeof (int *)) + return 1; +} diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr7.C b/gcc/testsuite/g++.dg/ext/stmtexpr7.C new file mode 100644 index 000000000..87ca39b56 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr7.C @@ -0,0 +1,14 @@ +// PR c++/24686 +// { dg-options "" } + +struct A +{ + ~A(); +}; +bool h(int, const A&); +int f(); +int i; +void g() +{ + i && (A(), ({ static int l = f(); l; })); +} diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr8.C b/gcc/testsuite/g++.dg/ext/stmtexpr8.C new file mode 100644 index 000000000..8e5d0ddcb --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr8.C @@ -0,0 +1,28 @@ +// PR c++/27115 + +// { dg-do run } +// { dg-options "" } + +struct A +{ + int i; + A (int j) : i(j) {} + A (const A &j) : i(j.i) {} + A& operator= (const A &j) { i = j.i; return *this; } +}; + +A foo(int j) +{ + return ({ j ? A(1) : A(0); }); +} + +int main() +{ + return foo(1).i-1; +} + +void foo2() +{ + A b = ({ A a(1); a; }); +} + diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr9.C b/gcc/testsuite/g++.dg/ext/stmtexpr9.C new file mode 100644 index 000000000..4963e10e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr9.C @@ -0,0 +1,8 @@ +// PR c++/28899 +// { dg-options "" } + +void f() +{ + unsigned l, l1; + l1 = l = ({ unsigned __v; __v; }); +} diff --git a/gcc/testsuite/g++.dg/ext/strncpy-chk1.C b/gcc/testsuite/g++.dg/ext/strncpy-chk1.C new file mode 100644 index 000000000..7770ba931 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/strncpy-chk1.C @@ -0,0 +1,31 @@ +// PR c++/40502 +// { dg-do compile } +// { dg-options "-O2" } + +struct A { char x[12], y[35]; }; +struct B { char z[50]; }; + +inline void +foo (char *dest, const char *__restrict src, __SIZE_TYPE__ n) +{ + __builtin___strncpy_chk (dest, src, n, __builtin_object_size (dest, 0)); // { dg-warning "will always overflow" } +} + +void bar (const char *, int); + +inline void +baz (int i) +{ + char s[128], t[32]; + bar (s, 0); + bar (t, i); + A a; + B b; + foo (a.y, b.z, 36); +} + +void +test () +{ + baz (0); +} diff --git a/gcc/testsuite/g++.dg/ext/sync-1.C b/gcc/testsuite/g++.dg/ext/sync-1.C new file mode 100644 index 000000000..e4d6dff61 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/sync-1.C @@ -0,0 +1,40 @@ +// Validate that the __sync builtins are overloaded properly. +// { dg-do compile } +// { dg-options "-Werror" } + +#define TEST1(TYPE, BUILTIN) \ +void t_##TYPE##BUILTIN(TYPE *p) \ +{ \ + __typeof(BUILTIN(p, 1)) *pp; \ + pp = p; \ +} + +#define TEST2(BUILTIN) \ + TEST1(int, BUILTIN) \ + TEST1(long, BUILTIN) + +TEST2(__sync_fetch_and_add) +TEST2(__sync_fetch_and_sub) +TEST2(__sync_fetch_and_or) +TEST2(__sync_fetch_and_and) +TEST2(__sync_fetch_and_xor) +TEST2(__sync_fetch_and_nand) + +TEST2(__sync_add_and_fetch) +TEST2(__sync_sub_and_fetch) +TEST2(__sync_or_and_fetch) +TEST2(__sync_and_and_fetch) +TEST2(__sync_xor_and_fetch) +TEST2(__sync_nand_and_fetch) + +TEST2(__sync_lock_test_and_set) + +#define TEST3(TYPE) \ +void t_##TYPE##__sync_val_compare_and_swap(TYPE *p) \ +{ \ + __typeof(__sync_val_compare_and_swap(p, 1, 2)) *pp; \ + pp = p; \ +} + +TEST3(int) +TEST3(long) diff --git a/gcc/testsuite/g++.dg/ext/sync-2.C b/gcc/testsuite/g++.dg/ext/sync-2.C new file mode 100644 index 000000000..5695684c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/sync-2.C @@ -0,0 +1,58 @@ +// Validate that the __sync builtins are overloaded properly in templates. +// { dg-do compile } +// { dg-options "-Werror" } + + +#define TEST1(BUILTIN) \ +template<typename T> \ +void f##BUILTIN(T *p) \ +{ \ + __typeof(BUILTIN(p, 1)) *pp; \ + pp = p; \ +} + +TEST1(__sync_fetch_and_add) +TEST1(__sync_fetch_and_sub) +TEST1(__sync_fetch_and_or) +TEST1(__sync_fetch_and_and) +TEST1(__sync_fetch_and_xor) +TEST1(__sync_fetch_and_nand) + +TEST1(__sync_add_and_fetch) +TEST1(__sync_sub_and_fetch) +TEST1(__sync_or_and_fetch) +TEST1(__sync_and_and_fetch) +TEST1(__sync_xor_and_fetch) +TEST1(__sync_nand_and_fetch) + +TEST1(__sync_lock_test_and_set) + +template<typename T> +void f__sync_val_compare_and_swap(T *p) +{ + __typeof(__sync_val_compare_and_swap(p, 1, 2)) *pp; + pp = p; +} + +#define TEST2(TYPE) \ +void h_##TYPE () \ +{ \ + TYPE x; \ + f__sync_fetch_and_add (&x); \ + f__sync_fetch_and_sub (&x); \ + f__sync_fetch_and_or (&x); \ + f__sync_fetch_and_and (&x); \ + f__sync_fetch_and_xor (&x); \ + f__sync_fetch_and_nand (&x); \ + f__sync_add_and_fetch (&x); \ + f__sync_sub_and_fetch (&x); \ + f__sync_or_and_fetch (&x); \ + f__sync_and_and_fetch (&x); \ + f__sync_xor_and_fetch (&x); \ + f__sync_nand_and_fetch (&x); \ + f__sync_lock_test_and_set (&x); \ + f__sync_val_compare_and_swap (&x); \ +} + +TEST2(int) +TEST2(long) diff --git a/gcc/testsuite/g++.dg/ext/sync-3.C b/gcc/testsuite/g++.dg/ext/sync-3.C new file mode 100644 index 000000000..99faac7bc --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/sync-3.C @@ -0,0 +1,21 @@ +// PR debug/41801 +// { dg-do compile } +// { dg-options "-O2 -g" } + +struct T +{ + void + foo () volatile + { + __sync_lock_release (&t); + __sync_synchronize (); + } + bool t; +}; + +int +main () +{ + T t = { false }; + t.foo (); +} diff --git a/gcc/testsuite/g++.dg/ext/tmplattr1.C b/gcc/testsuite/g++.dg/ext/tmplattr1.C new file mode 100644 index 000000000..111e3441f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/tmplattr1.C @@ -0,0 +1,24 @@ +// PR c++/24260 +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target ilp32 } + +#define stdcall __attribute__((stdcall)) + +struct T { + template <class S> + static int stdcall func(int arg1, int arg2); +}; + +template <class S> +int stdcall T::func(int arg1, int arg2) +{ + return arg1+arg2; +} + +struct dummy {}; + +void xx() +{ + int (stdcall *ptr2)(int,int) = &T::func<dummy>; +} + diff --git a/gcc/testsuite/g++.dg/ext/tmplattr2.C b/gcc/testsuite/g++.dg/ext/tmplattr2.C new file mode 100644 index 000000000..4fd651d6c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/tmplattr2.C @@ -0,0 +1,18 @@ +// PR c++/17743 + +template <unsigned Len, unsigned Align> +struct aligned_storage +{ + typedef char type[Len] __attribute__((aligned((Align)))); +}; + +template<typename T> +struct X +{ + typename aligned_storage<sizeof(T),__alignof(T)>::type data; +}; + +template<bool> struct StaticAssert; +template<> struct StaticAssert<true> {}; + +StaticAssert<__alignof (X<double>) == __alignof (double)> dummy; diff --git a/gcc/testsuite/g++.dg/ext/tmplattr3.C b/gcc/testsuite/g++.dg/ext/tmplattr3.C new file mode 100644 index 000000000..f8d3c1620 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/tmplattr3.C @@ -0,0 +1,42 @@ +// PR c++/17743 + +template<typename T> +struct X { + typedef char layout_type[sizeof(T)] + __attribute ((aligned(__alignof(double)))); + layout_type data; +}; + +template<typename T> +struct Y { + typedef char layout_type[sizeof(T)] + __attribute ((aligned(__alignof(T)))); + layout_type data; +}; + +template<typename T> +struct Z { + typedef char layout_type[sizeof(T)] + __attribute ((aligned(__alignof(T)))); + struct Z2 { + layout_type data; + } in; +}; + +template<typename T> +struct A; + +template <typename T> +struct A<T*> { + typedef char layout_type[sizeof(T)] + __attribute ((aligned(__alignof(T)))); + layout_type data; +}; + +template<bool> struct StaticAssert; +template<> struct StaticAssert<true> {}; + +StaticAssert<__alignof(X<double>) == __alignof(double)> d1; +StaticAssert<__alignof(Y<double>) == __alignof(double)> d2; +StaticAssert<__alignof(Z<double>) == __alignof(double)> d3; +StaticAssert<__alignof(A<double*>) == __alignof(double)> d4; diff --git a/gcc/testsuite/g++.dg/ext/tmplattr4.C b/gcc/testsuite/g++.dg/ext/tmplattr4.C new file mode 100644 index 000000000..3d5c6b7d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/tmplattr4.C @@ -0,0 +1,19 @@ +// PR c++/7586 +// { dg-do run } + +template<typename T> +int f() +{ + typedef unsigned char type[sizeof (T)] + __attribute((aligned(__alignof(T)))); + + return __alignof (type); +} + +int main() +{ + if (f<int>() == __alignof (int)) + return 0; + else + return 1; +} diff --git a/gcc/testsuite/g++.dg/ext/tmplattr5.C b/gcc/testsuite/g++.dg/ext/tmplattr5.C new file mode 100644 index 000000000..30138d44a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/tmplattr5.C @@ -0,0 +1,33 @@ +// PR c++/19407 +// { dg-do run } + +typedef float global_vector_type __attribute__((vector_size(16))); + +template <class T> struct A +{ + typedef T type; +}; + +template < typename Val > struct S +{ + typedef typename A<Val>::type vector_type __attribute__((vector_size(16))); + typedef Val vector_type2 __attribute__((vector_size(16))); + int pr_size() { return sizeof(vector_type); } + int pr_size2() { return sizeof(vector_type2); } +}; + +int main() +{ + if (sizeof (S<float>::vector_type) != sizeof (global_vector_type)) + return 1; + if (sizeof (S<float>::vector_type2) != sizeof (global_vector_type)) + return 2; + + S<float> x; + if (x.pr_size() != sizeof (global_vector_type)) + return 3; + if (x.pr_size2() != sizeof (global_vector_type)) + return 4; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/tmplattr6.C b/gcc/testsuite/g++.dg/ext/tmplattr6.C new file mode 100644 index 000000000..17f23fe34 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/tmplattr6.C @@ -0,0 +1,12 @@ +// Don't crash on an unknown attribute. + +struct foo { + template <class T> + void __attribute__((leafify)) bar() {} // { dg-warning "ignored" } +}; + +void bar(void) +{ + foo f; + f.bar<int>(); +} diff --git a/gcc/testsuite/g++.dg/ext/tmplattr7.C b/gcc/testsuite/g++.dg/ext/tmplattr7.C new file mode 100644 index 000000000..ee6c41847 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/tmplattr7.C @@ -0,0 +1,11 @@ +// PR c++/33620 + +template <typename T> +struct __attribute__((visibility("default"))) List {}; + +int bar(List<int> args); +bool test(const List<int> &); + +int i = bar(List<int>()); + +bool test(const List<int> &) {} diff --git a/gcc/testsuite/g++.dg/ext/tmplattr8.C b/gcc/testsuite/g++.dg/ext/tmplattr8.C new file mode 100644 index 000000000..4b8707aa5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/tmplattr8.C @@ -0,0 +1,8 @@ +// PR c++/28560 + +template<typename> struct A {}; + +template<int> struct B; + +template<int N> struct C : + A<typename B<N>::X __attribute__((unused))> {}; // { dg-warning "attribute" } diff --git a/gcc/testsuite/g++.dg/ext/tmplattr9.C b/gcc/testsuite/g++.dg/ext/tmplattr9.C new file mode 100644 index 000000000..090257a5f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/tmplattr9.C @@ -0,0 +1,26 @@ +// PR c++/34937, 34962 +// { dg-require-weak "" } +// { dg-options "" } + +struct A +{ + static const int i; +}; + +template<int> void foo() +{ + int x[A::i] __attribute((vector_size(8))); +} + +template<int> struct B +{ + enum { a, b = a }; + void bar(B<b>) __attribute((weak)); +}; + +void f() +{ + foo<0>(); + B<0> b; + b.bar (B<B<0>::b>()); +} diff --git a/gcc/testsuite/g++.dg/ext/typedef-init.C b/gcc/testsuite/g++.dg/ext/typedef-init.C new file mode 100644 index 000000000..153303d21 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/typedef-init.C @@ -0,0 +1,36 @@ +/* { dg-do compile } */ +/* { dg-options "-fpermissive" } // suppress default -pedantic-errors */ + +/* This code used to be a legitimate, if dubious, extension. However, + it's been broken since GCC 3.0 (caused ICE) and we have now removed + the extension. See PR c/7353. + + For cases A and C, C++ issues a warning in addition to the error, + since this construct appears to be a case of implicit int + (forbidden in std. C++) until we get to the equals sign. */ + +/* Case A: just the bare name = initializer. */ + +typedef A = 0; /* { dg-error "does not name a type" "A" } */ +A a; /* { dg-error "does not name a type" "A error cascade" } */ + +/* Case B: with a type also. */ + +typedef int B = 0; /* { dg-error "initialized" "B" } */ +B b; /* { dg-error "does not name a type" "B error cascade" } */ + +/* C and D are the same as A and B, but wrapped in a structure; + field declarations go by a different code path in C++ (ick). */ + +struct S { + typedef C = 0; /* { dg-error "does not name a type" "C" } */ + C c; /* { dg-error "" "C error cascade" } */ + + typedef int D = 0; /* { dg-error "initialized" "D" } */ + D d; /* { dg-bogus "" "D error cascade" } */ +}; + +template<int> void foo() +{ + typedef int i = 0; /* { dg-error "is initialized" } */ +} diff --git a/gcc/testsuite/g++.dg/ext/typename1.C b/gcc/testsuite/g++.dg/ext/typename1.C new file mode 100644 index 000000000..cb9f4a7fc --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/typename1.C @@ -0,0 +1,7 @@ +// PR c++/6255 +// { dg-options "-fpermissive -w" } + +template <class T> struct A { typedef int X; }; +template <class T> struct B { typedef A<T> Y; void f (typename Y::X); }; +template <class T, class T1, class T2, class T3> struct C : public B<T> { void g (typename B<T>::Y::X); }; +template class B<int>; diff --git a/gcc/testsuite/g++.dg/ext/typeof1.C b/gcc/testsuite/g++.dg/ext/typeof1.C new file mode 100644 index 000000000..a3c13c8ae --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/typeof1.C @@ -0,0 +1,21 @@ +// Test typeof template argument substitution + +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } +// { dg-options "" } + +template <class T> struct A { + void f() {} + void g(T* t) { + A<typeof(t)> a; + a.f(); + } +}; + +int main() +{ + A<int> a; + int b; + a.g(&b); +} diff --git a/gcc/testsuite/g++.dg/ext/typeof10.C b/gcc/testsuite/g++.dg/ext/typeof10.C new file mode 100644 index 000000000..1b357ad9d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/typeof10.C @@ -0,0 +1,11 @@ +// PR c++/20552 +// Origin: Ivan Godard <igodard@pacbell.net> + +template<int> struct A +{ + void foo() + { + typedef int T; // { dg-error "previous" } + typedef __typeof__(*this) T; // { dg-error "conflicting" } + } +}; diff --git a/gcc/testsuite/g++.dg/ext/typeof11.C b/gcc/testsuite/g++.dg/ext/typeof11.C new file mode 100644 index 000000000..757bcdea4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/typeof11.C @@ -0,0 +1,18 @@ +// PR c++/37920 + +template<typename T> T& ensure_obj(const T&); +template <typename T> +void func2(T& t) +{ + typedef __typeof__(ensure_obj(t)) ttt; + struct ttt1 + { + ttt1( ttt arg0 ){} + } tttt ( t ); +} +int main() +{ + double d = 5; + func2(d); +} + diff --git a/gcc/testsuite/g++.dg/ext/typeof2.C b/gcc/testsuite/g++.dg/ext/typeof2.C new file mode 100644 index 000000000..3c5112fd0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/typeof2.C @@ -0,0 +1,29 @@ +// Test typeof with __asm redirection +// { dg-do compile } +// { dg-options "-O2" } + +extern "C" { + extern int foo1; + extern int foo1 __asm ("bar1"); + int foo1 = 1; + + extern int foo2 (int); + extern int foo2 (int) __asm ("bar2"); + int foo2 (int x) + { + return x; + } + + extern int foo3; + extern __typeof (foo3) foo3 __asm ("bar3"); + int foo3 = 1; + + extern int foo4 (int); + extern __typeof (foo4) foo4 __asm ("bar4"); + int foo4 (int x) + { + return x; + } +} + +// { dg-final { scan-assembler-not "foo" } } diff --git a/gcc/testsuite/g++.dg/ext/typeof3.C b/gcc/testsuite/g++.dg/ext/typeof3.C new file mode 100644 index 000000000..cf78c7c61 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/typeof3.C @@ -0,0 +1,4 @@ +double f(double); +float f(float); +void h(typeof(f) g) {} // { dg-error "" } + diff --git a/gcc/testsuite/g++.dg/ext/typeof4.C b/gcc/testsuite/g++.dg/ext/typeof4.C new file mode 100644 index 000000000..2f4237035 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/typeof4.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options "" } + +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/9459: typeof in return type of template function + +void foo (int) {} +void foo (double) {} + +template <typename C> +typeof(foo(1)) +bar () { return foo(1); } diff --git a/gcc/testsuite/g++.dg/ext/typeof5.C b/gcc/testsuite/g++.dg/ext/typeof5.C new file mode 100644 index 000000000..d1ee4f718 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/typeof5.C @@ -0,0 +1,8 @@ +// { dg-options "" } + +int foo; + +template <class T> struct Base {}; + +template <class T> +struct Derived : public Base<typeof(foo)> {}; diff --git a/gcc/testsuite/g++.dg/ext/typeof6.C b/gcc/testsuite/g++.dg/ext/typeof6.C new file mode 100644 index 000000000..ef75f255c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/typeof6.C @@ -0,0 +1,17 @@ +// { dg-options "" } + +template <class T> +void test1() { + int x = 0; + const typeof(x) & t1 = x+0; +} + +void test2() { + int x = 0; + const typeof(x) & t1 = x+0; +} + +int main() { + test1<int>(); + test2 (); +} diff --git a/gcc/testsuite/g++.dg/ext/typeof7.C b/gcc/testsuite/g++.dg/ext/typeof7.C new file mode 100644 index 000000000..6c426931b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/typeof7.C @@ -0,0 +1,6 @@ +// PR c++/13635 +// { dg-options "" } + +template<int n> class X {template<class Y> typeof(Y::y) foo();}; +X<0> x; + diff --git a/gcc/testsuite/g++.dg/ext/typeof8.C b/gcc/testsuite/g++.dg/ext/typeof8.C new file mode 100644 index 000000000..8e6523484 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/typeof8.C @@ -0,0 +1,12 @@ +// PR c++/14116 +// Any use of typeof in a templete was causing an ICE. +// { dg-options "" } + +struct vector { typedef int iterator; }; +vector read_queue; +template <class T> void f(){ + typedef typeof (read_queue) read_queue_t; + read_queue_t::iterator it; +} + + diff --git a/gcc/testsuite/g++.dg/ext/typeof9.C b/gcc/testsuite/g++.dg/ext/typeof9.C new file mode 100644 index 000000000..1547c0f2f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/typeof9.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +// Origin: gcc-bug@vogtner.de + +// PR c++/14106: ICE with typeof of function template. + +template<class T> +void j (T i) +{ +} + +template<typename T> +void instanciate () { + static void (*fp) (T) = j; + __typeof__ (j) *p; // { dg-error "unknown|invalid" } +} +template void instanciate<float>(); diff --git a/gcc/testsuite/g++.dg/ext/unary_trait_incomplete.C b/gcc/testsuite/g++.dg/ext/unary_trait_incomplete.C new file mode 100644 index 000000000..51cc80cd2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/unary_trait_incomplete.C @@ -0,0 +1,76 @@ +// PR c++/39475 + +struct I; +struct C { }; + +bool nas1 = __has_nothrow_assign(I); // { dg-error "incomplete type" } +bool nas2 = __has_nothrow_assign(C[]); +bool nas3 = __has_nothrow_assign(I[]); // { dg-error "incomplete type" } +bool nas4 = __has_nothrow_assign(void); +bool nas5 = __has_nothrow_assign(const void); + +bool tas1 = __has_trivial_assign(I); // { dg-error "incomplete type" } +bool tas2 = __has_trivial_assign(C[]); +bool tas3 = __has_trivial_assign(I[]); // { dg-error "incomplete type" } +bool tas4 = __has_trivial_assign(void); +bool tas5 = __has_trivial_assign(const void); + +bool nco1 = __has_nothrow_constructor(I); // { dg-error "incomplete type" } +bool nco2 = __has_nothrow_constructor(C[]); +bool nco3 = __has_nothrow_constructor(I[]); // { dg-error "incomplete type" } +bool nco4 = __has_nothrow_constructor(void); +bool nco5 = __has_nothrow_constructor(const void); + +bool tco1 = __has_trivial_constructor(I); // { dg-error "incomplete type" } +bool tco2 = __has_trivial_constructor(C[]); +bool tco3 = __has_trivial_constructor(I[]); // { dg-error "incomplete type" } +bool tco4 = __has_trivial_constructor(void); +bool tco5 = __has_trivial_constructor(const void); + +bool ncp1 = __has_nothrow_copy(I); // { dg-error "incomplete type" } +bool ncp2 = __has_nothrow_copy(C[]); +bool ncp3 = __has_nothrow_copy(I[]); // { dg-error "incomplete type" } +bool ncp4 = __has_nothrow_copy(void); +bool ncp5 = __has_nothrow_copy(const void); + +bool tcp1 = __has_trivial_copy(I); // { dg-error "incomplete type" } +bool tcp2 = __has_trivial_copy(C[]); +bool tcp3 = __has_trivial_copy(I[]); // { dg-error "incomplete type" } +bool tcp4 = __has_trivial_copy(void); +bool tcp5 = __has_trivial_copy(const void); + +bool vde1 = __has_virtual_destructor(I); // { dg-error "incomplete type" } +bool vde2 = __has_virtual_destructor(C[]); +bool vde3 = __has_virtual_destructor(I[]); // { dg-error "incomplete type" } +bool vde4 = __has_virtual_destructor(void); +bool vde5 = __has_virtual_destructor(const void); + +bool tde1 = __has_trivial_destructor(I); // { dg-error "incomplete type" } +bool tde2 = __has_trivial_destructor(C[]); +bool tde3 = __has_trivial_destructor(I[]); // { dg-error "incomplete type" } +bool tde4 = __has_trivial_destructor(void); +bool tde5 = __has_trivial_destructor(const void); + +bool abs1 = __is_abstract(I); // { dg-error "incomplete type" } +bool abs2 = __is_abstract(C[]); +bool abs3 = __is_abstract(I[]); // { dg-error "incomplete type" } +bool abs4 = __is_abstract(void); +bool abs5 = __is_abstract(const void); + +bool pod1 = __is_pod(I); // { dg-error "incomplete type" } +bool pod2 = __is_pod(C[]); +bool pod3 = __is_pod(I[]); // { dg-error "incomplete type" } +bool pod4 = __is_pod(void); +bool pod5 = __is_pod(const void); + +bool emp1 = __is_empty(I); // { dg-error "incomplete type" } +bool emp2 = __is_empty(C[]); +bool emp3 = __is_empty(I[]); // { dg-error "incomplete type" } +bool emp4 = __is_empty(void); +bool emp5 = __is_empty(const void); + +bool pol1 = __is_polymorphic(I); // { dg-error "incomplete type" } +bool pol2 = __is_polymorphic(C[]); +bool pol3 = __is_polymorphic(I[]); // { dg-error "incomplete type" } +bool pol4 = __is_polymorphic(void); +bool pol5 = __is_polymorphic(const void); diff --git a/gcc/testsuite/g++.dg/ext/uow-1.C b/gcc/testsuite/g++.dg/ext/uow-1.C new file mode 100644 index 000000000..fdf6aebb1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/uow-1.C @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-Wall" } */ + +extern "C" { + +typedef int UOW; +struct ABC { + UOW UOW; +}; + +} + diff --git a/gcc/testsuite/g++.dg/ext/uow-2.C b/gcc/testsuite/g++.dg/ext/uow-2.C new file mode 100644 index 000000000..79c1913f9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/uow-2.C @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-Wall -fms-extensions" } */ + +typedef int UOW; +struct ABC { + UOW UOW; +}; + diff --git a/gcc/testsuite/g++.dg/ext/uow-3.C b/gcc/testsuite/g++.dg/ext/uow-3.C new file mode 100644 index 000000000..a2c224021 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/uow-3.C @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-Wall" } */ + +typedef int UOW; /* { dg-error "" } */ +struct ABC { + UOW UOW; /* { dg-error "" } */ +}; + diff --git a/gcc/testsuite/g++.dg/ext/uow-4.C b/gcc/testsuite/g++.dg/ext/uow-4.C new file mode 100644 index 000000000..21ed04a88 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/uow-4.C @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-Wall -pedantic" } */ + +extern "C" { + +typedef int UOW; /* { dg-error "" } */ +struct ABC { + UOW UOW; /* { dg-error "" } */ +}; + +} + diff --git a/gcc/testsuite/g++.dg/ext/utf-array-short-wchar.C b/gcc/testsuite/g++.dg/ext/utf-array-short-wchar.C new file mode 100644 index 000000000..a549f6973 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf-array-short-wchar.C @@ -0,0 +1,36 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Expected errors for char16_t/char32_t string literals. */ +/* { dg-do compile } */ +/* { dg-options "-std=c++0x -fshort-wchar" } */ + +const char s_0[] = "ab"; +const char s_1[] = u"ab"; /* { dg-error "from wide string" } */ +const char s_2[] = U"ab"; /* { dg-error "from wide string" } */ +const char s_3[] = L"ab"; /* { dg-error "from wide string" } */ + +const char16_t s16_0[] = "ab"; /* { dg-error "from non-wide" } */ +const char16_t s16_1[] = u"ab"; +const char16_t s16_2[] = U"ab"; /* { dg-error "from incompatible" } */ +const char16_t s16_3[] = L"ab"; /* { dg-error "from incompatible" } */ + +const char16_t s16_4[0] = u"ab"; /* { dg-error "chars is too long" } */ +const char16_t s16_5[1] = u"ab"; /* { dg-error "chars is too long" } */ +const char16_t s16_6[2] = u"ab"; /* { dg-error "chars is too long" } */ +const char16_t s16_7[3] = u"ab"; +const char16_t s16_8[4] = u"ab"; + +const char32_t s32_0[] = "ab"; /* { dg-error "from non-wide" } */ +const char32_t s32_1[] = u"ab"; /* { dg-error "from incompatible" } */ +const char32_t s32_2[] = U"ab"; +const char32_t s32_3[] = L"ab"; /* { dg-error "from incompatible" } */ + +const char32_t s32_4[0] = U"ab"; /* { dg-error "chars is too long" } */ +const char32_t s32_5[1] = U"ab"; /* { dg-error "chars is too long" } */ +const char32_t s32_6[2] = U"ab"; /* { dg-error "chars is too long" } */ +const char32_t s32_7[3] = U"ab"; +const char32_t s32_8[4] = U"ab"; + +const wchar_t sw_0[] = "ab"; /* { dg-error "from non-wide" } */ +const wchar_t sw_1[] = u"ab"; /* { dg-error "from incompatible" } */ +const wchar_t sw_2[] = U"ab"; /* { dg-error "from incompatible" } */ +const wchar_t sw_3[] = L"ab"; diff --git a/gcc/testsuite/g++.dg/ext/utf-array.C b/gcc/testsuite/g++.dg/ext/utf-array.C new file mode 100644 index 000000000..6a14f79e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf-array.C @@ -0,0 +1,36 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Expected errors for char16_t/char32_t string literals. */ +/* { dg-do compile } */ +/* { dg-options "-std=c++0x" } */ + +const char s_0[] = "ab"; +const char s_1[] = u"ab"; /* { dg-error "from wide string" } */ +const char s_2[] = U"ab"; /* { dg-error "from wide string" } */ +const char s_3[] = L"ab"; /* { dg-error "from wide string" } */ + +const char16_t s16_0[] = "ab"; /* { dg-error "from non-wide" } */ +const char16_t s16_1[] = u"ab"; +const char16_t s16_2[] = U"ab"; /* { dg-error "from incompatible" } */ +const char16_t s16_3[] = L"ab"; /* { dg-error "from incompatible" } */ + +const char16_t s16_4[0] = u"ab"; /* { dg-error "chars is too long" } */ +const char16_t s16_5[1] = u"ab"; /* { dg-error "chars is too long" } */ +const char16_t s16_6[2] = u"ab"; /* { dg-error "chars is too long" } */ +const char16_t s16_7[3] = u"ab"; +const char16_t s16_8[4] = u"ab"; + +const char32_t s32_0[] = "ab"; /* { dg-error "from non-wide" } */ +const char32_t s32_1[] = u"ab"; /* { dg-error "from incompatible" } */ +const char32_t s32_2[] = U"ab"; +const char32_t s32_3[] = L"ab"; /* { dg-error "from incompatible" } */ + +const char32_t s32_4[0] = U"ab"; /* { dg-error "chars is too long" } */ +const char32_t s32_5[1] = U"ab"; /* { dg-error "chars is too long" } */ +const char32_t s32_6[2] = U"ab"; /* { dg-error "chars is too long" } */ +const char32_t s32_7[3] = U"ab"; +const char32_t s32_8[4] = U"ab"; + +const wchar_t sw_0[] = "ab"; /* { dg-error "from non-wide" } */ +const wchar_t sw_1[] = u"ab"; /* { dg-error "from incompatible" } */ +const wchar_t sw_2[] = U"ab"; /* { dg-error "from incompatible" } */ +const wchar_t sw_3[] = L"ab"; diff --git a/gcc/testsuite/g++.dg/ext/utf-badconcat.C b/gcc/testsuite/g++.dg/ext/utf-badconcat.C new file mode 100644 index 000000000..bab020e4f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf-badconcat.C @@ -0,0 +1,22 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Test unsupported concatenation of char16_t/char32_t* string literals. */ +/* { dg-do compile } */ +/* { dg-options "-std=c++0x" } */ + +const void *s0 = u"a" "b"; +const void *s1 = "a" u"b"; +const void *s2 = u"a" U"b"; /* { dg-error "non-standard concatenation" } */ +const void *s3 = U"a" u"b"; /* { dg-error "non-standard concatenation" } */ +const void *s4 = u"a" L"b"; /* { dg-error "non-standard concatenation" } */ +const void *s5 = L"a" u"b"; /* { dg-error "non-standard concatenation" } */ +const void *s6 = u"a" u"b"; +const void *s7 = U"a" "b"; +const void *s8 = "a" U"b"; +const void *s9 = U"a" L"b"; /* { dg-error "non-standard concatenation" } */ +const void *sa = L"a" U"b"; /* { dg-error "non-standard concatenation" } */ +const void *sb = U"a" U"b"; +const void *sc = L"a" "b"; +const void *sd = "a" L"b"; +const void *se = L"a" L"b"; + +int main () {} diff --git a/gcc/testsuite/g++.dg/ext/utf-badconcat2.C b/gcc/testsuite/g++.dg/ext/utf-badconcat2.C new file mode 100644 index 000000000..499b323fc --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf-badconcat2.C @@ -0,0 +1,15 @@ +// Test unsupported concatenation of UTF-8 string literals. +// { dg-do compile } +// { dg-options "-std=c++0x" } + +const void *s0 = u8"a" "b"; +const void *s1 = "a" u8"b"; +const void *s2 = u8"a" u8"b"; +const void *s3 = u8"a" u"b"; // { dg-error "non-standard concatenation" } +const void *s4 = u"a" u8"b"; // { dg-error "non-standard concatenation" } +const void *s5 = u8"a" U"b"; // { dg-error "non-standard concatenation" } +const void *s6 = U"a" u8"b"; // { dg-error "non-standard concatenation" } +const void *s7 = u8"a" L"b"; // { dg-error "non-standard concatenation" } +const void *s8 = L"a" u8"b"; // { dg-error "non-standard concatenation" } + +int main () {} diff --git a/gcc/testsuite/g++.dg/ext/utf-cvt.C b/gcc/testsuite/g++.dg/ext/utf-cvt.C new file mode 100644 index 000000000..286a0d007 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf-cvt.C @@ -0,0 +1,55 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Test the char16_t and char32_t promotion rules. */ +/* { dg-do compile } */ +/* { dg-options "-std=c++0x -Wall -Wconversion -Wsign-conversion -Wsign-promo" } */ + +extern void f_c (char); +extern void fsc (signed char); +extern void fuc (unsigned char); +extern void f_s (short); +extern void fss (signed short); +extern void fus (unsigned short); +extern void f_i (int); +extern void fsi (signed int); +extern void fui (unsigned int); +extern void f_l (long); +extern void fsl (signed long); +extern void ful (unsigned long); +extern void f_ll (long long); +extern void fsll (signed long long); +extern void full (unsigned long long); + +void m(char16_t c0, char32_t c1) +{ + f_c (c0); /* { dg-warning "alter its value" } */ + fsc (c0); /* { dg-warning "alter its value" } */ + fuc (c0); /* { dg-warning "alter its value" } */ + f_s (c0); /* { dg-warning "change the sign" } */ + fss (c0); /* { dg-warning "change the sign" } */ + fus (c0); + f_i (c0); + fsi (c0); + fui (c0); + f_l (c0); + fsl (c0); + ful (c0); + f_ll (c0); + fsll (c0); + full (c0); + + f_c (c1); /* { dg-warning "alter its value" } */ + fsc (c1); /* { dg-warning "alter its value" } */ + fuc (c1); /* { dg-warning "alter its value" } */ + f_s (c1); /* { dg-warning "alter its value" } */ + fss (c1); /* { dg-warning "alter its value" } */ + fus (c1); /* { dg-warning "alter its value" } */ + f_i (c1); /* { dg-warning "change the sign" } */ + fsi (c1); /* { dg-warning "change the sign" } */ + fui (c1); + f_l (c1); /* { dg-warning "change the sign" "" { target { llp64 || ilp32 } } } */ + fsl (c1); /* { dg-warning "change the sign" "" { target { llp64 || ilp32 } } } */ + ful (c1); + f_ll (c1); + fsll (c1); + full (c1); +} diff --git a/gcc/testsuite/g++.dg/ext/utf-cxx0x.C b/gcc/testsuite/g++.dg/ext/utf-cxx0x.C new file mode 100644 index 000000000..1daa0dee4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf-cxx0x.C @@ -0,0 +1,14 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Test parsing of u and U prefixes when also used as macros. */ +/* { dg-do compile } */ +/* { dg-options "-std=c++0x" } */ + +#define u L +#define U L + +const unsigned short c2 = u'a'; +const unsigned long c3 = U'a'; +const void *s0 = u"a"; +const void *s1 = U"a"; + +int main () {} diff --git a/gcc/testsuite/g++.dg/ext/utf-cxx98.C b/gcc/testsuite/g++.dg/ext/utf-cxx98.C new file mode 100644 index 000000000..a8dd13a4e --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf-cxx98.C @@ -0,0 +1,29 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Expected errors for char16_t/char32_t in c++98. */ +/* Ensure u and U prefixes are parsed as separate tokens in c++98. */ +/* { dg-do compile } */ +/* { dg-options "-std=c++98" } */ + +const static char16_t c0 = 'a'; /* { dg-error "not name a type" } */ +const static char32_t c1 = 'a'; /* { dg-error "not name a type" } */ + +const unsigned short c2 = u'a'; /* { dg-error "not declared" } */ + /* { dg-error "expected ',' or ';'" "" { target *-*-* } 10 } */ +const unsigned long c3 = U'a'; /* { dg-error "not declared" } */ + /* { dg-error "expected ',' or ';'" "" { target *-*-* } 12 } */ + +#define u 1 + +#define U 2 + + +const unsigned short c5 = u'a'; +const unsigned long c6 = U'a'; + +#undef u +#undef U +#define u "a" +#define U "b" + +const void *s0 = u"a"; +const void *s1 = U"a"; + +int main () {} diff --git a/gcc/testsuite/g++.dg/ext/utf-dflt.C b/gcc/testsuite/g++.dg/ext/utf-dflt.C new file mode 100644 index 000000000..942f2b26d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf-dflt.C @@ -0,0 +1,29 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Expected errors for char16_t/char32_t in default std. */ +/* Ensure u and U prefixes are parsed as separate tokens in default std. */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +const static char16_t c0 = 'a'; /* { dg-error "not name a type" } */ +const static char32_t c1 = 'a'; /* { dg-error "not name a type" } */ + +const unsigned short c2 = u'a'; /* { dg-error "not declared" } */ + /* { dg-error "expected ',' or ';'" "" { target *-*-* } 10 } */ +const unsigned long c3 = U'a'; /* { dg-error "not declared" } */ + /* { dg-error "expected ',' or ';'" "" { target *-*-* } 12 } */ + +#define u 1 + +#define U 2 + + +const unsigned short c4 = u'a'; +const unsigned long c5 = U'a'; + +#undef u +#undef U +#define u "a" +#define U "b" + +const void *s0 = u"a"; +const void *s1 = U"a"; + +int main () {} diff --git a/gcc/testsuite/g++.dg/ext/utf-dflt2.C b/gcc/testsuite/g++.dg/ext/utf-dflt2.C new file mode 100644 index 000000000..fd2222f67 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf-dflt2.C @@ -0,0 +1,12 @@ +// In C++0x, the u8 prefix should be parsed as separate tokens. +// { dg-do compile } +// { dg-options "-std=c++98" } + +const void *s0 = u8"a"; // { dg-error "was not declared" } + // { dg-error "expected ',' or ';'" "" { target *-*-* } 5 } + +#define u8 "a" + +const void *s1 = u8"a"; + +int main () {} diff --git a/gcc/testsuite/g++.dg/ext/utf-gnuxx0x.C b/gcc/testsuite/g++.dg/ext/utf-gnuxx0x.C new file mode 100644 index 000000000..0a6967fe4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf-gnuxx0x.C @@ -0,0 +1,14 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Test parsing of u and U prefixes when also used as macros. */ +/* { dg-do compile } */ +/* { dg-options "-std=gnu++0x" } */ + +#define u L +#define U L + +const unsigned short c2 = u'a'; +const unsigned long c3 = U'a'; +const void *s0 = u"a"; +const void *s1 = U"a"; + +int main () {} diff --git a/gcc/testsuite/g++.dg/ext/utf-gnuxx98.C b/gcc/testsuite/g++.dg/ext/utf-gnuxx98.C new file mode 100644 index 000000000..fc8068b7e --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf-gnuxx98.C @@ -0,0 +1,29 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Expected errors for char16_t/char32_t in gnu++98. */ +/* Ensure u and U prefixes are parsed as separate tokens in gnu++98. */ +/* { dg-do compile } */ +/* { dg-options "-std=gnu++98" } */ + +const static char16_t c0 = 'a'; /* { dg-error "not name a type" } */ +const static char32_t c1 = 'a'; /* { dg-error "not name a type" } */ + +const unsigned short c2 = u'a'; /* { dg-error "not declared" } */ + /* { dg-error "expected ',' or ';'" "" { target *-*-* } 10 } */ +const unsigned long c3 = U'a'; /* { dg-error "not declared" } */ + /* { dg-error "expected ',' or ';'" "" { target *-*-* } 12 } */ + +#define u 1 + +#define U 2 + + +const unsigned short c5 = u'a'; +const unsigned long c6 = U'a'; + +#undef u +#undef U +#define u "a" +#define U "b" + +const void *s0 = u"a"; +const void *s1 = U"a"; + +int main () {} diff --git a/gcc/testsuite/g++.dg/ext/utf-mangle.C b/gcc/testsuite/g++.dg/ext/utf-mangle.C new file mode 100644 index 000000000..a13188788 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf-mangle.C @@ -0,0 +1,14 @@ +// Contributed by Kris Van Hees <kris.van.hees@oracle.com> +// Test the support for char16_t character constants. +// { dg-do compile } +// { dg-options "-std=c++0x" } + +void f0 (char16_t c) {} +void f1 (char32_t c) {} +void f2 (char16_t *s) {} +void f3 (char32_t *s) {} + +// { dg-final { scan-assembler "_Z2f0Ds:" } } +// { dg-final { scan-assembler "_Z2f1Di:" } } +// { dg-final { scan-assembler "_Z2f2PDs:" } } +// { dg-final { scan-assembler "_Z2f3PDi:" } } diff --git a/gcc/testsuite/g++.dg/ext/utf-rtti.C b/gcc/testsuite/g++.dg/ext/utf-rtti.C new file mode 100644 index 000000000..b5d201b4d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf-rtti.C @@ -0,0 +1,12 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Ensure that typeinfo data is generated for char16_t/char32_t. */ +/* { dg-do link } */ +/* { dg-options "-std=c++0x" } */ + +#include <typeinfo> + +int main(void) +{ + typeid(char16_t).name(); + typeid(char32_t).name(); +} diff --git a/gcc/testsuite/g++.dg/ext/utf-type.C b/gcc/testsuite/g++.dg/ext/utf-type.C new file mode 100644 index 000000000..41a83ff2e --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf-type.C @@ -0,0 +1,15 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Ensure that __CHAR16_TYPE__ and __CHAR32_TYPE__ exist, match the types they + are the underlying data type for. */ +/* { dg-do run } */ +/* { dg-options "-std=c++0x -Wall -Werror" } */ + +extern "C" void abort (void); + +int main () +{ + if (sizeof (__CHAR16_TYPE__) != sizeof (char16_t)) + abort(); + if (sizeof (__CHAR32_TYPE__) != sizeof (char32_t)) + abort(); +} diff --git a/gcc/testsuite/g++.dg/ext/utf-typedef-cxx0x.C b/gcc/testsuite/g++.dg/ext/utf-typedef-cxx0x.C new file mode 100644 index 000000000..641e836e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf-typedef-cxx0x.C @@ -0,0 +1,7 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Ensure that a typedef to char16_t/char32_t issues an error in c++0x. */ +/* { dg-do compile } */ +/* { dg-options "-std=c++0x" } */ + +typedef short unsigned int char16_t; /* { dg-error "redeclaration" } */ +typedef unsigned int char32_t; /* { dg-error "redeclaration" } */ diff --git a/gcc/testsuite/g++.dg/ext/utf-typedef-cxx98.C b/gcc/testsuite/g++.dg/ext/utf-typedef-cxx98.C new file mode 100644 index 000000000..8922856c2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf-typedef-cxx98.C @@ -0,0 +1,7 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Ensure that a typedef to char16_t/char32_t is fine in c++98. */ +/* { dg-do compile } */ +/* { dg-options "-std=c++98" } */ + +typedef short unsigned int char16_t; +typedef unsigned int char32_t; diff --git a/gcc/testsuite/g++.dg/ext/utf-typespec.C b/gcc/testsuite/g++.dg/ext/utf-typespec.C new file mode 100644 index 000000000..6a4af2559 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf-typespec.C @@ -0,0 +1,25 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Ensure that type specifiers are not allowed for char16_t/char32_t. */ +/* { dg-do compile } */ +/* { dg-options "-std=c++0x" } */ + +signed char16_t c0; /* { dg-error "signed" } */ +signed char32_t c1; /* { dg-error "signed" } */ +unsigned char16_t c2; /* { dg-error "unsigned" } */ +unsigned char32_t c3; /* { dg-error "unsigned" } */ + +short char16_t c4; /* { dg-error "short" } */ +long char16_t c5; /* { dg-error "long" } */ +short char32_t c6; /* { dg-error "short" } */ +long char32_t c7; /* { dg-error "long" } */ + +signed short char16_t c8; /* { dg-error "signed" } */ +signed short char32_t c9; /* { dg-error "signed" } */ +signed long char16_t ca; /* { dg-error "signed" } */ +signed long char32_t cb; /* { dg-error "signed" } */ +unsigned short char16_t cc; /* { dg-error "unsigned" } */ +unsigned short char32_t cd; /* { dg-error "unsigned" } */ +unsigned long char16_t ce; /* { dg-error "unsigned" } */ +unsigned long char32_t cf; /* { dg-error "unsigned" } */ + +int main () {} diff --git a/gcc/testsuite/g++.dg/ext/utf16-1.C b/gcc/testsuite/g++.dg/ext/utf16-1.C new file mode 100644 index 000000000..fa07de912 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf16-1.C @@ -0,0 +1,65 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Test the support for char16_t character constants. */ +/* { dg-do run } */ +/* { dg-options "-std=c++0x -Wall -Werror" } */ + +extern "C" void abort (void); + +const static char16_t c0 = u'a'; +const static char16_t c1 = u'\0'; +const static char16_t c2 = u'\u0024'; +const static char16_t c3 = u'\u2029'; +const static char16_t c4 = u'\u8010'; + +const static char16_t c5 = 'a'; +const static char16_t c6 = U'a'; +const static char16_t c7 = U'\u2029'; +const static char16_t c8 = U'\u8010'; +const static char16_t c9 = L'a'; +const static char16_t ca = L'\u2029'; +const static char16_t cb = L'\u8010'; + +#define A 0x0061 +#define D 0x0024 +#define X 0x2029 +#define Y 0x8010 + +int main () +{ + if (sizeof (u'a') != sizeof (char16_t)) + abort (); + if (sizeof (u'\0') != sizeof (char16_t)) + abort (); + if (sizeof (u'\u0024') != sizeof (char16_t)) + abort (); + if (sizeof (u'\u2029') != sizeof (char16_t)) + abort (); + if (sizeof (u'\u8010') != sizeof (char16_t)) + abort (); + + if (c0 != A) + abort (); + if (c1 != 0x0000) + abort (); + if (c2 != D) + abort (); + if (c3 != X) + abort (); + if (c4 != Y) + abort (); + + if (c5 != A) + abort (); + if (c6 != A) + abort (); + if (c7 != X) + abort (); + if (c8 != Y) + abort (); + if (c9 != A) + abort (); + if (ca != X) + abort (); + if (cb != Y) + abort (); +} diff --git a/gcc/testsuite/g++.dg/ext/utf16-2.C b/gcc/testsuite/g++.dg/ext/utf16-2.C new file mode 100644 index 000000000..d7a6056f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf16-2.C @@ -0,0 +1,30 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Test the support for char16_t* string literals. */ +/* { dg-do run } */ +/* { dg-options "-std=c++0x -Wall -Werror" } */ + +extern "C" void abort (void); + +const static char16_t *s0 = u"ab"; +const static char16_t *s1 = u"a\u0024"; +const static char16_t *s2 = u"a\u2029"; +const static char16_t *s3 = u"a\U00064321"; + +#define A 0x0061 +#define B 0x0062 +#define D 0x0024 +#define X 0x2029 +#define Y1 0xD950 +#define Y2 0xDF21 + +int main () +{ + if (s0[0] != A || s0[1] != B || s0[2] != 0x0000) + abort (); + if (s1[0] != A || s1[1] != D || s0[2] != 0x0000) + abort (); + if (s2[0] != A || s2[1] != X || s0[2] != 0x0000) + abort (); + if (s3[0] != A || s3[1] != Y1 || s3[2] != Y2 || s3[3] != 0x0000) + abort (); +} diff --git a/gcc/testsuite/g++.dg/ext/utf16-3.C b/gcc/testsuite/g++.dg/ext/utf16-3.C new file mode 100644 index 000000000..183347b6e --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf16-3.C @@ -0,0 +1,47 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Test concatenation of char16_t* string literals. */ +/* { dg-do run } */ +/* { dg-options "-std=c++0x -Wall -Werror" } */ + +extern "C" void abort (void); + +const static char16_t *s0 = u"a" u"b"; + +const static char16_t *s1 = u"a" "b"; +const static char16_t *s2 = "a" u"b"; +const static char16_t *s3 = u"a" "\u2029"; +const static char16_t *s4 = "\u2029" u"b"; +const static char16_t *s5 = u"a" "\U00064321"; +const static char16_t *s6 = "\U00064321" u"b"; + +#define A 0x0061 +#define B 0x0062 +#define X 0x2029 +#define Y1 0xD950 +#define Y2 0xDF21 + +int main () +{ + if (sizeof ((u"a" u"b")[0]) != sizeof (char16_t)) + abort (); + if (sizeof ((u"a" "b")[0]) != sizeof (char16_t)) + abort (); + if (sizeof (( "a" u"b")[0]) != sizeof (char16_t)) + abort (); + + if (s0[0] != A || s0[1] != B || s0[2] != 0x0000) + abort (); + + if (s1[0] != A || s1[1] != B || s1[2] != 0x0000) + abort (); + if (s2[0] != A || s2[1] != B || s2[2] != 0x0000) + abort (); + if (s3[0] != A || s3[1] != X || s3[2] != 0x0000) + abort (); + if (s4[0] != X || s4[1] != B || s4[2] != 0x0000) + abort (); + if (s5[0] != A || s5[1] != Y1 || s5[2] != Y2 || s5[3] != 0x0000) + abort (); + if (s6[0] != Y1 || s6[1] != Y2 || s6[2] != B || s6[3] != 0x0000) + abort (); +} diff --git a/gcc/testsuite/g++.dg/ext/utf16-4.C b/gcc/testsuite/g++.dg/ext/utf16-4.C new file mode 100644 index 000000000..21cdb53bd --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf16-4.C @@ -0,0 +1,18 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Expected errors for char16_t character constants. */ +/* { dg-do compile } */ +/* { dg-options "-std=c++0x" } */ + +const static char16_t c0 = u''; /* { dg-error "empty character" } */ +const static char16_t c1 = u'ab'; /* { dg-warning "constant too long" } */ +const static char16_t c2 = u'\U00064321'; /* { dg-warning "constant too long" } */ + +const static char16_t c3 = 'a'; +const static char16_t c4 = U'a'; +const static char16_t c5 = U'\u2029'; +const static char16_t c6 = U'\U00064321'; /* { dg-warning "implicitly truncated" } */ +const static char16_t c7 = L'a'; +const static char16_t c8 = L'\u2029'; +const static char16_t c9 = L'\U00064321'; /* { dg-warning "implicitly truncated" "" { target { 4byte_wchar_t } } 16 } */ + /* { dg-warning "constant too long" "" { target { ! 4byte_wchar_t } } 16 } */ +int main () {} diff --git a/gcc/testsuite/g++.dg/ext/utf32-1.C b/gcc/testsuite/g++.dg/ext/utf32-1.C new file mode 100644 index 000000000..98465a0a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf32-1.C @@ -0,0 +1,42 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Test the support for char32_t character constants. */ +/* { dg-do run } */ +/* { dg-options "-std=c++0x -Wall -Werror" } */ + +extern "C" void abort (void); + +const static char32_t c0 = U'a'; +const static char32_t c1 = U'\0'; +const static char32_t c2 = U'\u0024'; +const static char32_t c3 = U'\u2029'; +const static char32_t c4 = U'\U00064321'; + +#define A 0x00000061 +#define D 0x00000024 +#define X 0x00002029 +#define Y 0x00064321 + +int main () +{ + if (sizeof (U'a') != sizeof (char32_t)) + abort (); + if (sizeof (U'\0') != sizeof (char32_t)) + abort (); + if (sizeof (U'\u0024') != sizeof (char32_t)) + abort (); + if (sizeof (U'\u2029') != sizeof (char32_t)) + abort (); + if (sizeof (U'\U00064321') != sizeof (char32_t)) + abort (); + + if (c0 != A) + abort (); + if (c1 != 0x0000) + abort (); + if (c2 != D) + abort (); + if (c3 != X) + abort (); + if (c4 != Y) + abort (); +} diff --git a/gcc/testsuite/g++.dg/ext/utf32-2.C b/gcc/testsuite/g++.dg/ext/utf32-2.C new file mode 100644 index 000000000..e2256ba74 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf32-2.C @@ -0,0 +1,29 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Test the support for char32_t* string constants. */ +/* { dg-do run } */ +/* { dg-options "-std=c++0x -Wall -Werror" } */ + +extern "C" void abort (void); + +const static char32_t *s0 = U"ab"; +const static char32_t *s1 = U"a\u0024"; +const static char32_t *s2 = U"a\u2029"; +const static char32_t *s3 = U"a\U00064321"; + +#define A 0x00000061 +#define B 0x00000062 +#define D 0x00000024 +#define X 0x00002029 +#define Y 0x00064321 + +int main () +{ + if (s0[0] != A || s0[1] != B || s0[2] != 0x00000000) + abort (); + if (s1[0] != A || s1[1] != D || s0[2] != 0x00000000) + abort (); + if (s2[0] != A || s2[1] != X || s0[2] != 0x00000000) + abort (); + if (s3[0] != A || s3[1] != Y || s3[2] != 0x00000000) + abort (); +} diff --git a/gcc/testsuite/g++.dg/ext/utf32-3.C b/gcc/testsuite/g++.dg/ext/utf32-3.C new file mode 100644 index 000000000..bba893cef --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf32-3.C @@ -0,0 +1,46 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Test concatenation of char32_t* string literals. */ +/* { dg-do run } */ +/* { dg-options "-std=c++0x -Wall -Werror" } */ + +extern "C" void abort (void); + +const static char32_t *s0 = U"a" U"b"; + +const static char32_t *s1 = U"a" "b"; +const static char32_t *s2 = "a" U"b"; +const static char32_t *s3 = U"a" "\u2029"; +const static char32_t *s4 = "\u2029" U"b"; +const static char32_t *s5 = U"a" "\U00064321"; +const static char32_t *s6 = "\U00064321" U"b"; + +#define A 0x00000061 +#define B 0x00000062 +#define X 0x00002029 +#define Y 0x00064321 + +int main () +{ + if (sizeof ((U"a" U"b")[0]) != sizeof (char32_t)) + abort (); + if (sizeof ((U"a" "b")[0]) != sizeof (char32_t)) + abort (); + if (sizeof (( "a" U"b")[0]) != sizeof (char32_t)) + abort (); + + if (s0[0] != A || s0[1] != B || s0[2] != 0x00000000) + abort (); + + if (s1[0] != A || s1[1] != B || s1[2] != 0x00000000) + abort (); + if (s2[0] != A || s2[1] != B || s2[2] != 0x00000000) + abort (); + if (s3[0] != A || s3[1] != X || s3[2] != 0x00000000) + abort (); + if (s4[0] != X || s4[1] != B || s4[2] != 0x00000000) + abort (); + if (s5[0] != A || s5[1] != Y || s5[2] != 0x00000000) + abort (); + if (s6[0] != Y || s6[1] != B || s6[2] != 0x00000000) + abort (); +} diff --git a/gcc/testsuite/g++.dg/ext/utf32-4.C b/gcc/testsuite/g++.dg/ext/utf32-4.C new file mode 100644 index 000000000..744fea7c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf32-4.C @@ -0,0 +1,18 @@ +/* Contributed by Kris Van Hees <kris.van.hees@oracle.com> */ +/* Expected errors for char32_t character constants. */ +/* { dg-do compile } */ +/* { dg-options "-std=c++0x" } */ + +const static char32_t c0 = U''; /* { dg-error "empty character" } */ +const static char32_t c1 = U'ab'; /* { dg-warning "constant too long" } */ +const static char32_t c2 = U'\U00064321'; + +const static char32_t c3 = 'a'; +const static char32_t c4 = u'a'; +const static char32_t c5 = u'\u2029'; +const static char32_t c6 = u'\U00064321'; /* { dg-warning "constant too long" } */ +const static char32_t c7 = L'a'; +const static char32_t c8 = L'\u2029'; +const static char32_t c9 = L'\U00064321'; /* { dg-warning "constant too long" "" { target { ! 4byte_wchar_t } } } */ + +int main () {} diff --git a/gcc/testsuite/g++.dg/ext/utf8-1.C b/gcc/testsuite/g++.dg/ext/utf8-1.C new file mode 100644 index 000000000..203b326af --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf8-1.C @@ -0,0 +1,45 @@ +// { dg-do run } +// { dg-require-iconv "ISO-8859-2" } +// { dg-options "-std=c++0x -fexec-charset=ISO-8859-2" } + +const char *str1 = "h\u00e1\U0000010Dky "; +const char *str2 = "\u010d\u00E1rky\n"; +const char *str3 = u8"h\u00e1\U0000010Dky "; +const char *str4 = u8"\u010d\u00E1rky\n"; +const char *str5 = "h\u00e1\U0000010Dky " "\u010d\u00E1rky\n"; +const char *str6 = u8"h\u00e1\U0000010Dky " "\u010d\u00E1rky\n"; +const char *str7 = "h\u00e1\U0000010Dky " u8"\u010d\u00E1rky\n"; +#define u8 +const char *str8 = u8"h\u00e1\U0000010Dky " u8"\u010d\u00E1rky\n"; + +const char latin2_1[] = "\x68\xe1\xe8\x6b\x79\x20"; +const char latin2_2[] = "\xe8\xe1\x72\x6b\x79\n"; +const char utf8_1[] = "\x68\xc3\xa1\xc4\x8d\x6b\x79\x20"; +const char utf8_2[] = "\xc4\x8d\xc3\xa1\x72\x6b\x79\n"; + +int +main (void) +{ + if (__builtin_strcmp (str1, latin2_1) != 0 + || __builtin_strcmp (str2, latin2_2) != 0 + || __builtin_strcmp (str3, utf8_1) != 0 + || __builtin_strcmp (str4, utf8_2) != 0 + || __builtin_strncmp (str5, latin2_1, sizeof (latin2_1) - 1) != 0 + || __builtin_strcmp (str5 + sizeof (latin2_1) - 1, latin2_2) != 0 + || __builtin_strncmp (str6, utf8_1, sizeof (utf8_1) - 1) != 0 + || __builtin_strcmp (str6 + sizeof (utf8_1) - 1, utf8_2) != 0 + || __builtin_strncmp (str7, utf8_1, sizeof (utf8_1) - 1) != 0 + || __builtin_strcmp (str7 + sizeof (utf8_1) - 1, utf8_2) != 0 + || __builtin_strncmp (str8, utf8_1, sizeof (utf8_1) - 1) != 0 + || __builtin_strcmp (str8 + sizeof (utf8_1) - 1, utf8_2) != 0) + __builtin_abort (); + if (sizeof ("a" u8"b"[0]) != 1 + || sizeof (u8"a" "b"[0]) != 1 + || sizeof (u8"a" u8"b"[0]) != 1 + || sizeof ("a" "\u010d") != 3 + || sizeof ("a" u8"\u010d") != 4 + || sizeof (u8"a" "\u010d") != 4 + || sizeof (u8"a" "\u010d") != 4) + __builtin_abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/utf8-2.C b/gcc/testsuite/g++.dg/ext/utf8-2.C new file mode 100644 index 000000000..417a8bfdc --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/utf8-2.C @@ -0,0 +1,21 @@ +// { dg-do compile } +// { dg-options "-std=c++0x" } + +const char s0[] = u8"ab"; +const char16_t s1[] = u8"ab"; // { dg-error "from non-wide" } +const char32_t s2[] = u8"ab"; // { dg-error "from non-wide" } +const wchar_t s3[] = u8"ab"; // { dg-error "from non-wide" } + +const char t0[0] = u8"ab"; // { dg-error "chars is too long" } +const char t1[1] = u8"ab"; // { dg-error "chars is too long" } +const char t2[2] = u8"ab"; // { dg-error "chars is too long" } +const char t3[3] = u8"ab"; +const char t4[4] = u8"ab"; + +const char u0[0] = u8"\u2160."; // { dg-error "chars is too long" } +const char u1[1] = u8"\u2160."; // { dg-error "chars is too long" } +const char u2[2] = u8"\u2160."; // { dg-error "chars is too long" } +const char u3[3] = u8"\u2160."; // { dg-error "chars is too long" } +const char u4[4] = u8"\u2160."; // { dg-error "chars is too long" } +const char u5[5] = u8"\u2160."; +const char u6[6] = u8"\u2160."; diff --git a/gcc/testsuite/g++.dg/ext/va-arg-pack-1.C b/gcc/testsuite/g++.dg/ext/va-arg-pack-1.C new file mode 100644 index 000000000..b81d0e58d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/va-arg-pack-1.C @@ -0,0 +1,145 @@ +// __builtin_va_arg_pack () builtin tests. +// { dg-do run } +// { dg-options "-O2" } + +#include <stdarg.h> + +extern "C" void abort (void); + +int v1 = 8; +long int v2 = 3; +void *v3 = (void *) &v2; +struct A { char c[16]; } v4 = { "foo" }; +long double v5 = 40; +char seen[20]; +int cnt; + +__attribute__ ((noinline)) int +foo1 (int x, int y, ...) +{ + int i; + long int l; + void *v; + struct A a; + long double ld; + va_list ap; + + va_start (ap, y); + if (x < 0 || x >= 20 || seen[x]) + abort (); + seen[x] = ++cnt; + if (y != 6) + abort (); + i = va_arg (ap, int); + if (i != 5) + abort (); + switch (x) + { + case 0: + i = va_arg (ap, int); + if (i != 9 || v1 != 9) + abort (); + a = va_arg (ap, struct A); + if (__builtin_memcmp (a.c, v4.c, sizeof (a.c)) != 0) + abort (); + v = (void *) va_arg (ap, struct A *); + if (v != (void *) &v4) + abort (); + l = va_arg (ap, long int); + if (l != 3 || v2 != 4) + abort (); + break; + case 1: + ld = va_arg (ap, long double); + if (ld != 41 || v5 != ld) + abort (); + i = va_arg (ap, int); + if (i != 8) + abort (); + v = va_arg (ap, void *); + if (v != &v2) + abort (); + break; + case 2: + break; + default: + abort (); + } + va_end (ap); + return x; +} + +__attribute__ ((noinline)) int +foo2 (int x, int y, ...) +{ + long long int ll; + void *v; + struct A a, b; + long double ld; + va_list ap; + + va_start (ap, y); + if (x < 0 || x >= 20 || seen[x]) + abort (); + seen[x] = ++cnt | 64; + if (y != 10) + abort (); + switch (x) + { + case 11: + break; + case 12: + ld = va_arg (ap, long double); + if (ld != 41 || v5 != 40) + abort (); + a = va_arg (ap, struct A); + if (__builtin_memcmp (a.c, v4.c, sizeof (a.c)) != 0) + abort (); + b = va_arg (ap, struct A); + if (__builtin_memcmp (b.c, v4.c, sizeof (b.c)) != 0) + abort (); + v = va_arg (ap, void *); + if (v != &v2) + abort (); + ll = va_arg (ap, long long int); + if (ll != 16LL) + abort (); + break; + case 2: + break; + default: + abort (); + } + va_end (ap); + return x + 8; +} + +__attribute__ ((noinline)) int +foo3 (void) +{ + return 6; +} + +extern inline __attribute__ ((always_inline, gnu_inline)) int +bar (int x, ...) +{ + if (x < 10) + return foo1 (x, foo3 (), 5, __builtin_va_arg_pack ()); + return foo2 (x, foo3 () + 4, __builtin_va_arg_pack ()); +} + +int +main (void) +{ + if (bar (0, ++v1, v4, &v4, v2++) != 0) + abort (); + if (bar (1, ++v5, 8, v3) != 1) + abort (); + if (bar (2) != 2) + abort (); + if (bar (v1 + 2) != 19) + abort (); + if (bar (v1 + 3, v5--, v4, v4, v3, 16LL) != 20) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/va-arg-pack-2.C b/gcc/testsuite/g++.dg/ext/va-arg-pack-2.C new file mode 100644 index 000000000..c5d3e2ac5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/va-arg-pack-2.C @@ -0,0 +1,46 @@ +// { dg-do compile } +// { dg-options "-O2" } + +int bar (int, const char *, int, ...); +int baz (int, const char *, long int); + +extern inline __attribute__((always_inline)) int +f2 (int y, ...) +{ + return bar (y, "", __builtin_va_arg_pack ()); /* { dg-error "invalid use of" } */ +} + +extern inline __attribute__((always_inline)) int +f3 (int y, ...) +{ + return bar (y, "", 5, __builtin_va_arg_pack ()); +} + +extern inline __attribute__((always_inline)) int +f4 (int y, ...) +{ + return bar (y, "", 4, __builtin_va_arg_pack (), 6); /* { dg-error "invalid use of" } */ +} + +extern inline __attribute__((always_inline)) int +f5 (int y, ...) +{ + return baz (y, "", __builtin_va_arg_pack ()); /* { dg-error "invalid use of" } */ +} + +extern inline __attribute__((always_inline)) int +f6 (int y, ...) +{ + return __builtin_va_arg_pack (); /* { dg-error "invalid use of" } */ +} + +int +test (void) +{ + int a = f2 (5, "a", 6); + a += f3 (6, "ab", 17LL); + a += f4 (7, 1, 2, 3); + a += f5 (8, 7L); + a += f6 (9); + return a; +} diff --git a/gcc/testsuite/g++.dg/ext/va-arg-pack-len-1.C b/gcc/testsuite/g++.dg/ext/va-arg-pack-len-1.C new file mode 100644 index 000000000..d3c84091b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/va-arg-pack-len-1.C @@ -0,0 +1,122 @@ +// { dg-do run } +// { dg-options "-O2" } + +#include <stdarg.h> + +extern "C" int error_open_missing_mode (void) + __attribute__((__error__ ("open with O_CREAT needs 3 arguments, only 2 were given"))); +extern "C" int warn_open_too_many_arguments (void) + __attribute__((__warning__ ("open called with more than 3 arguments"))); +extern "C" void abort (void); + +char expected_char; + +__attribute__((noinline)) int +myopen2 (const char *path, int oflag) +{ + if (expected_char++ != path[0] || path[1] != '\0') + abort (); + switch (path[0]) + { + case 'f': + if (oflag != 0x2) + abort (); + break; + case 'g': + if (oflag != 0x43) + abort (); + // In real __open_2 this would terminate the program: + // open with O_CREAT without third argument. + return -6; + default: + abort (); + } + return 0; +} + +__attribute__((noinline)) int +myopenva (const char *path, int oflag, ...) +{ + int mode = 0; + va_list ap; + if ((oflag & 0x40) != 0) + { + va_start (ap, oflag); + mode = va_arg (ap, int); + va_end (ap); + } + if (expected_char++ != path[0] || path[1] != '\0') + abort (); + switch (path[0]) + { + case 'a': + if (oflag != 0x43 || mode != 0644) + abort (); + break; + case 'b': + if (oflag != 0x3) + abort (); + break; + case 'c': + if (oflag != 0x2) + abort (); + break; + case 'd': + if (oflag != 0x43 || mode != 0600) + abort (); + break; + case 'e': + if (oflag != 0x3) + abort (); + break; + default: + abort (); + } + return 0; +} + +extern inline __attribute__((always_inline, gnu_inline)) int +myopen (const char *path, int oflag, ...) +{ + if (__builtin_va_arg_pack_len () > 1) + warn_open_too_many_arguments (); + + if (__builtin_constant_p (oflag)) + { + if ((oflag & 0x40) != 0 && __builtin_va_arg_pack_len () < 1) + { + error_open_missing_mode (); + return myopen2 (path, oflag); + } + return myopenva (path, oflag, __builtin_va_arg_pack ()); + } + + if (__builtin_va_arg_pack_len () < 1) + return myopen2 (path, oflag); + + return myopenva (path, oflag, __builtin_va_arg_pack ()); +} + +volatile int l0; + +int +main (void) +{ + expected_char = 'a'; + if (myopen ("a", 0x43, 0644)) + abort (); + if (myopen ("b", 0x3, 0755)) + abort (); + if (myopen ("c", 0x2)) + abort (); + if (myopen ("d", l0 + 0x43, 0600)) + abort (); + if (myopen ("e", l0 + 0x3, 0700)) + abort (); + if (myopen ("f", l0 + 0x2)) + abort (); + // Invalid use of myopen, but only detectable at runtime. + if (myopen ("g", l0 + 0x43) != -6) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/va-arg-pack-len-2.C b/gcc/testsuite/g++.dg/ext/va-arg-pack-len-2.C new file mode 100644 index 000000000..0d369bdc9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/va-arg-pack-len-2.C @@ -0,0 +1,42 @@ +// { dg-do compile } +// { dg-options "-O2" } + +#include <stdarg.h> + +extern int error_open_missing_mode (void) + __attribute__((__error__ ("open with O_CREAT needs 3 arguments, only 2 were given"))); +extern int warn_open_too_many_arguments (void) + __attribute__((__warning__ ("open called with more than 3 arguments"))); + +extern int myopen2 (const char *path, int oflag); +extern int myopenva (const char *path, int oflag, ...); + +extern inline __attribute__((always_inline, gnu_inline)) int +myopen (const char *path, int oflag, ...) +{ + if (__builtin_va_arg_pack_len () > 1) + warn_open_too_many_arguments (); // { dg-warning "called with more than 3" } + + if (__builtin_constant_p (oflag)) + { + if ((oflag & 0x40) != 0 && __builtin_va_arg_pack_len () < 1) + { + error_open_missing_mode (); // { dg-error "needs 3 arguments, only 2 were given" } + return myopen2 (path, oflag); + } + return myopenva (path, oflag, __builtin_va_arg_pack ()); + } + + if (__builtin_va_arg_pack_len () < 1) + return myopen2 (path, oflag); + + return myopenva (path, oflag, __builtin_va_arg_pack ()); +} + +int +main (void) +{ + myopen ("h", 0x43); + myopen ("i", 0x43, 0644, 0655); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/va-arg1.C b/gcc/testsuite/g++.dg/ext/va-arg1.C new file mode 100644 index 000000000..079db2e5c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/va-arg1.C @@ -0,0 +1,8 @@ +// PR c++/33462 + +struct A {}; + +void foo() +{ + ++__builtin_va_arg(0, A); // { dg-error "'\\+\\+va_arg\\(0, A\\)'" } +} diff --git a/gcc/testsuite/g++.dg/ext/vector1.C b/gcc/testsuite/g++.dg/ext/vector1.C new file mode 100644 index 000000000..c6f0e0409 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector1.C @@ -0,0 +1,5 @@ +// PR c++/11895 +// This used to ICE in reshape_init. +// testcase from fnf@ninemoons.com + + __attribute__((vector_size(16))) int a1 = { 100, 200, 300, 400 }; diff --git a/gcc/testsuite/g++.dg/ext/vector10.C b/gcc/testsuite/g++.dg/ext/vector10.C new file mode 100644 index 000000000..46ea244c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector10.C @@ -0,0 +1,11 @@ +// PR c++/34914 +// { dg-do compile } + +struct A { int __attribute ((vector_size (8))) x; }; + +void +foo () +{ + __attribute ((vector_size (8))) int A::*p; + p == 0; +} diff --git a/gcc/testsuite/g++.dg/ext/vector11.C b/gcc/testsuite/g++.dg/ext/vector11.C new file mode 100644 index 000000000..a3213522b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector11.C @@ -0,0 +1,6 @@ +// PR c++/34913 + +template<typename T> struct A +{ + int x[sizeof(T)] __attribute((vector_size(8))); +}; diff --git a/gcc/testsuite/g++.dg/ext/vector12.C b/gcc/testsuite/g++.dg/ext/vector12.C new file mode 100644 index 000000000..e0b6d2ba6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector12.C @@ -0,0 +1,4 @@ +// PR c++/34917 +// { dg-do compile } + +const int i __attribute ((vector_size (8))) = {}; diff --git a/gcc/testsuite/g++.dg/ext/vector13.C b/gcc/testsuite/g++.dg/ext/vector13.C new file mode 100644 index 000000000..5160f1121 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector13.C @@ -0,0 +1,6 @@ +// PR c++/35096 +// { dg-do compile } + +typedef const int X __attribute((vector_size(8))); +extern const int x[] __attribute((vector_size(8))); +X x[] = { 5 }; diff --git a/gcc/testsuite/g++.dg/ext/vector14.C b/gcc/testsuite/g++.dg/ext/vector14.C new file mode 100644 index 000000000..8e792108f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector14.C @@ -0,0 +1,22 @@ +// PR c++/35758 +// { dg-do compile } +// { dg-options "-msse" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } +// { dg-require-effective-target sse } +// Ignore warning on some powerpc-linux configurations. +// { dg-prune-output "non-standard ABI extension" } +// { dg-prune-output "mangled name" } + +#define vector __attribute__((vector_size(16))) + +template<int N> vector signed int foo (vector float value) {} + +template<int> void foo (float) {} + +int +main () +{ + vector float v; + float f; + foo<1> (v); + foo<1> (f); +} diff --git a/gcc/testsuite/g++.dg/ext/vector15.C b/gcc/testsuite/g++.dg/ext/vector15.C new file mode 100644 index 000000000..7058bf1b8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector15.C @@ -0,0 +1,5 @@ +/* { dg-do compile } */ + +/* Check that we error out when using vector_size on the bool type. */ + +__attribute__((vector_size(16) )) bool a; /* { dg-error "" } */ diff --git a/gcc/testsuite/g++.dg/ext/vector16.C b/gcc/testsuite/g++.dg/ext/vector16.C new file mode 100644 index 000000000..7964a881f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector16.C @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +#define vector __attribute__((vector_size(4*sizeof(int)) )) + +vector int a, b, c; + + +/* Test that remainder works for vectors. */ +void f(void) +{ + a = b % c; +} diff --git a/gcc/testsuite/g++.dg/ext/vector2.C b/gcc/testsuite/g++.dg/ext/vector2.C new file mode 100644 index 000000000..c1737dbb4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector2.C @@ -0,0 +1,12 @@ +// PR c++/23337; caused an ICE in component_ref_field_offset +// { dg-options "" } +// { dg-options "-mmmx" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ +// { dg-prune-output "mangled name" } +typedef int vec __attribute__ ((vector_size (8))); +extern int bar (vec); +int +foo (int i) +{ + vec a[] = { (vec) { 0, i }, (vec) { 4, 5 } }; + return bar (a[0]) + bar (a[1]); +} diff --git a/gcc/testsuite/g++.dg/ext/vector3.C b/gcc/testsuite/g++.dg/ext/vector3.C new file mode 100644 index 000000000..1a67cf76a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector3.C @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "" } */ + +// PR c++/28302 + +int __attribute__((vector_size(8))) x; + +void foo() +{ + ~x; +} + diff --git a/gcc/testsuite/g++.dg/ext/vector4.C b/gcc/testsuite/g++.dg/ext/vector4.C new file mode 100644 index 000000000..e14578489 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector4.C @@ -0,0 +1,6 @@ +/* { dg-options "" } */ +/* { dg-do compile } */ +// Testing if we can do a new of a vector +// PR C++/28450 + +void* q = new int __attribute__((vector_size(8))) (); diff --git a/gcc/testsuite/g++.dg/ext/vector5.C b/gcc/testsuite/g++.dg/ext/vector5.C new file mode 100644 index 000000000..e5304bcb1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector5.C @@ -0,0 +1,8 @@ +// PR c++/30022 +// { dg-do compile } + +void foo() +{ + int __attribute__((vector_size(8))) v; + v = 1/v; // { dg-error "invalid operands of types" } +} diff --git a/gcc/testsuite/g++.dg/ext/vector6.C b/gcc/testsuite/g++.dg/ext/vector6.C new file mode 100644 index 000000000..9caf8c2f6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector6.C @@ -0,0 +1,12 @@ +// { dg-options "" } +// { dg-do compile } +// C++/30016, we were allowing conversion between vector types +// and union types which is invalid. + +typedef float __v_4F __attribute__ ((vector_size (16))); +typedef union {__v_4F v; float a[4];} __v4F; +void f(void) +{ + __v_4F b; + (reinterpret_cast<__v4F>(b).a)[1] = 1; // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/ext/vector7.C b/gcc/testsuite/g++.dg/ext/vector7.C new file mode 100644 index 000000000..cd259b1a2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector7.C @@ -0,0 +1,8 @@ +// { dg-options "" } +// { dg-do compile } +// PR C++/31721 and PR 14217 +// the attribute vector_size would change a reference type into a pointer type which was wrong. + +#define vector __attribute__((__vector_size__(16) )) +vector int b; +vector int &a = b; diff --git a/gcc/testsuite/g++.dg/ext/vector8.C b/gcc/testsuite/g++.dg/ext/vector8.C new file mode 100644 index 000000000..5f9f9561d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector8.C @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "" } */ + +/* Check for application of |, ^, and & on vector types. */ +#define vector __attribute__((vector_size(16) )) + +vector float a; +vector int a1; +vector float b; +vector int b1; + +int f(void) +{ + a = a | b; /* { dg-error "" } */ + a = a & b; /* { dg-error "" } */ + a = a ^ b; /* { dg-error "" } */ + a1 = a1 | b1; + a1 = a1 & b1; + a1 = a1 ^ b1; +} + diff --git a/gcc/testsuite/g++.dg/ext/vector9.C b/gcc/testsuite/g++.dg/ext/vector9.C new file mode 100644 index 000000000..52b3f1714 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector9.C @@ -0,0 +1,10 @@ +// PR c++/34891 + +typedef float v4f __attribute__((vector_size(8))); +typedef int v4i __attribute__((vector_size(8))); + +void foo() +{ + v4f v; + !(v4i)v; // { dg-error "v4i|argument" } +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/anon1.C b/gcc/testsuite/g++.dg/ext/visibility/anon1.C new file mode 100644 index 000000000..16647b228 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/anon1.C @@ -0,0 +1,10 @@ +// PR c++/21581 +// Test for anonymous namespace internal linkage + +// { dg-do compile } +// { dg-final { scan-assembler-not "globl.*_ZN.*1fEv" } } + +namespace +{ + int f() { } +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/anon10.C b/gcc/testsuite/g++.dg/ext/visibility/anon10.C new file mode 100644 index 000000000..8c79631b0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/anon10.C @@ -0,0 +1,44 @@ +// http://bugzilla.redhat.com/411871 +// { dg-do compile } + +extern "C" int printf (const char *, ...); + +struct E +{ + template <typename T> E (const volatile T&); + template <typename T> E (T&); + char x[64]; +}; + +template<typename T> struct D +{ + static E foo (E, ...); + static int foo (T, int); +}; + +template<typename T, typename U> struct C +{ + static T ca; + static const int value = sizeof (D<U>::foo (ca, 0)) == sizeof (int); +}; + +struct A +{ + int a; +}; + +namespace +{ + struct B + { + int a; + }; +} + +int bar (void) +{ + C<A, int> a; + C<B, int> b; + + return a.value + b.value; +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/anon11.C b/gcc/testsuite/g++.dg/ext/visibility/anon11.C new file mode 100644 index 000000000..dfb4f12bb --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/anon11.C @@ -0,0 +1,13 @@ +// PR c++/55877 +// { dg-final { scan-assembler-not "\\.local" } } + +typedef struct { + typedef enum { X, Y } A; + typedef struct { } B; + struct C { }; +} D; + +D d; +D::A a; +D::B b; +D::C c; diff --git a/gcc/testsuite/g++.dg/ext/visibility/anon2.C b/gcc/testsuite/g++.dg/ext/visibility/anon2.C new file mode 100644 index 000000000..1d8e479b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/anon2.C @@ -0,0 +1,11 @@ +// Test for propagation of anonymous namespace internal linkage + +// { dg-do compile } +// { dg-final { scan-assembler-not "globl.*_Z1fv" } } + +namespace +{ + struct A { }; +} + +A f () { } diff --git a/gcc/testsuite/g++.dg/ext/visibility/anon3.C b/gcc/testsuite/g++.dg/ext/visibility/anon3.C new file mode 100644 index 000000000..9def559d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/anon3.C @@ -0,0 +1,16 @@ +// PR c++/31187 +// Bug: the repeated declaration was confusing the compiler into +// thinking that foo1 had language internal linkage. + +class foo { }; + +namespace +{ + extern foo foo1; + foo foo1; +} + +template< foo * > +class bar { }; + +bar< &foo1 > bar1; diff --git a/gcc/testsuite/g++.dg/ext/visibility/anon4.C b/gcc/testsuite/g++.dg/ext/visibility/anon4.C new file mode 100644 index 000000000..6d5d58ec3 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/anon4.C @@ -0,0 +1,16 @@ +// PR c++/31903 +// Test for anonymous namespace internal linkage, for typeinfo + +// { dg-do compile } +// { dg-final { scan-assembler-not "globl.*_ZTIN*3fooE" } } + +#include <typeinfo> +namespace +{ + class foo + { + virtual void bar(); + }; +} + +const std::type_info &X = typeid(foo); diff --git a/gcc/testsuite/g++.dg/ext/visibility/anon5.C b/gcc/testsuite/g++.dg/ext/visibility/anon5.C new file mode 100644 index 000000000..d069eeab6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/anon5.C @@ -0,0 +1,8 @@ +// PR c++/32596 +// { dg-do compile } + +namespace +{ + template<class T> inline void char_less(void) { } + template<> inline void char_less<char>(void) { } +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/anon6.C b/gcc/testsuite/g++.dg/ext/visibility/anon6.C new file mode 100644 index 000000000..951de4964 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/anon6.C @@ -0,0 +1,28 @@ +// PR c++/33094 +// { dg-final { scan-assembler "1BIiE1cE" } } +// { dg-final { scan-assembler-not "globl.*1BIiE1cE" } } +// { dg-final { scan-assembler-not "1CIiE1cE" } } + +// Test that B<int>::c is emitted as an internal symbol, and C<int>::c is +// not emitted. + +namespace +{ + template <typename T> + class A + { + virtual T f1() { return c; } + static const T c = 0; + }; + + template <typename T> + class B + { + static const T c = 0; + }; + + template <typename T> const T B<T>::c; + + template class A<int>; + template class B<int>; +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/anon7.C b/gcc/testsuite/g++.dg/ext/visibility/anon7.C new file mode 100644 index 000000000..0c42ea866 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/anon7.C @@ -0,0 +1,23 @@ +// PR c++/34094 +// { dg-do compile } + +namespace +{ + struct A { + static int bar (); + static int i; // { dg-error "used, but not defined" "" { xfail *-*-* } } + static int j; + static int k; + static int l; + static const int m = 16; + static const int n = 17; + }; + int A::j = 4; + int A::k; + const int A::m; +} + +int foo (void) +{ + return A::i + A::j + A::k + A::m + A::n + A::bar (); +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/anon8.C b/gcc/testsuite/g++.dg/ext/visibility/anon8.C new file mode 100644 index 000000000..8ef8d6823 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/anon8.C @@ -0,0 +1,35 @@ +// PR c++/34213 +// { dg-do compile } + +template <void (*fn) ()> +void call () // { dg-message "note" } +{ + fn (); +} + +namespace +{ + struct B1 + { + static void fn1 () {} + static void fn4 (); + }; + void fn3 () {} + void B1::fn4 () {} + static void fn5 () {} +} + +int main () +{ + struct B2 + { + static void fn2 () {} + }; + call<&B1::fn1> (); + call<&B2::fn2> (); // { dg-error "not external linkage|no matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 29 } + call<&fn3> (); + call<&B1::fn4> (); + call<&fn5> (); // { dg-error "not external linkage|no matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 33 } +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/anon9.C b/gcc/testsuite/g++.dg/ext/visibility/anon9.C new file mode 100644 index 000000000..bb752253b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/anon9.C @@ -0,0 +1,11 @@ +// PR c++/34238 +// { dg-do compile } + +namespace +{ + template <typename T = int> struct A + { + static const bool a = true; + }; +} +struct A<> a; diff --git a/gcc/testsuite/g++.dg/ext/visibility/arm1.C b/gcc/testsuite/g++.dg/ext/visibility/arm1.C new file mode 100644 index 000000000..2c2e3d066 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/arm1.C @@ -0,0 +1,30 @@ +// { dg-do compile { target arm*-*-eabi* arm*-*-symbianelf* } } +// { dg-require-dll "" } +// { dg-options "-fvisibility=hidden" } +// Most class data should be exported. +// { dg-final { scan-not-hidden "_ZTV1S" } } +// { dg-final { scan-not-hidden "_ZTI1S" } } +// { dg-final { scan-not-hidden "_ZTS1S" } } +// { dg-final { scan-not-hidden "_ZTV1U" } } +// { dg-final { scan-not-hidden "_ZTT1U" } } +// { dg-final { scan-not-hidden "_ZTI1U" } } +// { dg-final { scan-not-hidden "_ZTS1U" } } +// The construction vtable should be hidden. +// { dg-final { scan-hidden "_ZTC1U0_1T" } } + +struct S { + virtual void f(); +}; + +void S::f() { +} + +struct T : public virtual S { + virtual void g(); +}; + +struct U : public virtual T { + virtual void h(); +}; + +void U::h() {} diff --git a/gcc/testsuite/g++.dg/ext/visibility/arm2.C b/gcc/testsuite/g++.dg/ext/visibility/arm2.C new file mode 100644 index 000000000..7eed18d7f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/arm2.C @@ -0,0 +1,11 @@ +// { dg-do compile { target arm*-*-*eabi* arm*-*-symbianelf* } } +// Class data should be exported. +// { dg-final { scan-not-hidden "_ZTV1S" } } +// { dg-final { scan-not-hidden "_ZTI1S" } } +// { dg-final { scan-not-hidden "_ZTS1S" } } + +struct S { + virtual void f(); +}; + +void S::f() {} diff --git a/gcc/testsuite/g++.dg/ext/visibility/arm3.C b/gcc/testsuite/g++.dg/ext/visibility/arm3.C new file mode 100644 index 000000000..9be7082ce --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/arm3.C @@ -0,0 +1,36 @@ +// { dg-do compile { target arm*-*-*eabi* } } +// { dg-require-dll "" } +// { dg-options "-fvisibility=hidden" } + +/* From ARM C++ ABI \S 3.2.5.5: + + A class should be exported unless explicitly tagged otherwise. + + This admonition applies even on DLL-based systems where hidden + visibility is the default. We want -fvisibility=hidden to behave + identically to the situation where hidden visibility is the + hard-wired default. So, both A and B are exported classes. + + Furthermore: + + If CAG symbol Y names one of the impedimenta associated with an + exported class X: + + ... + + * Otherwise, if X has no key function: + + - Y is exported from ... each DLL that refers to X and uses Y. + + So, the type-info and virtual-table symbols associated with A and B + must be exported. */ + +// { dg-final { scan-not-hidden "_ZTI1A" } } +// { dg-final { scan-not-hidden "_ZTS1A" } } +// { dg-final { scan-not-hidden "_ZTV1B" } } +// { dg-final { scan-not-hidden "_ZTI1B" } } +// { dg-final { scan-not-hidden "_ZTS1B" } } + +struct A {}; +struct B : virtual public A {}; +B b; diff --git a/gcc/testsuite/g++.dg/ext/visibility/assign1.C b/gcc/testsuite/g++.dg/ext/visibility/assign1.C new file mode 100644 index 000000000..b25999e8e --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/assign1.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-final { scan-hidden "_ZN1DaSERKS_" } } */ + +struct B { + B& operator=(const B&); +}; + +struct __attribute__((visibility("hidden"))) D : public B { + // The implicit assignment operator should be hidden. +}; + +__attribute__((visibility("hidden"))) D d1; +__attribute__((visibility("hidden"))) D d2; + +void f() { + d1 = d2; +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/class1.C b/gcc/testsuite/g++.dg/ext/visibility/class1.C new file mode 100644 index 000000000..792fc7891 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/class1.C @@ -0,0 +1,22 @@ +// PR c++/26905 +// Init should not be hidden, so calling it should use the PLT. + +// { dg-options "-fpic" } +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-skip-if "" { *-*-darwin* } { "*" } { "" } } +// { dg-require-visibility "" } +// { dg-require-effective-target fpic } +// { dg-final { scan-assembler "InitEv@PLT" } } + +#pragma GCC visibility push(hidden) +struct __attribute__ ((visibility ("default"))) nsINIParser +{ + static void Init(); +}; + +__attribute__ ((visibility ("default"))) +void +CheckCompatibility(void) +{ + nsINIParser::Init(); +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-2.C b/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-2.C new file mode 100644 index 000000000..ed38ebefe --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-2.C @@ -0,0 +1,19 @@ +/* Test that -fvisibility-inlines-hidden doesn't affect static variables. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-options "-fvisibility-inlines-hidden" } */ +/* { dg-final { scan-not-hidden "_ZZN3foo7my_funcEvE1x" } } */ + +struct foo +{ + int my_func() { + static int x; + return x++; + } +}; + +int t() +{ + foo f; + return f.my_func(); +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-3.C b/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-3.C new file mode 100644 index 000000000..50885a798 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-3.C @@ -0,0 +1,30 @@ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-options "-fvisibility-inlines-hidden" } */ +/* { dg-final { scan-not-hidden "_ZN1IIiE3fooEv" } } */ +/* { dg-final { scan-not-hidden "_ZN1OIiE3fooEv" } } */ +/* { dg-final { scan-hidden "_ZN1S3fooEv" } } */ + +template <class T> +struct O { + static inline void foo() { } +}; + +template void O<int>::foo(); + +template <class T> +struct I { + static inline void foo() { } +}; + +extern template void I<int>::foo(); + +struct S { + static inline void foo() { } +}; + +void bar() { + I<int>::foo(); + O<int>::foo(); + S::foo(); +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C b/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C new file mode 100644 index 000000000..2ee8f0767 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C @@ -0,0 +1,18 @@ +/* Test that -fvisibility-inlines-hidden affects class members. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-options "-fvisibility-inlines-hidden" } */ +/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */ + +class Foo +{ +public: + void method() { } +}; + +int main(void) +{ + Foo f; + f.method(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override1.C b/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override1.C new file mode 100644 index 000000000..685cd1309 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override1.C @@ -0,0 +1,12 @@ +/* Test that -fvisibility does not override class member specific settings. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-options "-fvisibility=hidden" } */ +/* { dg-final { scan-not-hidden "methodEv" } } */ + +class __attribute__ ((visibility ("default"))) Foo +{ + void method(); +}; + +void Foo::method() { } diff --git a/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override2.C b/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override2.C new file mode 100644 index 000000000..4b4b54d5a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override2.C @@ -0,0 +1,12 @@ +/* Test that -fvisibility does not override class member specific settings. */ +/* { dg-do compile } */ +/* { dg-require-visibility "internal" } */ +/* { dg-options "-fvisibility=hidden" } */ +/* { dg-final { scan-not-hidden "Foo.methodEv" } } */ + +class Foo +{ + __attribute__ ((visibility ("internal"))) void method(); +}; + +void Foo::method() { } diff --git a/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C b/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C new file mode 100644 index 000000000..4358d25a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C @@ -0,0 +1,12 @@ +/* Test that -fvisibility affects class members. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-options "-fvisibility=hidden" } */ +/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */ + +class Foo +{ + void method(); +}; + +void Foo::method() { } diff --git a/gcc/testsuite/g++.dg/ext/visibility/guard1.C b/gcc/testsuite/g++.dg/ext/visibility/guard1.C new file mode 100644 index 000000000..5290e2f8e --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/guard1.C @@ -0,0 +1,29 @@ +// { dg-options "-fvisibility=hidden" } +// { dg-require-visibility "" } +// { dg-final { scan-not-hidden "_ZGVZN5otherclEvE4s_cd" } } + +extern "C" int printf (const char *, ...); + +#define DLLEXPORT __attribute__ ((visibility("default"))) + +struct class_data +{ + int apple; + class_data() { printf("non trivial ctor\n"); } +}; + +struct DLLEXPORT other +{ + class_data* operator ()() + { + static class_data s_cd; + return &s_cd; + } +}; + +int main() +{ + other aFoo; + aFoo(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/local1.C b/gcc/testsuite/g++.dg/ext/visibility/local1.C new file mode 100644 index 000000000..7a04db601 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/local1.C @@ -0,0 +1,25 @@ +// PR c++/19238 +// Test that hidden visibility on an inline function is inherited by static +// local variables and local classes. + +// { dg-require-visibility "" } +// { dg-final { scan-hidden "_Z1fv" } } +// { dg-final { scan-hidden "_ZZ1fvE1i" } } +// { dg-final { scan-hidden "_ZZ1fvEN1A1fEv" } } + +__attribute ((visibility ("hidden"))) inline int +f() +{ + static int i = 2; + struct A + { + void f () { } + } a; + a.f(); + return i; +} + +int main() +{ + f(); +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C b/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C new file mode 100644 index 000000000..45eb641b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C @@ -0,0 +1,11 @@ +/* Test that setting visibility for class member functions works. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */ + +class __attribute__ ((visibility ("hidden"))) Foo +{ + void method(); +}; + +void Foo::method() { } diff --git a/gcc/testsuite/g++.dg/ext/visibility/ms-compat-1.C b/gcc/testsuite/g++.dg/ext/visibility/ms-compat-1.C new file mode 100644 index 000000000..bce2aac55 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/ms-compat-1.C @@ -0,0 +1,28 @@ +/* { dg-require-visibility "" } */ +/* { dg-options "-fvisibility-ms-compat" } */ + +/* { dg-final { scan-not-hidden "_ZTI1S" } } */ +/* { dg-final { scan-hidden "_ZTI1T" } } */ +/* { dg-final { scan-not-hidden "_ZTI1U" } } */ +/* { dg-final { scan-not-hidden "_ZN1U6hide_4Ev" } } */ + +class S { + virtual void hide_2(); +} hide_1; + +void S::hide_2() { +} + +class __attribute__((visibility("hidden"))) T { + virtual void hide_4(); +} hide_3; + +void T::hide_4() { +} + +class __attribute__((visibility("default"))) U { + virtual void hide_4(); +}; + +void U::hide_4() { +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/namespace1.C b/gcc/testsuite/g++.dg/ext/visibility/namespace1.C new file mode 100644 index 000000000..b7773dc9d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/namespace1.C @@ -0,0 +1,30 @@ +// PR c++/21764 +// Test for namespace visibility attribute semantics. + +// { dg-require-visibility "" } +// { dg-final { scan-hidden "_ZN3foo1fEv" } } +// { dg-final { scan-hidden "_ZN3foo1gEv" } } +// { dg-final { scan-hidden "_ZN3foo1A1mEv" } } +// { dg-final { scan-hidden "_ZN3foo1tIiEEvv" } } +// { dg-final { scan-not-hidden "_ZN3foo1hEv" } } + +namespace foo __attribute ((visibility ("hidden"))) +{ + int f() { } + void g(); + template <typename T> void t() { } + class A + { + void m (); + }; +} + +namespace foo +{ + void h() {} +} + +void foo::g() { t<int> (); } + +void foo::A::m() { } + diff --git a/gcc/testsuite/g++.dg/ext/visibility/namespace2.C b/gcc/testsuite/g++.dg/ext/visibility/namespace2.C new file mode 100644 index 000000000..96c5b0953 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/namespace2.C @@ -0,0 +1,20 @@ +// PR c++/32470 + +// { dg-require-visibility "" } +// { dg-options "-fvisibility=hidden" } +// { dg-final { scan-hidden "_ZN4Test4testEv" } } + +namespace std __attribute__((__visibility__("default"))) { + template<typename _CharT> + class basic_streambuf + { + friend void getline(); + }; + extern template class basic_streambuf<char>; +} + +class Test +{ + void test(); +}; +void Test::test() { } diff --git a/gcc/testsuite/g++.dg/ext/visibility/namespace3.C b/gcc/testsuite/g++.dg/ext/visibility/namespace3.C new file mode 100644 index 000000000..a07abdcd8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/namespace3.C @@ -0,0 +1,6 @@ +// PR c++/41774 +// { dg-do compile } + +namespace std __attribute__ ((__visibility__ ("default"))) { +#pragma GCC visibility pop // { dg-warning "no matching push for" } +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/new1.C b/gcc/testsuite/g++.dg/ext/visibility/new1.C new file mode 100644 index 000000000..ec201cbc2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/new1.C @@ -0,0 +1,13 @@ +// { dg-require-visibility "" } +// { dg-options "-fvisibility=hidden" } +// { dg-final { scan-not-hidden "_Znwj" } } + +void f() { + new int; +} + +void *g(); + +void *operator new(__SIZE_TYPE__) { + return g(); +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/noPLT.C b/gcc/testsuite/g++.dg/ext/visibility/noPLT.C new file mode 100644 index 000000000..38af05fd6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/noPLT.C @@ -0,0 +1,20 @@ +/* Test that -fvisibility=hidden prevents PLT. */ +/* { dg-do compile { target fpic } } */ +/* { dg-require-visibility "" } */ +/* { dg-options "-fPIC -fvisibility=hidden" } */ +/* { dg-final { scan-assembler-not "methodEv@PLT|indirect_symbol.*methodEv" } } */ + +class Foo +{ +public: + void method(); +}; + +void Foo::method() { } + +int main(void) +{ + Foo f; + f.method(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/overload-1.C b/gcc/testsuite/g++.dg/ext/visibility/overload-1.C new file mode 100644 index 000000000..d841c53fb --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/overload-1.C @@ -0,0 +1,9 @@ +/* Test that visibility of function parameters propagates to an undecorated + function. */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "_Z3fooP8a_struct" } } */ + +struct __attribute__((visibility("hidden"))) a_struct; + +void foo(a_struct * p) +{ } diff --git a/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C b/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C new file mode 100644 index 000000000..4300d1ab1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C @@ -0,0 +1,14 @@ +/* Test that #pragma GCC visibility does not override class member specific settings. */ +/* { dg-do compile } */ +/* { dg-require-visibility "internal" } */ +/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" { target { ! *-*-solaris2* } } } } */ +/* { dg-final { scan-assembler "\\.(internal|hidden).*Foo.methodEv" { target *-*-solaris2* } } } */ + +#pragma GCC visibility push(hidden) +class __attribute__ ((visibility ("internal"))) Foo +{ + void method(); +}; +#pragma GCC visibility pop + +void Foo::method() { } diff --git a/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C b/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C new file mode 100644 index 000000000..f566cd2f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C @@ -0,0 +1,14 @@ +/* Test that #pragma GCC visibility does not override class member specific settings. */ +/* { dg-do compile } */ +/* { dg-require-visibility "internal" } */ +/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" { target { ! *-*-solaris2* } } } } */ +/* { dg-final { scan-assembler "\\.(internal|hidden).*Foo.methodEv" { target *-*-solaris2* } } } */ + +#pragma GCC visibility push(hidden) +class Foo +{ + __attribute__ ((visibility ("internal"))) void method(); +}; +#pragma GCC visibility pop + +void Foo::method() { } diff --git a/gcc/testsuite/g++.dg/ext/visibility/pragma.C b/gcc/testsuite/g++.dg/ext/visibility/pragma.C new file mode 100644 index 000000000..98384c9c4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/pragma.C @@ -0,0 +1,13 @@ +/* Test that #pragma GCC visibility affects class members. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */ + +#pragma GCC visibility push(hidden) +class Foo +{ + void method(); +}; +#pragma GCC visibility pop + +void Foo::method() { } diff --git a/gcc/testsuite/g++.dg/ext/visibility/prop1.C b/gcc/testsuite/g++.dg/ext/visibility/prop1.C new file mode 100644 index 000000000..f4574820d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/prop1.C @@ -0,0 +1,23 @@ +// Test for propagation of visibility through template arguments + +// { dg-do compile } +// { dg-require-visibility "" } +// { dg-final { scan-hidden "_Z1fIN1N1AEEvT_" } } +// { dg-final { scan-hidden "_Z1hIXadL_ZN1N1iEEEEvv" } } + +namespace N __attribute ((__visibility__ ("hidden"))) +{ + struct A { }; + int i; +} + +template <class T> void f (T) { } +template <int *I> void h() { } + +void g() +{ + N::A a; + f(a); + h<&N::i>(); +} + diff --git a/gcc/testsuite/g++.dg/ext/visibility/redecl1.C b/gcc/testsuite/g++.dg/ext/visibility/redecl1.C new file mode 100644 index 000000000..b53335ef5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/redecl1.C @@ -0,0 +1,7 @@ +// Test that we complain about redeclaration with different visibility + +struct __attribute((visibility("hidden"))) B; +struct __attribute((visibility("default"))) B; // { dg-error "visibility" } + +__attribute ((visibility ("hidden"))) void f(); // { dg-warning "previous" } +__attribute ((visibility ("default"))) void f(); // { dg-warning "visibility" } diff --git a/gcc/testsuite/g++.dg/ext/visibility/staticdatamem.C b/gcc/testsuite/g++.dg/ext/visibility/staticdatamem.C new file mode 100644 index 000000000..4ec9479a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/staticdatamem.C @@ -0,0 +1,20 @@ +// PR c++/18925 +// { dg-do compile { target ia64-*-linux* } } +// { dg-options "-fPIC -fvisibility=hidden" } +// { dg-final { scan-assembler-not "gprel" } } + +class __attribute__ ((visibility("default"))) Type +{ + private: + static long _staticTypeCount; + public: + Type() { _staticTypeCount++; } + ~Type(); +}; + +long Type::_staticTypeCount = 0; + +Type::~Type() +{ + _staticTypeCount--; +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C b/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C new file mode 100644 index 000000000..e745caa5a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C @@ -0,0 +1,11 @@ +/* Test that setting visibility for static class member functions works. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */ + +class __attribute__ ((visibility ("hidden"))) Foo +{ + static void method(); +}; + +void Foo::method() { } diff --git a/gcc/testsuite/g++.dg/ext/visibility/symbian1.C b/gcc/testsuite/g++.dg/ext/visibility/symbian1.C new file mode 100644 index 000000000..864ab2bb9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/symbian1.C @@ -0,0 +1,22 @@ +// { dg-do compile { target arm*-*-symbianelf* } } +// Class data should not be exported. +// { dg-final { scan-hidden "_ZTV2K3" } } +// But the constructor and destructor should be exported. +// { dg-final { scan-not-hidden "_ZN2K3C2Ev" } } +// { dg-final { scan-not-hidden "_ZN2K3D0Ev" } } + +class __declspec(notshared) K3 { +public: + __declspec(dllimport) K3(); + __declspec(dllimport) virtual ~K3(); + virtual int m1(); +}; + +__declspec(dllexport) + K3::K3(){} + +__declspec(dllexport) + K3::~K3(){} + +int K3::m1() { return 1; } + diff --git a/gcc/testsuite/g++.dg/ext/visibility/symbian2.C b/gcc/testsuite/g++.dg/ext/visibility/symbian2.C new file mode 100644 index 000000000..767f0b54e --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/symbian2.C @@ -0,0 +1,11 @@ +// { dg-do compile { target arm*-*-symbianelf* } } +// Class data should not be exported. +// { dg-final { scan-hidden "_ZTI1A" } } +// { dg-final { scan-hidden "_ZTS1A" } } +// { dg-final { scan-hidden "_ZTV1B" } } +// { dg-final { scan-hidden "_ZTI1B" } } +// { dg-final { scan-hidden "_ZTS1B" } } + +struct A {}; +struct B : virtual public A {}; +B b; diff --git a/gcc/testsuite/g++.dg/ext/visibility/template1.C b/gcc/testsuite/g++.dg/ext/visibility/template1.C new file mode 100644 index 000000000..c5cee0d4b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/template1.C @@ -0,0 +1,35 @@ +// PR c++/19134 +// -fvisibility-inlines-hidden doesn't apply to non-inline specializations + +// { dg-require-visibility "" } +// { dg-options "-fvisibility-inlines-hidden" } +// { dg-final { scan-not-hidden "_ZN1AIiE3fooEv" } } +// { dg-final { scan-not-hidden "_ZN1AIiE3barEv" } } +// { dg-final { scan-hidden "_ZN1AIlE3fooEv" } } +// { dg-final { scan-hidden "_ZN1AIlE3barEv" } } +// { dg-final { scan-hidden "_ZN1AIcE3barEv" } } + +template<class T> +struct A { + void foo() {}; + __attribute ((visibility ("hidden"))) void bar(); +}; + +// This has default visibility. +template<> void A<int>::foo() {} + +// This has hidden visibility because of -fvisibility-inlines-hidden. +template<> inline void A<long>::foo() {} +// Force the inline out. +void f () { A<long> a; a.foo(); } + +// This has default visibility. +template<> __attribute ((visibility ("default"))) void A<int>::bar() {} + +// This inherits hidden visibility from its template. +template<> void A<long>::bar() { } + +// This also has hidden visibility; #pragma vis doesn't affect class members. +#pragma GCC visibility push(default) +template<> void A<char>::bar() { } +#pragma GCC visibility pop diff --git a/gcc/testsuite/g++.dg/ext/visibility/template2.C b/gcc/testsuite/g++.dg/ext/visibility/template2.C new file mode 100644 index 000000000..8db96db56 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/template2.C @@ -0,0 +1,35 @@ +// PR c++/27000 +// Implicitly instantiated templates should not be affected by +// #pragma visibility. + +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-final { scan-not-hidden "_ZN1SIiED1Ev" } } */ +/* { dg-final { scan-not-hidden "_ZN1SIiEC1ERKi" } } */ + +template <class T> +struct S +{ + S (const T &); + ~S (); + T t; +}; + +template <class T> +S<T>::S (const T &x) +{ + t = x; +} + +template <class T> +S<T>::~S () +{ +} + +#pragma GCC visibility push(hidden) +struct U +{ + S<int> s; + U () : s (6) { } +} u; +#pragma GCC visibility pop diff --git a/gcc/testsuite/g++.dg/ext/visibility/template3.C b/gcc/testsuite/g++.dg/ext/visibility/template3.C new file mode 100644 index 000000000..69cb6caba --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/template3.C @@ -0,0 +1,22 @@ +// PR c++/17470 +// Test that we can give visibility to explicit template instantiations + +// { dg-require-visibility "" } +// { dg-final { scan-hidden "_ZN1AIlE1fEl" } } +// { dg-final { scan-hidden "_ZN1AIiE1fEi" } } +// { dg-final { scan-not-hidden "_ZN1AIcE1fEc" } } +// { dg-final { scan-hidden "_Z8identityIdET_S0_" } } +// { dg-final { scan-not-hidden "_Z8identityIiET_S0_" } } + +template <class T> T identity(T t) { return t; } +template __attribute__((visibility("hidden"))) double identity(double); +template int identity(int); + + +template <class T> struct A { void f (T); }; +template <class T> void A<T>::f (T) { } +template struct __attribute ((visibility ("hidden"))) A<int>; +template<> struct __attribute ((visibility ("hidden"))) A<long> { void f(long); }; +// inherits hidden visibility from its class +void A<long>::f (long) { } +template struct A<char>; diff --git a/gcc/testsuite/g++.dg/ext/visibility/template4.C b/gcc/testsuite/g++.dg/ext/visibility/template4.C new file mode 100644 index 000000000..add63a593 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/template4.C @@ -0,0 +1,39 @@ +// Test for explicit visibility on template vs. #pragma vis at explicit +// instantiation/specialization point for plain function templates. + +// { dg-require-visibility "" } +// { dg-final { scan-hidden "_Z3fooIdEvT_" } } +// { dg-final { scan-hidden "_Z3fooIlEvT_" } } +// { dg-final { scan-hidden "_Z3fooIcEvT_" } } +// { dg-final { scan-hidden "_Z3fooIiEvT_" } } +// { dg-final { scan-not-hidden "_Z3fooIfEvT_" } } +// { dg-final { scan-not-hidden "_Z3fooIsEvT_" } } + +// { dg-final { scan-hidden "_Z3barIdEvT_" } } +// { dg-final { scan-hidden "_Z3barIlEvT_" } } +// { dg-final { scan-hidden "_Z3barIiEvT_" } } +// { dg-final { scan-hidden "_Z3barIcEvT_" } } +// { dg-final { scan-not-hidden "_Z3barIfEvT_" } } +// { dg-final { scan-not-hidden "_Z3barIsEvT_" } } + +#pragma GCC visibility push(hidden) +template <class T> void bar(T) { } +#pragma GCC visibility pop +template void bar (long); +template<> void bar (double) { } +template __attribute ((visibility ("default"))) void bar (short); +template<> __attribute ((visibility ("default"))) void bar (float) { } +#pragma GCC visibility push(default) +template<> void bar(char) { } +template void bar(int); +#pragma GCC visibility pop + +template <class T> __attribute ((visibility ("hidden"))) void foo(T) { } +template void foo (long); +template<> void foo (double) { } +template __attribute ((visibility ("default"))) void foo (short); +template<> __attribute ((visibility ("default"))) void foo (float) { } +#pragma GCC visibility push(default) +template<> void foo(char) { } +template void foo(int); +#pragma GCC visibility pop diff --git a/gcc/testsuite/g++.dg/ext/visibility/template6.C b/gcc/testsuite/g++.dg/ext/visibility/template6.C new file mode 100644 index 000000000..7892a46e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/template6.C @@ -0,0 +1,17 @@ +// Test for explicit visibility taking precedence + +// { dg-require-visibility "" } +// { dg-final { scan-not-hidden "_ZN1AIiE1fEv" } } + +template <class T> struct A +{ + // This attribute takes precedence over... + __attribute ((visibility ("default"))) void f (); +}; + +template <class T> +void A<T>::f () +{ } + +// ...this attribute. +template struct __attribute ((visibility ("hidden"))) A<int>; diff --git a/gcc/testsuite/g++.dg/ext/visibility/typeinfo1.C b/gcc/testsuite/g++.dg/ext/visibility/typeinfo1.C new file mode 100644 index 000000000..99dfc1cd7 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/typeinfo1.C @@ -0,0 +1,19 @@ +// PR c++/26984 +// lazily generated typeinfos should not be affected by #pragma vis, but +// they should be affected by the visibility of the type they describe. + +// { dg-require-visibility "" } +// { dg-options "-fvisibility-inlines-hidden" } +// { dg-final { scan-not-hidden "_ZTIPPi" } } +// { dg-final { scan-not-hidden "_ZTSPPi" } } +// { dg-final { scan-hidden "_ZTIP1A" } } +// { dg-final { scan-hidden "_ZTSP1A" } } + +#include <typeinfo> + +#pragma GCC visibility push(hidden) +const std::type_info* t = &(typeid(int **)); +struct A { }; +#pragma GCC visibility pop + +const std::type_info* t2 = &(typeid(A *)); diff --git a/gcc/testsuite/g++.dg/ext/visibility/typeinfo2.C b/gcc/testsuite/g++.dg/ext/visibility/typeinfo2.C new file mode 100644 index 000000000..54f541d85 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/typeinfo2.C @@ -0,0 +1,23 @@ +// PR c++/35368 +// { dg-require-visibility "" } + +#pragma GCC visibility push (hidden) + +struct A +{ + A(); + virtual ~A() { } +}; + +A::A() +{ +} + +void foo(A *a) +{ + delete a; +} + +// { dg-final { scan-not-hidden "_ZTVN10__cxxabiv117__class_type_infoE" } } +// { dg-final { scan-hidden "_ZTI1A" } } +// { dg-final { scan-hidden "_ZTV1A" } } diff --git a/gcc/testsuite/g++.dg/ext/visibility/typeinfo3.C b/gcc/testsuite/g++.dg/ext/visibility/typeinfo3.C new file mode 100644 index 000000000..5102b6492 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/typeinfo3.C @@ -0,0 +1,24 @@ +// PR c++/35368 +// { dg-require-visibility "" } + +#pragma GCC visibility push (hidden) + +#include <typeinfo> + +const std::type_info& info1 = typeid(int []); +const std::type_info& info2 = typeid(int); +enum E { e = 0 }; +const std::type_info& info3 = typeid(E); +struct S { S (); }; +const std::type_info& info4 = typeid(S); +const std::type_info& info5 = typeid(int *); + +// { dg-final { scan-not-hidden "_ZTVN10__cxxabiv117__array_type_infoE" } } +// { dg-final { scan-not-hidden "_ZTVN10__cxxabiv116__enum_type_infoE" } } +// { dg-final { scan-hidden "_ZTI1S" } } +// { dg-final { scan-hidden "_ZTS1S" } } +// { dg-final { scan-hidden "info1" } } +// { dg-final { scan-hidden "info2" } } +// { dg-final { scan-hidden "info3" } } +// { dg-final { scan-hidden "info4" } } +// { dg-final { scan-hidden "info5" } } diff --git a/gcc/testsuite/g++.dg/ext/visibility/virtual.C b/gcc/testsuite/g++.dg/ext/visibility/virtual.C new file mode 100644 index 000000000..770600368 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/virtual.C @@ -0,0 +1,17 @@ +/* Test that setting visibility for class affects virtual table, VTT and + type_info name and node. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-final { scan-hidden "ZTV3Foo" } } */ +/* { dg-final { scan-hidden "ZTT3Foo" } } */ +/* { dg-final { scan-hidden "ZTS3Foo" } } */ +/* { dg-final { scan-hidden "ZTI3Foo" } } */ + +struct A { }; + +class __attribute__ ((visibility ("hidden"))) Foo: virtual public A +{ + virtual void method(); +}; + +void Foo::method() { } diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C new file mode 100644 index 000000000..8ea270bf8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C @@ -0,0 +1,8 @@ +/* Test visibility attribute on function definition. */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "_Z3foov" } } */ + +void +__attribute__((visibility ("hidden"))) +foo() +{ } diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-10.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-10.C new file mode 100644 index 000000000..312d32309 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-10.C @@ -0,0 +1,19 @@ +// { dg-require-visibility "" } +// { dg-require-dll "" } + +extern void __attribute__((dllimport, visibility("hidden"))) + f1(); // { dg-error "visibility" } +extern void __attribute__((visibility("hidden"), dllimport)) + f2(); // { dg-error "visibility" } +extern void __attribute__((dllexport, visibility("hidden"))) + f3(); // { dg-error "visibility" } +extern void __attribute__((visibility("hidden"), dllexport)) + f4(); // { dg-error "visibility" } +extern void __attribute__((visibility("default"), dllimport)) + f5(); +extern void __attribute__((dllimport, visibility("default"))) + f6(); +extern void __attribute__((visibility("default"), dllexport)) + f7(); +extern void __attribute__((dllexport, visibility("default"))) + f8(); diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-11.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-11.C new file mode 100644 index 000000000..78f40c62b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-11.C @@ -0,0 +1,18 @@ +// PR target/39175 +// { dg-do compile } +// { dg-require-visibility "" } +// { dg-options "-O2 -fvisibility=hidden -fpic" { target fpic } } + +__attribute__((noinline)) int +foo (int x) +{ + return x; +} + +int foo (int x); + +int +bar (int x) +{ + return foo (x); +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C new file mode 100644 index 000000000..26272abb1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C @@ -0,0 +1,7 @@ +/* Test that visibility attribute on declaration extends to definition. */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "_Z3foov" } } */ + +void __attribute__((visibility ("hidden"))) foo(); + +void foo() { } diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C new file mode 100644 index 000000000..e4f499fcc --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C @@ -0,0 +1,7 @@ +/* Test visibility attribute on forward declaration of global variable */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "xyzzy" } } */ + +int +__attribute__((visibility ("hidden"))) +xyzzy = 5; diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C new file mode 100644 index 000000000..f67659587 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C @@ -0,0 +1,8 @@ +/* Test visibility attribute on forward declaration of global variable */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "xyzzy" } } */ + +extern int __attribute__ ((visibility ("hidden"))) +xyzzy; + +int xyzzy = 5; diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C new file mode 100644 index 000000000..592529e66 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C @@ -0,0 +1,11 @@ +/* Test visibility attribute on definition of a function that has + already had a forward declaration. */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "_Z3foov" } } */ + +void foo(); + +void + __attribute__((visibility ("hidden"))) +foo() +{ } diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C new file mode 100644 index 000000000..0fecf6b74 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C @@ -0,0 +1,10 @@ +/* Test visibility attribute on definition of global variable that has + already had a forward declaration. */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "xyzzy" } } */ + +extern int xyzzy; + +int +__attribute__((visibility ("hidden"))) +xyzzy = 5; diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C new file mode 100644 index 000000000..ae4589397 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C @@ -0,0 +1,11 @@ +/* Test warning from conflicting visibility specifications. */ +/* { dg-require-visibility "protected" } */ +/* { dg-final { scan-hidden "xyzzy" } } */ + +extern int +__attribute__((visibility ("hidden"))) +xyzzy; /* { dg-warning "previous declaration here" "" } */ + +int +__attribute__((visibility ("protected"))) +xyzzy = 5; /* { dg-warning "visibility attribute ignored" "" } */ diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-8.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-8.C new file mode 100644 index 000000000..f0139b362 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-8.C @@ -0,0 +1,56 @@ +// Test that a definition marked with dllexport has default +// visibility. +// { dg-require-visibility "" } +// { dg-require-dll "" } +// { dg-options "-fvisibility=hidden" } +// { dg-final { scan-not-hidden "_ZN1A1fEv" } } +// { dg-final { scan-not-hidden "_Z1gv" } } +// { dg-final { scan-not-hidden "_Z1hv" } } +// { dg-final { scan-not-hidden "_ZN1BC1Ev" } } +// { dg-final { scan-not-hidden "_ZN1BC2Ev" } } +// { dg-final { scan-not-hidden "_ZN1BD0Ev" } } +// { dg-final { scan-not-hidden "_ZN1BD1Ev" } } +// { dg-final { scan-not-hidden "_ZN1BD2Ev" } } +// { dg-final { scan-not-hidden "_ZN1B1iEv" } } +// { dg-final { scan-not-hidden "_ZN1B1jEv" } } +// { dg-final { scan-not-hidden "_ZN1A1a" } } +// { dg-final { scan-not-hidden "_ZN1B1b" } } +// { dg-final { scan-not-hidden "k" } } +// { dg-final { scan-not-hidden "l" } } + +struct __declspec(dllexport) A { + void f(); + static int a; +}; + +void A::f() {} + +int A::a; + +__declspec(dllexport) void g() {} + +__declspec(dllexport) void h(); +void h() {} + +struct B { + B(); + __declspec(dllexport) virtual ~B(); + void i(); + __declspec(dllexport) void j(); + __declspec(dllexport) static int b; +}; + +__declspec(dllexport) B::B() {} + +B::~B() {} + +__declspec(dllexport) void B::i() {} + +void B::j() {} + +int B::b; + +__declspec(dllexport) int k; + +__declspec(dllexport) extern int l; +int l; diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-9.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-9.C new file mode 100644 index 000000000..06b5a17e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-9.C @@ -0,0 +1,29 @@ +// Test that dllimport'd functions have default visibility. +// { dg-require-visibility "" } +// { dg-require-dll "" } +// { dg-options "-fvisibility=hidden" } +// { dg-final { scan-not-hidden "_Z2f1v" } } +// { dg-final { scan-not-hidden "_ZN1S2f3Ev" } } + +extern void __attribute__((dllimport)) f1(); +void f2() { + f1(); +} + +struct __attribute__((visibility("hidden")) S1 { + __attribute__((dllimport)) void f3(); +}; + +void f4() { + S1 s1; + s1.f3(); +} + +struct S2 { + __attribute__((dllimport)) void f5(); +}; + +void f6() { + S2 s2; + s2.f5(); +} diff --git a/gcc/testsuite/g++.dg/ext/visibility/warn2.C b/gcc/testsuite/g++.dg/ext/visibility/warn2.C new file mode 100644 index 000000000..475179fd6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/warn2.C @@ -0,0 +1,16 @@ +// Complain when a class is specified with greater visibility than one of +// its members' types or bases. + +// { dg-require-visibility "" } + +namespace N __attribute ((__visibility__ ("hidden"))) +{ + struct A { }; +} + +struct B // { dg-warning "visibility" } +{ + N::A a; +}; + +struct C: public N::A { }; // { dg-warning "visibility" } diff --git a/gcc/testsuite/g++.dg/ext/visibility/warn3.C b/gcc/testsuite/g++.dg/ext/visibility/warn3.C new file mode 100644 index 000000000..d1d3ba486 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/warn3.C @@ -0,0 +1,26 @@ +// Tests for various visibility mismatch situations. + +// { dg-require-visibility "" } + +// { dg-final { scan-not-hidden "_ZN1A1fEv" } } + +struct __attribute ((visibility ("hidden"))) A +{ + // This is OK, A::f gets default visibility. + __attribute ((visibility ("default"))) void f (); +}; + +void A::f() { } + +// This gets a warning because B objects might rely +// on hidden symbols from A. +struct B // { dg-warning "visibility" } +{ + A a; +}; + +// This one has explicit visibility, so it doesn't get a warning. +struct __attribute ((visibility ("default"))) C +{ + A a; +}; diff --git a/gcc/testsuite/g++.dg/ext/visibility/warn4.C b/gcc/testsuite/g++.dg/ext/visibility/warn4.C new file mode 100644 index 000000000..33e6f6785 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/warn4.C @@ -0,0 +1,10 @@ +// Warn if we try to give an instantiation visibility after it's already +// been instantiated. + +// { dg-require-visibility "" } + +template <class T> struct A { void f (T); }; +template <class T> void A<T>::f (T) { } + +A<double> ad; +template struct __attribute ((visibility ("hidden"))) A<double>; // { dg-warning "already defined" } diff --git a/gcc/testsuite/g++.dg/ext/vla1.C b/gcc/testsuite/g++.dg/ext/vla1.C new file mode 100644 index 000000000..f3725354f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vla1.C @@ -0,0 +1,26 @@ +// { dg-do compile } + +// Crash tests from PR middle-end/6994. See also gcc.dg/vla-2.c. +// A::A is acceptable extended C++ (VLA types brought over from C99); +// B::B is not, but is closely related to acceptable extended C, though +// not to acceptable C99. + +class A { A (int); }; + +A::A (int i) +{ + int ar[1][i]; // { dg-error "variable length array" } + + ar[0][0] = 0; +} + +class B { B (int); }; + +B::B (int i) +{ + struct S { + int ar[1][i]; // { dg-error "array" } + } s; + + s.ar[0][0] = 0; // { dg-prune-output "no member" } +} diff --git a/gcc/testsuite/g++.dg/ext/vla10.C b/gcc/testsuite/g++.dg/ext/vla10.C new file mode 100644 index 000000000..17cdb2f9f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vla10.C @@ -0,0 +1,32 @@ +// PR c++/48446 +// { dg-options "" } + +template<typename T> +struct A +{ + ~A (); + T *operator-> () const; +}; + +struct B +{ + typedef A <B> P; + static P foo (int); +}; + +struct C +{ + typedef A<C> P; + static const int c = 80; +}; + +C::P bar (); + +void +baz () +{ + char z[bar ()->c]; + { + B::P m = B::foo (sizeof (z)); + } +} diff --git a/gcc/testsuite/g++.dg/ext/vla2.C b/gcc/testsuite/g++.dg/ext/vla2.C new file mode 100644 index 000000000..f6a9debca --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vla2.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// { dg-options "" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 21 Mar 2003 <nathan@codesourcery.com> + +// PR 9708. We unified a VLA size as a constant. Then issued bogus +// errors. + +template <unsigned int N> +char* begin(char (&a) [N] ); // { dg-message "note" } + +void bar(int i) +{ + char d[i] ; + + begin(d); // { dg-error "no matching function" "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 17 } +} diff --git a/gcc/testsuite/g++.dg/ext/vla3.C b/gcc/testsuite/g++.dg/ext/vla3.C new file mode 100644 index 000000000..329cc7dde --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vla3.C @@ -0,0 +1,24 @@ +// PR c++/28903 +// { dg-options "" } + +template <class> +struct View +{ + int n; +}; +template <class ViewA> +struct ViewDom : View<ViewA> +{ + using View<ViewA>::n; + ViewDom(); +}; +template <class ViewA> +ViewDom<ViewA>::ViewDom() +{ + char a[n]; +} +void element( ) +{ + ViewDom<int> a; +} + diff --git a/gcc/testsuite/g++.dg/ext/vla4.C b/gcc/testsuite/g++.dg/ext/vla4.C new file mode 100644 index 000000000..ecec90807 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vla4.C @@ -0,0 +1,21 @@ +// PR c++/29318 +// { dg-options "" } + +#include <typeinfo> + +void f(int i) { + try { + int a[i]; + throw &a; // { dg-error "variable size" } + } catch (int (*)[i]) { // { dg-error "variable size" } + } +} + +int main() +{ + int i = 5; + int va[i]; + const std::type_info& info(typeid(&va)); // { dg-error "variable size" } + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/vla5.C b/gcc/testsuite/g++.dg/ext/vla5.C new file mode 100644 index 000000000..021d48469 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vla5.C @@ -0,0 +1,10 @@ +// PR c++/37417 +// Testcase by Martin Michlmayr <tbm@cyrius.com> +// { dg-do compile } +// { dg-options "-O" } + +void +test (int a) +{ + new (char[a]); +} diff --git a/gcc/testsuite/g++.dg/ext/vla6.C b/gcc/testsuite/g++.dg/ext/vla6.C new file mode 100644 index 000000000..83011f2f0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vla6.C @@ -0,0 +1,18 @@ +// PR c++/28879 +// { dg-options "" } + +struct A +{ + int i; + A(): i(1) {} +}; + +template<int> void foo() +{ + int x[A().i]; +} + +void f() +{ + foo<1>(); +} diff --git a/gcc/testsuite/g++.dg/ext/vla7.C b/gcc/testsuite/g++.dg/ext/vla7.C new file mode 100644 index 000000000..5246f9c8c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vla7.C @@ -0,0 +1,30 @@ +// PR c++/40013 +// { dg-options "" } + +template <class T> +struct A +{ + struct B + { + struct + { + int fn () { return 0; } + } b; + }; + void test (); +}; + +template <class T> +void +A <T>::test () +{ + B a; + int vla[a.b.fn ()]; +} + +int +main () +{ + A <char> a; + a.test (); +} diff --git a/gcc/testsuite/g++.dg/ext/vla8.C b/gcc/testsuite/g++.dg/ext/vla8.C new file mode 100644 index 000000000..7b7428d07 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vla8.C @@ -0,0 +1,15 @@ +// PR c++/42387 +// { dg-options "" } + +template<class PF> +struct AvlTreeIter +{ + int Num(); + + AvlTreeIter() + { + new (void* [Num()]); + } +}; + +AvlTreeIter<int> a; diff --git a/gcc/testsuite/g++.dg/ext/vla9.C b/gcc/testsuite/g++.dg/ext/vla9.C new file mode 100644 index 000000000..c58edbc9b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vla9.C @@ -0,0 +1,38 @@ +// PR c++/43555 +// { dg-options "" } +// { dg-do run } + +extern "C" void * malloc (__SIZE_TYPE__); +extern "C" int printf (const char *, ...); +extern "C" void abort(void); + +int nx,ny; + +void f(double *x1d,int choice) +{ + double (*x2d)[nx][ny]=(double(*)[nx][ny])x1d; + unsigned long delta; +// (*x2d)[0][0]=123; // <- this line affects the result + if (choice!=0) + { + delta=&(*x2d)[1][0]-x1d; + } + else + { + delta=&(*x2d)[1][0]-x1d; + } + printf("Choice: %d, Delta: %ld\n",choice,delta); + if (delta != ny) + abort (); +} + +int main() +{ + double *data; + nx=100; + ny=100; + data=(double*)malloc(nx*ny*sizeof(double)); + f(data,0); + f(data,1); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/vlm1.C b/gcc/testsuite/g++.dg/ext/vlm1.C new file mode 100644 index 000000000..9cb6c38be --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vlm1.C @@ -0,0 +1,13 @@ +// { dg-options "" } + +template <class T> struct A {}; + +struct B { + static const int s; + A<int[s]> a; // { dg-error "array|template" } +}; + +const int B::s=16; + +B b; + diff --git a/gcc/testsuite/g++.dg/ext/vlm2.C b/gcc/testsuite/g++.dg/ext/vlm2.C new file mode 100644 index 000000000..3a0b33526 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vlm2.C @@ -0,0 +1,13 @@ +// { dg-options "" } + +int n; + +struct Y +{ + void f () { + typedef int X[n]; + struct Z { + X x; // { dg-error "variably modified" } + }; + } +}; diff --git a/gcc/testsuite/g++.dg/ext/weak1.C b/gcc/testsuite/g++.dg/ext/weak1.C new file mode 100644 index 000000000..b7a448f37 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/weak1.C @@ -0,0 +1,13 @@ +// Test for #pragma weak where the weak alias symbol isn't declared, +// although the symbol it is an alias for is defined in the +// translation unit. Bug 7544. +// Origin: Joseph Myers <joseph@codesourcery.com> +// { dg-do compile } +// { dg-require-weak "" } +// { dg-require-alias "" } +// { dg-options "-fno-common" } + +// { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?bar1" } } + +#pragma weak bar1 = foo1 +extern "C" void foo1 (void) {} diff --git a/gcc/testsuite/g++.dg/ext/weak2.C b/gcc/testsuite/g++.dg/ext/weak2.C new file mode 100644 index 000000000..1bf2ddcb4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/weak2.C @@ -0,0 +1,17 @@ +// Test for #pragma weak with declaration not at file scope. +// { dg-do compile } +// { dg-require-weak "" } +// { dg-options "" } + +// { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?_Z3foov" } } + +#pragma weak _Z3foov + +int +main (void) +{ + extern int foo (void); + if (&foo) + return foo (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/weak3.C b/gcc/testsuite/g++.dg/ext/weak3.C new file mode 100644 index 000000000..360821acc --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/weak3.C @@ -0,0 +1,17 @@ +// PR c++/20961 +// Test for #pragma weak and __attribute__((weak)) being used together. +// { dg-do compile } +// { dg-require-weak "" } +// { dg-options "" } + +// { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?_Z3foov" } } + +int foo (); +#pragma weak foo + +int +__attribute__((weak)) +foo () +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/func-args-1.C b/gcc/testsuite/g++.dg/func-args-1.C new file mode 100644 index 000000000..4b2efd83d --- /dev/null +++ b/gcc/testsuite/g++.dg/func-args-1.C @@ -0,0 +1,53 @@ +/* Test messages for wrong number of arguments to function. */ +/* Origin: Joseph Myers <jsm@polyomino.org.uk> */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +void f0(void); /* { dg-message "note: declared here" } */ +void f1(int); /* { dg-message "note: declared here" } */ +void f1v(int, ...); /* { dg-message "note: declared here" } */ +void f2(int, int); /* { dg-message "note: declared here" } */ +void f2v(int, int, ...); /* { dg-message "note: declared here" } */ + +struct s { + void (*f0)(void); + void (*f1)(int); + void (*f1v)(int, ...); + void (*f2)(int, int); + void (*f2v)(int, int, ...); +} x; + +void +g (int a) +{ + f0(); + x.f0(); + f0(a); /* { dg-error "too many arguments to function" } */ + x.f0(a); /* { dg-error "too many arguments to function" } */ + f0(a, a); /* { dg-error "too many arguments to function" } */ + x.f0(a, a); /* { dg-error "too many arguments to function" } */ + f1(); /* { dg-error "too few arguments to function" } */ + x.f1(); /* { dg-error "too few arguments to function" } */ + f1(a); + x.f1(a); + f1(a, a); /* { dg-error "too many arguments to function" } */ + x.f1(a, a); /* { dg-error "too many arguments to function" } */ + f1v(); /* { dg-error "too few arguments to function" } */ + x.f1v(); /* { dg-error "too few arguments to function" } */ + f1v(a); + x.f1v(a); + f1v(a, a); + x.f1v(a, a); + f2(a); /* { dg-error "too few arguments to function" } */ + x.f2(a); /* { dg-error "too few arguments to function" } */ + f2(a, a); + x.f2(a, a); + f2(a, a, a); /* { dg-error "too many arguments to function" } */ + x.f2(a, a, a); /* { dg-error "too many arguments to function" } */ + f2v(a); /* { dg-error "too few arguments to function" } */ + x.f2v(a); /* { dg-error "too few arguments to function" } */ + f2v(a, a); + x.f2v(a, a); + f2v(a, a, a); + x.f2v(a, a, a); +} diff --git a/gcc/testsuite/g++.dg/gcov/gcov-1.C b/gcc/testsuite/g++.dg/gcov/gcov-1.C new file mode 100644 index 000000000..c279b1452 --- /dev/null +++ b/gcc/testsuite/g++.dg/gcov/gcov-1.C @@ -0,0 +1,313 @@ +/* Check that execution counts and branch probabilities for various C + constructs are reported correctly by gcov. */ + +/* { dg-options "-fprofile-arcs -ftest-coverage" } */ +/* { dg-do run { target native } } */ + +extern "C" void abort (void); + +int do_something (int i) +{ + return i; +} + +/* Check static inline functions. */ + +int unref_val; + +static inline int +unreferenced (int i, int j) +{ + return i - j; +} + +static inline int +uncalled (int i, int j) +{ + return i * j; +} + +static inline int +called (int i, int j) +{ + return i + j; /* count(1) */ +} + +void +call_unref () +{ + if (unref_val) /* count(1) */ + unref_val = uncalled (1, 2); + unref_val = called (unref_val, 4); /* count(1) */ +} + + +/* Check for loops. */ + +int for_val1; +int for_val2; +int for_temp; + +int +test_for1 (int n) +{ + int i; + for_temp = 1; /* count(3) */ + for (i = 0; i < n; i++) /* branch(25) */ + /* branch(end) */ + for_temp++; /* count(9) */ + return for_temp; /* count(3) */ +} + +int +test_for2 (int m, int n, int o) +{ + int i, j, k; + for_temp = 1; /* count(6) */ + for (i = 0; i < n; i++) /* branch(30) */ + /* branch(end) */ + for (j = 0; j < m; j++) /* branch(32) */ + /* branch(end) */ + for (k = 0; k < o; k++) /* branch(27) */ + /* branch(end) */ + for_temp++; /* count(81) */ + return for_temp; /* count(6) */ +} + +int +call_for () +{ + for_val1 += test_for1 (0); + for_val1 += test_for1 (2); + for_val1 += test_for1 (7); + + for_val2 += test_for2 (0, 0, 0); + for_val2 += test_for2 (1, 0, 0); + for_val2 += test_for2 (1, 3, 0); + for_val2 += test_for2 (1, 3, 1); + for_val2 += test_for2 (3, 1, 5); + for_val2 += test_for2 (3, 7, 3); +} + +/* Check the use of goto. */ + +int goto_val; + +int +test_goto1 (int f) +{ + /* branch(50) */ + if (f) /* count(2) */ + /* branch(end) */ + goto lab1; /* count(1) */ + return 1; /* count(1) */ +lab1: + return 2; /* count(1) */ +} + +int +test_goto2 (int f) +{ + int i; + /* branch(7) */ + for (i = 0; i < 10; i++) /* count(15) */ + /* branch(end) */ + if (i == f) goto lab2; /* count(14) */ + return 4; /* count(1) */ +lab2: + return 8; /* count(1) */ +} + +void +call_goto () +{ + goto_val += test_goto1 (0); + goto_val += test_goto1 (1); + goto_val += test_goto2 (3); + goto_val += test_goto2 (30); +} + +/* Check nested if-then-else statements. */ + +int ifelse_val1; +int ifelse_val2; +int ifelse_val3; + +int +test_ifelse1 (int i, int j) +{ + int result = 0; + /* branch(40) */ + if (i) /* count(5) */ + /* branch(0) */ + if (j) /* count(3) */ + /* branch(end) */ + result = do_something (4); /* count(3) */ + else + result = do_something (1024); + else + /* branch(50) */ + if (j) /* count(2) */ + /* branch(end) */ + result = do_something (1); /* count(1) */ + else + result = do_something (2); /* count(1) */ + /* branch(80) */ + if (i > j) /* count(5) */ + /* branch(end) */ + result = do_something (result*2); /* count(1) */ + /* branch(80) */ + if (i > 10) /* count(5) */ + /* branch(100) */ + if (j > 10) /* count(1) */ + /* branch(end) */ + result = do_something (result*4); /* count(1) */ + return result; /* count(5) */ +} + +int +test_ifelse2 (int i) +{ + int result = 0; + /* branch(83) */ + if (!i) /* count(6) */ + /* branch(end) */ + result = do_something (1); /* count(1) */ + /* branch(100) */ + if (i == 1) /* count(6) */ + /* branch(end) */ + result = do_something (1024); + /* branch(50) */ + if (i == 2) /* count(6) */ + /* branch(end) */ + result = do_something (2); /* count(3) */ + /* branch(67) */ + if (i == 3) /* count(6) */ + /* branch(end) */ + return do_something (8); /* count(2) */ + /* branch(100) */ + if (i == 4) /* count(4) */ + /* branch(end) */ + return do_something (2048); + return result; /* count(4) */ +} + +int +test_ifelse3 (int i, int j) +{ + int result = 1; + /* branch(27 50 75) */ + if (i > 10 && j > i && j < 20) /* count(11) */ + /* branch(end) */ + result = do_something (16); /* count(1) */ + /* branch(55) */ + if (i > 20) /* count(11) */ + /* branch(60) */ + if (j > i) /* count(5) */ + /* branch(50) */ + if (j < 30) /* count(2) */ + /* branch(end) */ + result = do_something (32); /* count(1) */ + /* branch(9 10 89) */ + if (i == 3 || j == 47 || i == j) /* count(11) */ + /* branch(end) */ + result = do_something (64); /* count(3) */ + return result; /* count(11) */ +} + +void +call_ifelse () +{ + ifelse_val1 += test_ifelse1 (0, 2); + ifelse_val1 += test_ifelse1 (0, 0); + ifelse_val1 += test_ifelse1 (1, 2); + ifelse_val1 += test_ifelse1 (10, 2); + ifelse_val1 += test_ifelse1 (11, 11); + + ifelse_val2 += test_ifelse2 (0); + ifelse_val2 += test_ifelse2 (2); + ifelse_val2 += test_ifelse2 (2); + ifelse_val2 += test_ifelse2 (2); + ifelse_val2 += test_ifelse2 (3); + ifelse_val2 += test_ifelse2 (3); + + ifelse_val3 += test_ifelse3 (11, 19); + ifelse_val3 += test_ifelse3 (25, 27); + ifelse_val3 += test_ifelse3 (11, 22); + ifelse_val3 += test_ifelse3 (11, 10); + ifelse_val3 += test_ifelse3 (21, 32); + ifelse_val3 += test_ifelse3 (21, 20); + ifelse_val3 += test_ifelse3 (1, 2); + ifelse_val3 += test_ifelse3 (32, 31); + ifelse_val3 += test_ifelse3 (3, 0); + ifelse_val3 += test_ifelse3 (0, 47); + ifelse_val3 += test_ifelse3 (65, 65); +} + +/* Check switch statements. */ + +int switch_val, switch_m; + +int +test_switch (int i, int j) +{ + int result = 0; /* count(5) */ + + /* branch(20 0 60 20) */ + switch (i) /* count(5) */ + /* branch(end) */ + { + case 1: + result = do_something (2); /* count(1) */ + break; + case 2: + result = do_something (1024); + break; + case 3: + case 4: + /* branch(67) */ + if (j == 2) /* count(3) */ + /* branch(end) */ + return do_something (4); /* count(1) */ + result = do_something (8); /* count(2) */ + break; + default: + result = do_something (32); /* count(1) */ + switch_m++; /* count(1) */ + break; + } + return result; /* count(4) */ +} + +void +call_switch () +{ + switch_val += test_switch (1, 0); + switch_val += test_switch (3, 0); + switch_val += test_switch (3, 2); + switch_val += test_switch (4, 0); + switch_val += test_switch (16, 0); + switch_val += switch_m; +} + +int +main() +{ + call_for (); + call_goto (); + call_ifelse (); + call_switch (); + call_unref (); + if ((for_val1 != 12) + || (for_val2 != 87) + || (goto_val != 15) + || (ifelse_val1 != 31) + || (ifelse_val2 != 23) + || (ifelse_val3 != 246) + || (switch_val != 55) + || (unref_val != 4)) + abort (); + return 0; +} + +/* { dg-final { run-gcov branches { -b gcov-1.C } } } */ diff --git a/gcc/testsuite/g++.dg/gcov/gcov-2.C b/gcc/testsuite/g++.dg/gcov/gcov-2.C new file mode 100644 index 000000000..66d8af39b --- /dev/null +++ b/gcc/testsuite/g++.dg/gcov/gcov-2.C @@ -0,0 +1,32 @@ +/* Verify line coverage counts for simple member functions. */ + +/* { dg-options "-fprofile-arcs -ftest-coverage" } */ +/* { dg-do run { target native } } */ + +class C { +public: + C() + { + i = 0; /* count(1) */ + } + ~C() {} + void seti (int j) + { + i = j; /* count(1) */ + } +private: + int i; +}; + +void foo() +{ + C c; /* count(1) */ + c.seti (1); /* count(1) */ +} + +int main() +{ + foo(); /* count(1) */ +} + +/* { dg-final { run-gcov gcov-2.C } } */ diff --git a/gcc/testsuite/g++.dg/gcov/gcov-3.C b/gcc/testsuite/g++.dg/gcov/gcov-3.C new file mode 100644 index 000000000..aff063a4b --- /dev/null +++ b/gcc/testsuite/g++.dg/gcov/gcov-3.C @@ -0,0 +1,17 @@ +/* Check that gcov doesn't abort when a static object is defined + within a header file. */ + +/* { dg-options "-fprofile-arcs -ftest-coverage" } */ +/* { dg-do run { target native } } */ + +#include "gcov-3.h" + +extern int foo(); + +int +main () +{ + return foo(); /* count(1) */ +} + +/* { dg-final { run-gcov gcov-3.C } } */ diff --git a/gcc/testsuite/g++.dg/gcov/gcov-3.h b/gcc/testsuite/g++.dg/gcov/gcov-3.h new file mode 100644 index 000000000..1c7ca00dd --- /dev/null +++ b/gcc/testsuite/g++.dg/gcov/gcov-3.h @@ -0,0 +1,31 @@ +/* Leave unused lines for at least the length of the including source file. */ + + + + + + + + + + + + + + + + + + + +struct T { + int i; + T() { i = 0; } +}; + +T t; + +int foo() +{ + return t.i; /* count(1) */ +} diff --git a/gcc/testsuite/g++.dg/gcov/gcov-4.C b/gcc/testsuite/g++.dg/gcov/gcov-4.C new file mode 100644 index 000000000..2f83ff1be --- /dev/null +++ b/gcc/testsuite/g++.dg/gcov/gcov-4.C @@ -0,0 +1,41 @@ +/* Check that execution counts and branch probabilities for various C + constructs are reported correctly by gcov. */ + +#include <stdio.h> + +/* { dg-options "-fprofile-arcs -ftest-coverage -fno-exceptions" } */ +/* { dg-do run { target native } } */ + +class foo { +public: + foo() { printf("foo()\n"); }; + ~foo() { printf("~foo()\n"); }; + void method(void) { printf("method()\n"); }; +}; + +int func(int i, int j) __attribute__((noinline)); + +int func(int i, int j){ + if (j) { + printf("unreachable\n"); + return 3; + } + + foo f; + + if (i == 1) { + f.method(); + f.method(); + } else { + f.method(); + printf("unreachable\n"); + return 2; /* count(#####) */ + } + f.method(); + return 0; +} + +int main() { + return func(1, 0); +} +/* { dg-final { run-gcov gcov-4.C } } */ diff --git a/gcc/testsuite/g++.dg/gcov/gcov-5.C b/gcc/testsuite/g++.dg/gcov/gcov-5.C new file mode 100644 index 000000000..9ada41802 --- /dev/null +++ b/gcc/testsuite/g++.dg/gcov/gcov-5.C @@ -0,0 +1,50 @@ +/* Check that execution counts for template functions + are reported correctly by gcov. */ + +#include <stdio.h> +#include <stdlib.h> + +/* { dg-options "-fprofile-arcs -ftest-coverage -fno-inline" } */ +/* { dg-do run { target native } } */ + +class A { + int count; + public: + A(int c) { count = c; } + void func(void) { printf("func\n"); } + bool done(void) { + return (count == 0) ? true : (count-- != 0); + } + void run(void) { abort(); } +}; + +//typedef A T; +template<class T> +void WithoutBrace(T *a) { + while (!a->done()) + a->run(); /* count(#####) */ +} /* count(1) */ + +template<class T> +void WithBrace(T *a) +{ + while (!a->done()) + { + a->run(); /* count(#####) */ + } +} /* count(1) */ + +A *func(A *a) +{ + WithoutBrace(a); + WithBrace(a); + return a; +} + +int main() { + A a(0); + func(&a); + return 0; +} + +/* { dg-final { run-gcov gcov-5.C } } */ diff --git a/gcc/testsuite/g++.dg/gcov/gcov-6.C b/gcc/testsuite/g++.dg/gcov/gcov-6.C new file mode 100644 index 000000000..53a2b20bf --- /dev/null +++ b/gcc/testsuite/g++.dg/gcov/gcov-6.C @@ -0,0 +1,29 @@ +// PR gcov-profile/34609 +// { dg-do compile } +// { dg-options "-O -ftest-coverage" } + +struct A +{ + int i; + int &get () { return i; } +}; + +inline A foo () +{ + A a; + a.get (); + return a; +} + +inline A bar () +{ + return foo (); +} + +void baz () +{ + A a; + a = bar (); +} + +// { dg-final { cleanup-coverage-files } } diff --git a/gcc/testsuite/g++.dg/gcov/gcov.exp b/gcc/testsuite/g++.dg/gcov/gcov.exp new file mode 100644 index 000000000..08e00c45d --- /dev/null +++ b/gcc/testsuite/g++.dg/gcov/gcov.exp @@ -0,0 +1,44 @@ +# Copyright (C) 1997, 2001, 2002, 2007 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# Gcov test driver. + +# Load support procs. +load_lib g++-dg.exp +load_lib gcov.exp + +global GXX_UNDER_TEST + +# Find gcov in the same directory as $GXX_UNDER_TEST. +if { ![is_remote host] && [string match "*/*" [lindex $GXX_UNDER_TEST 0]] } { + set GCOV [file dirname [lindex $GXX_UNDER_TEST 0]]/gcov +} else { + set GCOV gcov +} + +# Initialize harness. +dg-init + +# Delete old .gcda files. +set files [glob -nocomplain gcov-*.gcda] +if { $files != "" } { + eval "remote_file build delete $files" +} + +# Main loop. +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C]] "" "" + +dg-finish diff --git a/gcc/testsuite/g++.dg/gomp/atomic-1.C b/gcc/testsuite/g++.dg/gomp/atomic-1.C new file mode 100644 index 000000000..3e4bc569b --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/atomic-1.C @@ -0,0 +1,99 @@ +/* { dg-do compile } */ + +int x; +volatile int y; +volatile unsigned char z; + +void f1(void) +{ + #pragma omp atomic + x++; + #pragma omp atomic + x--; + #pragma omp atomic + ++x; + #pragma omp atomic + --x; + #pragma omp atomic + x += 1; + #pragma omp atomic + x -= y; + #pragma omp atomic + x |= 1; + #pragma omp atomic + x &= 1; + #pragma omp atomic + x ^= 1; + #pragma omp atomic + x *= 3; + #pragma omp atomic + x /= 3; + #pragma omp atomic + x /= 3; + #pragma omp atomic + x <<= 3; + #pragma omp atomic + x >>= 3; +} + +void f2(void) +{ + #pragma omp atomic + y++; + #pragma omp atomic + y--; + #pragma omp atomic + ++y; + #pragma omp atomic + --y; + #pragma omp atomic + y += 1; + #pragma omp atomic + y -= x; + #pragma omp atomic + y |= 1; + #pragma omp atomic + y &= 1; + #pragma omp atomic + y ^= 1; + #pragma omp atomic + y *= 3; + #pragma omp atomic + y /= 3; + #pragma omp atomic + y /= 3; + #pragma omp atomic + y <<= 3; + #pragma omp atomic + y >>= 3; +} + +void f3(void) +{ + #pragma omp atomic + z++; + #pragma omp atomic + z--; + #pragma omp atomic + ++z; + #pragma omp atomic + --z; + #pragma omp atomic + z += 1; + #pragma omp atomic + z |= 1; + #pragma omp atomic + z &= 1; + #pragma omp atomic + z ^= 1; + #pragma omp atomic + z *= 3; + #pragma omp atomic + z /= 3; + #pragma omp atomic + z /= 3; + #pragma omp atomic + z <<= 3; + #pragma omp atomic + z >>= 3; +} diff --git a/gcc/testsuite/g++.dg/gomp/atomic-10.C b/gcc/testsuite/g++.dg/gomp/atomic-10.C new file mode 100644 index 000000000..fe64f0f06 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/atomic-10.C @@ -0,0 +1,24 @@ +// PR middle-end/28046 +// { dg-do compile } +// { dg-options "-fopenmp -fdump-tree-ompexp" } + +int a[3], b; +struct C { int x; int y; } c; + +int bar (void), *baz (void); + +void +foo (void) +{ +#pragma omp atomic + a[2] += bar (); +#pragma omp atomic + b += bar (); +#pragma omp atomic + c.y += bar (); +#pragma omp atomic + *baz () += bar (); +} + +// { dg-final { scan-tree-dump-times "__sync_fetch_and_add" 4 "ompexp" { target i?86-*-* x86_64-*-* ia64-*-* powerpc*-*-* alpha*-*-* } } } +// { dg-final { cleanup-tree-dump "ompexp" } } diff --git a/gcc/testsuite/g++.dg/gomp/atomic-11.C b/gcc/testsuite/g++.dg/gomp/atomic-11.C new file mode 100644 index 000000000..618c4c8e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/atomic-11.C @@ -0,0 +1,306 @@ +/* PR middle-end/45423 */ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-gimple -g0" } */ +/* atomicvar should never be referenced in between the barrier and + following #pragma omp atomic_load. */ +/* { dg-final { scan-tree-dump-not "barrier\[^#\]*atomicvar" "gimple" } } */ +/* { dg-final { cleanup-tree-dump "gimple" } } */ + +#ifdef __cplusplus +bool atomicvar, c; +#else +_Bool atomicvar, c; +#endif +int i, atomicvar2, c2; + +int +foo (void) +{ + #pragma omp barrier + #pragma omp atomic + atomicvar |= -1; + #pragma omp barrier + #pragma omp atomic + atomicvar |= 0; + #pragma omp barrier + #pragma omp atomic + atomicvar |= 1; + #pragma omp barrier + #pragma omp atomic + atomicvar |= 2; + #pragma omp barrier + #pragma omp atomic + atomicvar |= c; + #pragma omp barrier + #pragma omp atomic + atomicvar ^= -1; + #pragma omp barrier + #pragma omp atomic + atomicvar ^= 0; + #pragma omp barrier + #pragma omp atomic + atomicvar ^= 1; + #pragma omp barrier + #pragma omp atomic + atomicvar ^= 2; + #pragma omp barrier + #pragma omp atomic + atomicvar ^= c; + #pragma omp barrier + #pragma omp atomic + atomicvar &= -1; + #pragma omp barrier + #pragma omp atomic + atomicvar &= 0; + #pragma omp barrier + #pragma omp atomic + atomicvar &= 1; + #pragma omp barrier + #pragma omp atomic + atomicvar &= 2; + #pragma omp barrier + #pragma omp atomic + atomicvar &= c; + #pragma omp barrier + #pragma omp atomic + atomicvar += -1; + #pragma omp barrier + #pragma omp atomic + atomicvar += 0; + #pragma omp barrier + #pragma omp atomic + atomicvar += 1; + #pragma omp barrier + #pragma omp atomic + atomicvar += 2; + #pragma omp barrier + #pragma omp atomic + atomicvar += c; + #pragma omp barrier + #pragma omp atomic + atomicvar -= -1; + #pragma omp barrier + #pragma omp atomic + atomicvar -= 0; + #pragma omp barrier + #pragma omp atomic + atomicvar -= 1; + #pragma omp barrier + #pragma omp atomic + atomicvar -= 2; + #pragma omp barrier + #pragma omp atomic + atomicvar -= c; + #pragma omp barrier + #pragma omp atomic + atomicvar *= -1; + #pragma omp barrier + #pragma omp atomic + atomicvar *= 0; + #pragma omp barrier + #pragma omp atomic + atomicvar *= 1; + #pragma omp barrier + #pragma omp atomic + atomicvar *= 2; + #pragma omp barrier + #pragma omp atomic + atomicvar *= c; + #pragma omp barrier + #pragma omp atomic + atomicvar /= -1; + #pragma omp barrier + #pragma omp atomic + atomicvar /= 1; + #pragma omp barrier + #pragma omp atomic + atomicvar /= 2; + #pragma omp barrier + #pragma omp atomic + atomicvar /= c; + #pragma omp barrier + #pragma omp atomic + atomicvar <<= 0; + #pragma omp barrier + #pragma omp atomic + atomicvar <<= 1; + #pragma omp barrier + #pragma omp atomic + atomicvar <<= 2; + #pragma omp barrier + #pragma omp atomic + atomicvar <<= i; + #pragma omp barrier + #pragma omp atomic + atomicvar >>= 0; + #pragma omp barrier + #pragma omp atomic + atomicvar >>= 1; + #pragma omp barrier + #pragma omp atomic + atomicvar >>= 2; + #pragma omp barrier + #pragma omp atomic + atomicvar >>= i; + #pragma omp barrier + #pragma omp atomic + atomicvar++; + #pragma omp barrier + #pragma omp atomic + ++atomicvar; + #pragma omp barrier +#ifndef __cplusplus + #pragma omp atomic + atomicvar--; + #pragma omp barrier + #pragma omp atomic + --atomicvar; + #pragma omp barrier +#endif + return 0; +} + +int +bar (void) +{ + #pragma omp barrier + #pragma omp atomic + atomicvar2 |= -1; + #pragma omp barrier + #pragma omp atomic + atomicvar2 |= 0; + #pragma omp barrier + #pragma omp atomic + atomicvar2 |= 1; + #pragma omp barrier + #pragma omp atomic + atomicvar2 |= 2; + #pragma omp barrier + #pragma omp atomic + atomicvar2 |= c2; + #pragma omp barrier + #pragma omp atomic + atomicvar2 ^= -1; + #pragma omp barrier + #pragma omp atomic + atomicvar2 ^= 0; + #pragma omp barrier + #pragma omp atomic + atomicvar2 ^= 1; + #pragma omp barrier + #pragma omp atomic + atomicvar2 ^= 2; + #pragma omp barrier + #pragma omp atomic + atomicvar2 ^= c2; + #pragma omp barrier + #pragma omp atomic + atomicvar2 &= -1; + #pragma omp barrier + #pragma omp atomic + atomicvar2 &= 0; + #pragma omp barrier + #pragma omp atomic + atomicvar2 &= 1; + #pragma omp barrier + #pragma omp atomic + atomicvar2 &= 2; + #pragma omp barrier + #pragma omp atomic + atomicvar2 &= c2; + #pragma omp barrier + #pragma omp atomic + atomicvar2 += -1; + #pragma omp barrier + #pragma omp atomic + atomicvar2 += 0; + #pragma omp barrier + #pragma omp atomic + atomicvar2 += 1; + #pragma omp barrier + #pragma omp atomic + atomicvar2 += 2; + #pragma omp barrier + #pragma omp atomic + atomicvar2 += c2; + #pragma omp barrier + #pragma omp atomic + atomicvar2 -= -1; + #pragma omp barrier + #pragma omp atomic + atomicvar2 -= 0; + #pragma omp barrier + #pragma omp atomic + atomicvar2 -= 1; + #pragma omp barrier + #pragma omp atomic + atomicvar2 -= 2; + #pragma omp barrier + #pragma omp atomic + atomicvar2 -= c2; + #pragma omp barrier + #pragma omp atomic + atomicvar2 *= -1; + #pragma omp barrier + #pragma omp atomic + atomicvar2 *= 0; + #pragma omp barrier + #pragma omp atomic + atomicvar2 *= 1; + #pragma omp barrier + #pragma omp atomic + atomicvar2 *= 2; + #pragma omp barrier + #pragma omp atomic + atomicvar2 *= c2; + #pragma omp barrier + #pragma omp atomic + atomicvar2 /= -1; + #pragma omp barrier + #pragma omp atomic + atomicvar2 /= 1; + #pragma omp barrier + #pragma omp atomic + atomicvar2 /= 2; + #pragma omp barrier + #pragma omp atomic + atomicvar2 /= c2; + #pragma omp barrier + #pragma omp atomic + atomicvar2 <<= 0; + #pragma omp barrier + #pragma omp atomic + atomicvar2 <<= 1; + #pragma omp barrier + #pragma omp atomic + atomicvar2 <<= 2; + #pragma omp barrier + #pragma omp atomic + atomicvar2 <<= i; + #pragma omp barrier + #pragma omp atomic + atomicvar2 >>= 0; + #pragma omp barrier + #pragma omp atomic + atomicvar2 >>= 1; + #pragma omp barrier + #pragma omp atomic + atomicvar2 >>= 2; + #pragma omp barrier + #pragma omp atomic + atomicvar2 >>= i; + #pragma omp barrier + #pragma omp atomic + atomicvar2++; + #pragma omp barrier + #pragma omp atomic + ++atomicvar2; + #pragma omp barrier + #pragma omp atomic + atomicvar2--; + #pragma omp barrier + #pragma omp atomic + --atomicvar2; + #pragma omp barrier + return 0; +} diff --git a/gcc/testsuite/g++.dg/gomp/atomic-12.C b/gcc/testsuite/g++.dg/gomp/atomic-12.C new file mode 100644 index 000000000..6c1f96502 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/atomic-12.C @@ -0,0 +1,9 @@ +/* PR middle-end/45423 */ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-gimple -g0 -O2" } */ +/* atomicvar should never be referenced in between the barrier and + following #pragma omp atomic_load. */ +/* { dg-final { scan-tree-dump-not "barrier\[^#\]*atomicvar" "gimple" } } */ +/* { dg-final { cleanup-tree-dump "gimple" } } */ + +#include "atomic-11.C" diff --git a/gcc/testsuite/g++.dg/gomp/atomic-13.C b/gcc/testsuite/g++.dg/gomp/atomic-13.C new file mode 100644 index 000000000..f8fc9d872 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/atomic-13.C @@ -0,0 +1,43 @@ +/* PR middle-end/45423 */ +/* { dg-do compile } */ +/* { dg-options "-fopenmp" } */ + +#ifdef __cplusplus +bool *baz (); +#else +_Bool *baz (); +#endif +int *bar (); + +int +foo (void) +{ + #pragma omp barrier + #pragma omp atomic + (*bar ())++; + #pragma omp barrier + #pragma omp atomic + ++(*bar ()); + #pragma omp barrier + #pragma omp atomic + (*bar ())--; + #pragma omp barrier + #pragma omp atomic + --(*bar ()); + #pragma omp barrier + #pragma omp atomic + (*baz ())++; + #pragma omp barrier + #pragma omp atomic + ++(*baz ()); +#ifndef __cplusplus + #pragma omp barrier + #pragma omp atomic + (*baz ())--; + #pragma omp barrier + #pragma omp atomic + --(*baz ()); + #pragma omp barrier +#endif + return 0; +} diff --git a/gcc/testsuite/g++.dg/gomp/atomic-14.C b/gcc/testsuite/g++.dg/gomp/atomic-14.C new file mode 100644 index 000000000..ae1eb50dc --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/atomic-14.C @@ -0,0 +1,19 @@ +// PR middle-end/45423 +// { dg-do compile } +// { dg-options "-fopenmp" } + +bool *baz (), atomicvar; + +int +foo (void) +{ + #pragma omp atomic + (*baz ())--; // { dg-error "invalid use of Boolean" } + #pragma omp atomic + --(*baz ()); // { dg-error "invalid use of Boolean" } + #pragma omp atomic + atomicvar--; // { dg-error "invalid use of Boolean" } + #pragma omp atomic + --atomicvar; // { dg-error "invalid use of Boolean" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/gomp/atomic-2.C b/gcc/testsuite/g++.dg/gomp/atomic-2.C new file mode 100644 index 000000000..720ec9e8b --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/atomic-2.C @@ -0,0 +1,23 @@ +/* { dg-do compile } */ + +float x, y; + +void f1(void) +{ + #pragma omp atomic + x++; + #pragma omp atomic + x--; + #pragma omp atomic + ++x; + #pragma omp atomic + --x; + #pragma omp atomic + x += 1; + #pragma omp atomic + x -= y; + #pragma omp atomic + x *= 3; + #pragma omp atomic + x /= 3; +} diff --git a/gcc/testsuite/g++.dg/gomp/atomic-3.C b/gcc/testsuite/g++.dg/gomp/atomic-3.C new file mode 100644 index 000000000..7ea792d34 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/atomic-3.C @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-ompexp" } */ + +int *xyzzy; + +void f1(void) +{ + #pragma omp atomic + xyzzy++; +} + +/* { dg-final { scan-tree-dump-times "xyzzy, 4" 1 "ompexp" { target i?86-*-* x86_64-*-* ia64-*-* powerpc*-*-* alpha*-*-* } } } */ +/* { dg-final { cleanup-tree-dump "ompexp" } } */ diff --git a/gcc/testsuite/g++.dg/gomp/atomic-4.C b/gcc/testsuite/g++.dg/gomp/atomic-4.C new file mode 100644 index 000000000..7f27370d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/atomic-4.C @@ -0,0 +1,24 @@ +/* { dg-do compile } */ + +int a[4]; +int *p; +struct S { int x; int y[4]; } s; +int *bar(void); + +void f1(void) +{ + #pragma omp atomic + a[4] += 1; + #pragma omp atomic + *p += 1; + #pragma omp atomic + s.x += 1; + #pragma omp atomic + s.y[*p] += 1; + #pragma omp atomic + s.y[*p] *= 42; + #pragma omp atomic + *bar() += 1; + #pragma omp atomic + *bar() *= 42; +} diff --git a/gcc/testsuite/g++.dg/gomp/atomic-5.C b/gcc/testsuite/g++.dg/gomp/atomic-5.C new file mode 100644 index 000000000..0f750c73d --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/atomic-5.C @@ -0,0 +1,34 @@ +/* { dg-do compile } */ + +int x; +const int y = 0; +int bar(void); + +void f1(void) +{ + #pragma omp atomic + x %= 2; /* { dg-error "invalid operator" } */ + #pragma omp atomic + x = x + 1; /* { dg-error "invalid operator" } */ + #pragma omp atomic + x = 1; /* { dg-error "invalid operator" } */ + #pragma omp atomic + ++y; /* { dg-error "read-only variable" } */ + #pragma omp atomic + y--; /* { dg-error "read-only variable" } */ + #pragma omp atomic + y += 1; /* { dg-error "read-only variable" } */ + #pragma omp atomic + bar(); /* { dg-error "invalid operator" } */ + #pragma omp atomic + bar() += 1; /* { dg-error "lvalue required" } */ + #pragma omp atomic a /* { dg-error "expected end of line" } */ + x++; + #pragma omp atomic + ; /* { dg-error "expected primary-expression" } */ + #pragma omp atomic + #pragma omp atomic /* { dg-error "not allowed" } */ + ; + /* Check that we didn't get stuck on the pragma eol marker. */ + undef; /* { dg-error "" } */ +} diff --git a/gcc/testsuite/g++.dg/gomp/atomic-6.C b/gcc/testsuite/g++.dg/gomp/atomic-6.C new file mode 100644 index 000000000..52ac40f2a --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/atomic-6.C @@ -0,0 +1,11 @@ +// { dg-do compile } +// { dg-options "-w -fopenmp" } + +int x[10], z; +double y[10]; + +void f1(void) +{ + #pragma omp atomic + x[z] /= y[z]; +} diff --git a/gcc/testsuite/g++.dg/gomp/atomic-7.C b/gcc/testsuite/g++.dg/gomp/atomic-7.C new file mode 100644 index 000000000..612e97f45 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/atomic-7.C @@ -0,0 +1,23 @@ +/* { dg-do compile } */ + +double x, y; + +void f2(void) +{ + #pragma omp atomic + y++; + #pragma omp atomic + y--; + #pragma omp atomic + ++y; + #pragma omp atomic + --y; + #pragma omp atomic + y += 1; + #pragma omp atomic + y -= x; + #pragma omp atomic + y *= 3; + #pragma omp atomic + y /= 3; +} diff --git a/gcc/testsuite/g++.dg/gomp/atomic-8.C b/gcc/testsuite/g++.dg/gomp/atomic-8.C new file mode 100644 index 000000000..2f04151f0 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/atomic-8.C @@ -0,0 +1,21 @@ +/* { dg-do compile } */ + +long double z; + +void f3(void) +{ + #pragma omp atomic + z++; + #pragma omp atomic + z--; + #pragma omp atomic + ++z; + #pragma omp atomic + --z; + #pragma omp atomic + z += 1; + #pragma omp atomic + z *= 3; + #pragma omp atomic + z /= 3; +} diff --git a/gcc/testsuite/g++.dg/gomp/atomic-9.C b/gcc/testsuite/g++.dg/gomp/atomic-9.C new file mode 100644 index 000000000..2fafbd409 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/atomic-9.C @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-ompexp" } */ + +volatile int *bar(void); + +void f1(void) +{ + #pragma omp atomic + *bar() += 1; +} + +/* { dg-final { scan-tree-dump-times "__sync_fetch_and_add" 1 "ompexp" { target i?86-*-* x86_64-*-* ia64-*-* powerpc*-*-* alpha*-*-* } } } */ +/* { dg-final { cleanup-tree-dump "ompexp" } } */ diff --git a/gcc/testsuite/g++.dg/gomp/barrier-1.C b/gcc/testsuite/g++.dg/gomp/barrier-1.C new file mode 100644 index 000000000..10ca553f9 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/barrier-1.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-gimple" } */ + +void f1(void) +{ + #pragma omp barrier +} + +void f2(bool p) +{ + if (p) + { + #pragma omp barrier + } +} + +/* { dg-final { scan-tree-dump-times "GOMP_barrier" 2 "gimple" } } */ +/* { dg-final { cleanup-tree-dump "gimple" } } */ diff --git a/gcc/testsuite/g++.dg/gomp/barrier-2.C b/gcc/testsuite/g++.dg/gomp/barrier-2.C new file mode 100644 index 000000000..1d929d26d --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/barrier-2.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +void f1(void) +{ + #pragma omp barrier a // { dg-error "expected end of line" } +} + +void f3(bool p) +{ + if (p) + #pragma omp barrier // { dg-error "compound statements" } +} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/gomp/block-0.C b/gcc/testsuite/g++.dg/gomp/block-0.C new file mode 100644 index 000000000..fa7865d8b --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/block-0.C @@ -0,0 +1,33 @@ +// { dg-do compile } +// { dg-options "-fopenmp -fdump-tree-omplower" } + +void bar(); +void foo() +{ + #pragma omp critical + bar (); + #pragma omp master + bar (); + #pragma omp single + bar (); + #pragma omp for + for (int i = 0; i < 10; ++i) + bar (); + #pragma omp sections + { bar(); } + #pragma omp parallel + bar (); + #pragma omp parallel for + for (int i = 0; i < 10; ++i) + bar (); + #pragma omp parallel sections + { + bar (); + bar (); + #pragma omp section + bar (); + } +} + +// { dg-final { scan-tree-dump-times "terminate" 10 "omplower" } } +// { dg-final { cleanup-tree-dump "omplower" } } diff --git a/gcc/testsuite/g++.dg/gomp/block-1.C b/gcc/testsuite/g++.dg/gomp/block-1.C new file mode 100644 index 000000000..d2b86645a --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/block-1.C @@ -0,0 +1,25 @@ +// { dg-do compile } + +void foo() +{ + bad1: // { dg-error "jump to label" } + #pragma omp parallel + goto bad1; // { dg-error "from here|exits OpenMP" } + + goto bad2; // { dg-error "from here" } + #pragma omp parallel + { + bad2: ; // { dg-error "jump to label|enters OpenMP" } + } + + #pragma omp parallel + { + int i; + goto ok1; + for (i = 0; i < 10; ++i) + { ok1: break; } + } +} + +// { dg-message "error: invalid branch to/from an OpenMP structured block" "" { target *-*-* } 7 } +// { dg-message "error: invalid entry to OpenMP structured block" "" { target *-*-* } 9 } diff --git a/gcc/testsuite/g++.dg/gomp/block-10.C b/gcc/testsuite/g++.dg/gomp/block-10.C new file mode 100644 index 000000000..b273c1f29 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/block-10.C @@ -0,0 +1,40 @@ +// { dg-do compile } + +void foo(int i) +{ + int j; + switch (i) + { + #pragma omp parallel + { case 0:; } // { dg-error "jump|enters" } + } + switch (i) + { + #pragma omp for + for (j = 0; j < 10; ++ j) + { case 1:; } // { dg-error "jump|enters" } + } + switch (i) + { + #pragma omp critical + { case 2:; } // { dg-error "jump|enters" } + } + switch (i) + { + #pragma omp master + { case 3:; } // { dg-error "jump|enters" } + } + switch (i) + { + #pragma omp sections + { case 4:; // { dg-error "jump|enters" } + #pragma omp section + { case 5:; } // { dg-error "jump|enters" } + } + } + switch (i) + { + #pragma omp ordered + { default:; } // { dg-error "jump|enters" } + } +} diff --git a/gcc/testsuite/g++.dg/gomp/block-11.C b/gcc/testsuite/g++.dg/gomp/block-11.C new file mode 100644 index 000000000..c2800061b --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/block-11.C @@ -0,0 +1,19 @@ +/* PR c++/24516 */ +/* { dg-do compile } */ + +void +bar (int *p) +{ + int m; +#pragma omp parallel for + for (m = 0; m < 1000; ++m) + switch (p[m]) + { + case 1: + p[m] = 2; + break; + default: + p[m] = 3; + break; + } +} diff --git a/gcc/testsuite/g++.dg/gomp/block-2.C b/gcc/testsuite/g++.dg/gomp/block-2.C new file mode 100644 index 000000000..17d98d845 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/block-2.C @@ -0,0 +1,35 @@ +// { dg-do compile } + +void foo() +{ + int i, j; + + #pragma omp for + for (i = 0; i < 10; ++i) + break; // { dg-error "break" } + + bad1: // { dg-error "jump to label" } + #pragma omp for + for (i = 0; i < 10; ++i) + goto bad1; // { dg-error "from here|exits OpenMP" } + + goto bad2; // { dg-error "from here" } + #pragma omp for + for (i = 0; i < 10; ++i) + { + bad2: ; // { dg-error "jump|enters OpenMP" } + } + + #pragma omp for + for (i = 0; i < 10; ++i) + for (j = 0; j < 10; ++j) + if (i == j) + break; + + #pragma omp for + for (i = 0; i < 10; ++i) + continue; +} + +// { dg-message "error: invalid branch to/from an OpenMP structured block" "" { target *-*-* } 14 } +// { dg-message "error: invalid entry to OpenMP structured block" "" { target *-*-* } 16 } diff --git a/gcc/testsuite/g++.dg/gomp/block-3.C b/gcc/testsuite/g++.dg/gomp/block-3.C new file mode 100644 index 000000000..aeb0c7795 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/block-3.C @@ -0,0 +1,61 @@ +// { dg-do compile } + +extern int test(int); +void foo() +{ + int i; + + for (i = 0; i < 10; ++i) + { + #pragma omp sections + { + continue; // { dg-error "invalid exit" } + } + } + + #pragma omp sections + { + #pragma omp section + { bad1: ; } // { dg-error "jump to label" } + #pragma omp section + goto bad1; // { dg-error "from here|enters OpenMP" } + } + + #pragma omp sections + { + goto bad2; // { dg-error "from here" } + } + bad2:; // { dg-error "jump|exits OpenMP" } + + goto bad3; // { dg-error "from here" } + #pragma omp sections + { + bad3: ; // { dg-error "jump|enters OpenMP" } + } + + #pragma omp sections + { + goto ok1; + ok1:; + + #pragma omp section + for (i = 0; i < 10; ++i) + if (test(i)) + break; + else + continue; + + #pragma omp section + switch (i) + { + case 0: + break; + default: + test(i); + } + } +} + +// { dg-message "error: invalid branch to/from an OpenMP structured block" "" { target *-*-* } 21 } +// { dg-message "error: invalid branch to/from an OpenMP structured block" "" { target *-*-* } 26 } +// { dg-message "error: invalid entry to OpenMP structured block" "" { target *-*-* } 30 } diff --git a/gcc/testsuite/g++.dg/gomp/block-4.C b/gcc/testsuite/g++.dg/gomp/block-4.C new file mode 100644 index 000000000..815d36b2e --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/block-4.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +void foo() +{ + #pragma omp critical + { + return; // { dg-error "invalid exit" } + } +} diff --git a/gcc/testsuite/g++.dg/gomp/block-5.C b/gcc/testsuite/g++.dg/gomp/block-5.C new file mode 100644 index 000000000..391f8b660 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/block-5.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +void foo() +{ + #pragma omp master + { + goto bad1; // { dg-error "from here" } + } + + #pragma omp master + { + bad1: // { dg-error "jump|exits OpenMP" } + return; // { dg-error "invalid exit" } + } +} + +// { dg-message "error: invalid branch to/from an OpenMP structured block" "" { target *-*-* } 7 } diff --git a/gcc/testsuite/g++.dg/gomp/block-6.C b/gcc/testsuite/g++.dg/gomp/block-6.C new file mode 100644 index 000000000..fa4c5eab5 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/block-6.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +void foo() +{ + #pragma omp ordered + { + return; // { dg-error "invalid exit" } + } +} diff --git a/gcc/testsuite/g++.dg/gomp/block-7.C b/gcc/testsuite/g++.dg/gomp/block-7.C new file mode 100644 index 000000000..802b3b3a3 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/block-7.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +void foo() +{ + int i, j; + for (i = 0; i < 10; ++i) + { + #pragma omp for + for (j = ({ continue; 0; }); // { dg-error "invalid exit" } + j < ({ continue; 10; }); // { dg-error "invalid exit" } + j += ({ continue; 1; })) // { dg-error "invalid exit" } + continue; + + #pragma omp for + for (j = ({ break; 0; }); // { dg-error "invalid exit" } + j < ({ break; 10; }); // { dg-error "invalid exit" } + j += ({ break; 1; })) // { dg-error "invalid exit" } + break; // { dg-error "break" } + } +} diff --git a/gcc/testsuite/g++.dg/gomp/block-8.C b/gcc/testsuite/g++.dg/gomp/block-8.C new file mode 100644 index 000000000..177acaa28 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/block-8.C @@ -0,0 +1,11 @@ +// { dg-do compile } +// PR 24451 + +int foo() +{ + int i; + + #pragma omp parallel for + for (i = 0; i < 10; ++i) + return 0; // { dg-error "invalid exit" } +} diff --git a/gcc/testsuite/g++.dg/gomp/block-9.C b/gcc/testsuite/g++.dg/gomp/block-9.C new file mode 100644 index 000000000..8012e5a7d --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/block-9.C @@ -0,0 +1,25 @@ +// { dg-do compile } + +void foo(int i) +{ + int j; + switch (i) + { + #pragma omp parallel + { case 0:; } // { dg-error "jump|enters" } + #pragma omp for + for (j = 0; j < 10; ++ j) + { case 1:; } // { dg-error "jump|enters" } + #pragma omp critical + { case 2:; } // { dg-error "jump|enters" } + #pragma omp master + { case 3:; } // { dg-error "jump|enters" } + #pragma omp sections + { case 4:; // { dg-error "jump|enters" } + #pragma omp section + { case 5:; } // { dg-error "jump|enters" } + } + #pragma omp ordered + { default:; } // { dg-error "jump|enters" } + } +} diff --git a/gcc/testsuite/g++.dg/gomp/clause-1.C b/gcc/testsuite/g++.dg/gomp/clause-1.C new file mode 100644 index 000000000..76683ecf6 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/clause-1.C @@ -0,0 +1,32 @@ +// { dg-do compile } + +struct T +{ + int n; + + void test(); +}; + +void T::test() +{ + #pragma omp parallel private(n) // { dg-error "T::n" } + n = 1; + + #pragma omp parallel shared(n) // { dg-error "T::n" } + n = 1; + + #pragma omp parallel firstprivate(n) // { dg-error "T::n" } + n = 1; + + #pragma omp sections lastprivate(n) // { dg-error "T::n" } + { n = 1; } + + #pragma omp parallel reduction(+:n) // { dg-error "T::n" } + n = 1; + + #pragma omp single copyprivate(n) // { dg-error "T::n" } + n = 1; + + #pragma omp parallel copyin(n) // { dg-error "T::n" } + n = 1; +} diff --git a/gcc/testsuite/g++.dg/gomp/clause-2.C b/gcc/testsuite/g++.dg/gomp/clause-2.C new file mode 100644 index 000000000..450419ad6 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/clause-2.C @@ -0,0 +1,38 @@ +// { dg-do compile } + +struct A { int a; }; +struct B { B(); }; +struct C { C(); C(const C&); }; +struct D { D& operator=(const D&); }; + +class E { private: E(); public: E(int); }; // { dg-error "private" } +class F { private: F(const F&); public: F(); }; // { dg-error "private" } +class G { private: G& operator=(const G&); }; // { dg-error "private" } + +void bar(); +void foo() +{ + A a; B b; C c; D d; E e(0); F f; G g; + + #pragma omp parallel shared(a, b, c, d, e, f, g) + bar(); + + #pragma omp parallel private(a, b, c, d, f, g) + bar(); + #pragma omp parallel private(e) // { dg-error "context" } + bar(); + + #pragma omp parallel firstprivate(a, b, c, d, e, g) + bar(); + #pragma omp parallel firstprivate(f) // { dg-error "context" } + bar(); + + #pragma omp parallel sections lastprivate(a, b, d, c, f) + { bar(); } + #pragma omp parallel sections lastprivate(e) // { dg-error "context" } + { bar(); } + #pragma omp parallel sections lastprivate(g) // { dg-error "context" } + { bar(); } + #pragma omp parallel sections firstprivate(e) lastprivate(e) + { bar(); } +} diff --git a/gcc/testsuite/g++.dg/gomp/clause-3.C b/gcc/testsuite/g++.dg/gomp/clause-3.C new file mode 100644 index 000000000..6b3d410a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/clause-3.C @@ -0,0 +1,94 @@ +// { dg-do compile } +// { dg-require-effective-target tls } + +#define p parallel + +extern void bar (void); +extern char q[]; // { dg-error "has incomplete type" } +int t; +#pragma omp threadprivate (t) + +void +foo (int x) +{ + char *p; + struct S { int i; int j; } s; + char a[32]; + double d; + int i; + const int c = 8; +#pragma omp p shared (x, x) // { dg-error "more than once" } + ; +#pragma omp p private (x) private (x) // { dg-error "more than once" } + ; +#pragma omp p shared (x) firstprivate (x) // { dg-error "more than once" } + ; +#pragma omp p firstprivate (x, x) // { dg-error "more than once" } + ; +#pragma omp p for shared (x) lastprivate (x) // { dg-error "more than once" } + for (i = 0; i < 10; i++) + ; +#pragma omp p for private (x) lastprivate (x) // { dg-error "more than once" } + for (i = 0; i < 10; i++) + ; +#pragma omp p for lastprivate (x, x) // { dg-error "more than once" } + for (i = 0; i < 10; i++) + ; +#pragma omp single private (x) copyprivate (x) // { dg-error "more than once" } + ; +#pragma omp p shared (bar) // { dg-error "is not a variable" } + ; +#pragma omp p private (bar) // { dg-error "is not a variable" } + ; +#pragma omp p firstprivate (bar) // { dg-error "is not a variable" } + ; +#pragma omp p reduction (+:p) // { dg-error "has invalid type for" } + ; +#pragma omp p reduction (*:s) // { dg-error "has invalid type for" } + ; +#pragma omp p reduction (-:a) // { dg-error "has invalid type for" } + ; + d = 0; +#pragma omp p reduction (*:d) + ; +#pragma omp p reduction (|:d) // { dg-error "has invalid type for" } + ; +#pragma omp p reduction (&&:d) // { dg-error "has invalid type for" } + ; +#pragma omp p copyin (d) // { dg-error "must be 'threadprivate'" } + ; +#pragma omp p copyin (x) // { dg-error "must be 'threadprivate'" } + ; +#pragma omp p for firstprivate (x) lastprivate (x) + for (i = 0; i < 10; i++) + ; +#pragma omp p private (q) // { dg-error "unspecified bounds" } + ; +#pragma omp p firstprivate (q) // { dg-error "unspecified bounds" } + ; +#pragma omp p for lastprivate (q) // { dg-error "unspecified bounds" } + for (i = 0; i < 10; i++) + ; +#pragma omp p shared (t) // { dg-error "predetermined 'threadprivate'" } + ; +#pragma omp p private (t) // { dg-error "predetermined 'threadprivate'" } + ; +#pragma omp p firstprivate (t) // { dg-error "predetermined 'threadprivate'" } + ; +#pragma omp p for lastprivate (t) // { dg-error "predetermined 'threadpriv" } + for (i = 0; i < 10; i++) + ; +#pragma omp p reduction (*:t) // { dg-error "predetermined 'threadprivate'" } + ; +#pragma omp p shared (c) // { dg-error "predetermined 'shared'" } + ; +#pragma omp p private (c) // { dg-error "predetermined 'shared'" } + ; +#pragma omp p firstprivate (c) // { dg-error "predetermined 'shared'" } + ; +#pragma omp p for lastprivate (c) // { dg-error "predetermined 'shared'" } + for (i = 0; i < 10; i++) + ; +#pragma omp p reduction (*:c) // { dg-error "predetermined 'shared'" } + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/clause-4.C b/gcc/testsuite/g++.dg/gomp/clause-4.C new file mode 100644 index 000000000..06b91e8a2 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/clause-4.C @@ -0,0 +1,23 @@ +// PR c/34506 +// { dg-do compile } + +#define p parallel + +void +foo (int x) +{ +#pragma omp p num_threads (4) if (1) private (x) + ; +#pragma omp p num_threads(4)if(1)private(x) + ; +#pragma omp p num_threads (4), if (1) , private (x) + ; +#pragma omp p num_threads(4),if(1),private(x) + ; +#pragma omp p, num_threads (4), if (1), private (x) // { dg-error "clause before" } + ; +#pragma omp p num_threads (4), if (1), private (x), // { dg-error "clause before" } + ; +#pragma omp p num_threads (4), , if (1), private (x) // { dg-error "clause before" } + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/copyin-1.C b/gcc/testsuite/g++.dg/gomp/copyin-1.C new file mode 100644 index 000000000..117f82f81 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/copyin-1.C @@ -0,0 +1,27 @@ +// { dg-do compile } +// { dg-require-effective-target tls } + +int i, j; + +#pragma omp threadprivate (i) + +void bar(void); +void foo(void) +{ + int k; + extern int l; + extern int m; + +#pragma omp threadprivate (m) + + #pragma omp parallel copyin(i) + bar(); + #pragma omp parallel copyin(j) // { dg-error "threadprivate" } + bar(); + #pragma omp parallel copyin(k) // { dg-error "threadprivate" } + bar(); + #pragma omp parallel copyin(l) // { dg-error "threadprivate" } + bar(); + #pragma omp parallel copyin(m) + bar(); +} diff --git a/gcc/testsuite/g++.dg/gomp/critical-1.C b/gcc/testsuite/g++.dg/gomp/critical-1.C new file mode 100644 index 000000000..bdc7bad7b --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/critical-1.C @@ -0,0 +1,28 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-omplower" } */ + +extern void bar(int); + +void foo (void) +{ + #pragma omp critical + bar(0); + + /* Note that "name" is in its own namespace, thus this foo is not + the same as the function. */ + #pragma omp critical(foo) + { + bar(1); + bar(2); + } + + #pragma omp critical + #pragma omp critical(foo) + bar(3); +} + +/* { dg-final { scan-tree-dump-times "GOMP_critical_start" 2 "omplower" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_critical_end" 2 "omplower" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_critical_name_start" 2 "omplower" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_critical_name_end" 2 "omplower" } } */ +/* { dg-final { cleanup-tree-dump "omplower" } } */ diff --git a/gcc/testsuite/g++.dg/gomp/critical-2.C b/gcc/testsuite/g++.dg/gomp/critical-2.C new file mode 100644 index 000000000..37c9c2414 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/critical-2.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +void f1(void) +{ + #pragma omp critical a // { dg-error "expected" } + ; + #pragma omp critical ( // { dg-error "expected identifier" } + ; + #pragma omp critical (a // { dg-error "expected .\\)." } + ; + #pragma omp critical (a b) // { dg-error "expected .\\)." } +} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/gomp/flush-1.C b/gcc/testsuite/g++.dg/gomp/flush-1.C new file mode 100644 index 000000000..3c6a34bff --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/flush-1.C @@ -0,0 +1,25 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-gimple" } */ + +void f1(void) +{ + #pragma omp flush +} + +int x; + +void f2(bool p) +{ + int z; + if (p) + { + #pragma omp flush (x) + } + else + { + #pragma omp flush (x, z, p) + } +} + +/* { dg-final { scan-tree-dump-times "__sync_synchronize" 3 "gimple" } } */ +/* { dg-final { cleanup-tree-dump "gimple" } } */ diff --git a/gcc/testsuite/g++.dg/gomp/flush-2.C b/gcc/testsuite/g++.dg/gomp/flush-2.C new file mode 100644 index 000000000..a5c0df89c --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/flush-2.C @@ -0,0 +1,10 @@ +// { dg-do compile } + +void f1(void) +{ + #pragma omp flush a // { dg-error "expected" } + #pragma omp flush ( // { dg-error "expected" } + #pragma omp flush (b // { dg-error "declared|expected" } + #pragma omp flush (c d) // { dg-error "declared|expected" } + #pragma omp flush (e) // { dg-error "declared" } +} diff --git a/gcc/testsuite/g++.dg/gomp/for-1.C b/gcc/testsuite/g++.dg/gomp/for-1.C new file mode 100644 index 000000000..f8bb9d547 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-1.C @@ -0,0 +1,49 @@ +// { dg-do compile } + +extern void baz(int); +void foo (int j, int k) +{ + int i; + + /* Valid loops. */ + #pragma omp for + for (i = 0; i < 10; i++) + baz (i); + + #pragma omp for + for (i = j; i <= 10; i+=4) + baz (i); + + #pragma omp for + for (i = j; i > 0; i = i - 1) + baz (j); + + #pragma omp for + for (i = j; i >= k; i--) + baz (i); + + // Malformed parallel loops. + #pragma omp for + i = 0; // { dg-error "for statement expected" } + for ( ; i < 10; ) + { + baz (i); + i++; + } + + #pragma omp for + for (i = 0; ; i--) // { dg-error "missing controlling predicate" } + { + if (i >= 10) + break; // { dg-error "break" } + baz (i); + } + + #pragma omp for + for (i = 0; i < 10 && j > 4; i-=3) // { dg-error "invalid controlling predicate" } + baz (i); + + #pragma omp for + for (i = 0; i < 10; i-=3, j+=2) // { dg-error "invalid increment expression" } + baz (i); +} diff --git a/gcc/testsuite/g++.dg/gomp/for-10.C b/gcc/testsuite/g++.dg/gomp/for-10.C new file mode 100644 index 000000000..f21404249 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-10.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-ompexp" } */ + +extern void bar(int); + +void foo (int n) +{ + int i; + + #pragma omp for schedule(runtime) ordered + for (i = 0; i < n; ++i) + bar(i); +} + +/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_runtime_start" 1 "ompexp" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_runtime_next" 1 "ompexp" } } */ +/* { dg-final { cleanup-tree-dump "ompexp" } } */ diff --git a/gcc/testsuite/g++.dg/gomp/for-11.C b/gcc/testsuite/g++.dg/gomp/for-11.C new file mode 100644 index 000000000..d15576d2f --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-11.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +extern void baz (int); + +void foo (int j, int k) +{ + #pragma omp for + for (int l = j; l < k; l++) + baz (l); + + #pragma omp for + for (int i = 0, m = 0; m < 10; m++) // { dg-error "" } + baz (m); +} diff --git a/gcc/testsuite/g++.dg/gomp/for-12.C b/gcc/testsuite/g++.dg/gomp/for-12.C new file mode 100644 index 000000000..98318d7d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-12.C @@ -0,0 +1,12 @@ +int foo (void) +{ + int i, a; + + a = 30; + + #pragma omp parallel for lastprivate (a) + for (i = 0; i < 10; i++) + a = a + i; + + return a; +} diff --git a/gcc/testsuite/g++.dg/gomp/for-13.C b/gcc/testsuite/g++.dg/gomp/for-13.C new file mode 100644 index 000000000..16e971f19 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-13.C @@ -0,0 +1,18 @@ +// At one point in development, a typo disabled the remapping of the +// for iteration variable as private. + +// { dg-do compile } +// { dg-options "-fopenmp -fdump-tree-lower" } + +extern void bar(int); +void foo(void) +{ + int i; + +#pragma omp parallel for default(none) + for (i = 0; i < 10; i++) + bar(i); +} + +// { dg-final { scan-tree-dump-times "omp_data_o" 0 "lower" } } +// { dg-final { cleanup-tree-dump "lower" } } diff --git a/gcc/testsuite/g++.dg/gomp/for-14.C b/gcc/testsuite/g++.dg/gomp/for-14.C new file mode 100644 index 000000000..fb2641370 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-14.C @@ -0,0 +1,19 @@ +// { dg-do compile } + +extern int printf (const char *, ...); +extern void foo (int *); + +int main (void) +{ + double d = 6; + int i = 1, j = 6, k = 8; +#pragma omp parallel shared(d) private(i) num_threads (4) + { + i = 4; +#pragma omp for lastprivate(j) + for (j = 1; j <= k; j++) + printf ("%s %d %d %d %p %g\n", "Hello, World!", i, j, k, &j, d); + printf ("%s %d %g\n", "Hello, World!", i, d); + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/gomp/for-15.C b/gcc/testsuite/g++.dg/gomp/for-15.C new file mode 100644 index 000000000..25eea2ad2 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-15.C @@ -0,0 +1,35 @@ +// PR c++/24512 +// { dg-do compile } + +template<typename T> void foo () +{ +#pragma omp for + for (int i = 0; i < 10; i++); + +#pragma omp for + for (int i = 0; i < 10; i++); + +#pragma omp for + for (T j = 0; j < 10; j++); + +#pragma omp for + for (T j = 0; j < 10; j++); + +#pragma omp parallel for + for (int k = 0; k < 10; k++); + +#pragma omp parallel for + for (int k = 0; k < 10; k++); + +#pragma omp parallel for + for (T l = 0; l < 10; l++); + +#pragma omp parallel for + for (T l = 0; l < 10; l++); +} + +void bar () +{ + foo<int> (); + foo<long> (); +} diff --git a/gcc/testsuite/g++.dg/gomp/for-16.C b/gcc/testsuite/g++.dg/gomp/for-16.C new file mode 100644 index 000000000..dbbed8fe5 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-16.C @@ -0,0 +1,32 @@ +// { dg-do compile } + +template<typename T> +void foo () +{ +#pragma omp for + for (unsigned int i = 0; i < 10; i++); +#pragma omp for + for (int j = 0; ; j++); // { dg-error "missing controlling predicate" } +#pragma omp for + for (int k = 0; k == 1; k++); // { dg-error "invalid controlling predicate" } +#pragma omp for + for (int l = 0; l < 10; ); // { dg-error "missing increment expression" } +#pragma omp for + for (int m = 0; m < 10; m *= 3); // { dg-error "invalid increment expression" } +#pragma omp for + for (T n = 0; ; n++); // { dg-error "missing controlling predicate" } +#pragma omp for + for (T o = 0; o == 1; o++); // Error here is emitted only during + // instantiation +#pragma omp for + for (T p = 0; p < 10; ); // { dg-error "missing increment expression" } +#pragma omp for + for (T q = 0; q < 10; q *= 3); // Error here is emitted only during + // instantiation +} + +void bar () +{ +#pragma omp for + for (int m = 0; m < 10; m *= 3); // { dg-error "invalid increment expression" } +} diff --git a/gcc/testsuite/g++.dg/gomp/for-17.C b/gcc/testsuite/g++.dg/gomp/for-17.C new file mode 100644 index 000000000..9634e59c8 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-17.C @@ -0,0 +1,11 @@ +/* { dg-do compile } */ + +void foo() +{ + long n = 10; + int i; +#pragma omp for + for (i=0; i < n; ++i) ; +#pragma omp for + for (i=0; n > i; ++i) ; +} diff --git a/gcc/testsuite/g++.dg/gomp/for-18.C b/gcc/testsuite/g++.dg/gomp/for-18.C new file mode 100644 index 000000000..0a5052674 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-18.C @@ -0,0 +1,67 @@ +// { dg-do compile } +extern int bar (int); + +void +foo (void) +{ + int j, k = 1, l = 30, m = 4; + long int o = 4; + long long int p = 0; +#pragma omp for + for (j = k; j <= l; j += m - 1) + ; +#pragma omp for + for (j = k; j <= l; j += (m - 1)) + ; +#pragma omp for + for (j = k; j <= l; j += bar (m - 1)) + ; +#pragma omp for + for (j = k; j <= l; j = j + m - 1) + ; +#pragma omp for + for (j = k; j <= l; j = j + (m - 1)) + ; +#pragma omp for + for (j = k; j <= l; j = j + bar (m - 1)) + ; +#pragma omp for + for (j = ({ int n; n = k; n; }); j <= l; j++) + ; +#pragma omp for + for (j = k; j <= ({ int n; n = l; n; }); j++) + ; +#pragma omp for + for (j = k; j <= l; j += ({ int n; n = 1; n; })) + ; +#pragma omp for + for (j = k; j <= l; j += m + 1) + ; +#pragma omp for + for (j = k; j <= l; j += o) + ; +#pragma omp for + for (j = k; j <= l; j = j + o) + ; +#pragma omp for + for (j = k; j <= l; j = o + 1 + j) + ; +#pragma omp for + for (j = k; j <= l; j = o + m + j) + ; +#pragma omp for + for (j = k; j <= l; j += o + p) + ; +#pragma omp for + for (j = k; j <= l; j = j + o + p) + ; +#pragma omp for + for (j = l; j >= k; j -= o) + ; +#pragma omp for + for (j = l; j >= k; j -= p) + ; +#pragma omp for + for (j = l; j >= k; j -= o + p) + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/for-19.C b/gcc/testsuite/g++.dg/gomp/for-19.C new file mode 100644 index 000000000..1929e45f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-19.C @@ -0,0 +1,41 @@ +// PR c++/38348 +// { dg-do compile } +// { dg-options "-fopenmp" } + +const char *p = "abcde"; + +template <typename T> +void +f1 (void) +{ +#pragma omp for // { dg-error "forbids incrementing a pointer of type" } + for (void *q = (void *)p; q < (void *) (p + 4); q++) // { dg-error "forbids incrementing a pointer of type" } + ; +} + +template <typename T> +void +f2 (void) +{ +#pragma omp for + for (const char *q = p; q < p + 4; q++) + ; +} + +template <typename T> +void +f3 (void) +{ +#pragma omp for // { dg-error "forbids incrementing a pointer of type" } + for (T q = T (p); q < T (p + 4); q++) + ; +} + +int +main (void) +{ + f1 <int> (); // { dg-message "instantiated from here" } + f2 <int> (); + f3 <const char *> (); + f3 <void *> (); // { dg-message "instantiated from here" } +} diff --git a/gcc/testsuite/g++.dg/gomp/for-2.C b/gcc/testsuite/g++.dg/gomp/for-2.C new file mode 100644 index 000000000..37e5929af --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-2.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ + +void foo() +{ + int i; + + #pragma omp for nowait + for (i = 0; i < 10; ++i) ; + + #pragma omp for nowait nowait /* { dg-error "too many" } */ + for (i = 0; i < 10; ++i) ; + + #pragma omp for ordered + for (i = 0; i < 10; ++i) ; + + #pragma omp for ordered ordered /* { dg-error "too many" } */ + for (i = 0; i < 10; ++i) ; +} diff --git a/gcc/testsuite/g++.dg/gomp/for-3.C b/gcc/testsuite/g++.dg/gomp/for-3.C new file mode 100644 index 000000000..fcf5a2c1b --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-3.C @@ -0,0 +1,62 @@ +// { dg-do compile } + +int bar (); + +void foo() +{ + int i; + + #pragma omp for schedule // { dg-error "expected" } + for (i = 0; i < 10; ++i) ; + + #pragma omp for schedule static // { dg-error "expected" } + for (i = 0; i < 10; ++i) ; + + #pragma omp for schedule ( // { dg-error "invalid schedule kind" } + for (i = 0; i < 10; ++i) ; + + #pragma omp for schedule ( static // { dg-error "expected" } + for (i = 0; i < 10; ++i) ; + + #pragma omp for schedule ( static ) + for (i = 0; i < 10; ++i) ; + + #pragma omp for schedule ( foo ) // { dg-error "invalid schedule kind" } + for (i = 0; i < 10; ++i) ; + + #pragma omp for schedule ( static 1 // { dg-error "expected" } + for (i = 0; i < 10; ++i) ; + + #pragma omp for schedule ( static 1 ) nowait // { dg-error "expected" } + for (i = 0; i < 10; ++i) ; + + #pragma omp for schedule ( static, 1 ) nowait + for (i = 0; i < 10; ++i) ; + + #pragma omp for schedule ( static, 1, 1 ) nowait // { dg-error "expected" } + for (i = 0; i < 10; ++i) ; + + #pragma omp for schedule ( static, 1 + 1 ) nowait + for (i = 0; i < 10; ++i) ; + + #pragma omp for schedule ( static, 1.0 ) // { dg-error "integral" } + for (i = 0; i < 10; ++i) ; + + #pragma omp for schedule (dynamic) + for (i = 0; i < 10; ++i) ; + + #pragma omp for schedule (dynamic, bar ()) + for (i = 0; i < 10; ++i) ; + + #pragma omp for schedule (guided) + for (i = 0; i < 10; ++i) ; + + #pragma omp for schedule (guided, bar ()) + for (i = 0; i < 10; ++i) ; + + #pragma omp for schedule (runtime) + for (i = 0; i < 10; ++i) ; + + #pragma omp for schedule (runtime, bar ()) // { dg-error "does not take" } + for (i = 0; i < 10; ++i) ; +} diff --git a/gcc/testsuite/g++.dg/gomp/for-4.C b/gcc/testsuite/g++.dg/gomp/for-4.C new file mode 100644 index 000000000..fb6994ea2 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-4.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-ompexp" } */ + +extern void bar(int); + +void foo (int n) +{ + int i; + + #pragma omp for schedule(dynamic) + for (i = 0; i < n; ++i) + bar(i); +} + +/* { dg-final { scan-tree-dump-times "GOMP_loop_dynamic_start" 1 "ompexp" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_loop_dynamic_next" 1 "ompexp" } } */ +/* { dg-final { cleanup-tree-dump "ompexp" } } */ diff --git a/gcc/testsuite/g++.dg/gomp/for-5.C b/gcc/testsuite/g++.dg/gomp/for-5.C new file mode 100644 index 000000000..5912a4e55 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-5.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-ompexp" } */ + +extern void bar(int); + +void foo (int n) +{ + int i; + + #pragma omp for schedule(guided) + for (i = 0; i < n; ++i) + bar(i); +} + +/* { dg-final { scan-tree-dump-times "GOMP_loop_guided_start" 1 "ompexp" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_loop_guided_next" 1 "ompexp" } } */ +/* { dg-final { cleanup-tree-dump "ompexp" } } */ diff --git a/gcc/testsuite/g++.dg/gomp/for-6.C b/gcc/testsuite/g++.dg/gomp/for-6.C new file mode 100644 index 000000000..100ee2c8c --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-6.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-ompexp" } */ + +extern void bar(int); + +void foo (int n) +{ + int i; + + #pragma omp for schedule(runtime) + for (i = 0; i < n; ++i) + bar(i); +} + +/* { dg-final { scan-tree-dump-times "GOMP_loop_runtime_start" 1 "ompexp" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_loop_runtime_next" 1 "ompexp" } } */ +/* { dg-final { cleanup-tree-dump "ompexp" } } */ diff --git a/gcc/testsuite/g++.dg/gomp/for-7.C b/gcc/testsuite/g++.dg/gomp/for-7.C new file mode 100644 index 000000000..10763dc59 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-7.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-ompexp" } */ + +extern void bar(int); + +void foo (int n) +{ + int i; + + #pragma omp for schedule(static) ordered + for (i = 0; i < n; ++i) + bar(i); +} + +/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_static_start" 1 "ompexp" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_static_next" 1 "ompexp" } } */ +/* { dg-final { cleanup-tree-dump "ompexp" } } */ diff --git a/gcc/testsuite/g++.dg/gomp/for-8.C b/gcc/testsuite/g++.dg/gomp/for-8.C new file mode 100644 index 000000000..1bc66c49a --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-8.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-ompexp" } */ + +extern void bar(int); + +void foo (int n) +{ + int i; + + #pragma omp for schedule(dynamic) ordered + for (i = 0; i < n; ++i) + bar(i); +} + +/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_dynamic_start" 1 "ompexp" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_dynamic_next" 1 "ompexp" } } */ +/* { dg-final { cleanup-tree-dump "ompexp" } } */ diff --git a/gcc/testsuite/g++.dg/gomp/for-9.C b/gcc/testsuite/g++.dg/gomp/for-9.C new file mode 100644 index 000000000..af99e216e --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/for-9.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-ompexp" } */ + +extern void bar(int); + +void foo (int n) +{ + int i; + + #pragma omp for schedule(guided) ordered + for (i = 0; i < n; ++i) + bar(i); +} + +/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_guided_start" 1 "ompexp" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_loop_ordered_guided_next" 1 "ompexp" } } */ +/* { dg-final { cleanup-tree-dump "ompexp" } } */ diff --git a/gcc/testsuite/g++.dg/gomp/gomp.exp b/gcc/testsuite/g++.dg/gomp/gomp.exp new file mode 100644 index 000000000..9f60bc1c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/gomp.exp @@ -0,0 +1,33 @@ +# Copyright (C) 2006 Free Software Foundation, Inc. +# +# This file is part of GCC. +# +# GCC is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GCC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# Load support procs. +load_lib g++-dg.exp + +if ![check_effective_target_fopenmp] { + return +} + +# Initialize `dg'. +dg-init + +# Main loop. +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C]] "" "-fopenmp" + +# All done. +dg-finish diff --git a/gcc/testsuite/g++.dg/gomp/macro-1.C b/gcc/testsuite/g++.dg/gomp/macro-1.C new file mode 100644 index 000000000..b04610d2c --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/macro-1.C @@ -0,0 +1,10 @@ +// { dg-do compile } + +#define N 10 + +extern void bar(void); +void foo(void) +{ + #pragma omp parallel num_threads(N) + bar(); +} diff --git a/gcc/testsuite/g++.dg/gomp/macro-2.C b/gcc/testsuite/g++.dg/gomp/macro-2.C new file mode 100644 index 000000000..75d6490cd --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/macro-2.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +#define p parallel +#define s(x) shared(x##1, x##2) +#define d(x) default(x) + +void bar(int, int, int, int); +void foo(void) +{ + int a1, a2, b1, b2; + + #pragma omp p s(a) s(b) d(none) + bar(a1, a2, b1, b2); +} diff --git a/gcc/testsuite/g++.dg/gomp/macro-3.C b/gcc/testsuite/g++.dg/gomp/macro-3.C new file mode 100644 index 000000000..3606db566 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/macro-3.C @@ -0,0 +1,26 @@ +// PR preprocessor/27746 +// { dg-do compile } +// { dg-options "-fopenmp -fdump-tree-omplower" } + +#define omp FOO +#define p parallel +#define omp_parallel _Pragma ("omp parallel") +#define omp_p _Pragma ("omp p") + +void bar (void); + +void +foo (void) +{ + #pragma omp parallel + bar (); + #pragma omp p + bar (); + omp_parallel + bar (); + omp_p + bar (); +} + +// { dg-final { scan-tree-dump-times "#pragma omp parallel" 4 "omplower" } } +// { dg-final { cleanup-tree-dump "omplower" } } diff --git a/gcc/testsuite/g++.dg/gomp/macro-4.C b/gcc/testsuite/g++.dg/gomp/macro-4.C new file mode 100644 index 000000000..9fc45b143 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/macro-4.C @@ -0,0 +1,29 @@ +// PR preprocessor/27746 +// { dg-do compile } +// { dg-options "-fopenmp -Wunknown-pragmas" } + +#define p _Pragma ("omp parallel") +#define omp_p _Pragma ("omp p") + +void bar (void); + +void +foo (void) +{ +#pragma omp p // { dg-warning "ignoring #pragma omp _Pragma" } + bar (); + omp_p // { dg-warning "ignoring #pragma omp _Pragma" } + bar (); +} + +#define parallel serial +#define omp_parallel _Pragma ("omp parallel") + +void +baz (void) +{ +#pragma omp parallel // { dg-warning "ignoring #pragma omp serial" } + bar (); + omp_parallel // { dg-warning "ignoring #pragma omp serial" } + bar (); +} diff --git a/gcc/testsuite/g++.dg/gomp/master-1.C b/gcc/testsuite/g++.dg/gomp/master-1.C new file mode 100644 index 000000000..2681c216a --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/master-1.C @@ -0,0 +1,22 @@ +/* { dg-do compile } */ + +extern void bar(int); + +void foo (void) +{ + #pragma omp master + bar(0); + + #pragma omp master + { + bar(1); + bar(2); + } + + /* Yes, this is legal -- structured-block contains statement contains + openmp-construct contains master-construct. */ + #pragma omp master + #pragma omp master + #pragma omp master + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/master-2.C b/gcc/testsuite/g++.dg/gomp/master-2.C new file mode 100644 index 000000000..053206627 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/master-2.C @@ -0,0 +1,7 @@ +/* { dg-do compile } */ + +void f1(void) +{ + #pragma omp master asdf /* { dg-error "expected" } */ + #pragma omp master +} /* { dg-error "expected" } */ diff --git a/gcc/testsuite/g++.dg/gomp/master-3.C b/gcc/testsuite/g++.dg/gomp/master-3.C new file mode 100644 index 000000000..37966106d --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/master-3.C @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-omplower" } */ + +extern void bar(int); + +void foo (void) +{ + #pragma omp master + bar(0); +} + +/* { dg-final { scan-tree-dump-times "omp_get_thread_num" 1 "omplower" } } */ +/* { dg-final { cleanup-tree-dump "omplower" } } */ diff --git a/gcc/testsuite/g++.dg/gomp/method-1.C b/gcc/testsuite/g++.dg/gomp/method-1.C new file mode 100644 index 000000000..3d8235656 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/method-1.C @@ -0,0 +1,18 @@ +/* PR c++/24513 */ +/* { dg-do compile } */ + +struct S +{ + void foo (int *p) + { +#pragma omp parallel for + for (int i = 0; i < 1000; ++i) + p[i]=0; + } + void bar () + { +#pragma omp master + j = 2; + } + int j; +}; diff --git a/gcc/testsuite/g++.dg/gomp/ordered-1.C b/gcc/testsuite/g++.dg/gomp/ordered-1.C new file mode 100644 index 000000000..a1cd7f486 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/ordered-1.C @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-fopenmp -fdump-tree-omplower" } */ + +extern void bar(int); + +void foo (void) +{ + #pragma omp ordered + bar(0); + + #pragma omp ordered + { + bar(1); + bar(2); + } +} + +/* { dg-final { scan-tree-dump-times "GOMP_ordered_start" 2 "omplower" } } */ +/* { dg-final { scan-tree-dump-times "GOMP_ordered_end" 2 "omplower" } } */ +/* { dg-final { cleanup-tree-dump "omplower" } } */ diff --git a/gcc/testsuite/g++.dg/gomp/ordered-2.C b/gcc/testsuite/g++.dg/gomp/ordered-2.C new file mode 100644 index 000000000..6c2b4329c --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/ordered-2.C @@ -0,0 +1,7 @@ +/* { dg-do compile } */ + +void f1(void) +{ + #pragma omp ordered asdf /* { dg-error "expected" } */ + #pragma omp ordered +} /* { dg-error "expected" } */ diff --git a/gcc/testsuite/g++.dg/gomp/parallel-1.C b/gcc/testsuite/g++.dg/gomp/parallel-1.C new file mode 100644 index 000000000..c5c233b76 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/parallel-1.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +void foo() +{ + int i; + + #pragma omp parallel + { + #pragma omp parallel + { + #pragma omp parallel + { + i++; + } + } + } +} diff --git a/gcc/testsuite/g++.dg/gomp/parallel-2.C b/gcc/testsuite/g++.dg/gomp/parallel-2.C new file mode 100644 index 000000000..68e577766 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/parallel-2.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +void foo() +{ + int i; + + #pragma omp parallel default(none) // { dg-error "enclosing" } + { + #pragma omp parallel + { + #pragma omp parallel default(none) // { dg-error "enclosing" } + { + i++; // { dg-error "not specified" } + } + } + } +} diff --git a/gcc/testsuite/g++.dg/gomp/parallel-3.C b/gcc/testsuite/g++.dg/gomp/parallel-3.C new file mode 100644 index 000000000..633d7ba59 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/parallel-3.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +extern int printf (const char *, ...); + +int main (void) +{ + double d = 6; + int i = 1; +#pragma omp parallel shared(d) private(i) num_threads (4 + i) + { + i = 4; + printf ("%s %d %g\n", "Hello, World!", i, d); + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/gomp/parallel-4.C b/gcc/testsuite/g++.dg/gomp/parallel-4.C new file mode 100644 index 000000000..ca06aeef9 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/parallel-4.C @@ -0,0 +1,24 @@ +/* { dg-do compile } */ + +extern int foo(void); +extern void bar(void); + +int main () +{ + /* Malformed uses of 'if' and 'num_threads'. */ + #pragma omp parallel if (foo () > 10) if (foo () == 3) /* { dg-error "too many" } */ + { + bar (); + } + + #pragma omp parallel num_threads (3) num_threads (20) /* { dg-error "too many" } */ + { + bar (); + } + + /* Valid uses of 'if' and 'num_threads'. */ + #pragma omp parallel if (foo () == 10) num_threads (foo ()) + { + bar (); + } +} diff --git a/gcc/testsuite/g++.dg/gomp/parallel-5.C b/gcc/testsuite/g++.dg/gomp/parallel-5.C new file mode 100644 index 000000000..b8cd174a3 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/parallel-5.C @@ -0,0 +1,11 @@ +// { dg-do compile } + +extern void bar (void); + +int main (void) +{ + int i; +#pragma omp parallel for nowait /* { dg-error "'nowait'" } */ + for (i = 0; i < 10; i++) + bar (); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr24849.C b/gcc/testsuite/g++.dg/gomp/pr24849.C new file mode 100644 index 000000000..f35643719 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr24849.C @@ -0,0 +1,19 @@ +/* { dg-do compile } */ + +template<typename T> struct Healpix_Map { + T *map; + int npix_; + + void Import_nograde (const Healpix_Map<T> &orig) { +#pragma omp parallel +{ + int m; +#pragma omp for schedule (dynamic) + for (m=0; m<npix_; ++m) map[m] = orig.map[m]; +} + } + }; + +void foo(Healpix_Map<int> &a, Healpix_Map<int> &b) { + a.Import_nograde(b); + } diff --git a/gcc/testsuite/g++.dg/gomp/pr25874.C b/gcc/testsuite/g++.dg/gomp/pr25874.C new file mode 100644 index 000000000..83573f10a --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr25874.C @@ -0,0 +1,25 @@ +// { dg-options "-O -fopenmp" } + +int foo(); + +struct wigner_d + { + void recurse () { + int dd; + for (int j=0; j<=1; ++j) { +#pragma omp parallel + dd=5; + } + } + }; + +template<typename T> void rotate_alm(T arg) + { + wigner_d rec; + rec.recurse(); +#pragma omp parallel + foo(); + } + +template void rotate_alm(float arg); +template void rotate_alm(double arg); diff --git a/gcc/testsuite/g++.dg/gomp/pr25996.C b/gcc/testsuite/g++.dg/gomp/pr25996.C new file mode 100644 index 000000000..6b50ff030 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr25996.C @@ -0,0 +1,32 @@ +// PR c/25996 + +void +test1 (void) +{ +#pragma omp for + for (i = 0; i < 1; ++i); // { dg-error "not declared|expected iteration decl" } +} + +void +test2 (void) +{ + int i; +#pragma omp for + for (i = j; i < 1; ++i); // { dg-error "not declared|expected iteration decl" } +} + +void +test3 (void) +{ + int i; +#pragma omp for + for (i = 0; i < j; ++i); // { dg-error "not declared|invalid controlling predicate" } +} + +void +test4 (void) +{ + int i; +#pragma omp for + for (i = 0; i < 10; i += j); // { dg-error "not declared|invalid increment expression" } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr26611-1.C b/gcc/testsuite/g++.dg/gomp/pr26611-1.C new file mode 100644 index 000000000..8ec543bd6 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr26611-1.C @@ -0,0 +1,15 @@ +// PR middle-end/26611 +// { dg-do compile } + +void +foo () +{ +#pragma omp parallel + try + { + int q = 1; + } + catch (...) + { + } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr26611-2.C b/gcc/testsuite/g++.dg/gomp/pr26611-2.C new file mode 100644 index 000000000..f95179891 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr26611-2.C @@ -0,0 +1,15 @@ +// PR middle-end/26611 +// { dg-do compile } + +void +foo () +{ +#pragma omp parallel + try + { + } + catch (...) + { + int q = 1; + } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr26690-1.C b/gcc/testsuite/g++.dg/gomp/pr26690-1.C new file mode 100644 index 000000000..17e01b3d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr26690-1.C @@ -0,0 +1,16 @@ +// PR c++/26690 +// { dg-do compile } + +struct A // { dg-message "A::A|candidate expects" } +{ + A (int); // { dg-message "note" } +}; + +void +foo () +{ + A a(0); +#pragma omp parallel private (a) // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 13 } + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr26690-2.C b/gcc/testsuite/g++.dg/gomp/pr26690-2.C new file mode 100644 index 000000000..ca01a3a59 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr26690-2.C @@ -0,0 +1,17 @@ +// PR c++/26690 +// { dg-do compile } + +struct A +{ + A (int x = 6); // { dg-message "A::A\\(int\\)" } + A (long long x = 12LL); // { dg-message "note" } +}; + +void +foo () +{ + A a(6); +#pragma omp parallel private (a) // { dg-error "call of overloaded" } + // { dg-message "candidate" "candidate note" { target *-*-* } 14 } + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr26823-1.C b/gcc/testsuite/g++.dg/gomp/pr26823-1.C new file mode 100644 index 000000000..d24eddbdf --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr26823-1.C @@ -0,0 +1,23 @@ +// PR middle-end/26823 +// { dg-do compile } + +struct A +{ + ~A () {} +}; + +struct B +{ + A a; + B (); +}; + +void +foo () +{ +#pragma omp parallel + { + B b[1]; + new int; + } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr26823-2.C b/gcc/testsuite/g++.dg/gomp/pr26823-2.C new file mode 100644 index 000000000..d4747cff5 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr26823-2.C @@ -0,0 +1,29 @@ +// PR middle-end/26823 +// { dg-do compile } + +struct A +{ + ~A () {} +}; + +extern void bar (); + +void +foo () +{ +#pragma omp parallel + { + { + A a; + bar (); + } + { + A a; + bar (); + } + { + A a; + bar (); + } + } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr26913.C b/gcc/testsuite/g++.dg/gomp/pr26913.C new file mode 100644 index 000000000..4f5bb2834 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr26913.C @@ -0,0 +1,19 @@ +// PR middle-end/26913 + +struct A +{ + ~A () throw (); +}; + +void foo (A); + +A bar () throw (); + +void baz () +{ +#pragma omp parallel + { + A a; + foo (bar ()); + } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr27310.C b/gcc/testsuite/g++.dg/gomp/pr27310.C new file mode 100644 index 000000000..d921e6af2 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr27310.C @@ -0,0 +1,22 @@ +// PR middle-end/27310 +// { dg-do compile } +// { dg-options "-O2 -fopenmp" } + +struct A +{ + ~A (); +}; + +struct B +{ + A a, b; +}; + +void +foo () +{ + A c, d; + +#pragma omp parallel + B e; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr27325.C b/gcc/testsuite/g++.dg/gomp/pr27325.C new file mode 100644 index 000000000..05bc481d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr27325.C @@ -0,0 +1,25 @@ +// PR middle-end/27325 +// { dg-do compile } +// { dg-options "-O2 -fopenmp" } + +struct A { A(); ~A(); int i; }; + +int +foo () +{ + A a; +#pragma omp parallel private (a) + for (int i = 0; i < 5; ++i) + a.i++; + return 0; +} + +int +bar () +{ + A a; +#pragma omp for private (a) + for (int i = 0; i < 5; ++i) + a.i++; + return 0; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr27337-1.C b/gcc/testsuite/g++.dg/gomp/pr27337-1.C new file mode 100644 index 000000000..6c26070ab --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr27337-1.C @@ -0,0 +1,22 @@ +// PR middle-end/27337 +// { dg-do compile } + +struct S +{ + S (); + ~S (); + double &operator* () const; +}; + +S +foo () +{ + int i; + S ret; + +#pragma omp parallel for + for (i = 0; i < 2; i++) + *ret += i; + + return ret; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr27337-2.C b/gcc/testsuite/g++.dg/gomp/pr27337-2.C new file mode 100644 index 000000000..d1ae4a139 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr27337-2.C @@ -0,0 +1,22 @@ +// PR middle-end/27337 +// { dg-do compile } + +struct S +{ + S (); + ~S (); + int i; +}; + +S +foo () +{ + int i; + S ret; + +#pragma omp parallel for firstprivate (ret) lastprivate (ret) + for (i = 0; i < 2; i++) + ret.i += i; + + return ret; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr27359.C b/gcc/testsuite/g++.dg/gomp/pr27359.C new file mode 100644 index 000000000..603898c32 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr27359.C @@ -0,0 +1,10 @@ +// PR c++/27359 +// { dg-do compile } + +void +foo () +{ +#pragma omp parallel for + for (int i; i < 1; ++i) // { dg-error "expected|was not declared" } + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr27415.C b/gcc/testsuite/g++.dg/gomp/pr27415.C new file mode 100644 index 000000000..81f0ed5c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr27415.C @@ -0,0 +1,50 @@ +// PR middle-end/27415 +// { dg-do compile } + +void +test1 (void) +{ + int i = 0; +#pragma omp parallel +#pragma omp for firstprivate (i) // { dg-error "should not be firstprivate" } + for (i = 0; i < 10; i++) + ; +} + +void +test2 (void) +{ + int i = 0; +#pragma omp parallel for firstprivate (i) + for (i = 0; i < 10; i++) // { dg-error "should not be firstprivate" } + ; +} + +void +test3 (void) +{ + int i = 0; +#pragma omp parallel +#pragma omp for reduction (+:i) // { dg-error "should not be reduction" } + for (i = 0; i < 10; i++) + ; +} + +void +test4 (void) +{ + int i = 0; +#pragma omp parallel for reduction (*:i) + for (i = 0; i < 10; i++) // { dg-error "should not be reduction" } + ; +} + +void +test5 (void) +{ + int i = 0; +#pragma omp parallel firstprivate (i) +#pragma omp for + for (i = 0; i < 10; i++) + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr27499.C b/gcc/testsuite/g++.dg/gomp/pr27499.C new file mode 100644 index 000000000..4e0d5b1a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr27499.C @@ -0,0 +1,13 @@ +// PR c/27499 +// { dg-do compile } + +extern void bar (unsigned int); + +void +foo (void) +{ + unsigned int i; +#pragma omp for + for (i = 0; i < 64; ++i) + bar (i); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr29965-1.C b/gcc/testsuite/g++.dg/gomp/pr29965-1.C new file mode 100644 index 000000000..efb89ffa6 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr29965-1.C @@ -0,0 +1,45 @@ +// PR middle-end/29965 +// Test that OpenMP construct bodies which never return don't cause ICEs. +// { dg-do compile } +// { dg-options "-O2 -fopenmp" } + +extern void baz () __attribute__ ((noreturn)); + +static inline void +foo () +{ +#pragma omp parallel + for (;;) + ; +} + +static inline void +bar () +{ +#pragma omp parallel + baz (); +} + +void +foo1 () +{ + foo (); +} + +void +foo2 () +{ + foo (); +} + +void +bar1 () +{ + bar (); +} + +void +bar2 () +{ + bar (); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr29965-10.C b/gcc/testsuite/g++.dg/gomp/pr29965-10.C new file mode 100644 index 000000000..2e816da7b --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr29965-10.C @@ -0,0 +1,24 @@ +// PR middle-end/29965 +// Test that OpenMP construct bodies which never return don't cause ICEs. +// This is invalid code, but we don't emit diagnostics for it, nevertheless +// we test that we don't ICE on it. +// { dg-do compile } +// { dg-options "-O2 -fopenmp" } + +void +foo1 () +{ + int i; +#pragma omp for schedule (static) + for (i = 0; i < 2834; i++) + throw 0; +} + +void +foo2 () +{ + int i; +#pragma omp parallel for schedule (static) + for (i = 0; i < 2834; i++) + throw 0; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr29965-2.C b/gcc/testsuite/g++.dg/gomp/pr29965-2.C new file mode 100644 index 000000000..0976ca762 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr29965-2.C @@ -0,0 +1,98 @@ +// PR middle-end/29965 +// Test that OpenMP construct bodies which never return don't cause ICEs. +// { dg-do compile } +// { dg-options "-O2 -fopenmp" } + +extern void baz () __attribute__ ((noreturn)); + +void +foo1 () +{ +#pragma omp sections + { + for (;;) + ; + } +} + +void +bar1 () +{ +#pragma omp sections + { +#pragma omp section + baz (); +#pragma omp section + baz (); + } +} + +void +foo2 () +{ +#pragma omp sections + { + ; +#pragma omp section + for (;;) + ; + } +} + +void +bar2 () +{ +#pragma omp sections + { +#pragma omp section + baz (); +#pragma omp section + ; + } +} + +void +foo3 () +{ +#pragma omp parallel sections + { + for (;;) + ; + } +} + +void +bar3 () +{ +#pragma omp parallel sections + { +#pragma omp section + baz (); +#pragma omp section + baz (); + } +} + +void +foo4 () +{ +#pragma omp parallel sections + { + ; +#pragma omp section + for (;;) + ; + } +} + +void +bar4 () +{ +#pragma omp parallel sections + { +#pragma omp section + baz (); +#pragma omp section + ; + } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr29965-3.C b/gcc/testsuite/g++.dg/gomp/pr29965-3.C new file mode 100644 index 000000000..b98c24e55 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr29965-3.C @@ -0,0 +1,62 @@ +// PR middle-end/29965 +// Test that OpenMP construct bodies which never return don't cause ICEs. +// { dg-do compile } +// { dg-options "-O2 -fopenmp" } + +extern void baz () __attribute__ ((noreturn)); + +void +foo1 () +{ +#pragma omp single + for (;;); +} + +void +bar1 () +{ +#pragma omp single + baz (); +} + +void +foo2 () +{ +#pragma omp master + for (;;); +} + +void +bar2 () +{ +#pragma omp master + baz (); +} + +void +foo3 () +{ +#pragma omp ordered + for (;;); +} + +void +bar3 () +{ +#pragma omp ordered + baz (); +} + +void +foo4 () +{ +#pragma omp critical + for (;;); +} + +void +bar4 () +{ +#pragma omp critical + baz (); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr29965-4.C b/gcc/testsuite/g++.dg/gomp/pr29965-4.C new file mode 100644 index 000000000..b044fdf70 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr29965-4.C @@ -0,0 +1,44 @@ +// PR middle-end/29965 +// Test that OpenMP construct bodies which never return don't cause ICEs. +// { dg-do compile } +// { dg-options "-O2 -fopenmp" } + +extern void baz () __attribute__ ((noreturn)); + +void +foo1 () +{ + int i; +#pragma omp for schedule (dynamic) + for (i = 0; i < 2834; i++) + for (;;) + ; +} + +void +bar1 () +{ + int i; +#pragma omp for schedule (dynamic) + for (i = 0; i < 2834; i++) + baz (); +} + +void +foo2 () +{ + int i; +#pragma omp parallel for schedule (dynamic) + for (i = 0; i < 2834; i++) + for (;;) + ; +} + +void +bar2 () +{ + int i; +#pragma omp parallel for schedule (dynamic) + for (i = 0; i < 2834; i++) + baz (); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr29965-5.C b/gcc/testsuite/g++.dg/gomp/pr29965-5.C new file mode 100644 index 000000000..cf91dd6dc --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr29965-5.C @@ -0,0 +1,44 @@ +// PR middle-end/29965 +// Test that OpenMP construct bodies which never return don't cause ICEs. +// { dg-do compile } +// { dg-options "-O2 -fopenmp" } + +extern void baz () __attribute__ ((noreturn)); + +void +foo1 () +{ + int i; +#pragma omp for schedule (static) + for (i = 0; i < 2834; i++) + for (;;) + ; +} + +void +bar1 () +{ + int i; +#pragma omp for schedule (static) + for (i = 0; i < 2834; i++) + baz (); +} + +void +foo2 () +{ + int i; +#pragma omp parallel for schedule (static) + for (i = 0; i < 2834; i++) + for (;;) + ; +} + +void +bar2 () +{ + int i; +#pragma omp parallel for schedule (static) + for (i = 0; i < 2834; i++) + baz (); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr29965-6.C b/gcc/testsuite/g++.dg/gomp/pr29965-6.C new file mode 100644 index 000000000..6384d0928 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr29965-6.C @@ -0,0 +1,44 @@ +// PR middle-end/29965 +// Test that OpenMP construct bodies which never return don't cause ICEs. +// { dg-do compile } +// { dg-options "-O2 -fopenmp" } + +extern void baz () __attribute__ ((noreturn)); + +void +foo1 () +{ + int i; +#pragma omp for schedule (static, 16) + for (i = 0; i < 2834; i++) + for (;;) + ; +} + +void +bar1 () +{ + int i; +#pragma omp for schedule (static, 16) + for (i = 0; i < 2834; i++) + baz (); +} + +void +foo2 () +{ + int i; +#pragma omp parallel for schedule (static, 16) + for (i = 0; i < 2834; i++) + for (;;) + ; +} + +void +bar2 () +{ + int i; +#pragma omp parallel for schedule (static, 16) + for (i = 0; i < 2834; i++) + baz (); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr29965-7.C b/gcc/testsuite/g++.dg/gomp/pr29965-7.C new file mode 100644 index 000000000..be7d6ae9d --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr29965-7.C @@ -0,0 +1,32 @@ +// PR middle-end/29965 +// Test that OpenMP construct bodies which never return don't cause ICEs. +// This is invalid code, but we don't emit diagnostics for it, nevertheless +// we test that we don't ICE on it. +// { dg-do compile } +// { dg-options "-O2 -fopenmp" } + +void +foo () +{ +#pragma omp parallel + throw 0; +} + +static inline void +bar () +{ +#pragma omp parallel + throw 0; +} + +void +bar1 () +{ + bar (); +} + +void +bar2 () +{ + bar (); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr29965-8.C b/gcc/testsuite/g++.dg/gomp/pr29965-8.C new file mode 100644 index 000000000..b2a35287d --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr29965-8.C @@ -0,0 +1,94 @@ +// PR middle-end/29965 +// Test that OpenMP construct bodies which never return don't cause ICEs. +// This is invalid code, but we don't emit diagnostics for it, nevertheless +// we test that we don't ICE on it. +// { dg-do compile } +// { dg-options "-O2 -fopenmp" } + +void +foo1 () +{ +#pragma omp sections + { + throw 0; + } +} + +void +bar1 () +{ +#pragma omp sections + { +#pragma omp section + throw 0; +#pragma omp section + throw 0; + } +} + +void +foo2 () +{ +#pragma omp sections + { + ; +#pragma omp section + throw 0; + } +} + +void +bar2 () +{ +#pragma omp sections + { +#pragma omp section + throw 0; +#pragma omp section + ; + } +} + +void +foo3 () +{ +#pragma omp parallel sections + { + throw 0; + } +} + +void +bar3 () +{ +#pragma omp parallel sections + { +#pragma omp section + throw 0; +#pragma omp section + throw 0; + } +} + +void +foo4 () +{ +#pragma omp parallel sections + { + ; +#pragma omp section + throw 0; + } +} + +void +bar4 () +{ +#pragma omp parallel sections + { +#pragma omp section + throw 0; +#pragma omp section + ; + } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr29965-9.C b/gcc/testsuite/g++.dg/gomp/pr29965-9.C new file mode 100644 index 000000000..b66a24729 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr29965-9.C @@ -0,0 +1,34 @@ +// PR middle-end/29965 +// Test that OpenMP construct bodies which never return don't cause ICEs. +// This is invalid code, but we don't emit diagnostics for it, nevertheless +// we test that we don't ICE on it. +// { dg-do compile } +// { dg-options "-O2 -fopenmp" } + +void +foo1 () +{ +#pragma omp single + throw 0; +} + +void +foo2 () +{ +#pragma omp master + throw 0; +} + +void +foo3 () +{ +#pragma omp ordered + throw 0; +} + +void +foo4 () +{ +#pragma omp critical + throw 0; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr30494.C b/gcc/testsuite/g++.dg/gomp/pr30494.C new file mode 100644 index 000000000..3f2d12058 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr30494.C @@ -0,0 +1,30 @@ +// PR middle-end/30494 +// { dg-do compile } + +int +foo (int n) +{ + int i; +#pragma omp for + for (i = 0; i < 6; i++) + { + int v[n], w[n * 3 + i]; + v[0] = 1; + w[0] = 2; + } + return 0; +} + +int +bar (int n) +{ + int i; +#pragma parallel omp for + for (i = 0; i < 6; i++) + { + int v[n], w[n * 3 + i]; + v[0] = 1; + w[0] = 2; + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr30558.C b/gcc/testsuite/g++.dg/gomp/pr30558.C new file mode 100644 index 000000000..e4929220b --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr30558.C @@ -0,0 +1,41 @@ +// PR tree-optimization/30558 +// { dg-do compile } +// { dg-options "-fopenmp" } + +template <typename T> struct F +{ + ~F (); + F (T); + const T &operator[] (unsigned i) const; +}; + +template <typename T> F<T> foo (const F<T> &x) +{ + return F<T> (x[1]); +} + +struct G +{ + G () { bar (2); } + F<int> &operator () (F<int> x); + void bar (int); +}; + +int +main () +{ + try + { + G g; +#pragma omp parallel for + for (int i = 0; i < 10; ++i) + { + F<int> j (i); + F<int> f = g (j); + F<int> h = foo (f); + } + } + catch (int &e) + { + } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr30696.C b/gcc/testsuite/g++.dg/gomp/pr30696.C new file mode 100644 index 000000000..8f4f2d968 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr30696.C @@ -0,0 +1,12 @@ +inline void foo() {} + +int main() +{ + foo(); + +#pragma omp parallel for + for ( int i=0; i<1; ++i ) + foo(); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr31598.C b/gcc/testsuite/g++.dg/gomp/pr31598.C new file mode 100644 index 000000000..3ebcead5a --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr31598.C @@ -0,0 +1,59 @@ +// PR c++/31598 +// { dg-do compile } +// +// Copyright (C) 2007 Free Software Foundation, Inc. +// Contributed by Theodore.Papadopoulo +// 16 Apr 2007 <Theodore.Papadopoulo@sophia.inria.fr> + +int i; +template <typename> struct A { A() {} }; +template <typename> struct C { C() { i++; } C(const C &) { i += 2; } }; +struct D { D() {} }; + +struct M { typedef double E; }; + +template <typename T> +struct R +{ + R() + { + typedef A<typename T::E> B; + B b; + #pragma omp parallel for firstprivate(b) schedule(guided) + for (int t = 0; t < 10; ++t) + ; + } +}; + +template <typename T> +struct S +{ + S() + { + typedef C<typename T::E> B; + B b; + #pragma omp parallel for firstprivate(b) + for (int t = 0; t < 10; ++t) + ; + } +}; + +struct U +{ + U() + { + D b; + #pragma omp parallel for firstprivate(b) + for (int t = 0; t < 10; ++t) + ; + } +}; + +int +main () +{ + R<M> r; + S<M> s; + U u; + return 0; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr31748.C b/gcc/testsuite/g++.dg/gomp/pr31748.C new file mode 100644 index 000000000..516978d28 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr31748.C @@ -0,0 +1,10 @@ +// PR c++/31748 + +struct A; + +void +foo () +{ +#pragma omp parallel private(A) // { dg-error "struct A.*is not a variable" } + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr31769.C b/gcc/testsuite/g++.dg/gomp/pr31769.C new file mode 100644 index 000000000..54945f94e --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr31769.C @@ -0,0 +1,61 @@ +// PR tree-optimization/31769 +// { dg-options "-O2 -fopenmp" } +// { dg-do compile } + +struct B +{ + B () {} + virtual ~B () {} +}; +struct C +{ + C (int x, int y) {} +}; +template<typename T, int U> +struct D +{ + D () {} + ~D () {} +}; +struct E +{ + E () {} + ~E () {} + D<int, 1> e; +}; +struct A +{ + B *b; + A () { b = __null; } + ~A () { if (b != __null) delete b; } +}; +struct F : public A +{ + explicit F (int x) { foo (0); } + F (const F &x) {} + F (F &x, C y) {} + F operator () (C x) const + { + return F (const_cast<F &>(*this), x); + } + template <typename U> F & operator+= (const U &); + void foo (int); + E f; +}; + +int +main () +{ + try + { + F f (10); + F g (10); + C h (0, 9); +#pragma omp parallel for + for (int i = 0; i < 2; ++i) + g += f (h); + } + catch (int &e) + { + } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr32177.C b/gcc/testsuite/g++.dg/gomp/pr32177.C new file mode 100644 index 000000000..55c8483be --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr32177.C @@ -0,0 +1,46 @@ +// PR c++/32177 +// { dg-do compile } +// { dg-options "-fopenmp" } +// +// Copyright (C) 2007 Free Software Foundation, Inc. +// Contributed by Theodore.Papadopoulo 1 Jun 2007 <Theodore.Papadopoulo@sophia.inria.fr> + +struct A +{ + A () {} + ~A () {} + int s () const { return 1; } +}; + +void +f1 () +{ + #pragma omp parallel for + for (int i = 1; i <= A ().s (); ++i) + ; +} + +void +f2 () +{ + #pragma omp parallel for + for (int i = A ().s (); i <= 20; ++i) + ; +} + +void +f3 () +{ + #pragma omp parallel for + for (int i = 1; i <= 20; i += A ().s ()) + ; +} + +void +f4 () +{ + int i; + #pragma omp parallel for + for (i = A ().s (); i <= 20; i++) + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr33333.C b/gcc/testsuite/g++.dg/gomp/pr33333.C new file mode 100644 index 000000000..ea5079b5e --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr33333.C @@ -0,0 +1,19 @@ +// PR middle-end/33333 +// { dg-do compile } + +struct A +{ + int n; + void foo (); +}; + +void +A::foo () +{ + try + { + #pragma omp parallel for + for (int i = 0; i < n; ++i) + ; + } catch (...) {} +} diff --git a/gcc/testsuite/g++.dg/gomp/pr33372-1.C b/gcc/testsuite/g++.dg/gomp/pr33372-1.C new file mode 100644 index 000000000..62900bf65 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr33372-1.C @@ -0,0 +1,19 @@ +// PR c++/33372 +// { dg-do compile } +// { dg-options "-fopenmp" } + +template <typename T> +void f () +{ + extern T n (); +#pragma omp parallel num_threads(n) // { dg-error "num_threads expression must be integral" } + ; +#pragma omp parallel for schedule(static, n) + for (int i = 0; i < 10; i++) // { dg-error "chunk size expression must be integral" } + ; +} + +void g () +{ + f<int> (); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr33372-2.C b/gcc/testsuite/g++.dg/gomp/pr33372-2.C new file mode 100644 index 000000000..cce7ecc74 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr33372-2.C @@ -0,0 +1,19 @@ +// PR c++/33372 +// { dg-do compile } +// { dg-options "-fopenmp" } + +template <typename T> +void f () +{ + T n = 6; +#pragma omp parallel num_threads(n) + ; +#pragma omp parallel for schedule(static, n) + for (int i = 0; i < 10; i++) + ; +} + +void g () +{ + f<int> (); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr33372-3.C b/gcc/testsuite/g++.dg/gomp/pr33372-3.C new file mode 100644 index 000000000..8220f3c5a --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr33372-3.C @@ -0,0 +1,19 @@ +// PR c++/33372 +// { dg-do compile } +// { dg-options "-fopenmp" } + +template <typename T> +void f () +{ + T n = 6; +#pragma omp parallel num_threads(n) // { dg-error "num_threads expression must be integral" } + ; +#pragma omp parallel for schedule(static, n) + for (int i = 0; i < 10; i++) // { dg-error "chunk size expression must be integral" } + ; +} + +void g () +{ + f<double> (); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr33890.C b/gcc/testsuite/g++.dg/gomp/pr33890.C new file mode 100644 index 000000000..1710b928e --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr33890.C @@ -0,0 +1,34 @@ +// PR c++/33890 +// { dg-do compile } +// { dg-options "-fopenmp" } + +struct A +{ + int x; + A () : x (0) {} + int & getX (); +}; + +template <int> void +foo () +{ + A a; + +#pragma omp for + for (int i = a.getX (); i < 10; ++i) + ; +#pragma omp for + for (int i = 0; i < a.getX (); ++i) + ; + a.x = 1; +#pragma omp for + for (int i = 0; i < 10; i += a.getX ()) + ; +} + +void +bar () +{ + foo <0> (); + foo <1> (); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr34607.C b/gcc/testsuite/g++.dg/gomp/pr34607.C new file mode 100644 index 000000000..f032aa45d --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr34607.C @@ -0,0 +1,18 @@ +// PR c++/34607 +// { dg-do compile } +// { dg-options "-fopenmp" } + +void +foo () +{ +#pragma omp for + for (int i =; i < 2; ++i) // { dg-error "expected primary-expression" } + ; +#pragma omp for + for (T i = 54; i < 56; i++) // { dg-error "was not declared|expected" } + ; + T j; // { dg-error "was not declared|expected" } +#pragma omp for + for (j = 1; j < 3; j++) // { dg-error "was not declared|expected" } + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr34608.C b/gcc/testsuite/g++.dg/gomp/pr34608.C new file mode 100644 index 000000000..759ab3fca --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr34608.C @@ -0,0 +1,19 @@ +// PR middle-end/34608 +// { dg-do compile } +// { dg-options "-ftest-coverage -fopenmp" } + +struct A +{ + ~A () throw (); +}; + +void foo (A); + +void +bar () +{ +#pragma omp parallel + foo (A ()); +} + +// { dg-final { cleanup-coverage-files } } diff --git a/gcc/testsuite/g++.dg/gomp/pr34694.C b/gcc/testsuite/g++.dg/gomp/pr34694.C new file mode 100644 index 000000000..c225e1545 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr34694.C @@ -0,0 +1,15 @@ +// PR middle-end/34694 +// { dg-do compile } +// { dg-options "-O -fopenmp -Wall" } + +int i; + +void +foo () +{ +#pragma omp parallel + { + int j; // { dg-message "note: 'j' was declared here" } + i = j; // { dg-warning "is used uninitialized" } + } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr34964.C b/gcc/testsuite/g++.dg/gomp/pr34964.C new file mode 100644 index 000000000..f5995a6da --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr34964.C @@ -0,0 +1,6 @@ +// PR c++/34964 +// { dg-do compile } +// { dg-options "-fopenmp" } + +char x[] = 0; // { dg-error "initializer fails to determine size" } +#pragma omp threadprivate (x) diff --git a/gcc/testsuite/g++.dg/gomp/pr35028.C b/gcc/testsuite/g++.dg/gomp/pr35028.C new file mode 100644 index 000000000..ef7ba07de --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr35028.C @@ -0,0 +1,19 @@ +// PR c++/35028 +// { dg-do compile } +// { dg-options "-fopenmp" } + +struct A +{ + A (); + A (const A &, ...); + ~A (); + A operator++ (int); +}; + +void +foo () +{ + A a; + #pragma omp parallel firstprivate (a) + a++; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr35078.C b/gcc/testsuite/g++.dg/gomp/pr35078.C new file mode 100644 index 000000000..1f0d9ec7f --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr35078.C @@ -0,0 +1,20 @@ +// PR c++/35078 +// { dg-do compile } +// { dg-options "-fopenmp" } + +template<int> void +foo () +{ +#pragma omp parallel for + for (int& i = 0; i < 10; ++i) // { dg-error "invalid type for iteration variable" } + ; +} + +void +bar () +{ + int j = 0; +#pragma omp parallel for + for (int& i = j; i < 10; ++i) // { dg-error "invalid type for iteration variable" } + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr35099.C b/gcc/testsuite/g++.dg/gomp/pr35099.C new file mode 100644 index 000000000..6c793a3f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr35099.C @@ -0,0 +1,39 @@ +// PR middle-end/35099 +// { dg-do compile } +// { dg-options "-O2 -fopenmp" } + +struct A +{ + ~A () throw (); + void foo (); +}; + +struct B +{ + B () { A ().foo (); } +}; + +void +bar () +{ +#pragma omp parallel + { + #pragma omp single + B (); + #pragma omp for + for (int i = 0; i < 2; ++i) + B (); + } +} + +void +baz () +{ +#pragma omp parallel + { + #pragma omp single + B (); + #pragma omp single + B (); + } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr35158.C b/gcc/testsuite/g++.dg/gomp/pr35158.C new file mode 100644 index 000000000..9577cd236 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr35158.C @@ -0,0 +1,14 @@ +// PR c++/35158 +// { dg-do compile } +// { dg-options "-fopenmp" } + +int main(int argc, char *argv[]) +{ +#pragma omp parallel for + for (int i(0) ; // { dg-error "parenthesized initialization is not allowed in OpenMP 'for' loop" } + i < 10 ; + i++) + ; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr35244.C b/gcc/testsuite/g++.dg/gomp/pr35244.C new file mode 100644 index 000000000..022f9d0a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr35244.C @@ -0,0 +1,30 @@ +// PR c++/35244 +// { dg-do compile } +// { dg-require-effective-target tls } +// { dg-options "-fopenmp" } + +int v1; +namespace N1 +{ + int v2; +} +namespace N2 +{ + int v3; +} +using N1::v2; +using namespace N2; +struct A; +typedef int i; +#pragma omp threadprivate (i) // { dg-error "is not file, namespace or block scope variable" } +#pragma omp threadprivate (A) // { dg-error "is not file, namespace or block scope variable" } +#pragma omp threadprivate (v1, v2, v3) + +void foo () +{ + static int v4; + { + static int v5; +#pragma omp threadprivate (v4, v5) + } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr35328.C b/gcc/testsuite/g++.dg/gomp/pr35328.C new file mode 100644 index 000000000..718283b59 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr35328.C @@ -0,0 +1,31 @@ +// PR c++/35328 +// { dg-do compile } +// { dg-options "-fopenmp" } + +struct A +{ + ~A ()(); // { dg-error "declared as function returning a function" } +}; +struct B +{ + B ()(); // { dg-error "declared as function returning a function" } +}; +struct C +{ + C (); + C (const C &)(); // { dg-error "declared as function returning a function" } +}; + +void +foo () +{ + A a; + B b; + C c; + #pragma omp parallel firstprivate (a) + ; + #pragma omp parallel private (b) + ; + #pragma omp parallel firstprivate (c) + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr35337.C b/gcc/testsuite/g++.dg/gomp/pr35337.C new file mode 100644 index 000000000..2e9ca6b20 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr35337.C @@ -0,0 +1,20 @@ +// PR c++/35337 +// { dg-do compile } +// { dg-options "-fopenmp" } + +struct A { }; + +void +foo () +{ +#pragma omp parallel firstprivate(A) // { dg-error "struct A\[^\n\]*is not a variable" } + ; +} + +void +bar () +{ +#pragma omp for lastprivate(A) // { dg-error "struct A\[^\n\]*is not a variable" } + for (int i = 0; i < 10; i++) + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr35364.C b/gcc/testsuite/g++.dg/gomp/pr35364.C new file mode 100644 index 000000000..da60d5deb --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr35364.C @@ -0,0 +1,50 @@ +// PR target/35364 +// { dg-do compile } +// { dg-options "-O2 -fopenmp" } + +template <typename T> +struct E +{ + E (); + ~E (); +}; + +template <typename T, typename U> +struct C +{ + C (const U &y) : u (y) {} + ~C () {} + const U &u; +}; + +template <typename T, typename U = E<T> > +struct B : public C<T, U> +{ + B (int x, const T &z = T (), const U &y = U ()) : C<T, U> (y) {} + ~B () {} +}; + +void +foo () +{ +#pragma omp parallel + { + B<double> x (1); + } +#pragma omp for + for (int i = 0; i < 10; i++) + { + B<int> x (i); + } +#pragma omp sections + { +#pragma omp section + { + B<int> x (6); + } + } +#pragma omp single + { + B<int> x (16); + } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr35751.C b/gcc/testsuite/g++.dg/gomp/pr35751.C new file mode 100644 index 000000000..0b6cded59 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr35751.C @@ -0,0 +1,34 @@ +// PR c/35751 +// { dg-do compile } +// { dg-options "-fopenmp" } + +void +foo (int i) +{ + extern int a[i]; // { dg-error "storage size of" } + static int b[i]; // { dg-error "storage size of" } + +#pragma omp parallel + { + a[0] = 0; + b[0] = 0; + } + +#pragma omp parallel shared (a, b) + { + a[0] = 0; + b[0] = 0; + } + +#pragma omp parallel private (a, b) + { + a[0] = 0; + b[0] = 0; + } + +#pragma omp parallel firstprivate (a, b) + { + a[0] = 0; + b[0] = 0; + } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr36237.C b/gcc/testsuite/g++.dg/gomp/pr36237.C new file mode 100644 index 000000000..29c7adc8a --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr36237.C @@ -0,0 +1,25 @@ +// PR c++/36237 +// { dg-do compile } +// { dg-options "-fopenmp" } + +struct A +{ + ~A (); +}; + +struct B +{ + B (const A &x = A ()) : a (x) { } + A a; +}; + +B var; + +void bar (); + +void +foo () +{ + #pragma omp parallel private (var) + bar (); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr36790.C b/gcc/testsuite/g++.dg/gomp/pr36790.C new file mode 100644 index 000000000..07e8b1052 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr36790.C @@ -0,0 +1,23 @@ +// PR middle-end/36790 +// { dg-do compile } +// { dg-options "-fopenmp -O2" } + +void +foo (bool b) +{ +} + +void +bar (bool b) +{ + foo (b); + #pragma omp task default (shared) + b = false; +} + +int +main () +{ + bar (false); + return 0; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr37189.C b/gcc/testsuite/g++.dg/gomp/pr37189.C new file mode 100644 index 000000000..31d95f2d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr37189.C @@ -0,0 +1,27 @@ +// PR c++/37189 +// { dg-do compile } +// { dg-options "-fopenmp" } + +struct S +{ + S () {} + S (S const &) {} +}; + +struct T +{ + S s; +}; + +void +bar (T &) +{ +} + +int +foo () +{ + T t; + #pragma omp task + bar (t); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr37346.C b/gcc/testsuite/g++.dg/gomp/pr37346.C new file mode 100644 index 000000000..b6619edc5 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr37346.C @@ -0,0 +1,15 @@ +// PR c++/37346 +// { dg-do compile } +// { dg-options "-fopenmp" } + +struct A +{ + A (); + int i; +}; + +A::A () +{ +#pragma omp critical + i++; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr37533.C b/gcc/testsuite/g++.dg/gomp/pr37533.C new file mode 100644 index 000000000..7bf61945b --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr37533.C @@ -0,0 +1,50 @@ +// PR c++/37533 +// { dg-do compile } +// { dg-options "-fopenmp" } + +template<int> +void +f1 () +{ +#pragma omp parallel for + for (int i = ""; i < 4; ++i) // { dg-error "invalid conversion from" } + ; +} + +template<int> +void +f2 () +{ + int i; +#pragma omp parallel for + for (i = ""; i < 4; ++i) // { dg-error "invalid conversion from" } + ; +} + +template<typename T> +void +f3 () +{ +#pragma omp parallel for + for (T i = ""; i < 4; ++i) // { dg-error "invalid conversion from" } + ; +} + +template<typename T> +void +f4 () +{ + T i; +#pragma omp parallel for + for (i = ""; i < 4; ++i) // { dg-error "invalid conversion from" } + ; +} + +void +bar () +{ + f1<0> (); // { dg-message "instantiated from here" } + f2<1> (); // { dg-message "instantiated from here" } + f3<int> (); // { dg-message "instantiated from here" } + f4<int> (); // { dg-message "instantiated from here" } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr38633.C b/gcc/testsuite/g++.dg/gomp/pr38633.C new file mode 100644 index 000000000..99b879573 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr38633.C @@ -0,0 +1,14 @@ +// PR middle-end/38633 +// { dg-do compile } +// { dg-options "-fopenmp" } + +void +foo () +{ +#pragma omp parallel + { + struct A { int i; } j; + j.i = 6; + j.i++; + } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr38639.C b/gcc/testsuite/g++.dg/gomp/pr38639.C new file mode 100644 index 000000000..1da3cecdf --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr38639.C @@ -0,0 +1,17 @@ +// PR c++/38639 +// { dg-do compile } +// { dg-options "-fopenmp -std=c++0x" } + +template<int> void +foo () +{ +#pragma omp parallel for + for (auto i = i = 0; i<4; ++i) // { dg-error "incomplete|unable|invalid" } + ; +} + +void +bar () +{ + foo<0> (); // { dg-message "instantiated from here" } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr39495-1.C b/gcc/testsuite/g++.dg/gomp/pr39495-1.C new file mode 100644 index 000000000..8563e684f --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr39495-1.C @@ -0,0 +1,95 @@ +// PR c/39495 +// { dg-do compile } +// { dg-options "-fopenmp" } + +#define INT_MIN (-__INT_MAX__ - 1) +#define INT_MAX __INT_MAX__ +#define UINT_MAX (2U * __INT_MAX__ + 1) + +int +foo (void) +{ + int i; + unsigned int u; + +#pragma omp for + for (i = INT_MIN + 6; i > INT_MIN + 1; i--) + ; +#pragma omp for + for (i = INT_MIN + 6; i >= INT_MIN + 1; i--) + ; +#pragma omp for + for (i = INT_MIN + 6; i > INT_MIN; i--) + ; +#pragma omp for + for (i = INT_MAX - 6; i < INT_MAX - 1; i++) + ; +#pragma omp for + for (i = INT_MAX - 6; i <= INT_MAX - 1; i++) + ; +#pragma omp for + for (i = INT_MAX - 6; i < INT_MAX; i++) + ; +#pragma omp for + for (u = 6; u > 1; u--) + ; +#pragma omp for + for (u = 6; u >= 1; u--) + ; +#pragma omp for + for (u = 6; u > 0; u--) + ; +#pragma omp for + for (u = UINT_MAX - 6; u < UINT_MAX - 1; u++) + ; +#pragma omp for + for (u = UINT_MAX - 6; u <= UINT_MAX - 1; u++) + ; +#pragma omp for + for (u = UINT_MAX - 6; u < UINT_MAX; u++) + ; +} + +int +bar (void) +{ + int i; + unsigned int u; + +#pragma omp for + for (i = INT_MIN + 6; i > INT_MIN + 1; i -= 2) + ; +#pragma omp for + for (i = INT_MIN + 6; i >= INT_MIN + 1; i -= 2) + ; +#pragma omp for + for (i = INT_MIN + 6; i > INT_MIN; i -= 2) + ; +#pragma omp for + for (i = INT_MAX - 6; i < INT_MAX - 1; i += 2) + ; +#pragma omp for + for (i = INT_MAX - 6; i <= INT_MAX - 1; i += 2) + ; +#pragma omp for + for (i = INT_MAX - 6; i < INT_MAX; i += 2) + ; +#pragma omp for + for (u = 6; u > 1; u -= 2) + ; +#pragma omp for + for (u = 6; u >= 1; u -= 2) + ; +#pragma omp for + for (u = 6; u > 0; u -= 2) + ; +#pragma omp for + for (u = UINT_MAX - 6; u < UINT_MAX - 1; u += 2) + ; +#pragma omp for + for (u = UINT_MAX - 6; u <= UINT_MAX - 1; u += 2) + ; +#pragma omp for + for (u = UINT_MAX - 6; u < UINT_MAX; u += 2) + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr39495-2.C b/gcc/testsuite/g++.dg/gomp/pr39495-2.C new file mode 100644 index 000000000..c0b4d5dbd --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr39495-2.C @@ -0,0 +1,39 @@ +// PR c/39495 +// { dg-do compile } +// { dg-options "-fopenmp" } + +#define INT_MIN (-__INT_MAX__ - 1) +#define INT_MAX __INT_MAX__ +#define UINT_MAX (2U * __INT_MAX__ + 1) + +int +foo (void) +{ + int i; + unsigned int u; + +#pragma omp for + for (i = INT_MIN + 6; i != INT_MIN; i--) // { dg-error "invalid controlling predicate" } + ; +#pragma omp for + for (i = INT_MIN + 6; i == INT_MIN; i--) // { dg-error "invalid controlling predicate" } + ; +#pragma omp for + for (i = INT_MAX - 6; i != INT_MAX; i++) // { dg-error "invalid controlling predicate" } + ; +#pragma omp for + for (i = INT_MAX - 6; i == INT_MAX; i++) // { dg-error "invalid controlling predicate" } + ; +#pragma omp for + for (u = 6; u != 0; u--) // { dg-error "invalid controlling predicate" } + ; +#pragma omp for + for (u = 6; u == 0; u--) // { dg-error "invalid controlling predicate" } + ; +#pragma omp for + for (u = UINT_MAX - 6; u != UINT_MAX; u++) // { dg-error "invalid controlling predicate" } + ; +#pragma omp for + for (u = UINT_MAX - 6; u == UINT_MAX; u++) // { dg-error "invalid controlling predicate" } + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr41429.C b/gcc/testsuite/g++.dg/gomp/pr41429.C new file mode 100644 index 000000000..7de41b846 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr41429.C @@ -0,0 +1,5 @@ +// PR middle-end/41429 +// { dg-do compile { target fpic } } +// { dg-options "-fopenmp -O2 -fpic" } + +#include "pr37189.C" diff --git a/gcc/testsuite/g++.dg/gomp/pr41967.C b/gcc/testsuite/g++.dg/gomp/pr41967.C new file mode 100644 index 000000000..0eb489e8b --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr41967.C @@ -0,0 +1,17 @@ +// PR c++/41967 +// { dg-do compile } +// { dg-options "-fopenmp" } + +int +foo () +{ + int sum = 0; +#pragma omp for collapse(2) + for (int i = 0; i < 5; ++i) + { + for (int j = 0; j < 5; ++j) + ++sum; + ++sum; // { dg-error "collapsed loops not perfectly nested" } + } + return sum; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr42234.C b/gcc/testsuite/g++.dg/gomp/pr42234.C new file mode 100644 index 000000000..9245b6c68 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr42234.C @@ -0,0 +1,19 @@ +// PR c++/42234 +// { dg-do compile } +// { dg-options "-fopenmp" } + +extern int foo (void); + +void +bar (int x) +{ + #pragma omp critical + { + int j; + for (j = 0; j < foo (); j++) + ; + if (0) + if (x >= 4) + ; + } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr47963.C b/gcc/testsuite/g++.dg/gomp/pr47963.C new file mode 100644 index 000000000..7c94e6422 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr47963.C @@ -0,0 +1,11 @@ +// PR c/47963 +// { dg-do compile } +// { dg-options "-fopenmp" } + +void +foo (float n) +{ + int A[n][n]; // { dg-error "has non-integral type" } +#pragma omp parallel private(A) + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr48632.C b/gcc/testsuite/g++.dg/gomp/pr48632.C new file mode 100644 index 000000000..afa8b1893 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr48632.C @@ -0,0 +1,22 @@ +// PR c++/48632 +// { dg-do compile } +// { dg-options "-fopenmp" } + +template<typename T> +void +foo (T *x, T *y, unsigned z) +{ +#pragma omp parallel for + for (T *p = x; p < y; p += z) + ; +#pragma omp parallel for + for (T *p = y; p > x; p -= z) + ; +} + +int +main () +{ + char buf[10]; + foo (&buf[0], &buf[9], 1); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr48716.C b/gcc/testsuite/g++.dg/gomp/pr48716.C new file mode 100644 index 000000000..2dccad2d9 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr48716.C @@ -0,0 +1,24 @@ +// PR c/48716 +// { dg-do compile } +// { dg-options "-fopenmp" } + +int +main (void) +{ + #pragma omp parallel default(none) + { + static int s; + int t = 0; + #pragma omp atomic + s++; + t++; + } + #pragma omp task default(none) + { + static int s; + int t = 0; + #pragma omp atomic + s++; + t++; + } +} diff --git a/gcc/testsuite/g++.dg/gomp/pr49223-1.C b/gcc/testsuite/g++.dg/gomp/pr49223-1.C new file mode 100644 index 000000000..307210fe1 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr49223-1.C @@ -0,0 +1,28 @@ +// PR c++/49223 +// { dg-do compile } +// { dg-options "-fopenmp" } + +template <int N> +struct V +{ + V () {} + ~V () {} +}; + +template <int N> +struct S +{ + void foo () + { + V <0> v; + #pragma omp parallel private (v) + ; + } +}; + +void +bar (void) +{ + S <0> s; + s.foo (); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr49223-2.C b/gcc/testsuite/g++.dg/gomp/pr49223-2.C new file mode 100644 index 000000000..95397733e --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr49223-2.C @@ -0,0 +1,16 @@ +// PR c++/49223 +// { dg-do compile } +// { dg-require-effective-target tls } +// { dg-options "-fopenmp" } + +struct S; // { dg-error "forward declaration" } +extern __thread struct S s; // { dg-error "has incomplete type" } +struct T; +extern __thread struct T t; + +void +foo () +{ + #pragma omp parallel copyin (s) + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr51360-2.C b/gcc/testsuite/g++.dg/gomp/pr51360-2.C new file mode 100644 index 000000000..cc03849a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr51360-2.C @@ -0,0 +1,21 @@ +/* PR c/51360 */ +/* { dg-do compile } */ +/* { dg-options "-Wunused -W -fopenmp" } */ + +void +foo (int a, int b, int c) +{ + int m, n, o, i; + m = 6; + n = 1; + o = 5; + a = 6; + b = 1; + c = 5; + #pragma omp parallel for num_threads (m) if (n) schedule (static, o) + for (i = 0; i < 10; i++) + ; + #pragma omp parallel for num_threads (a) if (b) schedule (static, c) + for (i = 0; i < 10; i++) + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr51360.C b/gcc/testsuite/g++.dg/gomp/pr51360.C new file mode 100644 index 000000000..06c64873c --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr51360.C @@ -0,0 +1,28 @@ +// PR c/51360 +// { dg-do compile } +// { dg-options "-Wunused -W -fopenmp" } + +template <typename T> +void +foo (T a, T b, T c) +{ + T m, n, o, i; + m = 6; + n = 1; + o = 5; + a = 6; + b = 1; + c = 5; + #pragma omp parallel for num_threads (m) if (n) schedule (static, o) + for (i = 0; i < 10; i++) + ; + #pragma omp parallel for num_threads (a) if (b) schedule (static, c) + for (i = 0; i < 10; i++) + ; +} + +void +bar () +{ + foo (0, 0, 0); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr51669.C b/gcc/testsuite/g++.dg/gomp/pr51669.C new file mode 100644 index 000000000..ab99d93e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr51669.C @@ -0,0 +1,32 @@ +// PR c++/51669 +// { dg-do compile } +// { dg-options "-fopenmp" } + +template <typename T> const T & min (const T &, const T &); + +void +f1 () +{ +#pragma omp parallel num_threads (min (4, 5)) + ; +} + +struct A { A (); ~A (); }; +int foo (const A &); + +void +f2 () +{ + int i; +#pragma omp parallel if (foo (A ())) num_threads (foo (A ())) + ; +#pragma omp task if (foo (A ())) + ; +#pragma omp for schedule (static, foo (A ())) + for (i = 0; i < 10; i++) + ; +#pragma omp parallel for schedule (static, foo (A ())) \ + if (foo (A ())) num_threads (foo (A ())) + for (i = 0; i < 10; i++) + ; +} diff --git a/gcc/testsuite/g++.dg/gomp/predetermined-1.C b/gcc/testsuite/g++.dg/gomp/predetermined-1.C new file mode 100644 index 000000000..dd09855de --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/predetermined-1.C @@ -0,0 +1,33 @@ +// { dg-do compile } +// { dg-options "-fopenmp" } + +struct A { int i; A (); ~A (); }; +struct B { int i; }; +struct C { int i; mutable int j; C (); ~C (); }; + +template <typename T> void bar (const T *); + +const A a; +const C c; + +const A foo (const A d, const C e) +{ + const A f; + const B b = { 4 }; + A g; + #pragma omp parallel default (none) + bar (&a); + #pragma omp parallel default (none) + bar (&b); + #pragma omp parallel default (none) // { dg-error "enclosing parallel" } + bar (&c); // { dg-error "not specified" } + #pragma omp parallel default (none) + bar (&d); + #pragma omp parallel default (none) // { dg-error "enclosing parallel" } + bar (&e); // { dg-error "not specified" } + #pragma omp parallel default (none) + bar (&f); + #pragma omp parallel default (none) // { dg-error "enclosing parallel" } + bar (&g); // { dg-error "not specified" } + return f; +} diff --git a/gcc/testsuite/g++.dg/gomp/sections-1.C b/gcc/testsuite/g++.dg/gomp/sections-1.C new file mode 100644 index 000000000..43704908e --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/sections-1.C @@ -0,0 +1,39 @@ +/* { dg-do compile } */ + +extern void bar(int); + +void f1(void) +{ + #pragma omp sections nowait + { + bar (1); + #pragma omp section + bar (2); + #pragma omp section + bar (3); + #pragma omp section + bar (4); + #pragma omp section + bar (5); + } +} + +void f2(void) +{ + #pragma omp sections + { + #pragma omp section + { + bar (1); + bar (1); + } + #pragma omp section + bar (2); + #pragma omp section + bar (3); + #pragma omp section + bar (4); + #pragma omp section + bar (5); + } +} diff --git a/gcc/testsuite/g++.dg/gomp/sections-2.C b/gcc/testsuite/g++.dg/gomp/sections-2.C new file mode 100644 index 000000000..aabdfaf80 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/sections-2.C @@ -0,0 +1,29 @@ +/* { dg-do compile } */ + +extern void bar(int); +void foo(void) +{ + #pragma omp sections + bar (0); // { dg-error "expected" } + + #pragma omp sections + { + } // { dg-error "expected" } + + #pragma omp sections + { + bar (1); + } + + #pragma omp sections + { + #pragma omp section + bar(2); + bar(3); // { dg-error "expected" } + bar(4); + #pragma omp section + bar(5); + bar(6); // { dg-error "expected" } + bar(7); + } +} diff --git a/gcc/testsuite/g++.dg/gomp/sections-3.C b/gcc/testsuite/g++.dg/gomp/sections-3.C new file mode 100644 index 000000000..d8fb2a09d --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/sections-3.C @@ -0,0 +1,15 @@ + +// { dg-do compile } + +extern void bar (void); + +int main (void) +{ + #pragma omp parallel sections nowait /* { dg-error "'nowait'" } */ + { + #pragma omp section + { bar(); } + #pragma omp section + { bar(); } + } +} diff --git a/gcc/testsuite/g++.dg/gomp/sections-4.C b/gcc/testsuite/g++.dg/gomp/sections-4.C new file mode 100644 index 000000000..62a2ecddf --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/sections-4.C @@ -0,0 +1,13 @@ +/* PR c++/24613 */ +/* { dg-do compile } */ + +#pragma omp section /* { dg-error "may only be used in" } */ + +int i; + +void +foo (void) +{ + #pragma omp section /* { dg-error "may only be used in" } */ + i++; +} diff --git a/gcc/testsuite/g++.dg/gomp/sharing-1.C b/gcc/testsuite/g++.dg/gomp/sharing-1.C new file mode 100644 index 000000000..83b818098 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/sharing-1.C @@ -0,0 +1,77 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target tls } */ + +int thrglobalvar; +#pragma omp threadprivate (thrglobalvar) +int globalvar; +const struct S +{ + int x; +} constvar = { 8 }; +struct T +{ + static T t; + int i; +}; +T T::t = { 6 }; +/* const qualified type, but mutable member -> not predetermined. */ +const struct U +{ + int x; + mutable int y; +} constmutvar = { 6, 4 }; + +int +foo (int x) +{ + return x; +} + +int +bar (int *x) +{ + return *x; +} + +int +baz (U u) +{ + return u.x; +} + +int +main (void) +{ + static int thrlocvar; +#pragma omp threadprivate (thrlocvar) + static int locvar; + static int *p; + int i, j, s, l; + + p = new int; + *p = 7; + s = 6; + l = 0; +#pragma omp parallel for /* { dg-error "enclosing parallel" } */ \ + default (none) private (p) shared (s) + for (i = 0; i < 64; i++) + { + int k = foo (0); /* Predetermined - private (automatic var declared */ + k++; /* in scope of construct). */ + thrglobalvar++; /* Predetermined - threadprivate. */ + thrlocvar++; /* Predetermined - threadprivate. */ + foo (i); /* Predetermined - private (omp for loop variable). */ + foo (constvar.x); /* Predetermined - shared (const qualified type). */ + foo (T::t.i); /* Predetermined - shared (static data member). */ + foo (*p); /* *p predetermined - shared (heap allocated */ + (*p)++; /* storage). */ + bar (p); /* Explicitly determined - private. */ + foo (s); /* Explicitly determined - shared. */ + globalvar++; /* { dg-error "not specified in" } */ + locvar++; /* { dg-error "not specified in" } */ + l++; /* { dg-error "not specified in" } */ + for (j = 0; j < 2; j++); /* { dg-error "not specified in" } */ + baz (constmutvar);/* { dg-error "not specified in" } */ + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/gomp/task-1.C b/gcc/testsuite/g++.dg/gomp/task-1.C new file mode 100644 index 000000000..0000e6f1f --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/task-1.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-fopenmp" } + +struct A { A (); ~A (); int i; }; + +template <typename T> void bar (T &); + +const A a; + +void foo (A &p) +{ + const A &q = a; +#pragma omp task // { dg-error "has reference type" } + bar (p); +#pragma omp task // { dg-error "has reference type" } + bar (q); +} diff --git a/gcc/testsuite/g++.dg/gomp/tls-1.C b/gcc/testsuite/g++.dg/gomp/tls-1.C new file mode 100644 index 000000000..bfe62cb00 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/tls-1.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// { dg-require-effective-target tls } + +int tp1; +static int tp2; +extern int tp3; + +int tp4 = 1; +static int tp5 = 1; + +#pragma omp threadprivate (tp1, tp2, tp3, tp4, tp5) + +#pragma omp threadprivate (undef) // { dg-error "declared" } + +int tp6; +int foo(void) { return tp6; } + +#pragma omp threadprivate (tp6) // { dg-error "after first use" } diff --git a/gcc/testsuite/g++.dg/gomp/tls-2.C b/gcc/testsuite/g++.dg/gomp/tls-2.C new file mode 100644 index 000000000..80275f908 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/tls-2.C @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target tls } */ + +extern char buf[]; +#pragma omp threadprivate (buf) /* { dg-error "has incomplete type" } */ + +void +foo (void) +{ + int i; +#pragma omp threadprivate (i) /* { dg-error "automatic variable" } */ + i = 0; +} diff --git a/gcc/testsuite/g++.dg/gomp/tls-3.C b/gcc/testsuite/g++.dg/gomp/tls-3.C new file mode 100644 index 000000000..c710b6d18 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/tls-3.C @@ -0,0 +1,27 @@ +// { dg-do compile } +// { dg-require-effective-target tls } + +#define thr threadprivate + +int i; +#pragma omp thr (i) +namespace N +{ + int j; +#pragma omp thr (j) +}; +struct S +{ + static int s; +#pragma omp thr (s) +}; + +int S::s = 5; + +int +foo () +{ + static int k; +#pragma omp thr (k) + return k++ + S::s; +} diff --git a/gcc/testsuite/g++.dg/gomp/tls-4.C b/gcc/testsuite/g++.dg/gomp/tls-4.C new file mode 100644 index 000000000..f6c039e3d --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/tls-4.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// { dg-require-effective-target tls } + +#define thr threadprivate + +struct S +{ + static int s; +}; +struct T : public S +{ + static int t; +#pragma omp thr (s) // { dg-error "directive not in" } +}; + +#pragma omp thr (T::t) // { dg-error "directive not in" } diff --git a/gcc/testsuite/g++.dg/gomp/tpl-atomic-1.C b/gcc/testsuite/g++.dg/gomp/tpl-atomic-1.C new file mode 100644 index 000000000..ff1e3632d --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/tpl-atomic-1.C @@ -0,0 +1,26 @@ +// { dg-do compile } + +int check; + +template<typename T> void foo() +{ + #pragma omp atomic + check |= sizeof(T); +} + +template<typename T> void bar(T *x, T y) +{ + #pragma omp atomic + *x += y; +} + +void test () +{ + int i; + long l; + + foo<char>(); + foo<short>(); + bar(&i, 4); + bar(&l, 8L); +} diff --git a/gcc/testsuite/g++.dg/gomp/tpl-atomic-2.C b/gcc/testsuite/g++.dg/gomp/tpl-atomic-2.C new file mode 100644 index 000000000..c27f20193 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/tpl-atomic-2.C @@ -0,0 +1,40 @@ +// { dg-do compile } + +struct S { int x; } s; + +// Make sure we detect errors on non-type-dependent things +// even when the templates are never instantiated. +template<typename T> void f1() +{ + #pragma omp atomic + s += 1; // { dg-error "invalid" } +} + +template<typename T> void f2(float *f) +{ + #pragma omp atomic + *f |= 1; // { dg-error "invalid|evaluation" } +} + +// Here the rhs is dependent, but not type dependent. +template<typename T> void f3(float *f) +{ + #pragma omp atomic + *f |= sizeof (T); // { dg-error "invalid|evaluation" } +} + +// And the converse, no error here because we're never fed a T. +template<typename T> void f4(T *t) +{ + #pragma omp atomic + *t += 1; +} + +// Here we'll let it go, because the rhs is type dependent and +// we can't properly instantiate the statement, and we do most +// of the semantic analysis concurrent with that. +template<typename T> void f5(float *f) +{ + #pragma omp atomic + *f |= (T)sizeof(T); // { dg-error "invalid|evaluation" "" { xfail *-*-* } } +} diff --git a/gcc/testsuite/g++.dg/gomp/tpl-barrier-1.C b/gcc/testsuite/g++.dg/gomp/tpl-barrier-1.C new file mode 100644 index 000000000..60567d910 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/tpl-barrier-1.C @@ -0,0 +1,25 @@ +// PR c++/24735 +// { dg-do compile } +// { dg-options "-fopenmp -fdump-tree-gimple" } + +template <int> void f1 () +{ + #pragma omp barrier +} + +template <int> void f2 (bool p) +{ + if (p) + { + #pragma omp barrier + } +} + +void f3 () +{ + f1<0> (); + f2<0> (true); +} + +// { dg-final { scan-tree-dump-times "GOMP_barrier" 2 "gimple" } } +// { dg-final { cleanup-tree-dump "gimple" } } diff --git a/gcc/testsuite/g++.dg/gomp/tpl-for-1.C b/gcc/testsuite/g++.dg/gomp/tpl-for-1.C new file mode 100644 index 000000000..e036e6447 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/tpl-for-1.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +void foo(int); +void foo(long); + +template<typename T> void bar() +{ + #pragma omp for + for (T i = 0; i < 10; ++i) + foo(i); +} + +void test() +{ + bar<int>(); + bar<long>(); +} diff --git a/gcc/testsuite/g++.dg/gomp/tpl-for-2.C b/gcc/testsuite/g++.dg/gomp/tpl-for-2.C new file mode 100644 index 000000000..a3bb6ccd4 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/tpl-for-2.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +void foo(int); + +template<int A, int B, int C> void bar() +{ + #pragma omp for + for (int i = A; i < B; i += C) + foo(i); +} + +void test() +{ + bar<0, 10, 2>(); +} diff --git a/gcc/testsuite/g++.dg/gomp/tpl-for-3.C b/gcc/testsuite/g++.dg/gomp/tpl-for-3.C new file mode 100644 index 000000000..0cafd9628 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/tpl-for-3.C @@ -0,0 +1,28 @@ +// { dg-do compile } + +void foo(int); + +template<typename T> void bar() +{ + #pragma omp parallel for + for (typename T::T i = 0; i < T::N; ++i) + foo(i); +} + +struct A +{ + typedef int T; + static T N; +}; + +struct B +{ + typedef long T; + static T N; +}; + +void test() +{ + bar<A>(); + bar<B>(); +} diff --git a/gcc/testsuite/g++.dg/gomp/tpl-master-1.C b/gcc/testsuite/g++.dg/gomp/tpl-master-1.C new file mode 100644 index 000000000..cf22e1c3f --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/tpl-master-1.C @@ -0,0 +1,30 @@ +// PR c++/24734 +// { dg-do compile } +// { dg-options "-fopenmp -fdump-tree-gimple" } + +int i; + +template <int> void f1 () +{ + #pragma omp ordered + i++; +} + +template <int> void f2 (bool p) +{ + if (p) + { + #pragma omp master + i++; + } +} + +void f3 () +{ + f1<0> (); + f2<0> (true); +} + +// { dg-final { scan-tree-dump-times "#pragma omp ordered" 1 "gimple" } } +// { dg-final { scan-tree-dump-times "#pragma omp master" 1 "gimple" } } +// { dg-final { cleanup-tree-dump "gimple" } } diff --git a/gcc/testsuite/g++.dg/gomp/tpl-parallel-1.C b/gcc/testsuite/g++.dg/gomp/tpl-parallel-1.C new file mode 100644 index 000000000..886d07e21 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/tpl-parallel-1.C @@ -0,0 +1,24 @@ +// { dg-do compile } + +int check; + +template<typename T> void foo() +{ + check |= sizeof(T); +} + +template<typename T> +void bar(void) +{ + #pragma omp parallel if (0) + foo<T>(); +} + +int main() +{ + bar<char>(); + bar<short>(); + if (check != (sizeof(char) | sizeof(short))) + __builtin_trap (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/gomp/tpl-parallel-2.C b/gcc/testsuite/g++.dg/gomp/tpl-parallel-2.C new file mode 100644 index 000000000..2dceb0932 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/tpl-parallel-2.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +template<typename T> +struct S +{ + T n; + void test(); + void work(); +}; + +template<typename T> +void S<T>::test() +{ + #pragma omp parallel num_threads(n) // { dg-error "must be integral" } + work(); +} + +template struct S<int>; +template struct S<long>; +template struct S<float>; // { dg-message "instantiated from here" } diff --git a/gcc/testsuite/g++.dg/graphite/graphite.exp b/gcc/testsuite/g++.dg/graphite/graphite.exp new file mode 100644 index 000000000..4b359c9b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/graphite/graphite.exp @@ -0,0 +1,71 @@ +# Copyright (C) 2009, 2010 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# GCC testsuite that uses the `dg.exp' driver. + +# Load support procs. +load_lib g++-dg.exp + +if ![check_effective_target_fgraphite] { + return +} + +# Remove VALUE from LIST_VARIABLE. +proc lremove {list_variable value} { + upvar 1 $list_variable var + set idx [lsearch -exact $var $value] + set var [lreplace $var $idx $idx] +} + +# The default action for a test is 'compile'. Save current default. +global dg-do-what-default +set save-dg-do-what-default ${dg-do-what-default} + +# Initialize `dg'. +dg-init + +set wait_to_run_files [lsort [glob -nocomplain $srcdir/$subdir/*.C ] ] +set scop_files [lsort [glob -nocomplain $srcdir/$subdir/scop-*.C ] ] +set id_files [lsort [glob -nocomplain $srcdir/$subdir/id-*.C ] ] +set run_id_files [lsort [glob -nocomplain $srcdir/$subdir/run-id-*.C ] ] +set interchange_files [lsort [glob -nocomplain $srcdir/$subdir/interchange-*.C ] ] +set block_files [lsort [glob -nocomplain $srcdir/$subdir/block-*.C ] ] + +# Tests to be compiled. +set dg-do-what-default compile +dg-runtest $scop_files "" "-O2 -fgraphite -fdump-tree-graphite-all" +dg-runtest $id_files "" "-O2 -fgraphite-identity -ffast-math" + +# Tests to be run. +set dg-do-what-default run +dg-runtest $run_id_files "" "-O2 -fgraphite-identity" +dg-runtest $interchange_files "" "-O2 -floop-interchange -fno-loop-block -fno-loop-strip-mine -ffast-math -fdump-tree-graphite-all" +dg-runtest $block_files "" "-O2 -floop-block -fno-loop-strip-mine -fno-loop-interchange -ffast-math -fdump-tree-graphite-all" + +# The default action for the rest of the files is 'compile'. +set dg-do-what-default compile +foreach f $scop_files {lremove wait_to_run_files $f} +foreach f $id_files {lremove wait_to_run_files $f} +foreach f $run_id_files {lremove wait_to_run_files $f} +foreach f $interchange_files {lremove wait_to_run_files $f} +foreach f $block_files {lremove wait_to_run_files $f} +dg-runtest $wait_to_run_files "" "-ansi -pedantic-errors" + +# Clean up. +set dg-do-what-default ${save-dg-do-what-default} + +# All done. +dg-finish diff --git a/gcc/testsuite/g++.dg/graphite/id-1.C b/gcc/testsuite/g++.dg/graphite/id-1.C new file mode 100644 index 000000000..5770e905d --- /dev/null +++ b/gcc/testsuite/g++.dg/graphite/id-1.C @@ -0,0 +1,39 @@ +#include <vector> + +template <int rank, int dim> class Tensor; +template <int dim> +class Tensor<1,dim> +{ + public: + explicit Tensor (const bool initialize = true); + Tensor (const Tensor<1,dim> &); + double values[(dim!=0) ? (dim) : 1]; +}; +template <int dim> +Tensor<1,dim>::Tensor (const Tensor<1,dim> &p) +{ + for (unsigned int i=0; i<dim; ++i) + values[i] = p.values[i]; +} +template <int dim> +class KellyErrorEstimator +{ + struct PerThreadData + { + std::vector<std::vector<std::vector<Tensor<1,dim> > > > psi; + PerThreadData (const unsigned int n_solution_vectors, + const unsigned int n_components, + const unsigned int n_q_points); + }; +}; +template <int dim> +KellyErrorEstimator<dim>::PerThreadData:: +PerThreadData (const unsigned int n_solution_vectors, + const unsigned int n_components, + const unsigned int n_q_points) +{ + for (unsigned int i=0; i<n_solution_vectors; ++i) + for (unsigned int qp=0;qp<n_q_points;++qp) + psi[i][qp].resize(n_components); +} +template class KellyErrorEstimator<3>; diff --git a/gcc/testsuite/g++.dg/graphite/pr39447.C b/gcc/testsuite/g++.dg/graphite/pr39447.C new file mode 100644 index 000000000..a0d09ec2b --- /dev/null +++ b/gcc/testsuite/g++.dg/graphite/pr39447.C @@ -0,0 +1,34 @@ +/* { dg-options "-O2 -fgraphite-identity" } */ + +struct Point +{ + int line, col; + + Point( int l = -1, int c = 0 ) throw() : line( l ), col( c ) {} + bool operator==( const Point & p ) const throw() + { return ( line == p.line && col == p.col ); } + bool operator<( const Point & p ) const throw() + { return ( line < p.line || ( line == p.line && col < p.col ) ); } +}; + +class Buffer +{ +public: + int characters( const int line ) const throw(); + int pgetc( Point & p ) const throw(); + Point eof() const throw() { return Point( 0, 0 ); } + bool pisvalid( const Point & p ) const throw() + { return ( ( p.col >= 0 && p.col < characters( p.line ) ) || p == eof() ); + } + bool save( Point p1 = Point(), Point p2 = Point() ) const; +}; + +bool Buffer::save( Point p1, Point p2 ) const +{ + if( !this->pisvalid( p1 ) ) p1 = eof(); + if( !this->pisvalid( p2 ) ) p2 = eof(); + for( Point p = p1; p < p2; ) { pgetc( p ); } + return true; +} + + diff --git a/gcc/testsuite/g++.dg/graphite/pr41305.C b/gcc/testsuite/g++.dg/graphite/pr41305.C new file mode 100644 index 000000000..6a30b0e9e --- /dev/null +++ b/gcc/testsuite/g++.dg/graphite/pr41305.C @@ -0,0 +1,332 @@ +// { dg-do compile } +// { dg-options "-O3 -floop-interchange -Wno-conversion-null" } + +void __throw_bad_alloc (); + +template <typename _Tp> void +swap (_Tp & __a, _Tp __b) +{ + __a = __b; +} + +template <typename _Category> struct iterator +{ + typedef _Category iterator_category; +}; + +template <typename _Tp> struct allocator +{ + typedef __SIZE_TYPE__ size_type; + typedef _Tp pointer; + pointer allocate (size_type) + { + __throw_bad_alloc (); + return __null; + } +}; + +template <class T, class = allocator <T> >class unbounded_array; +template <class T, class = unbounded_array <T> >class vector; +template <class = int> class scalar_vector; +template <class IC> struct random_access_iterator_base : public iterator <IC> +{ +}; + +template <class X, class> struct promote_traits +{ + typedef __typeof__ ((X ())) promote_type; +}; + +template <class T> struct scalar_traits +{ + typedef T const_reference; + typedef T reference; +}; + +template <class T> struct type_traits : scalar_traits <T> +{ +}; + +struct dense_proxy_tag +{ +}; + +template <class> struct iterator_base_traits; + +template <> struct iterator_base_traits <dense_proxy_tag> +{ + template <class, class> struct iterator_base + { + typedef random_access_iterator_base <dense_proxy_tag> type; + }; +}; + +template <class I1, class> struct iterator_restrict_traits +{ + typedef I1 iterator_category; +}; + +template <class> class storage_array +{ +}; + +template <class T, class ALLOC> struct unbounded_array : public storage_array <unbounded_array <ALLOC> > +{ + typedef typename ALLOC::size_type size_type; + typedef T & reference; + typedef T *pointer; + unbounded_array (size_type size, ALLOC = ALLOC ()) : alloc_ (), size_ (size) + { + alloc_.allocate (size_); + } + ~unbounded_array () + { + if (size_) + for (;;); + } + size_type + size () const + { + return size_; + } + reference + operator[] (size_type i) + { + return data_[i]; + } + void + swap (unbounded_array & a) + { + ::swap (size_, a.size_); + } + ALLOC alloc_; + size_type size_; + pointer data_; +}; + +template <class T1, class T2> struct scalar_binary_functor +{ + typedef typename promote_traits <T1, T2>::promote_type result_type; +}; + +template <class T1, class T2> struct scalar_plus : public scalar_binary_functor <T1, T2> +{ +}; + +template <class T1, class T2> struct scalar_multiplies : public scalar_binary_functor <T1, T2> +{ +}; + +template <class T1, class T2> struct scalar_binary_assign_functor +{ + typedef typename type_traits <T1>::reference argument1_type; + typedef typename type_traits <T2>::const_reference argument2_type; +}; + +template <class T1, class T2> struct scalar_assign : public scalar_binary_assign_functor <T1, T2> +{ + typedef typename scalar_binary_assign_functor <T1, T2>::argument1_type argument1_type; + typedef typename scalar_binary_assign_functor <T1, T2>::argument2_type argument2_type; + static const bool computed = false; + static void + apply (argument1_type t1, argument2_type t2) + { + t1 = t2; + } +}; + +template <class E> struct vector_expression +{ + typedef E expression_type; + const expression_type & + operator () () const + { + return *static_cast <const expression_type *>(this); + } +}; + +template <class C> class vector_container : public vector_expression <C> +{ +}; + +template <class E> struct vector_reference : public vector_expression <vector_reference <E> > +{ + typedef typename E::size_type size_type; + typename E::const_reference const_reference; + typedef E referred_type; + vector_reference (referred_type & e) : e_ (e) + { + } + size_type + size () const + { + return expression ().size (); + } + referred_type & + expression () const + { + return e_; + } + referred_type &e_; +}; + +template <class E1, class E2, class F> struct vector_binary : public vector_expression <vector_binary <E1, E2, F> > +{ + typedef E1 expression1_type; + typedef E2 expression2_type; + typedef typename E1::const_closure_type expression1_closure_type; + typedef typename E2::const_closure_type expression2_closure_type; + typedef typename promote_traits <typename E1::size_type, typename E2::size_type>::promote_type size_type; + typedef typename F::result_type value_type; + + vector_binary (const expression1_type & e1, expression2_type e2) : e1_ (e1), e2_ (e2) + { + } + + size_type + size () const + { + return e1_.size (); + } + + class const_iterator : public iterator_base_traits <typename iterator_restrict_traits <typename E1::const_iterator::iterator_category, const_iterator>::iterator_category>::template iterator_base <const_iterator, value_type>::type + { + }; + expression1_closure_type e1_; + expression2_closure_type e2_; +}; + +template <class E1, class E2, class F> struct vector_binary_traits +{ + typedef vector_binary <E1, E2, F> expression_type; + typedef expression_type result_type; +}; + +template <class E1, class E2> typename vector_binary_traits <E1, E2, scalar_plus <typename E1::value_type, typename E2::value_type> >::result_type +operator + (vector_expression <E1> &e1, const vector_expression <E2> &e2) +{ + typedef typename vector_binary_traits <E1, E2, scalar_plus <typename E1::value_type, typename E2::value_type> >::expression_type expression_type; + return expression_type (e1 (), e2 ()); +} + +template <class E1, class E2, class F> struct vector_binary_scalar2 : public vector_expression <vector_binary_scalar2 <E1, E2, F> > +{ + typedef vector_binary_scalar2 <E1, E2, F> self_type; + typedef typename E1::size_type size_type; + typedef typename F::result_type value_type; + typedef self_type const_closure_type; +}; + +template <class E1, class E2, class F> struct vector_binary_scalar2_traits +{ + typedef vector_binary_scalar2 <E1, E2, F> result_type; +}; + +template <class E1, class T2> +typename vector_binary_scalar2_traits <E1, T2, scalar_multiplies <typename E1::value_type, T2> >::result_type +operator * (vector_expression <E1>, T2) +{ +} + +template <class SC> struct vector_assign_traits +{ + typedef SC storage_category; +}; + +template <template <class, class> class F, class V, class E> void +indexing_vector_assign (V & v, vector_expression <E>) +{ + typedef F <typename V::reference, typename E::value_type> functor_type; + typedef typename V::size_type size_type; + size_type size (v.size ()); + for (size_type i; i <size; ++i) + functor_type::apply (v (i), (i)); +} + +template <template <class, class> class F, class V, class E> void +vector_assign (V & v, const vector_expression <E> &e, dense_proxy_tag) +{ + indexing_vector_assign <F> (v, e); +} + +template <template <class, class> class F, class V, class E> void +vector_assign (V & v, const vector_expression <E> &e) +{ + typedef typename vector_assign_traits <typename V::storage_category>::storage_category storage_category; + vector_assign <F> (v, e, storage_category ()); +} + +template <class T, class A> struct vector : public vector_container <vector <T> > +{ + typedef vector <T> self_type; + typedef typename A::size_type size_type; + typedef T value_type; + typedef typename type_traits <T>::const_reference const_reference; + typedef T &reference; + typedef A array_type; + typedef vector_reference <const self_type> const_closure_type; + typedef dense_proxy_tag storage_category; + vector (size_type size):vector_container <self_type> (), data_ (size) + { + } + vector (size_type size, value_type):vector_container <self_type> (), data_ (size) + { + } + template <class AE> vector (const vector_expression <AE> &ae) : vector_container <self_type> (), data_ (ae ().size ()) + { + vector_assign <scalar_assign> (*this, ae); + } + size_type + size () const + { + return data_.size (); + } + array_type & + data () + { + return data_; + } + reference + operator () (size_type i) + { + return data ()[i]; + } + template <class AE> vector operator += (const vector_expression <AE> &ae) + { + self_type temporary (*this + ae); + data_.swap (temporary.data ()); + return *this; + } + class const_iterator : public random_access_iterator_base <dense_proxy_tag> + { + }; + array_type data_; +}; + +template <class T> struct scalar_vector : public vector_container <scalar_vector <> > +{ + typedef scalar_vector self_type; + typedef __SIZE_TYPE__ size_type; + typedef T value_type; + typedef T const_reference; + typedef vector_reference <self_type> const_closure_type; +}; + +void +bar (vector <double>) +{ +} + +void +foo (int n_samp) +{ + vector <double> xi (n_samp, 0); + for (int n = 0; n <n_samp; ++n) + { + vector <double> cos_w_n (n_samp); + xi += cos_w_n * 6.0; + } + vector <double> cos_wd (n_samp); + xi += cos_wd; + bar (xi + scalar_vector <> ()); +} diff --git a/gcc/testsuite/g++.dg/graphite/pr41562.C b/gcc/testsuite/g++.dg/graphite/pr41562.C new file mode 100644 index 000000000..36b8c275f --- /dev/null +++ b/gcc/testsuite/g++.dg/graphite/pr41562.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O -ftree-loop-distribution -floop-block" } */ + +typedef struct stSirenEncoder { } *SirenEncoder; + +int Siren7_EncodeFrame(SirenEncoder encoder, unsigned char *DataIn, unsigned char *DataOut) { + int number_of_regions; + static int absolute_region_power_index[28] = {0}; + static int region_mlt_bit_counts[28] = {0}; + int dwRes = 0; + int region; + if (dwRes != 0) return dwRes; + for(region = 0; region < number_of_regions; region++) + { + absolute_region_power_index[region] += 24; + region_mlt_bit_counts[region] = 0; + } +} diff --git a/gcc/testsuite/g++.dg/graphite/pr42130.C b/gcc/testsuite/g++.dg/graphite/pr42130.C new file mode 100644 index 000000000..ee31abad0 --- /dev/null +++ b/gcc/testsuite/g++.dg/graphite/pr42130.C @@ -0,0 +1,19 @@ +/* { dg-options "-O2 -fgraphite-identity -fno-tree-ch" } */ +#include <vector> + +using std::vector; + +vector<unsigned> & __attribute__((noinline, noclone)) foo(unsigned n) +{ + vector<unsigned> *vv = new vector<unsigned>(n, 0u); + return *vv; +} + +int main() +{ + foo(0); + return 0; +} + +/* { dg-do run } */ + diff --git a/gcc/testsuite/g++.dg/graphite/pr42681.C b/gcc/testsuite/g++.dg/graphite/pr42681.C new file mode 100644 index 000000000..4c137ec06 --- /dev/null +++ b/gcc/testsuite/g++.dg/graphite/pr42681.C @@ -0,0 +1,17 @@ +/* { dg-options "-O1 -fgraphite-identity -fno-loop-block -fno-loop-interchange -fno-loop-strip-mine" } */ + +typedef __SIZE_TYPE__ size_t; +inline void* operator new(size_t, void* __p) throw() { return __p; } + +struct A { + int i, j; + A() : i(0) {} +}; + +void Init(A *a) +{ + for (int i = 0; i < 20; i++) { + new (&a[i]) A; + a[i].j = 0; + } +} diff --git a/gcc/testsuite/g++.dg/graphite/pr42930.C b/gcc/testsuite/g++.dg/graphite/pr42930.C new file mode 100644 index 000000000..c1150ce93 --- /dev/null +++ b/gcc/testsuite/g++.dg/graphite/pr42930.C @@ -0,0 +1,55 @@ +/* { dg-options "-O1 -floop-block" } */ + +typedef unsigned char byte; +typedef unsigned int uint; +typedef unsigned char uint8; +namespace Common { +class NonCopyable { +}; +template<class In, class Out> +Out copy(In first, In last, Out dst) { + while (first != last) + *dst++ = *first++; +} +template<class T> +class Array { + uint _size; + T *_storage; +public: + Array<T>& operator=(const Array<T> &array) { + copy(array._storage, array._storage + _size, _storage); + } +}; +} +namespace Graphics { +struct PixelFormat { + inline PixelFormat() { + } + inline PixelFormat(byte BytesPerPixel, + byte RBits, byte GBits, byte BBits, byte ABits, + byte RShift, byte GShift, byte BShift, byte AShift) { + } +}; +}; +namespace Cine { +static const Graphics::PixelFormat kLowPalFormat(2, 3, 3, 3, 0, 8, 4, 0, 0); +class Palette { +public: + struct Color { + uint8 r, g, b; + }; + Palette(const Graphics::PixelFormat format = Graphics::PixelFormat(), const uint numColors = 0); + bool empty() const; + bool isValid() const; + Common::Array<Color> _colors; +}; +class FWRenderer : public Common::NonCopyable { + Cine::Palette _activePal; + void drawCommand(); +}; +void FWRenderer::drawCommand() { + if (!_activePal.isValid() || _activePal.empty()) { + _activePal = Cine::Palette(kLowPalFormat, 16); + } +} +} diff --git a/gcc/testsuite/g++.dg/graphite/pr43026.C b/gcc/testsuite/g++.dg/graphite/pr43026.C new file mode 100644 index 000000000..c88019703 --- /dev/null +++ b/gcc/testsuite/g++.dg/graphite/pr43026.C @@ -0,0 +1,51 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fgraphite-identity" } */ + +template<typename Tp > class vector { }; + +template <int rank, int dim> class Tensor; + +template <int dim> class Tensor<1,dim> { +public: + Tensor (const Tensor<1,dim> &); +private: + double values[(dim != 0) ? (dim) : 1]; +}; + +template <int dim> +#ifdef NOINLINE +// declaring this noinline prevents the ICE +__attribute__ ((noinline)) +#endif +Tensor<1,dim>::Tensor (const Tensor<1,dim> &p) +{ + for (unsigned int i = 0; i < dim; ++i) + values[i] = p.values[i]; +} + +template <int rank, int dim> +class Tensor { + Tensor<rank-1,dim> subtensor[dim]; +}; + +template <int dim> class Base { +public: + const unsigned int npoints; + const unsigned int dofs; + const Tensor<2,dim> &s2d (const unsigned int fno, + const unsigned int pno) const; + void getf2d (vector<Tensor<2,dim> >& d2) const; +}; + +template <int dim> +void Base<dim>:: getf2d + (vector<Tensor<2,dim> > &d2) const +{ + unsigned int point, sf; + + for (point = 0; point < npoints; ++point) + for (sf = 0; sf < dofs; ++sf) + Tensor<2,dim> tmp = s2d (sf, point); +} + +template void Base<3>::getf2d (vector<Tensor<2,3> > &) const; diff --git a/gcc/testsuite/g++.dg/guality/guality.exp b/gcc/testsuite/g++.dg/guality/guality.exp new file mode 100644 index 000000000..749691dab --- /dev/null +++ b/gcc/testsuite/g++.dg/guality/guality.exp @@ -0,0 +1,54 @@ +# This harness is for tests that should be run at all optimisation levels. + +load_lib g++-dg.exp +load_lib gcc-gdb-test.exp + +# Disable on darwin until radr://7264615 is resolved. +# Disable on Tru64 UNIX (PR testsuite/48251). +if { [istarget *-*-darwin*] || [istarget alpha*-dec-osf*] } { + return +} + +proc check_guality {args} { + set result [eval check_compile guality_check executable $args "-g -O0"] + set lines [lindex $result 0] + set output [lindex $result 1] + set ret 0 + if {[string match "" $lines]} { + set execout [g++_load "./$output"] + set ret [string match "*1 PASS, 0 FAIL, 0 UNRESOLVED*" $execout] + } + remote_file build delete $output + return $ret +} + +dg-init + +global GDB +if ![info exists ::env(GUALITY_GDB_NAME)] { + if [info exists GDB] { + set guality_gdb_name "$GDB" + } else { + set guality_gdb_name "[transform gdb]" + } + setenv GUALITY_GDB_NAME "$guality_gdb_name" +} + +if {[check_guality " + #include \"$srcdir/$subdir/guality.h\" + volatile long int varl = 6; + int main (int argc, char *argv\[\]) + { + GUALCHKVAL (varl); + return 0; + } +"]} { + gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.C]] "" + gcc-dg-runtest [lsort [glob $srcdir/c-c++-common/guality/*.c]] "" +} + +if [info exists guality_gdb_name] { + unsetenv GUALITY_GDB_NAME +} + +dg-finish diff --git a/gcc/testsuite/g++.dg/guality/guality.h b/gcc/testsuite/g++.dg/guality/guality.h new file mode 100644 index 000000000..dd858d28b --- /dev/null +++ b/gcc/testsuite/g++.dg/guality/guality.h @@ -0,0 +1 @@ +#include "../../gcc.dg/guality/guality.h" diff --git a/gcc/testsuite/g++.dg/guality/pr46815.C b/gcc/testsuite/g++.dg/guality/pr46815.C new file mode 100644 index 000000000..41b921995 --- /dev/null +++ b/gcc/testsuite/g++.dg/guality/pr46815.C @@ -0,0 +1,25 @@ +// PR debug/46815 +// { dg-do run } +// { dg-options "-g" } +// { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } + +struct S +{ + int i; + S () { i = 42; } + virtual void foo (void) {} +}; + +S +bar () +{ + S s; + return s; // { dg-final { gdb-test 17 "s.i" "42" } } +} + +int +main () +{ + S s = bar (); + return s.i - 42; +} diff --git a/gcc/testsuite/g++.dg/guality/redeclaration1.C b/gcc/testsuite/g++.dg/guality/redeclaration1.C new file mode 100644 index 000000000..93b0750b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/guality/redeclaration1.C @@ -0,0 +1,27 @@ +// { dg-do run } +// { dg-options "-g" } +// { dg-skip-if "" { *-*-* } { "-flto" } { "" } } + +volatile int l; + +namespace S +{ + int i = 24; + void __attribute__((noinline)) + f() + { + int i = 42; + l = i; // { dg-final { gdb-test 14 "i" "42" } } + { + extern int i; + l = i; // { dg-final { gdb-test 17 "i" "24" } } + } + } +} + +int +main (void) +{ + S::f (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/inherit/access1.C b/gcc/testsuite/g++.dg/inherit/access1.C new file mode 100644 index 000000000..7f2ec6892 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/access1.C @@ -0,0 +1,19 @@ +// Test that we can access a member from an inaccessible base if it has +// been promoted with a using-declaration. + +// { dg-do compile } + +struct A +{ + int i; +}; + +struct B: private A +{ + using A::i; +}; + +struct C: public B +{ + void f () { B::i = 0; } +}; diff --git a/gcc/testsuite/g++.dg/inherit/access2.C b/gcc/testsuite/g++.dg/inherit/access2.C new file mode 100644 index 000000000..247799450 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/access2.C @@ -0,0 +1,14 @@ +// Test that a base doesn't get special rights to convert to itself. + +struct A { + void f (); +}; + +struct B: private A { }; + +B b; + +void A::f () +{ + A* ap = &b; // { dg-error "base|inherit" "" } +} diff --git a/gcc/testsuite/g++.dg/inherit/access3.C b/gcc/testsuite/g++.dg/inherit/access3.C new file mode 100644 index 000000000..1862bfc34 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/access3.C @@ -0,0 +1,19 @@ +// { dg-do compile } + +class __new_alloc { +public: + static void allocate() {} +}; + +template <class _Alloc> +class __debug_alloc : public _Alloc { +public: + static void allocate(); +}; + +template <class _Alloc> +void __debug_alloc<_Alloc>::allocate() { + _Alloc::allocate(); +} + +template class __debug_alloc<__new_alloc>; diff --git a/gcc/testsuite/g++.dg/inherit/access4.C b/gcc/testsuite/g++.dg/inherit/access4.C new file mode 100644 index 000000000..33f991b66 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/access4.C @@ -0,0 +1,8 @@ +struct Container { int Count(); }; +struct List : private Container { + using Container::Count; +}; +struct INetContentTypeParameterList : private List { void Clear(); }; +void INetContentTypeParameterList::Clear() { + Count();//Calling non static but in a non-static method. +} diff --git a/gcc/testsuite/g++.dg/inherit/access5.C b/gcc/testsuite/g++.dg/inherit/access5.C new file mode 100644 index 000000000..715a4a3b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/access5.C @@ -0,0 +1,4 @@ +struct S { ~S(); }; +struct T : virtual private S {}; +struct U : private T {}; +U u; diff --git a/gcc/testsuite/g++.dg/inherit/access6.C b/gcc/testsuite/g++.dg/inherit/access6.C new file mode 100644 index 000000000..7645c2d5e --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/access6.C @@ -0,0 +1,15 @@ +// PR c++/28588 + +class Foo { + static void f(); // { dg-error "private" } + static void f(int); + static void g(); // { dg-error "private" } +}; + +void h() +{ + Foo foo; + void (*f)(); + f = foo.f; // { dg-error "context" } + f = foo.g; // { dg-error "context" } +} diff --git a/gcc/testsuite/g++.dg/inherit/access7.C b/gcc/testsuite/g++.dg/inherit/access7.C new file mode 100644 index 000000000..4e2db1479 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/access7.C @@ -0,0 +1,15 @@ +struct B { + static void f(); +}; + +template <typename T> +struct D : private B { + void g() { + f(); + } +}; + +void h() { + D<int> d; + d.g(); +} diff --git a/gcc/testsuite/g++.dg/inherit/access8.C b/gcc/testsuite/g++.dg/inherit/access8.C new file mode 100644 index 000000000..a11ea8e04 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/access8.C @@ -0,0 +1,25 @@ +// PR c++/29138 + +class A +{ +public: + int i; + class A1 + { + int j; + }; +}; + +class B : private A +{ +public: + A::i; + A::A1; +}; + +void +f () +{ + B b; + B::A1 a1; +} diff --git a/gcc/testsuite/g++.dg/inherit/base1.C b/gcc/testsuite/g++.dg/inherit/base1.C new file mode 100644 index 000000000..952c6d20f --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/base1.C @@ -0,0 +1,22 @@ +// { dg-do compile } +// { dg-options "-pedantic-errors -w" } + +// Copyright (C) 2000 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 29 Nov 2001 <nathan@nathan@codesourcery.com> + +// PR 164 +// Although a direct base can be inaccessible due to ambiguity, that +// should not blow up synthesized methods. + +struct A {int m;}; +struct B : A {int m;}; +struct C : virtual A, B {int m;}; +struct D : B, C {int m;}; + +void foo2 () +{ + D d; + D e (d); + + e = d; +} diff --git a/gcc/testsuite/g++.dg/inherit/base2.C b/gcc/testsuite/g++.dg/inherit/base2.C new file mode 100644 index 000000000..5c7d812c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/base2.C @@ -0,0 +1,12 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 23 Sep 2004 <nathan@codesourcery.com> + +// Origin: Wolfgang Bangerth <bangerth@dealii.org> +// Bug 17620. Bogus duplicate base error. + +struct S {}; + +typedef S B; + +struct D1 : B {}; +struct D2 : B {}; diff --git a/gcc/testsuite/g++.dg/inherit/base3.C b/gcc/testsuite/g++.dg/inherit/base3.C new file mode 100644 index 000000000..866b2906c --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/base3.C @@ -0,0 +1,8 @@ +// PR c++/35985 +// { dg-do compile } + +template<typename T> struct A : T {}; // { dg-error "struct or class type" } + +struct B; + +A<void (B::*)()> a; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/inherit/cond1.C b/gcc/testsuite/g++.dg/inherit/cond1.C new file mode 100644 index 000000000..843c72ca3 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/cond1.C @@ -0,0 +1,10 @@ +// Origin: jason@redhat.com +// { dg-do compile } + +struct A { A(); A(const A&); int i; }; +struct B: public A { }; + +int f (bool b, A& ar, B& br) +{ + return (b?ar:br).i; +} diff --git a/gcc/testsuite/g++.dg/inherit/conv1.C b/gcc/testsuite/g++.dg/inherit/conv1.C new file mode 100644 index 000000000..e16c489a2 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/conv1.C @@ -0,0 +1,23 @@ +typedef struct _A A; +typedef struct _A B; + +void some_function(B *b); + +class AClass { + +public: + operator A*() { return 0;} + +}; + +class BClass :public AClass { + +public: + operator B*() { return 0;} + +}; + +int main(int argc, char **argv) { + BClass b; + some_function(b); +} diff --git a/gcc/testsuite/g++.dg/inherit/conv2.C b/gcc/testsuite/g++.dg/inherit/conv2.C new file mode 100644 index 000000000..fd0083825 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/conv2.C @@ -0,0 +1,22 @@ +// PR c++/25895 +// { dg-do run } + +class base { +public: + base() {} +private: + int val_; +}; + +class derived : public base { +public: + derived() {} +}; + +static bool x = true ? (derived*)0 : (base*)0; + +int main () +{ + if (x) + return 1; +} diff --git a/gcc/testsuite/g++.dg/inherit/conv3.C b/gcc/testsuite/g++.dg/inherit/conv3.C new file mode 100644 index 000000000..73d8c20f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/conv3.C @@ -0,0 +1,31 @@ +// PR 31074 +// Bug: The reference cast wasn't finding the desired static_cast followed by +// const_cast interpretation. + +struct Shape +{ + Shape() {} + virtual ~Shape() {} +}; + +struct Loop +{ + Loop() {} + virtual ~Loop() {} + virtual void func() {} +}; + +struct Rect : + public Shape, + public Loop +{ + Rect() {} + virtual ~Rect() {} +}; + +int main () +{ + const Rect* rect = new Rect(); + Loop &l = ((Loop&)(*rect)); + return (&l != (const Loop *)rect); +} diff --git a/gcc/testsuite/g++.dg/inherit/covariant1.C b/gcc/testsuite/g++.dg/inherit/covariant1.C new file mode 100644 index 000000000..978c3e825 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant1.C @@ -0,0 +1,33 @@ +// PR c++/5607 + +// { dg-do run } + +class A { +public: + virtual A* getThis() { return this; } +}; + +class B { +int a; +public: + virtual B* getThis() { return this; } +}; + +class AB : public A, public B { +public: + virtual AB* getThis() { return this; } +}; + +int main () +{ + AB* ab = new AB(); + + A* a = ab; + B* b = ab; + + if (a->getThis() != a + || b->getThis() != b) + return 1; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/inherit/covariant10.C b/gcc/testsuite/g++.dg/inherit/covariant10.C new file mode 100644 index 000000000..fe5d03c27 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant10.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Contributed by Nathan Sidwell 23 Oct 2003 <nathan@codesourcery.com> +// Origin: grigory@stl.sarov.ru +// PR c++/12699 ICE with covariancy + +struct c1 { + virtual void f1() const {} +}; + +struct c5 {}; + +struct c6 : virtual c1 { + virtual c5* f33() const {} +}; + +struct c13 : virtual c5 { }; + +struct c17 : virtual c6 +{ + virtual c13* f33() const {} +}; diff --git a/gcc/testsuite/g++.dg/inherit/covariant11.C b/gcc/testsuite/g++.dg/inherit/covariant11.C new file mode 100644 index 000000000..acba965f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant11.C @@ -0,0 +1,29 @@ +// { dg-do compile } + +// Contributed by Nathan Sidwell 23 Oct 2003 <nathan@codesourcery.com> +// Origin: grigory@stl.sarov.ru +// PR c++/12700 ICE with covariancy + +struct c2 { int i; }; + +struct c1 { + virtual c2& f8() {} +}; + +struct c3 : c1, c2 { + virtual c2& f8() {} +}; + +struct c11 : public c1 { + virtual c3& f8() {} +}; + +struct c15 : virtual c3 { + virtual c2& f8() {} +}; + +struct c18 : virtual c11 { + virtual c15& f8(); +}; + +c15& c18::f8() { throw 0; } diff --git a/gcc/testsuite/g++.dg/inherit/covariant12.C b/gcc/testsuite/g++.dg/inherit/covariant12.C new file mode 100644 index 000000000..434082abb --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant12.C @@ -0,0 +1,18 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 27 Feb 2005<nathan@codesourcery.com> + +// PR 20232: ICE on invalid + +struct T { }; + +struct S; + +struct B +{ + virtual T *Foo (); // { dg-error "overriding" "" } +}; + +struct D : B +{ + virtual S *Foo (); // { dg-error "invalid covariant" "" } +}; diff --git a/gcc/testsuite/g++.dg/inherit/covariant13.C b/gcc/testsuite/g++.dg/inherit/covariant13.C new file mode 100644 index 000000000..af60840c8 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant13.C @@ -0,0 +1,25 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 8 May 2005<nathan@codesourcery.com> + +// Origin:Andrew Pinski: pinskia@gcc.gnu.org +// PR 21427: ICE on valid + +struct B1 { + public: + virtual void foo(); +}; + +struct B2 { + public: + virtual B2 & bar() = 0; +}; + +struct I : public B1, B2 { + public: + virtual ~I(); + virtual I & bar(); +}; + +struct D : public I { + virtual ~D(); +}; diff --git a/gcc/testsuite/g++.dg/inherit/covariant14.C b/gcc/testsuite/g++.dg/inherit/covariant14.C new file mode 100644 index 000000000..13ca877b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant14.C @@ -0,0 +1,20 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 18 Oct 2005 <nathan@codesourcery.com> + +// PR 22604 +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +struct A; + +struct B +{ + virtual A* foo(); // { dg-error "overriding" "" } +}; + +namespace N +{ + struct A : B + { + virtual A* foo(); // { dg-error "invalid covariant" "" } + }; +} diff --git a/gcc/testsuite/g++.dg/inherit/covariant15.C b/gcc/testsuite/g++.dg/inherit/covariant15.C new file mode 100644 index 000000000..4696cc633 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant15.C @@ -0,0 +1,18 @@ +/* This used to ICE (PR c++/27492) */ +/* { dg-do "compile" } */ + +struct A {}; + +class B : A +{ + virtual A* foo(); /* { dg-error "overriding" } */ +}; + +struct C : virtual B +{ + virtual C* foo(); /* { dg-error "invalid covariant return type" } */ +}; + +C* C::foo() { return 0; } + +struct D : C {}; diff --git a/gcc/testsuite/g++.dg/inherit/covariant16.C b/gcc/testsuite/g++.dg/inherit/covariant16.C new file mode 100644 index 000000000..de9307e89 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant16.C @@ -0,0 +1,17 @@ +/* PR c++/28253 This used to ICE. */ +/* { dg-do compile } */ + +struct A +{ + virtual A* foo(); +}; + +struct B : virtual A +{ + virtual B* foo(); /* { dg-error "overriding" } */ +}; + +struct C : B +{ + virtual C& foo(); /* { dg-error "conflicting return type" } */ +}; diff --git a/gcc/testsuite/g++.dg/inherit/covariant17.C b/gcc/testsuite/g++.dg/inherit/covariant17.C new file mode 100644 index 000000000..b2de15f7e --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant17.C @@ -0,0 +1,43 @@ +// PR c++/43120 +// { dg-do run } + +extern "C" void abort (); + +struct A { + int a; + + A(int a_) : a(a_) {} + + A(const A &other) { } + + virtual void dummy() {} +}; + +struct B { + virtual B *clone() const = 0; +}; + +struct C : public virtual B { + virtual C *clone() const = 0; +}; + +struct E* ep; +struct E : public A, public C { + E(int a_) : A(a_) { ep = this; } + + virtual E *clone() const { + if (this != ep) + abort(); + return 0; + } +}; + +int main() { + E *a = new E(123); + C *c = a; + B *b = a; + c->clone(); + b->clone(); + delete a; + return 0; +} diff --git a/gcc/testsuite/g++.dg/inherit/covariant18.C b/gcc/testsuite/g++.dg/inherit/covariant18.C new file mode 100644 index 000000000..31e62165e --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant18.C @@ -0,0 +1,41 @@ +// PR c++/47873 +// { dg-do run } + +struct Base +{ + virtual ~Base(){} + + virtual Base& This() { return *this; } +}; + + +struct Ent : virtual Base +{ + void *m_Body; + + Ent& This() { return *this; } + + virtual Ent& body() + { + return This(); + } + +}; + + +struct Msg : virtual Ent +{ + Msg() + { + body(); + } + + Msg& This() { return *this; } +}; + +int main() +{ + Msg m; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/inherit/covariant19.C b/gcc/testsuite/g++.dg/inherit/covariant19.C new file mode 100644 index 000000000..22c2b0eb6 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant19.C @@ -0,0 +1,14 @@ +// PR c++/46220 +// According to the letter of the standard this is invalid, +// but that seems like a bug. + +class Baz; +class Foo { +public: + virtual const Baz* getBaz() = 0; +}; +class Bar : public Foo { +public: + Baz* getBaz(); +}; + diff --git a/gcc/testsuite/g++.dg/inherit/covariant2.C b/gcc/testsuite/g++.dg/inherit/covariant2.C new file mode 100644 index 000000000..b6d93d6b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant2.C @@ -0,0 +1,70 @@ +// { dg-do run } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 27 Nov 2002 <nathan@codesourcery.com> + +// covariant returns. Fixed offset. + +struct B1; +struct B2; +struct D; + +struct B1 +{ + virtual B1 *foo1 () {return this;} + virtual B2 *foo2 (D *); +}; +struct B2 +{ + virtual B2 *baz1 () {return this;} + virtual B1 *baz2 (D *); +}; + +struct D : B1, B2 +{ + virtual D *foo1 () {return this;} + virtual D *foo2 (D *d) {return d;} + virtual D *baz1 () {return this;} + virtual D *baz2 (D *d) {return d;} +}; + +B2 *B1::foo2 (D *d) {return d;} +B1 *B2::baz2 (D *d) {return d;} + +int test (B1 *b1, B2 *b2, D *d) +{ + if (b1->foo1 () != b1) + return 1; + if (b2->baz1 () != b2) + return 2; + if (b1->foo2 (d) != b2) + return 3; + if (b2->baz2 (d) != b1) + return 4; + return 0; +} + +int test (D *d) +{ + if (d->foo2 (d) != d) + return 11; + if (d->baz2 (d) != d) + return 12; + if (d->foo1 () != d) + return 13; + if (d->baz1 () != d) + return 14; + return 0; +} + +int main () +{ + D d; + int r; + + if ((r = test (&d, &d, &d))) + return r; + if ((r = test (&d))) + return r; + return 0; +} diff --git a/gcc/testsuite/g++.dg/inherit/covariant3.C b/gcc/testsuite/g++.dg/inherit/covariant3.C new file mode 100644 index 000000000..b7024c455 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant3.C @@ -0,0 +1,70 @@ +// { dg-do run } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 27 Nov 2002 <nathan@codesourcery.com> + +// covariant returns. Virtual offset. + +struct B1; +struct B2; +struct D; + +struct B1 +{ + virtual B1 *foo1 () {return this;} + virtual B2 *foo2 (D *); +}; +struct B2 +{ + virtual B2 *baz1 () {return this;} + virtual B1 *baz2 (D *); +}; + +struct D : virtual B1, virtual B2 +{ + virtual D *foo1 () {return this;} + virtual D *foo2 (D *d) {return d;} + virtual D *baz1 () {return this;} + virtual D *baz2 (D *d) {return d;} +}; + +B2 *B1::foo2 (D *d) {return d;} +B1 *B2::baz2 (D *d) {return d;} + +int test (B1 *b1, B2 *b2, D *d) +{ + if (b1->foo1 () != b1) + return 1; + if (b2->baz1 () != b2) + return 2; + if (b1->foo2 (d) != b2) + return 3; + if (b2->baz2 (d) != b1) + return 4; + return 0; +} + +int test (D *d) +{ + if (d->foo2 (d) != d) + return 11; + if (d->baz2 (d) != d) + return 12; + if (d->foo1 () != d) + return 13; + if (d->baz1 () != d) + return 14; + return 0; +} + +int main () +{ + D d; + int r; + + if ((r = test (&d, &d, &d))) + return r; + if ((r = test (&d))) + return r; + return 0; +} diff --git a/gcc/testsuite/g++.dg/inherit/covariant4.C b/gcc/testsuite/g++.dg/inherit/covariant4.C new file mode 100644 index 000000000..8f6101b3f --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant4.C @@ -0,0 +1,76 @@ +// { dg-do run } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 27 Nov 2002 <nathan@codesourcery.com> + +// covariant returns. Fixed & virtual offset. + +struct B1; +struct B2; +struct D; + +struct B1 +{ + virtual B1 *foo1 () {return this;} + virtual B2 *foo2 (D *); +}; + +struct B2 +{ + virtual B2 *baz1 () {return this;} + virtual B1 *baz2 (D *); +}; + +struct Pad1 { virtual ~Pad1 (){}}; +struct Pad2 { virtual ~Pad2 (){}}; +struct Proxy1 : Pad1, B1 {}; +struct Proxy2 : Pad2, B2 {}; + +struct D : virtual Proxy1, virtual Proxy2 +{ + virtual D *foo1 () {return this;} + virtual D *foo2 (D *d) {return d;} + virtual D *baz1 () {return this;} + virtual D *baz2 (D *d) {return d;} +}; + +B2 *B1::foo2 (D *d) {return d;} +B1 *B2::baz2 (D *d) {return d;} + +int test (B1 *b1, B2 *b2, D *d) +{ + if (b1->foo1 () != b1) + return 1; + if (b2->baz1 () != b2) + return 2; + if (b1->foo2 (d) != b2) + return 3; + if (b2->baz2 (d) != b1) + return 4; + return 0; +} + +int test (D *d) +{ + if (d->foo2 (d) != d) + return 11; + if (d->baz2 (d) != d) + return 12; + if (d->foo1 () != d) + return 13; + if (d->baz1 () != d) + return 14; + return 0; +} + +int main () +{ + D d; + int r; + + if ((r = test (&d, &d, &d))) + return r; + if ((r = test (&d))) + return r; + return 0; +} diff --git a/gcc/testsuite/g++.dg/inherit/covariant5.C b/gcc/testsuite/g++.dg/inherit/covariant5.C new file mode 100644 index 000000000..a46b1bf20 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant5.C @@ -0,0 +1,27 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 27 Dec 2002 <nathan@codesourcery.com> + +// We ICE'd + +struct c0 {}; + +struct c1 : virtual c0 +{ + virtual c0 &f2(); +}; + +struct c3 : c1 +{ + virtual c1 &f2(); +}; + +c1 &c3::f2() +{ + throw 0; +} + +struct c4 : virtual c3 +{ +}; diff --git a/gcc/testsuite/g++.dg/inherit/covariant6.C b/gcc/testsuite/g++.dg/inherit/covariant6.C new file mode 100644 index 000000000..dc5597153 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant6.C @@ -0,0 +1,27 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 27 Dec 2002 <nathan@codesourcery.com> + +// We ICE'd + +struct c0 {}; + +struct c1 : virtual c0 +{ + virtual c0 &f2(); +}; + +struct c3 : virtual c1 +{ + virtual c1 &f2(); +}; + +c1 &c3::f2() +{ + throw 0; +} + +struct c4 : virtual c3 +{ +}; diff --git a/gcc/testsuite/g++.dg/inherit/covariant7.C b/gcc/testsuite/g++.dg/inherit/covariant7.C new file mode 100644 index 000000000..4f0c7f7dd --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant7.C @@ -0,0 +1,51 @@ +// { dg-do compile } +// { dg-prune-output "direct base" } +// { dg-options "-fdump-class-hierarchy" } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 27 Dec 2002 <nathan@codesourcery.com> + +// We ICE'd + +struct c0 {}; + +struct c1 : virtual c0 +{ + virtual c0 &f2() volatile; +}; + +struct c2 +{ + int m; +}; + +struct c3 : virtual c0, virtual c1, c2 +{ + virtual c1 &f2() volatile; +}; + +struct c4 : virtual c3, virtual c0, virtual c1 +{ + int m; +}; + +struct c6 : c0, c3, c4 +{ + virtual c1 &f2() volatile; +}; + +// f2 appears four times in the c6 vtables: +// once in c1-in-c3-in-c6 - covariant, virtual base, uses c1 vcall offset and c0 vbase offset +// { dg-final { scan-tree-dump "24 .*c6::_ZTcv0_n16_v0_n12_NV2c62f2Ev" "class" { target ilp32 } } } +// { dg-final { scan-tree-dump "48 .*c6::_ZTcv0_n32_v0_n24_NV2c62f2Ev" "class" { target lp64 } } } +// once in c3-in-c6 - non-covariant, non-virtual base, calls f2 directly +// { dg-final { scan-tree-dump "28 .*c6::f2" "class" { target ilp32 } } } +// { dg-final { scan-tree-dump "56 .*c6::f2" "class" { target lp64 } } } +// once in c1-in-c3-in-c4-in-c6 - lost primary +// { dg-final { scan-tree-dump "80 .*0u" "class" { target ilp32 } } } +// { dg-final { scan-tree-dump "160 .*0u" "class" { target lp64 } } } +// once in c3-in-c4-in-c6 - c3 vcall offset +// { dg-final { scan-tree-dump "84 .*c6::_ZTv0_n16_NV2c62f2Ev" "class" { target ilp32 } } } +// { dg-final { scan-tree-dump "168 .*c6::_ZTv0_n32_NV2c62f2Ev" "class" { target lp64 } } } + +// { dg-final { cleanup-tree-dump "class" } } diff --git a/gcc/testsuite/g++.dg/inherit/covariant8.C b/gcc/testsuite/g++.dg/inherit/covariant8.C new file mode 100644 index 000000000..33dc43106 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant8.C @@ -0,0 +1,34 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 31 Dec 2002 <nathan@codesourcery.com> + +// ICE with covariant thunks. + +struct c0 {}; + +struct c1 : virtual c0 +{ + virtual c0 &f2 (); +}; + +struct c2 +{ + int m; +}; + +struct c3 : virtual c0, virtual c1, c2 +{ + virtual c1 &f2 (); +}; + +c1 &c3::f2 () +{ + throw 0; +} + +struct c4 : virtual c3, virtual c0, virtual c1 {}; + +struct c8 : virtual c2, virtual c0 {}; + +struct c12 : virtual c4, virtual c3, virtual c8 {}; diff --git a/gcc/testsuite/g++.dg/inherit/covariant9.C b/gcc/testsuite/g++.dg/inherit/covariant9.C new file mode 100644 index 000000000..62c3a2202 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant9.C @@ -0,0 +1,32 @@ +// { dg-do link } +// { dg-options "-w -ansi -pedantic" } + +// Contributed by Nathan Sidwell 23 Oct 2003 <nathan@codesourcery.com> +// Origin: grigory@stl.sarov.ru +// PR c++/12698. Duplicate covariant thunks emitted. + +struct c1 {}; + +struct c0 { + int i; + virtual c1& f10() {} +}; + +struct c2 : virtual c1, c0 { }; + +struct c6 : virtual c2, c0 { + virtual c2& f10() {} +}; + +struct c14 : virtual c2 { }; + +struct c19 : virtual ::c6 { + virtual class ::c14& f10() {} +}; + +int main () +{ + c19 obj; +} + + diff --git a/gcc/testsuite/g++.dg/inherit/crash1.C b/gcc/testsuite/g++.dg/inherit/crash1.C new file mode 100644 index 000000000..d5eb7c26a --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/crash1.C @@ -0,0 +1,6 @@ +// PR c++/30298 + +union A {}; + +struct B : A {}; // { dg-error "fails to be a struct or class type" } +struct B : A {}; // { dg-error "redefinition" } diff --git a/gcc/testsuite/g++.dg/inherit/crash2.C b/gcc/testsuite/g++.dg/inherit/crash2.C new file mode 100644 index 000000000..0d82f773e --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/crash2.C @@ -0,0 +1,6 @@ +// PR c++/30298 + +struct A {}; + +struct B : A, A {}; // { dg-error "duplicate base type" } +struct B : A, A {}; // { dg-error "redefinition" } diff --git a/gcc/testsuite/g++.dg/inherit/error1.C b/gcc/testsuite/g++.dg/inherit/error1.C new file mode 100644 index 000000000..1570bf11e --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/error1.C @@ -0,0 +1,10 @@ +// PR 12486 + +struct A { int ma; }; +struct B { }; + +void foo() +{ + B *b; + b->A::ma=0; // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/inherit/error2.C b/gcc/testsuite/g++.dg/inherit/error2.C new file mode 100644 index 000000000..7d5e2e5d6 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/error2.C @@ -0,0 +1,16 @@ +// PR c++/28259 +// { dg-do compile } + +struct A +{ + virtual A* foo(); // { dg-error "overriding" } +}; + +struct B : virtual A; // { dg-error "before" } + +struct C : A +{ + virtual B* foo(); // { dg-error "invalid covariant" } +}; + +B* C::foo() { return 0; } diff --git a/gcc/testsuite/g++.dg/inherit/error3.C b/gcc/testsuite/g++.dg/inherit/error3.C new file mode 100644 index 000000000..0b75b9dfb --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/error3.C @@ -0,0 +1,11 @@ +//PR c++/27316 + +struct A {}; + +struct B : A +! // { dg-error "token" } +{}; + +struct B : A +! // { dg-error "token" } +{}; diff --git a/gcc/testsuite/g++.dg/inherit/error4.C b/gcc/testsuite/g++.dg/inherit/error4.C new file mode 100644 index 000000000..4f6866ed8 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/error4.C @@ -0,0 +1,10 @@ +//PR c++/28740 + +struct A { virtual ~A(); }; + +struct B : A A {}; // { dg-error "expected|initializer|invalid" } + +A foo(const B &b) // { dg-error "" } +{ + return b; +} diff --git a/gcc/testsuite/g++.dg/inherit/implicit-trivial1.C b/gcc/testsuite/g++.dg/inherit/implicit-trivial1.C new file mode 100644 index 000000000..e63bd3435 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/implicit-trivial1.C @@ -0,0 +1,23 @@ +// PR c++/46807 +// { dg-options -std=c++98 } +// In C++98/03, B::B(const B&) is trivial because A::A(const A&) is trivial, +// even though doing overload resolution would mean calling the template +// constructor. In C++0x, we do overload resolution to determine triviality. + +struct A +{ + A() {} +private: + template <class T> A(T&); +}; + +struct B +{ + mutable A a; +}; + +int main() +{ + B b; + B b2(b); +} diff --git a/gcc/testsuite/g++.dg/inherit/local1.C b/gcc/testsuite/g++.dg/inherit/local1.C new file mode 100644 index 000000000..3cb196c38 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/local1.C @@ -0,0 +1,10 @@ +// PR c++/17121 + +struct A { + virtual ~A() {} +}; + +void tsk_tsk() +{ + struct B : public A {}; +} diff --git a/gcc/testsuite/g++.dg/inherit/local2.C b/gcc/testsuite/g++.dg/inherit/local2.C new file mode 100644 index 000000000..82d812ca2 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/local2.C @@ -0,0 +1,16 @@ +// PR c++/17155 +// { dg-do link } + +struct A { + virtual ~A() {} +}; + + +void tsk_tsk(void) +{ + struct B : public A { + B(int) {} + }; +} + +int main () {} diff --git a/gcc/testsuite/g++.dg/inherit/local3.C b/gcc/testsuite/g++.dg/inherit/local3.C new file mode 100644 index 000000000..b11646422 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/local3.C @@ -0,0 +1,14 @@ +// PR c++/13744 (ice-on-valid-code) +// Origin: Thom Harp <thomharp@charter.net> + +// { dg-do compile } + +template<int> void foo() +{ + struct A + { + virtual void bar() { A a(*this); } + } a; +} + +template void foo<0>(); diff --git a/gcc/testsuite/g++.dg/inherit/multiple1.C b/gcc/testsuite/g++.dg/inherit/multiple1.C new file mode 100644 index 000000000..3eb9fe763 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/multiple1.C @@ -0,0 +1,20 @@ +// { dg-options "-w" } + +struct Base { + int b; + + Base(int b) : b(b) { } +}; + +struct Derived : public Base { + Derived(int d) : Base(d) { } +}; + +struct Final : public Derived, public Base { + Final(int f) : Derived(f), Base(f-1) { } +}; + +int main() +{ + Final f(5); +} diff --git a/gcc/testsuite/g++.dg/inherit/namespace-as-base.C b/gcc/testsuite/g++.dg/inherit/namespace-as-base.C new file mode 100644 index 000000000..041c18abc --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/namespace-as-base.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +namespace Out { + namespace In { + } +} + +class Klasse : public Out::In { // { dg-error ".*" "" } +}; diff --git a/gcc/testsuite/g++.dg/inherit/null1.C b/gcc/testsuite/g++.dg/inherit/null1.C new file mode 100644 index 000000000..0908a01b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/null1.C @@ -0,0 +1,15 @@ +// PR c++/5453: Test that we don't assume that the pointer target of a +// reference is non-null just because we know the reference isn't. + +// { dg-do run } + +struct V { }; +struct A: virtual public V { }; + +A* ap; +A*& apr (ap); + +int main () +{ + V* vp = apr; +} diff --git a/gcc/testsuite/g++.dg/inherit/operator1.C b/gcc/testsuite/g++.dg/inherit/operator1.C new file mode 100644 index 000000000..6ef669c21 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/operator1.C @@ -0,0 +1,34 @@ +// Test that conversions to base classes happen when calling +// operators. + +// { dg-do run } + +extern "C" void abort (); + +struct B1; +struct B2; + +B2* p; +B1* p2; + +struct B1 { + virtual void f () {} +}; + +struct B2 { + int i; + bool operator!() { if (this != p) abort (); return true; } + operator void*() { if (this != p) abort (); return this; } +}; + +struct B3 : public B1, public B2 { +}; + +int main () { + B3 b; + p = (B2*) &b; + p2 = (B1*) &b; + bool b1 = b; + bool b2 = !b; +} + diff --git a/gcc/testsuite/g++.dg/inherit/operator2.C b/gcc/testsuite/g++.dg/inherit/operator2.C new file mode 100644 index 000000000..09407e1b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/operator2.C @@ -0,0 +1,22 @@ +typedef int INT_TYPEDEF; + +template<class T> +class TypedIfc +{ +public: + virtual ~TypedIfc() { } + virtual operator const T&() const = 0; + virtual const T& operator= (const T& t) = 0; +}; + +template<class Tnative> +class NullIfc : public TypedIfc<Tnative> +{ +public: + const Tnative& operator= (const Tnative& t) { return t; } + operator const Tnative&() const { return *(Tnative *)0; } +}; + +typedef TypedIfc<INT_TYPEDEF> INT_TYPEDEFIfc; + +NullIfc<int> i32; diff --git a/gcc/testsuite/g++.dg/inherit/override-attribs.C b/gcc/testsuite/g++.dg/inherit/override-attribs.C new file mode 100644 index 000000000..e28b8d484 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/override-attribs.C @@ -0,0 +1,24 @@ +// PR c++/14688 +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target ilp32 } + +class one +{ +public: + virtual void + test(void* value); // { dg-error "overriding" } +}; + +class two : public one +{ +public: + void __attribute__((regparm(2))) + test(void* value); // { dg-error "conflicting type attributes" } +}; + +class three : public one +{ +public: + void __attribute__ ((cdecl)) + test(void* value); // OK +}; diff --git a/gcc/testsuite/g++.dg/inherit/override1.C b/gcc/testsuite/g++.dg/inherit/override1.C new file mode 100644 index 000000000..8f8004641 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/override1.C @@ -0,0 +1,20 @@ +// { dg-options "-w" } + +struct c0 { virtual void f (); }; +struct c1 : public c0 {}; +struct c2 : public c0 {}; +struct c3 : virtual public c0, public c1, public c2 {}; +struct c5 {}; +struct c7 : virtual public c3 {}; +struct c8 : virtual public c1 { virtual void f (); }; +struct c9 {}; +struct c10 : virtual public c8, virtual public c7 {}; +struct c11 : virtual public c5 {}; +struct c12 : virtual public c8, public c7 {}; +struct c13 : public c9, public c3, virtual public c2 {}; +struct c14 : virtual public c1, virtual public c5, virtual public c0, + public c2 {}; +struct c15 : public c14, public c12, virtual public c3 {}; +struct c16 : public c12, public c10, public c2 { virtual void f (); }; +struct c17 : virtual public c13, public c15, virtual public c0, + virtual public c16 {}; diff --git a/gcc/testsuite/g++.dg/inherit/pr30297.C b/gcc/testsuite/g++.dg/inherit/pr30297.C new file mode 100644 index 000000000..222d9ab80 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/pr30297.C @@ -0,0 +1,11 @@ +// Regression test for ICE from PR c++/30297. + +struct A +{ + int i; +}; + +extern "C" struct B : A +{ + A::i; +}; diff --git a/gcc/testsuite/g++.dg/inherit/ptrmem1.C b/gcc/testsuite/g++.dg/inherit/ptrmem1.C new file mode 100644 index 000000000..375efc811 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/ptrmem1.C @@ -0,0 +1,21 @@ +// PR c++/14803 +// { dg-options "-Werror" } + +struct sc_module { int member; }; + +struct sc_signal_in_if { bool state; }; + +typedef void (sc_module::*SC_ENTRY_FUNC)(); + +class sc_clock : public sc_signal_in_if, public sc_module +{ +public: + sc_clock(); + void posedge_action(); + SC_ENTRY_FUNC fptr; +}; + +sc_clock::sc_clock() +{ + fptr = static_cast<SC_ENTRY_FUNC>(&sc_clock::posedge_action); +} diff --git a/gcc/testsuite/g++.dg/inherit/ptrmem2.C b/gcc/testsuite/g++.dg/inherit/ptrmem2.C new file mode 100644 index 000000000..a13705576 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/ptrmem2.C @@ -0,0 +1,25 @@ +// PR c++/16810 + +struct C { + virtual void f() {} +}; + +struct B {virtual ~B() {} }; + +class D : public B, public C +{ +public: + virtual void f() {} +}; + +typedef void ( C::*FP)(); +typedef void ( D::*D_f)(); + +int main() { + D *d = new D(); + C *c = d; + + const FP fptr = (FP) &D::f;; + (d->* (D_f)fptr)(); +} + diff --git a/gcc/testsuite/g++.dg/inherit/ptrmem3.C b/gcc/testsuite/g++.dg/inherit/ptrmem3.C new file mode 100644 index 000000000..0c06c65df --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/ptrmem3.C @@ -0,0 +1,17 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 27 May 2005 <nathan@codesourcery.com> + +// Origin:Andrew Pinski pinskia@gcc.gnu.org +// PR 21455 bogus error with pointer to member of incomplete + +class XMLFile; + +typedef bool (XMLFile::*ParserFunctionPtr)(); + +struct ParserElement +{ + ParserFunctionPtr getPreFunc() const { return preFunc; } + ParserFunctionPtr getPostFunc() const { return postFunc; } + ParserFunctionPtr preFunc; + ParserFunctionPtr postFunc; +}; diff --git a/gcc/testsuite/g++.dg/inherit/pure1.C b/gcc/testsuite/g++.dg/inherit/pure1.C new file mode 100644 index 000000000..ddd3cb332 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/pure1.C @@ -0,0 +1,19 @@ +// PR c++/23266 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } + +void foo0() = 0; // { dg-error "like a variable" } +virtual void foo1() = 0; // { dg-error "outside class|variable" } + +struct A +{ + void foo2() = 0; // { dg-error "non-virtual" } + static void foo3() = 0; // { dg-error "static member" } + virtual static void foo4() = 0; // { dg-error "both virtual and static" } + virtual void foo5() = 0; // { dg-error "base class" } +}; + +struct B : A +{ + static void foo5() = 0; // { dg-error "static member|declared" } +}; diff --git a/gcc/testsuite/g++.dg/inherit/sizeof1.C b/gcc/testsuite/g++.dg/inherit/sizeof1.C new file mode 100644 index 000000000..06d5c9993 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/sizeof1.C @@ -0,0 +1,17 @@ +// PR c++/35007 + +struct AffEntry +{ + union { + char base[256]; + } conds; +}; + +struct PfxEntry +: public AffEntry +{ + PfxEntry() + { + sizeof(conds.base[0]); + } +}; diff --git a/gcc/testsuite/g++.dg/inherit/template-as-base.C b/gcc/testsuite/g++.dg/inherit/template-as-base.C new file mode 100644 index 000000000..5d34b15d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/template-as-base.C @@ -0,0 +1,9 @@ +// Contributed by Gabriel Dos Reis <gdr@codesourcery.com> +// Distilled from PR C++/3656 + +namespace N +{ + template<typename> struct X { }; +} + +struct A : N::X { }; // { dg-error "expected class-name" "" } diff --git a/gcc/testsuite/g++.dg/inherit/thunk1.C b/gcc/testsuite/g++.dg/inherit/thunk1.C new file mode 100644 index 000000000..3bbd05069 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/thunk1.C @@ -0,0 +1,41 @@ +// { dg-do run { target i?86-*-* x86_64-*-* s390*-*-* alpha*-*-* ia64-*-* sparc*-*-* } } + +#include <stdarg.h> + +extern "C" void abort (); + +struct A { + virtual void f (int, ...) {} + int i; +}; + +struct B : virtual public A { +}; + +struct C : public B { + C (); + virtual void f (int, ...); +}; + +extern C* cp; + +C::C () { cp = this; } + +void C::f (int i, ...) { + if (this != cp) + abort (); + va_list ap; + if (i != 3) + abort (); + va_start (ap, i); + if (va_arg (ap, int) != 7) + abort (); + va_end (ap); +} + +C* cp = new C; + +int main () +{ + cp->f (3, 7); +} diff --git a/gcc/testsuite/g++.dg/inherit/thunk10.C b/gcc/testsuite/g++.dg/inherit/thunk10.C new file mode 100644 index 000000000..702067749 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/thunk10.C @@ -0,0 +1,60 @@ +/* { dg-options "-mthumb" { target arm*-*-* } } */ +/* { dg-do run } */ +/* { dg-timeout 100 } */ + +/* PR middle-end/39378 */ +/* Check if the thunk target function is emitted correctly. */ +class B1 +{ +public: + virtual int foo1(void); + int b1; +}; + +class B2 +{ +public: + virtual int foo2 (void); + int b2; +}; + +class D : public B1, public B2 +{ + int foo1(void); + int foo2(void); + int d; +}; + +int B1::foo1(void) +{ + return 3; +} + +int B2::foo2(void) +{ + return 4; +} + +int D::foo1(void) +{ + return 1; +} + +int D::foo2(void) +{ + return 2; +} + +__attribute__((noinline)) int test(B2* bp) +{ + return bp->foo2(); +} + +int main() +{ + B2 *bp = new D(); + if (test(bp) == 2) + return 0; + else + return 1; +} diff --git a/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc b/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc new file mode 100644 index 000000000..7009d6c50 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc @@ -0,0 +1,4 @@ +// { dg-do compile } +// { dg-options "-O2" } + +#include "thunk11.h" diff --git a/gcc/testsuite/g++.dg/inherit/thunk11.C b/gcc/testsuite/g++.dg/inherit/thunk11.C new file mode 100644 index 000000000..6e3bc329c --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/thunk11.C @@ -0,0 +1,11 @@ +// PR c++/42256 +// { dg-do link } +// { dg-additional-sources "thunk11-aux.cc" } +// { dg-options "-O2" } + +#include "thunk11.h" + +int +main () +{ +} diff --git a/gcc/testsuite/g++.dg/inherit/thunk11.h b/gcc/testsuite/g++.dg/inherit/thunk11.h new file mode 100644 index 000000000..641f40e4e --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/thunk11.h @@ -0,0 +1,16 @@ +struct A +{ + A () {} + virtual ~A () {} +}; +struct B +{ + B () {} + virtual ~B () {} +}; +struct C : public A, public B +{ + virtual void foo (); + virtual ~C () {}; +}; +inline void C::foo () {} diff --git a/gcc/testsuite/g++.dg/inherit/thunk2.C b/gcc/testsuite/g++.dg/inherit/thunk2.C new file mode 100644 index 000000000..094891c7a --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/thunk2.C @@ -0,0 +1,19 @@ +// PR c++/14108 + +class ClassC { +public: + ~ClassC(); +}; + +class ClassA { + virtual ClassC f(); +}; + +class ClassB : public virtual ClassA { + virtual ClassC f(); +}; + +ClassC ClassB::f() { + return ClassC(); +} + diff --git a/gcc/testsuite/g++.dg/inherit/thunk3.C b/gcc/testsuite/g++.dg/inherit/thunk3.C new file mode 100644 index 000000000..9787aa9c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/thunk3.C @@ -0,0 +1,12 @@ +// PR c++/18492 + +struct X{ ~X(); }; +struct B +{ + virtual void a( X ) = 0; +}; +struct D : public virtual B +{ + void a( X ); +}; +void D::a( X ){} diff --git a/gcc/testsuite/g++.dg/inherit/thunk4.C b/gcc/testsuite/g++.dg/inherit/thunk4.C new file mode 100644 index 000000000..a6e913e59 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/thunk4.C @@ -0,0 +1,23 @@ +// PR c++/21123 + +struct A +{ + A( const A &a); + const A& operator=( const A& a); +}; + +struct B +{ + virtual A f(); +}; + +struct C : virtual B +{ + virtual A f(); + A a; +}; + +A C::f() +{ + return a; +} diff --git a/gcc/testsuite/g++.dg/inherit/thunk5.C b/gcc/testsuite/g++.dg/inherit/thunk5.C new file mode 100644 index 000000000..05dba3638 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/thunk5.C @@ -0,0 +1,22 @@ +// PR c++/21123 + +struct A +{ + A(const A &a); + const A& operator=(const A& a); +}; + +struct B +{ + virtual A f(A); +}; + +struct C : virtual B +{ + virtual A f(A); +}; + +A C::f(A a) +{ + return a; +} diff --git a/gcc/testsuite/g++.dg/inherit/thunk6.C b/gcc/testsuite/g++.dg/inherit/thunk6.C new file mode 100644 index 000000000..b8e316d08 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/thunk6.C @@ -0,0 +1,16 @@ +// PR c++/26957 + +struct LongDouble { + char ld[16]; +}; + +struct DynAny { + virtual void insert_longdouble(LongDouble value) = 0; +}; + +struct TAO_DynCommon : public virtual DynAny { + virtual void insert_longdouble (LongDouble value); +}; + +void TAO_DynCommon::insert_longdouble (LongDouble value) { } + diff --git a/gcc/testsuite/g++.dg/inherit/thunk7.C b/gcc/testsuite/g++.dg/inherit/thunk7.C new file mode 100644 index 000000000..0e16d8954 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/thunk7.C @@ -0,0 +1,55 @@ +// { dg-do run } + +#include <stdlib.h> + +class A +{ + int a, b; +public: + virtual void foo (int a, int b, int c, int d); +}; + +class B +{ + int c, d; +public: + virtual void bar (int a, int b, int c, int d); +}; + +class D : public virtual A, public virtual B +{ + int e, f; +}; + +void A::foo(int a, int b, int c, int d) +{ + if (a != 1 || b != 2 || c != 3 || d != 4) + abort (); +} + +void B::bar (int a, int b, int c, int d) +{ + if (a != 5 || b != 6 || c != 7 || d != 8) + abort (); +} + +class C: private D, public virtual A, public virtual B +{ +public: + virtual void foo (int a, int b, int c, int d) { A::foo (a, b, c, d); D::A::foo (a, b, c, d); } + virtual void bar (int a, int b, int c, int d) { B::bar (a, b, c, d); D::B::bar (a, b, c, d); } +}; + +C c1; +C *c2 = &c1; +A *c3 = &c1; +B *c4 = &c1; + +int main() +{ + c2->foo (1, 2, 3, 4); + c2->bar (5, 6, 7, 8); + c3->foo (1, 2, 3, 4); + c4->bar (5, 6, 7, 8); + return 0; +} diff --git a/gcc/testsuite/g++.dg/inherit/thunk8.C b/gcc/testsuite/g++.dg/inherit/thunk8.C new file mode 100644 index 000000000..ef6453568 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/thunk8.C @@ -0,0 +1,26 @@ +/* PR target/27387 + We used to generate a non-PIC thunk on thumb even with -fPIC. + Make sure that won't happen anymore. */ + +/* { dg-do compile } */ +/* { dg-require-effective-target arm_thumb1_ok } */ +/* { dg-options "-mthumb -fPIC" } */ + +struct A { + virtual void f (); +}; + +struct B { + virtual void g (); +}; + +struct C : public A, public B { + virtual void g(); +}; + +void +C::g() +{ +} + +/* { dg-final { scan-assembler "LTHUNKPC" } } */ diff --git a/gcc/testsuite/g++.dg/inherit/thunk9.C b/gcc/testsuite/g++.dg/inherit/thunk9.C new file mode 100644 index 000000000..9eb9999f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/thunk9.C @@ -0,0 +1,14 @@ +// PR tree-optimization/37095 +// { dg-options "-O" } + +struct A +{ + virtual A *foo (); +}; + +struct B : virtual A +{ + virtual B *foo () { return 0; } +}; + +B b; diff --git a/gcc/testsuite/g++.dg/inherit/typedef1.C b/gcc/testsuite/g++.dg/inherit/typedef1.C new file mode 100644 index 000000000..20da08b2c --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/typedef1.C @@ -0,0 +1,8 @@ +namespace NS { +class X {}; +typedef X Y; +} + +struct Base : virtual public NS::Y { + Base() : NS::Y() {} +}; diff --git a/gcc/testsuite/g++.dg/inherit/typeinfo1.C b/gcc/testsuite/g++.dg/inherit/typeinfo1.C new file mode 100644 index 000000000..794776ecb --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/typeinfo1.C @@ -0,0 +1,18 @@ +typedef struct { + virtual const char *blah() { + return "Heya::blah"; + } +} Heya; + +struct Grok : public Heya { + virtual const char *blah() { + return "Grok::blah"; + } +}; + +int main() { + Grok *g = new Grok(); + delete g; + return 0; +} + diff --git a/gcc/testsuite/g++.dg/inherit/union1.C b/gcc/testsuite/g++.dg/inherit/union1.C new file mode 100644 index 000000000..da46096c8 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/union1.C @@ -0,0 +1,14 @@ +// PR c++/15507 + +struct A { + // empty +}; + +struct B : A { + int b; +}; + +union U { + A a; + B b; +}; diff --git a/gcc/testsuite/g++.dg/inherit/using1.C b/gcc/testsuite/g++.dg/inherit/using1.C new file mode 100644 index 000000000..03c9144e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/using1.C @@ -0,0 +1,34 @@ +// Test that overloading on 'this' quals works with class using-declarations. + +// { dg-do link } + +struct A { + void f() const; + void f() {} + void g() const {} + void g(); + void h() const; + void h(); + void i() const; + void i() {} +}; + +struct B: private A { + using A::f; + using A::g; + void h () const {} + using A::h; + void i () const {} + using A::i; +}; + +int main() +{ + B b1; + const B b2 = B(); + + b1.f (); + b2.g (); + b2.h (); + b1.i (); +} diff --git a/gcc/testsuite/g++.dg/inherit/using2.C b/gcc/testsuite/g++.dg/inherit/using2.C new file mode 100644 index 000000000..19f06e9cc --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/using2.C @@ -0,0 +1,25 @@ +// { dg-do run } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Sep 2002 <nathan@codesourcery.com> + +// PR 7919. Methods found via using decls didn't have their this +// pointers converted to the final base type. + +struct Base { + int m; + protected: + void *Return () { return this; } +}; + +struct Derived : Base { + using Base::Return; + virtual ~Derived () {} +}; + +int main () +{ + Derived d; + + return static_cast <Base *> (&d) != d.Return (); +} diff --git a/gcc/testsuite/g++.dg/inherit/using3.C b/gcc/testsuite/g++.dg/inherit/using3.C new file mode 100644 index 000000000..d2acf8009 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/using3.C @@ -0,0 +1,19 @@ +class A +{ +public: + typedef int T; + int a; +}; + +class B : virtual private A +{ +}; + +class C : virtual private A, public B +{ +public: + using A::a; + using A::T; +}; + +C::T x; diff --git a/gcc/testsuite/g++.dg/inherit/using4.C b/gcc/testsuite/g++.dg/inherit/using4.C new file mode 100644 index 000000000..a0b38737e --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/using4.C @@ -0,0 +1,14 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 6 Jun 2005 <nathan@codesourcery.com> + +// PR 20613:uninformative diagnostic +// Origin: Wolfgang Bangerth <bangerth@dealii.org> + +struct B { + void f(); +}; + +struct D : B { + using B::f; + using B::f; // { dg-error "repeated" } +}; diff --git a/gcc/testsuite/g++.dg/inherit/using5.C b/gcc/testsuite/g++.dg/inherit/using5.C new file mode 100644 index 000000000..89c7ca03b --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/using5.C @@ -0,0 +1,17 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 8 Jun 2005 <nathan@codesourcery.com> + +// PR 19496: Missing error during parsing. +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +template<int> struct A +{ + A::A; // { dg-error "constructor" } +}; + +struct B +{ + void f (); + using B::f; // { dg-error "not a base" } +}; + diff --git a/gcc/testsuite/g++.dg/inherit/using6.C b/gcc/testsuite/g++.dg/inherit/using6.C new file mode 100644 index 000000000..7bdfc3405 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/using6.C @@ -0,0 +1,15 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 8 Jun 2005 <nathan@codesourcery.com> + +struct A +{ + operator int (); +}; + +template <typename T> struct TPL : A +{ + using A::operator T; // { dg-error "operator float" } +}; + +TPL<int> i; +TPL<float> j; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/inherit/virtual1.C b/gcc/testsuite/g++.dg/inherit/virtual1.C new file mode 100644 index 000000000..08bcbb143 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/virtual1.C @@ -0,0 +1,12 @@ +//PR c++/27952 + +struct A +{ + virtual ~A() {} +}; + +struct B : A, virtual A {}; // { dg-error "duplicate base|forward declaration" } + +struct C : A, B {}; // { dg-error "duplicate base|invalid use" } + +C c; // { dg-error "aggregate" } diff --git a/gcc/testsuite/g++.dg/inherit/virtual2.C b/gcc/testsuite/g++.dg/inherit/virtual2.C new file mode 100644 index 000000000..9769d4ab7 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/virtual2.C @@ -0,0 +1,13 @@ +//PR c++/29022 + +struct A +{ + operator int(); +}; + +struct B : virtual A, A<0> {}; // { dg-error "token" } + +int foo(B &b) +{ + return b; // { dg-error "cannot convert" } +} diff --git a/gcc/testsuite/g++.dg/inherit/virtual3.C b/gcc/testsuite/g++.dg/inherit/virtual3.C new file mode 100644 index 000000000..65ae76c0b --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/virtual3.C @@ -0,0 +1,13 @@ +//PR c++/29022 + +struct A +{ + operator int(); +}; + +struct B : virtual A; // { dg-error "token" } + +int foo(B &b) +{ + return b; // { dg-error "cannot convert" } +} diff --git a/gcc/testsuite/g++.dg/inherit/virtual4.C b/gcc/testsuite/g++.dg/inherit/virtual4.C new file mode 100644 index 000000000..5415fdb3c --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/virtual4.C @@ -0,0 +1,24 @@ +// PR c++/31027 + +struct A {}; + +template<typename T> +struct C: virtual A { + C() {} + template<typename T_OTHER> C(const C<T_OTHER>&) {} + C func(const class C<long>&) const; + operator bool() const; +}; + +template<typename T> +struct D: C<T> { + void func2() { + C<int>a; + a.func(a); + } +}; + +void func3() { + C<int>a; + a.func(a); +} diff --git a/gcc/testsuite/g++.dg/inherit/virtual5.C b/gcc/testsuite/g++.dg/inherit/virtual5.C new file mode 100644 index 000000000..bed0ef3a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/virtual5.C @@ -0,0 +1,29 @@ +// Test that a synthesized op= can override one from a base. +// { dg-do run } + +struct B; + +struct A +{ + virtual B& operator=(const B&); +}; + +struct B: A +{ + B(int i): i(i) { } + int i; + // implicitly-declared op= +}; + +B& A::operator=(const B& b) { return static_cast<B&>(*this); } + +int main() +{ + B b1 (123); + B b2 (0); + + A& ar = b1; + ar = b2; + + return b1.i; +} diff --git a/gcc/testsuite/g++.dg/inherit/virtual6.C b/gcc/testsuite/g++.dg/inherit/virtual6.C new file mode 100644 index 000000000..f03696993 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/virtual6.C @@ -0,0 +1,15 @@ +// PR c++/45473 + +struct A +{ + virtual void B (); +}; + +struct B : A +{ + B (); +}; + +struct C : B +{ +}; diff --git a/gcc/testsuite/g++.dg/inherit/virtual7.C b/gcc/testsuite/g++.dg/inherit/virtual7.C new file mode 100644 index 000000000..61f17fe63 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/virtual7.C @@ -0,0 +1,27 @@ +// Origin: PR c++/47666 +// { dg-do compile } + +template <typename T> +struct A +{ + int a; +}; + +template <typename T> +struct B : public A <T> +{ +}; + +class D : public B <D *> +{ + virtual D & operator= (const D &); +}; + +class E : virtual public D +{ +}; + +class F : public E +{ + virtual void foo (); +}; diff --git a/gcc/testsuite/g++.dg/inherit/virtual8.C b/gcc/testsuite/g++.dg/inherit/virtual8.C new file mode 100644 index 000000000..4f6a119b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/virtual8.C @@ -0,0 +1,48 @@ +// PR c++/48035 +// { dg-do run } + +#include <new> +#include <cstring> +#include <cstdlib> + +struct A +{ + virtual void foo (void) {} + virtual ~A () {} +}; + +struct B : public A +{ + virtual ~B () {} +}; + +struct C +{ + virtual ~C () {} + int c; +}; + +struct D : public virtual B, public C +{ + virtual ~D () {} +}; + +struct E : public virtual D +{ + virtual ~E () {} +}; + +int +main () +{ + char *v = new char[sizeof (E) + 16]; + memset (v, 0x55, sizeof (E) + 16); + E *e = new (v) E (); + e->~E (); + + for (unsigned i = sizeof (E); i < sizeof (E) + 16; ++i) + if (v[i] != 0x55) + abort (); + + delete[] v; +} diff --git a/gcc/testsuite/g++.dg/inherit/volatile1.C b/gcc/testsuite/g++.dg/inherit/volatile1.C new file mode 100644 index 000000000..48df50ada --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/volatile1.C @@ -0,0 +1,14 @@ +// PR c++/19299 +// Origin: Andrew Pinski <pinskia@gcc.gnu.org> + +// { dg-do compile } + +struct V +{ + virtual void foo() = 0; +}; + +void bar(V volatile* p) +{ + p->V::~V(); +} diff --git a/gcc/testsuite/g++.dg/init/addr-const1.C b/gcc/testsuite/g++.dg/init/addr-const1.C new file mode 100644 index 000000000..3b4637a41 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/addr-const1.C @@ -0,0 +1,38 @@ +// { dg-do run } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 19 Apr 2003 <nathan@codesourcery.com> + +// PR 9881. address-constant-expression not static initialized + +struct bar { + double p; +}; // bar + +bar v; +static bool error = false; + +struct foo { + static double *a; + static double *b; + static double storage; +}; + +struct baz { + baz () { + if (foo::a != &v.p) + error = true; + if (foo::b != &foo::storage) + error = true; + } +}; + +baz f; // Get constructor to run before any other non-static initializers + +double *foo::a = &(((bar *)(&v))->p); +double *foo::b = &(((bar *)(&foo::storage))->p); +double foo::storage = 0.0; + +int main() { + return error; +} diff --git a/gcc/testsuite/g++.dg/init/aggr1.C b/gcc/testsuite/g++.dg/init/aggr1.C new file mode 100644 index 000000000..c63f0b02c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/aggr1.C @@ -0,0 +1,19 @@ +// Test that initializing an aggregate with complex copy constructor +// and assignment ops doesn't cause cp_expr_size to abort. + +struct A +{ + A(); + A(const A&); + A& operator=(const A&); +}; + +struct B +{ + A a; +}; + +int main () +{ + B b = { A() }; +} diff --git a/gcc/testsuite/g++.dg/init/aggr2.C b/gcc/testsuite/g++.dg/init/aggr2.C new file mode 100644 index 000000000..97dbeb619 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/aggr2.C @@ -0,0 +1,46 @@ +// PR c++/15172 +// { dg-do run } + +extern "C" int printf (const char *, ...); +extern "C" void abort (); + +struct A { + static A* p; + + A() { p = this; } + A(const A&); + ~A() { if (this != p) abort (); } + void print () { } +}; + +A* A::p; + +struct B { + A a; +}; + +B b = { A () }; + +struct A2 { + static A2* p; + + A2() { p = this; } + A2(const A2&); + ~A2() { if (this != p) abort (); } + void print () { } +}; + +A2* A2::p; + +struct B2 { + A2 a2; +}; + +int main () { + b.a.print (); + { + B2 b2 = { A2() }; + b2.a2.print (); + } +} + diff --git a/gcc/testsuite/g++.dg/init/aggr3.C b/gcc/testsuite/g++.dg/init/aggr3.C new file mode 100644 index 000000000..3376897e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/aggr3.C @@ -0,0 +1,16 @@ +// PR c++/18793 + +struct S { + S(); + S(const S&); + void operator=(const S&); +}; + +struct X { + int a, b, c, d, e; + S s; +}; + +void foobar () { + X x = {0}; +} diff --git a/gcc/testsuite/g++.dg/init/aggr4.C b/gcc/testsuite/g++.dg/init/aggr4.C new file mode 100644 index 000000000..7120e68cd --- /dev/null +++ b/gcc/testsuite/g++.dg/init/aggr4.C @@ -0,0 +1,7 @@ +struct A +{ + int i; +}; + +A a1 = { 1 }; // ok +A a2 = { a1 }; // { dg-error "cannot convert" } diff --git a/gcc/testsuite/g++.dg/init/aggr5.C b/gcc/testsuite/g++.dg/init/aggr5.C new file mode 100644 index 000000000..c1844f8ff --- /dev/null +++ b/gcc/testsuite/g++.dg/init/aggr5.C @@ -0,0 +1,11 @@ +// Origin PR c++/40239 +// { dg-do compile } + +struct B { B() { } private: B(B const&); }; +struct A { int a; B b; }; + +int +main() +{ + A a = {0}; +} diff --git a/gcc/testsuite/g++.dg/init/aggr6.C b/gcc/testsuite/g++.dg/init/aggr6.C new file mode 100644 index 000000000..98628d255 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/aggr6.C @@ -0,0 +1,11 @@ +// Origin PR c++/40239 +// { dg-do compile } + +struct B { B() { } private: B(B const&); }; +struct A { int a; B b; }; + +int +main() +{ + A a = {}; +} diff --git a/gcc/testsuite/g++.dg/init/array0.C b/gcc/testsuite/g++.dg/init/array0.C new file mode 100644 index 000000000..235cdf0de --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array0.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// { dg-options "" } +// PR C++/24138 + +void foo() +{ + typedef struct { + unsigned char dir; + int data[0]; + } yanito; + static const yanito horse = { 1, { 2, 3 } }; // { dg-error "too many" } +} diff --git a/gcc/testsuite/g++.dg/init/array1.C b/gcc/testsuite/g++.dg/init/array1.C new file mode 100644 index 000000000..5847247c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array1.C @@ -0,0 +1,26 @@ +// Test that completing an array declared with a typedef doesn't change +// the typedef. + +// { dg-do run } + +typedef int iArr[]; + +const iArr array4={ + 1, 2, 3, 4 +}; + +const iArr array3={ + 1, 2, 3 +}; + +const iArr array5={ + 1, 2, 3, 4, 5 +}; + +int main() +{ + if (sizeof (array4)/sizeof (array4[0]) != 4 + || sizeof (array3)/sizeof (array3[0]) != 3 + || sizeof (array5)/sizeof (array5[0]) != 5) + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/array10.C b/gcc/testsuite/g++.dg/init/array10.C new file mode 100644 index 000000000..41121055e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array10.C @@ -0,0 +1,6 @@ +// { dg-do compile } +// { dg-options "" } + +typedef int __attribute__((vector_size (8))) vec; + +vec foo[] = { (vec) {1, 2} }; diff --git a/gcc/testsuite/g++.dg/init/array11.C b/gcc/testsuite/g++.dg/init/array11.C new file mode 100644 index 000000000..e52effe9f --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array11.C @@ -0,0 +1,28 @@ +/* PR 11665 + Orgin: jwhite@cse.unl.edu + The problem was in initializer_constant_valid_p, + "for a CONSTRUCTOR, only the last element + of the CONSTRUCTOR was being checked" + (from the email of the patch which fixed this). + This used to ICE because GCC thought gdt_table was a + constant value when it is not. */ + +int x; + +typedef __SIZE_TYPE__ size_t; + +struct gdt +{ +size_t a,b,c,d,e,f; +}; +void f() +{ +struct gdt gdt_table[2]= +{ + { + 0, + ( (((size_t)(&x))<<(24))&(-1<<(8)) ), + }, +}; +} + diff --git a/gcc/testsuite/g++.dg/init/array12.C b/gcc/testsuite/g++.dg/init/array12.C new file mode 100644 index 000000000..3bb480029 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array12.C @@ -0,0 +1,28 @@ +// PR c++/12253 +// Bug: We were failing to destroy the temporary A passed to the +// constructor for b[0] before going on to construct b[1]. + +// { dg-do run } + +extern "C" int printf (const char *, ...); + +int c; +int r; + +struct A +{ + A() { printf ("A()\n"); if (c++) r = 1; } + A(const A&) { printf ("A(const A&)\n"); ++c; } + ~A() { printf ("~A()\n"); --c; } +}; + +struct B +{ + B(int, const A& = A()) { printf ("B()\n"); } +}; + +int main() +{ + B b[] = { 0, 0 }; + return r; +} diff --git a/gcc/testsuite/g++.dg/init/array13.C b/gcc/testsuite/g++.dg/init/array13.C new file mode 100644 index 000000000..aa66e33ac --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array13.C @@ -0,0 +1,9 @@ +template <typename DisjointSet> +struct test_disjoint_set { + static void do_test() + { + unsigned int elts[] + = { 0, 1, 2, 3 }; + const int N = sizeof(elts)/sizeof(*elts); + } +}; diff --git a/gcc/testsuite/g++.dg/init/array14.C b/gcc/testsuite/g++.dg/init/array14.C new file mode 100644 index 000000000..847bd1f20 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array14.C @@ -0,0 +1,21 @@ +// PR c++/12883 +// Bug: Destructor of array object not called if no prior +// instantiation of the template has happened. + +// { dg-do run } + +int ret = 1; + +template <int> struct X +{ + X(int) { } + ~X() { ret = 0; } +}; + +int main() +{ + { + X<0> array[] = { 0 }; + } + return ret; +} diff --git a/gcc/testsuite/g++.dg/init/array15.C b/gcc/testsuite/g++.dg/init/array15.C new file mode 100644 index 000000000..17160d076 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array15.C @@ -0,0 +1,46 @@ +// { dg-do run } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 8 Dec 2004 <nathan@codesourcery.com> + +// PR 16681 too much memory used +// Origin: Matt LaFary <lafary@activmedia.com> + +struct foo { + unsigned char buffer[4111222]; + foo() ; + bool check () const; +}; + +foo::foo () + : buffer() +{} + +bool foo::check () const +{ + for (unsigned ix = sizeof (buffer); ix--;) + if (buffer[ix]) + return false; + return true; +} + +void *operator new (__SIZE_TYPE__ size, void *p) +{ + return p; +} + +char heap[5000000]; + +int main () +{ + for (unsigned ix = sizeof (heap); ix--;) + heap[ix] = ix; + + foo *f = new (heap) foo (); + + if (!f->check ()) + return 1; + return 0; +} + + diff --git a/gcc/testsuite/g++.dg/init/array16.C b/gcc/testsuite/g++.dg/init/array16.C new file mode 100644 index 000000000..188d1a84f --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array16.C @@ -0,0 +1,112 @@ +// Causes timeout for the MMIX simulator on a 3GHz P4 and we can't +// have "compile" for some targets and "run" for others. +// { dg-do run { target { ! mmix-*-* } } } +// { dg-options "-mstructure-size-boundary=8" { target arm*-*-* } } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 8 Dec 2004 <nathan@codesourcery.com> + +// PR 16681 too much memory used +// Origin: Matt LaFary <lafary@activmedia.com> + +// NOTE: This test assumes that 4M instances of struct ELT can fit into +// a 5MB array. This isn't true, e.g., with the default +// arm-none-elf options. + +struct elt +{ + static int count; + static elt*ptr; + static int abort; + char c; + + elt (); + ~elt (); + +}; + +int elt::count; +elt *elt::ptr; +int elt::abort; + +elt::elt () + :c () +{ + if (count >= 0) + { + if (!ptr) + ptr = this; + if (count == 100) + throw 2; + if (this != ptr) + abort = 1; + count++; + ptr++; + } +} + +elt::~elt () +{ + if (count >= 0) + { + ptr--; + count--; + if (ptr != this) + abort = 2; + } +} + +struct foo { + elt buffer[4111222]; + foo() ; + bool check () const; +}; + +foo::foo () + : buffer() +{} + +bool foo::check () const +{ + for (unsigned ix = sizeof (buffer)/ sizeof (buffer[0]); ix--;) + if (buffer[ix].c) + return false; + return true; +} + +void *operator new (__SIZE_TYPE__ size, void *p) +{ + return p; +} + +char heap[5000000]; + +int main () +{ + for (unsigned ix = sizeof (heap); ix--;) + heap[ix] = ix; + + try + { + foo *f = new (heap) foo (); + return 1; + } + catch (...) + { + if (elt::count) + return 2; + if (elt::abort) + return elt::abort + 3; + } + + for (unsigned ix = sizeof (heap); ix--;) + heap[ix] = ix; + + elt::count = -1; + foo *f = new (heap) foo (); + if (!f->check ()) + return 3; + return 0; +} + + diff --git a/gcc/testsuite/g++.dg/init/array17.C b/gcc/testsuite/g++.dg/init/array17.C new file mode 100644 index 000000000..4240f7193 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array17.C @@ -0,0 +1,8 @@ +// { dg-do compile } + + +class StringMap { + const char empty_str[1]; +public: + StringMap() : empty_str() {} +}; diff --git a/gcc/testsuite/g++.dg/init/array18.C b/gcc/testsuite/g++.dg/init/array18.C new file mode 100644 index 000000000..154d03fcf --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array18.C @@ -0,0 +1,22 @@ +// PR c++/20142 +// { dg-do run } + +int n=4; + +struct A +{ + A() {} + A& operator= (const A&) { --n; return *this; } +}; + +struct B +{ + A x[2][2]; +}; + +int main() +{ + B b; + b = b; + return n; +} diff --git a/gcc/testsuite/g++.dg/init/array19.C b/gcc/testsuite/g++.dg/init/array19.C new file mode 100644 index 000000000..a5f124e21 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array19.C @@ -0,0 +1,4 @@ +// { dg-do compile } +// { dg-options "" } +double a[0] = { }; +const double b[0][1] = { }; diff --git a/gcc/testsuite/g++.dg/init/array2.C b/gcc/testsuite/g++.dg/init/array2.C new file mode 100644 index 000000000..ca03ff39c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array2.C @@ -0,0 +1,8 @@ +// Check that the type of an array is set correctly when flat initializers +// are used. + +// { dg-do compile } + +struct s { int a; int b; }; +struct s x[] = { 1, 2, 3, 4 }; +int y[sizeof (x) == 2 * sizeof (x[0])? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/init/array20.C b/gcc/testsuite/g++.dg/init/array20.C new file mode 100644 index 000000000..06a167596 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array20.C @@ -0,0 +1,5 @@ +// PR c++/27385 + +struct A {}; +A a[] = { 0 }; // { dg-error "initializer" } + diff --git a/gcc/testsuite/g++.dg/init/array21.C b/gcc/testsuite/g++.dg/init/array21.C new file mode 100644 index 000000000..f41ce86b1 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array21.C @@ -0,0 +1,7 @@ +// PR c++/27722 + +void foo() +{ + const int x[] = 0; // { dg-error "size" } + ++x; +} diff --git a/gcc/testsuite/g++.dg/init/array22.C b/gcc/testsuite/g++.dg/init/array22.C new file mode 100644 index 000000000..0c5bb33da --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array22.C @@ -0,0 +1,6 @@ +// PR C++/29002 +// We ICE trying to set the "zero" initializer on the incomplete +// array + +struct A {}; +int A::* x[]; // { dg-error "size" } diff --git a/gcc/testsuite/g++.dg/init/array23.C b/gcc/testsuite/g++.dg/init/array23.C new file mode 100644 index 000000000..80ffb0a98 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array23.C @@ -0,0 +1,6 @@ +// PR C++/29002 +// We ICE trying to set the "zero" initializer on the incomplete +// array + +struct A {A();int A::* t;}; +A x[]; // { dg-error "size" } diff --git a/gcc/testsuite/g++.dg/init/array24.C b/gcc/testsuite/g++.dg/init/array24.C new file mode 100644 index 000000000..ed4c1d881 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array24.C @@ -0,0 +1,7 @@ +// PR c++/29175 +// { dg-options "" } + +void foo(int i) +{ + int x[][i] = { 0 }; // { dg-error "variable-sized|storage size" } +} diff --git a/gcc/testsuite/g++.dg/init/array25.C b/gcc/testsuite/g++.dg/init/array25.C new file mode 100644 index 000000000..1ab2725d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array25.C @@ -0,0 +1,49 @@ +// related to PR c++/38233 +// test for value-init of a member array +// { dg-do run } + +struct elt +{ + virtual void f(); + char c; +}; + +void elt::f() { } + +struct foo { + elt buffer[500]; + foo() ; + bool check () const; +}; + +foo::foo () + : buffer() +{} + +bool foo::check () const +{ + for (unsigned ix = sizeof (buffer)/ sizeof (buffer[0]); ix--;) + if (buffer[ix].c) + return false; + return true; +} + +inline void *operator new (__SIZE_TYPE__ size, void *p) +{ + return p; +} + +char heap[sizeof(elt[500])]; + +int main () +{ + for (unsigned ix = sizeof (heap); ix--;) + heap[ix] = ix; + + foo *f = new (heap) foo (); + if (!f->check ()) + return 3; + return 0; +} + + diff --git a/gcc/testsuite/g++.dg/init/array26.C b/gcc/testsuite/g++.dg/init/array26.C new file mode 100644 index 000000000..83c4e0c4a --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array26.C @@ -0,0 +1,11 @@ +// PR c++/42058 +// { dg-options "" } + +struct A; + +struct B +{ + A a; // { dg-error "incomplete type" } +}; + +B b[1] = (B[]) { 0 }; // { dg-error "initializer" } diff --git a/gcc/testsuite/g++.dg/init/array27.C b/gcc/testsuite/g++.dg/init/array27.C new file mode 100644 index 000000000..988501545 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array27.C @@ -0,0 +1,11 @@ +// PR c++/42058 +// { dg-options "" } + +struct A {}; + +struct B +{ + A a; +}; + +B b[1] = (B[]) { 0 }; // { dg-error "initializer" } diff --git a/gcc/testsuite/g++.dg/init/array28.C b/gcc/testsuite/g++.dg/init/array28.C new file mode 100644 index 000000000..8cf19ba43 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array28.C @@ -0,0 +1,7 @@ +// PR c++/49669 + +struct Foo { explicit Foo(int) { } }; +struct Goo { + Goo() : x(Foo(4), Foo(5)) { } // { dg-error "array" } + Foo x[2]; +}; diff --git a/gcc/testsuite/g++.dg/init/array3.C b/gcc/testsuite/g++.dg/init/array3.C new file mode 100644 index 000000000..700b26389 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array3.C @@ -0,0 +1,23 @@ +// PR c++/6331 +// Bug: we were generating a badly cv-qualified ARRAY_TYPE in the +// synthesized copy constructor for A, which then became the canonical +// version, confusing later uses. + +struct A { + virtual ~A(); + const float* f(); + float fa[3]; +}; + +struct B { + B(const A& ai) : a (ai) {} + A a; +}; + +void g (const float pos[3]); + +extern A& a; +void h() +{ + g (a.f()); +} diff --git a/gcc/testsuite/g++.dg/init/array33.C b/gcc/testsuite/g++.dg/init/array33.C new file mode 100644 index 000000000..4440d3d54 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array33.C @@ -0,0 +1,22 @@ +// PR c++/55804 +// { dg-do run } + +int t = 0; +template <typename> struct vector { + vector() { t++; } +}; + +typedef vector<int> Arrays[1]; +class C +{ + vector<int> v_; + void Foo(const Arrays &); +}; +Arrays a; + +int main(void) +{ + if (t!=1) + __builtin_abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/array4.C b/gcc/testsuite/g++.dg/init/array4.C new file mode 100644 index 000000000..67519bf7c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array4.C @@ -0,0 +1,27 @@ +// { dg-do compile } +// Origin: Markus Breuer <markus.breuer@materna.de> + +// PR c++/6944 +// Fail to synthesize copy constructor of multi-dimensional +// array of class. + +#include <string> + +class Array +{ +public: + std::string m_array[10][20][30]; +}; + +Array func() +{ + Array result; + return result; // sorry, not implemented: cannot initialize multi-dimensional array with initializer +} + + +int main() +{ + Array arr = func(); +} + diff --git a/gcc/testsuite/g++.dg/init/array5.C b/gcc/testsuite/g++.dg/init/array5.C new file mode 100644 index 000000000..aeacb31cf --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array5.C @@ -0,0 +1,52 @@ +// { dg-do run } +// Copyright (C) 2002 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + +// Incorrect construction and destruction of multi-dimensional +// array of class. + +extern "C" void abort(); +extern "C" int printf(const char *, ...); + +int count; +int num; + +struct A +{ + A() + { + if (count == num) + throw ""; + count++; +#ifdef PRINT + printf("ctor %p\n", static_cast<void *>(this)); +#endif + } + + ~A() + { + count--; +#ifdef PRINT + printf("dtor %p\n", static_cast<void *>(this)); +#endif + } +}; + +struct Array +{ + A array[2][2][2]; +}; + +int main() +{ + for (num = 0; num <= 8; ++num) { + count = 0; + try { + Array A; + } + catch (...) { + } + if (count != 0) + abort(); + } +} diff --git a/gcc/testsuite/g++.dg/init/array6.C b/gcc/testsuite/g++.dg/init/array6.C new file mode 100644 index 000000000..6181d02bf --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array6.C @@ -0,0 +1,7 @@ +// { dg-do compile } + +char arr [][4] = { "one", "two" }; +const char arr2[][4] = { "one", "two" }; +signed char arr3[][4] = { "one", "two" }; +const unsigned char arr4[][4] = { "one", "two" }; +volatile wchar_t arr5[][4] = { L"one", L"two" }; diff --git a/gcc/testsuite/g++.dg/init/array7.C b/gcc/testsuite/g++.dg/init/array7.C new file mode 100644 index 000000000..23c6a7098 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array7.C @@ -0,0 +1,15 @@ +struct S { + virtual void v () {} + void f (const float g[3]); + float h[3]; +}; + +void g () { + S s1, s2; + s1 = s2; +} + +void S::f (const float g[3]) {} + + + diff --git a/gcc/testsuite/g++.dg/init/array8.C b/gcc/testsuite/g++.dg/init/array8.C new file mode 100644 index 000000000..5f28ca490 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array8.C @@ -0,0 +1,12 @@ +struct A { + A (); +}; + +struct B { + A a1; + A a2; +}; + +A a; + +struct B b[] = { { a, a }, { a, a } }; diff --git a/gcc/testsuite/g++.dg/init/array9.C b/gcc/testsuite/g++.dg/init/array9.C new file mode 100644 index 000000000..d37e00e5b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/array9.C @@ -0,0 +1,9 @@ +struct T { + T (); +}; + +void f () { + T t[2]; + for (int i = 0; i < 10; ++i); + int i = 0; +} diff --git a/gcc/testsuite/g++.dg/init/assign1.C b/gcc/testsuite/g++.dg/init/assign1.C new file mode 100644 index 000000000..690a48191 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/assign1.C @@ -0,0 +1,30 @@ +// PR c++/13009 +// { dg-do run } + +struct A { + char a; +}; + +struct B: public virtual A { + #if 0 // this piece of code works around the problem + B& operator= (const B& other) + { + A::operator= (other); + } + #endif +}; + +struct C: public B { + char c; +}; + +int main() { + B b; + b.a = 'b'; + C c; + c.a = c.c = 'c'; + + c.B::operator= (b); + if (c.a != 'b' || c.c != 'c') + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/attrib1.C b/gcc/testsuite/g++.dg/init/attrib1.C new file mode 100644 index 000000000..839e4ce21 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/attrib1.C @@ -0,0 +1,10 @@ +// { dg-do run } + +void f() __attribute((__constructor__)); +int i; +void f() { i = 1; } + +int main(int, char **) +{ + return 1-i; +} diff --git a/gcc/testsuite/g++.dg/init/bitfield1.C b/gcc/testsuite/g++.dg/init/bitfield1.C new file mode 100644 index 000000000..70a06d0e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/bitfield1.C @@ -0,0 +1,24 @@ +// Check that we handle bitfields as complex lvalues properly. + +struct A +{ + int i: 2; + int j: 2; + int k: 2; +}; + +A a, a2; +bool b; +void f (); + +int main () +{ + (f(), a.j) = 1; + (f(), a).j = 2; // { dg-warning "overflow" } + (b ? a.j : a2.k) = 3; // { dg-warning "overflow" } + (b ? a : a2).j = 0; + ++(a.j) = 1; + (a.j = 2) = 3; // { dg-warning "overflow" } +} + + diff --git a/gcc/testsuite/g++.dg/init/bitfield2.C b/gcc/testsuite/g++.dg/init/bitfield2.C new file mode 100644 index 000000000..e54b2e423 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/bitfield2.C @@ -0,0 +1,33 @@ +// PR c++/13371 +// Bug: We were failing to properly protect the lhs on the line marked +// "here" from multiple evaluation. + +// { dg-do run } + +extern "C" int printf (const char *, ...); + +enum E { E1, E2 }; + +struct A +{ + E e : 8; + unsigned char c; +}; + +A ar[2]; + +int c; + +int f() +{ + ++c; + printf ("f()\n"); + return 0; +} + +int main() +{ + ar[0].c = 0xff; + ar[f()].e = E1; // here + return (c != 1 || ar[0].c != 0xff); +} diff --git a/gcc/testsuite/g++.dg/init/brace1.C b/gcc/testsuite/g++.dg/init/brace1.C new file mode 100644 index 000000000..a819fa258 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/brace1.C @@ -0,0 +1,4 @@ +// { dg-do compile } + +int i[4] = { { 3 } }; // { dg-error "brace" } + diff --git a/gcc/testsuite/g++.dg/init/brace2.C b/gcc/testsuite/g++.dg/init/brace2.C new file mode 100644 index 000000000..619a20f3c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/brace2.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// [dcl.init] paragraph 13. +int x = { 2 }; +const char * y = { "hello" }; +int a = 2; +int b = { 2,3 }; // { dg-error "requires one element in initializer" } +int c = { { 2 } } ; // { dg-error "braces around scalar initializer" } +int d = {}; // { dg-error "initializer" } diff --git a/gcc/testsuite/g++.dg/init/brace3.C b/gcc/testsuite/g++.dg/init/brace3.C new file mode 100644 index 000000000..0a1ee8f00 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/brace3.C @@ -0,0 +1 @@ +int array[2][1] = { {0} {1} }; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/init/brace4.C b/gcc/testsuite/g++.dg/init/brace4.C new file mode 100644 index 000000000..0c3790193 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/brace4.C @@ -0,0 +1,5 @@ +// PR c++/16859 +// { dg-do compile } +// { dg-options "-pedantic" } + +int a[] = { }; // { dg-error "zero-size array" } diff --git a/gcc/testsuite/g++.dg/init/brace5.C b/gcc/testsuite/g++.dg/init/brace5.C new file mode 100644 index 000000000..696bbd676 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/brace5.C @@ -0,0 +1,7 @@ +// PR c++/27491 +// { dg-do compile } +// { dg-options "" } + +int i = (int) { 0 }; +int j = (int) { i }; +int k = (int) { k }; diff --git a/gcc/testsuite/g++.dg/init/brace6.C b/gcc/testsuite/g++.dg/init/brace6.C new file mode 100644 index 000000000..e01b94742 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/brace6.C @@ -0,0 +1,25 @@ +/* PR c++/30759 */ +/* { dg-do compile } */ + +struct A { + A(int) { } +}; + +struct B { + B(const B&); + int b; +}; + +struct C {}; + +struct D { int c; }; + +int main() +{ + int i = { 1 }; + int j = { 1, 2 }; /* { dg-error "requires one element" } */ + A a = { 6 }; /* { dg-error "initialize" } */ + B b = { 6 }; /* { dg-error "" } */ + C c = { 6 }; /* { dg-error "too many initializers" } */ + D d = { 6 }; +} diff --git a/gcc/testsuite/g++.dg/init/byval1.C b/gcc/testsuite/g++.dg/init/byval1.C new file mode 100644 index 000000000..86c6e4683 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/byval1.C @@ -0,0 +1,31 @@ +// PR c++/3948 +// Test that the destructor call for a value parameter gets the +// right address. + +// { dg-do run } + +void *p[2]; +int i; +int r; + +struct C +{ + int m; + + C() { p[i++] = this; } + ~C() { if (p[--i] != this) r = 1; } +}; + + +void Foo (C c) +{ + p[i++] = &c; +} + +int main () +{ + C c; + + Foo (c); + return r; +} diff --git a/gcc/testsuite/g++.dg/init/call1.C b/gcc/testsuite/g++.dg/init/call1.C new file mode 100644 index 000000000..d44b6dddc --- /dev/null +++ b/gcc/testsuite/g++.dg/init/call1.C @@ -0,0 +1,35 @@ +// Bug c++/16115 +// { dg-options "-O2" } + +extern "C" void abort(); + +int count = 0; + +struct T { + T() { count++; } + T(const T&) { count++; } + ~T() { if (count==0) abort(); --count; } +}; + +struct auto_ptr { + T* p; + + auto_ptr(T* __p) : p(__p) { } + ~auto_ptr() { delete p; } + + T* release() { + T* t = p; + p = 0; + return t; + } +}; + +void destroy (auto_ptr a) { + delete a.release(); +} + + +int main () +{ + destroy (new T); +} diff --git a/gcc/testsuite/g++.dg/init/cleanup1.C b/gcc/testsuite/g++.dg/init/cleanup1.C new file mode 100644 index 000000000..517af15c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/cleanup1.C @@ -0,0 +1,16 @@ +// PR c++/13033 + +// We failed to treat the for increment expression as a full-expression, +// which broke gimplification. + +struct QDomNode { + virtual ~QDomNode(); + QDomNode nextSibling() const; + bool isNull() const; +}; + +void processNode(QDomNode n) +{ + for (; !n.isNull(); n = n.nextSibling()) + ; +} diff --git a/gcc/testsuite/g++.dg/init/cleanup2.C b/gcc/testsuite/g++.dg/init/cleanup2.C new file mode 100644 index 000000000..e62364be1 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/cleanup2.C @@ -0,0 +1,19 @@ +// PR c++/12526 + +// We decided that the call to strcmp has no side-effects because strcmp is +// pure, even though the first argument has side-effects. As a result, we +// stripped the CLEANUP_POINT_EXPR. Hilarity ensued. + +extern "C" int strcmp (const char *, const char *); + +struct A { + A(int); + const char *str(); + ~A(); +}; + +void printQueryI() +{ + if(!strcmp(A(1).str(), "foo")) + { } +} diff --git a/gcc/testsuite/g++.dg/init/cleanup3.C b/gcc/testsuite/g++.dg/init/cleanup3.C new file mode 100644 index 000000000..da7e411ab --- /dev/null +++ b/gcc/testsuite/g++.dg/init/cleanup3.C @@ -0,0 +1,22 @@ +// Check that on targets with "__cxa_atexit" we use destructors, +// rather than cleanup functions, to destroy objects with static +// storage duration. + +// { dg-require-effective-target "cxa_atexit" } +// Cleanup functions generated by G++ have the "_tcf" prefix. +// { dg-final { scan-assembler-not "_tcf" } } + +struct S { + ~S(); +}; + +struct T { + S s; +}; + +S s; +T t; + +void f() { + static S s; +} diff --git a/gcc/testsuite/g++.dg/init/complex1.C b/gcc/testsuite/g++.dg/init/complex1.C new file mode 100644 index 000000000..3f88fd902 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/complex1.C @@ -0,0 +1,7 @@ +/* PR c++/21210 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +typedef float __complex__ fcomplex; +fcomplex cplx = fcomplex(); + diff --git a/gcc/testsuite/g++.dg/init/const1.C b/gcc/testsuite/g++.dg/init/const1.C new file mode 100644 index 000000000..af4427d9a --- /dev/null +++ b/gcc/testsuite/g++.dg/init/const1.C @@ -0,0 +1,8 @@ +// PR c++/20073 + +template<int> struct A +{ + A(); +}; + +const A<0> x[] = { A<0>() }; diff --git a/gcc/testsuite/g++.dg/init/const2.C b/gcc/testsuite/g++.dg/init/const2.C new file mode 100644 index 000000000..4fd631851 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/const2.C @@ -0,0 +1,7 @@ +// PR c++/19878 + +struct S { + char k; +}; +char const volatile S::* const p01 = &S::k; + diff --git a/gcc/testsuite/g++.dg/init/const3.C b/gcc/testsuite/g++.dg/init/const3.C new file mode 100644 index 000000000..96cb6f909 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/const3.C @@ -0,0 +1,12 @@ +// { dg-do run } + +struct S { + static const int i = 3; +}; + +const int S::i; + +int main () { + if (!S::i) + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/const4.C b/gcc/testsuite/g++.dg/init/const4.C new file mode 100644 index 000000000..b99726b86 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/const4.C @@ -0,0 +1,8 @@ +// PR c++/27804 +// { dg-do compile } + +bool foo() +{ + const int i = X; // { dg-error "not declared" } + return i > 0; +} diff --git a/gcc/testsuite/g++.dg/init/const5.C b/gcc/testsuite/g++.dg/init/const5.C new file mode 100644 index 000000000..fa8d8fc23 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/const5.C @@ -0,0 +1,11 @@ +// PR c++/31449 + +class Foo {}; +class Bar : public Foo {}; +static const Foo *foo = 0; + +static Bar *bar = static_cast<const Bar*>(foo); // { dg-error "conversion" } + +void func(const Foo *foo) { + Bar *bar = static_cast<const Bar*>(foo); // { dg-error "conversion" } +} diff --git a/gcc/testsuite/g++.dg/init/const6.C b/gcc/testsuite/g++.dg/init/const6.C new file mode 100644 index 000000000..e626bfeac --- /dev/null +++ b/gcc/testsuite/g++.dg/init/const6.C @@ -0,0 +1,27 @@ +// PR c++/36688 +// { dg-do run } +// { dg-options "-O2" } + +struct S +{ + long long a; + long long b; + long long c; +}; + +struct T +{ + S g; + long long h[12]; +}; + +static const S s = { 1, 2, 3 }; +static const T t = { s, 0 }; + +int +main () +{ + T x = t; + if (__builtin_memcmp (&x, &t, sizeof (T))) + __builtin_abort (); +} diff --git a/gcc/testsuite/g++.dg/init/const7.C b/gcc/testsuite/g++.dg/init/const7.C new file mode 100644 index 000000000..18d04625d --- /dev/null +++ b/gcc/testsuite/g++.dg/init/const7.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options "-fdump-tree-gimple" } + +struct s { int x, y; }; +short offsets[1] = { + ((char*) &(((struct s*)16)->y) - (char *)16), +}; + +// This ensures that we get a dump whether or not the bug is present. +void fn() { } + +// { dg-final { scan-tree-dump-not "initialization" "gimple" } } +// { dg-final { cleanup-tree-dump "gimple" } } diff --git a/gcc/testsuite/g++.dg/init/const8.C b/gcc/testsuite/g++.dg/init/const8.C new file mode 100644 index 000000000..4eb293d65 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/const8.C @@ -0,0 +1,11 @@ +// DR 234 - it should be OK to leave off the initializer of a const +// variable if the default constructor fully initializes the object. + +struct A { }; +const A a; + +struct B { A a; }; +const B b; + +struct C { virtual void f(); }; +const C c; diff --git a/gcc/testsuite/g++.dg/init/copy1.C b/gcc/testsuite/g++.dg/init/copy1.C new file mode 100644 index 000000000..91a84ae3e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/copy1.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +class A { +public: + A(){} + A( const A& a ){} +}; + +class B : public A +{ +public: + B( int& s) : s_(s){} + int& s_; +}; + +int main() +{ + int i; + B x1( i ); + B x2( x1 ); +} diff --git a/gcc/testsuite/g++.dg/init/copy2.C b/gcc/testsuite/g++.dg/init/copy2.C new file mode 100644 index 000000000..9a662d4cf --- /dev/null +++ b/gcc/testsuite/g++.dg/init/copy2.C @@ -0,0 +1,5 @@ +// { dg-do compile } + +struct S { S (); }; + +volatile S s[1] = { S () }; diff --git a/gcc/testsuite/g++.dg/init/copy3.C b/gcc/testsuite/g++.dg/init/copy3.C new file mode 100644 index 000000000..fa6a6ea18 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/copy3.C @@ -0,0 +1,16 @@ +// { dg-do run } +// { dg-options "-fno-elide-constructors" } + +int copies; + +struct S { + S () {} + S (const S&) { ++copies; } +}; + +S s[1] = { S () }; + +int main () { + if (copies != 1) + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/copy4.C b/gcc/testsuite/g++.dg/init/copy4.C new file mode 100644 index 000000000..bfff68566 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/copy4.C @@ -0,0 +1,19 @@ +// PR c++/9342 +// We were failing to wrap def().user in a TARGET_EXPR, so copying it +// into the reference temp used a bitwise copy. + +struct QString +{ + QString( const QString & ); + QString &operator=( const QString & ); +}; +struct ServerSettings +{ + QString user; +}; +extern ServerSettings def(); +extern void arg( const QString& a ); +void startSession( bool b, QString s ) +{ + arg (b ? def().user : s); +} diff --git a/gcc/testsuite/g++.dg/init/copy5.C b/gcc/testsuite/g++.dg/init/copy5.C new file mode 100644 index 000000000..cef5a2950 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/copy5.C @@ -0,0 +1,29 @@ +// { dg-options "-O2" } + +struct BOOL { + int nVal:1, bSet:1; + BOOL (int i) : nVal(i!=0), bSet(1) {} +}; +struct Fill { + void *d; + Fill() : d(0) {} + Fill( const Fill& ) {} +}; +struct SvMetaSlot { + Fill aGroupId; + BOOL a8; + SvMetaSlot() : + a8(1) {} + SvMetaSlot* MakeClone() const; +}; + +SvMetaSlot* SvMetaSlot::MakeClone() const { return new SvMetaSlot( *this ); } + +extern "C" void abort(void); +int main() +{ + SvMetaSlot s; SvMetaSlot s2(s); + if (s.a8.bSet != s2.a8.bSet) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/copy6.C b/gcc/testsuite/g++.dg/init/copy6.C new file mode 100644 index 000000000..136dc7830 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/copy6.C @@ -0,0 +1,13 @@ +// PR c++/11878 + +struct A +{ + virtual ~A(); +}; + +template<typename T> struct B +{ + T t; +}; + +void foo() { throw B<A>().t; } diff --git a/gcc/testsuite/g++.dg/init/copy7.C b/gcc/testsuite/g++.dg/init/copy7.C new file mode 100644 index 000000000..20e1e47db --- /dev/null +++ b/gcc/testsuite/g++.dg/init/copy7.C @@ -0,0 +1,39 @@ +// PR c++/39480 +// It isn't always safe to call memcpy with identical arguments. +// { dg-do run } + +extern "C" void abort(); +extern "C" void * +memcpy(void *dest, void *src, __SIZE_TYPE__ n) +{ + if (dest == src) + abort(); + else + { + __SIZE_TYPE__ i; + for (i = 0; i < n; i++) + ((char *)dest)[i] = ((const char*)src)[i]; + } +} + +struct A +{ + double d[10]; +}; + +struct B: public A +{ + char bc; +}; + +B b; + +void f(B *a1, B* a2) +{ + *a1 = *a2; +} + +int main() +{ + f(&b,&b); +} diff --git a/gcc/testsuite/g++.dg/init/ctor1.C b/gcc/testsuite/g++.dg/init/ctor1.C new file mode 100644 index 000000000..aeb509bfa --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor1.C @@ -0,0 +1,57 @@ +// { dg-do run } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 12 Oct 2002 <nathan@codesourcery.com> + +// From WindRiver SPR 80797 +// We were inadvertently SAVE_EXPRing volatile arrays during delete[] + +struct A +{ + A *ptr; + static int ok; + + A () {ptr = this;} + ~A () {ok = ptr == this;} +}; +int A::ok = -1; + +struct B +{ + B *ptr; + static int ok; + + B () {ptr = this;} + ~B () {ok = ptr == this;} +}; +int B::ok = -1; + +struct C +{ + A volatile a; + B volatile b[1]; + + C (); +}; + +C::C () +{ + throw 1; +} + +int main () +{ + try + { + C c; + } + catch (...) + { + if (A::ok != 1) + return 1; + if (B::ok != 1) + return 2; + return 0; + } + return 3; +} diff --git a/gcc/testsuite/g++.dg/init/ctor2.C b/gcc/testsuite/g++.dg/init/ctor2.C new file mode 100644 index 000000000..cf426f2bf --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor2.C @@ -0,0 +1,34 @@ +// { dg-do run } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 14 Mar 2003 <nathan@codesourcery.com> + +// PR 9629. The vtable is not set up until the base initializers have +// run. + +struct A { + static A *a; + A (); +}; +A *A::a; +A::A () {a = this;} + +struct B { + static A *a; + B (A *); +}; +A *B::a; +B::B(A *a_) {a = a_;} + +struct C : virtual public A, public B { + C(); +}; +C::C () : B(this) {} + +struct D : virtual public C {}; + +int main() +{ + new D(); + return A::a != B::a; +} diff --git a/gcc/testsuite/g++.dg/init/ctor3.C b/gcc/testsuite/g++.dg/init/ctor3.C new file mode 100644 index 000000000..1678aaf2c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor3.C @@ -0,0 +1,6 @@ +// PR c++/14401 + +struct S { + S() {} // { dg-error "" } + const int i; +}; diff --git a/gcc/testsuite/g++.dg/init/ctor4.C b/gcc/testsuite/g++.dg/init/ctor4.C new file mode 100644 index 000000000..1c92bb973 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor4.C @@ -0,0 +1,20 @@ +// PR c++/17788 +// { dg-do compile } + +class foo { +public: + foo(); +}; + +class bar: public foo { // { dg-error "reference|bar::bar" } +private: + int &a; +}; + +foo::foo() { +} + +int main(int argc, char **argv) +{ + bar x; // { dg-message "synthesized|deleted" } +} diff --git a/gcc/testsuite/g++.dg/init/ctor5.C b/gcc/testsuite/g++.dg/init/ctor5.C new file mode 100644 index 000000000..cc9331882 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor5.C @@ -0,0 +1,17 @@ +// PR C++/21645 +// We were crashing because we forgot to update the type for +// the cloned argument for the cloned ctor. + +struct color { + ~color(); +}; +struct style { + color col; + style (color); +}; + +style::style(color c) + : col(c) +{ +} + diff --git a/gcc/testsuite/g++.dg/init/ctor6.C b/gcc/testsuite/g++.dg/init/ctor6.C new file mode 100644 index 000000000..a25ecab1f --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor6.C @@ -0,0 +1,20 @@ +// PR c++/21340 + +struct Base{}; +struct Iterator : virtual Base {}; +bool operator==(const Iterator&, const Iterator&); +struct IteratorI : Iterator {}; +struct Obj +{ + bool operator==(const Obj&) const; +}; +template <int>bool dummy() +{ + Obj lhs, rhs; + return lhs == rhs; +} +int +main(int argc, char** argv) +{ + IteratorI* it2 = new IteratorI(); +} diff --git a/gcc/testsuite/g++.dg/init/ctor7.C b/gcc/testsuite/g++.dg/init/ctor7.C new file mode 100644 index 000000000..3378a150e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor7.C @@ -0,0 +1,51 @@ +// { dg-do run } + +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 13 Oct 2005 <nathan@codesourcery.com> + +// PR 23984:ICE +// Origin: Andrew Pinski pinskia@gcc.gnu.org + +struct B +{ + virtual void Foo (); +}; + +void B::Foo () +{ +} + +struct D : virtual B +{ +}; + +struct E +{ + B *ptr; + + E (B *); +}; + +static B *ptr; + +E::E (B *ptr_) + :ptr (ptr_) +{ +} + +struct G : D, E +{ + G (); +}; + +G::G () + : E (this) +{ +} + +int main () +{ + G object; + + return object.ptr != &object; +} diff --git a/gcc/testsuite/g++.dg/init/ctor8.C b/gcc/testsuite/g++.dg/init/ctor8.C new file mode 100644 index 000000000..3491f6a1d --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor8.C @@ -0,0 +1,9 @@ +// PR c++/29039 + +typedef struct S { + int &r; +}; // { dg-warning "'typedef' was ignored" } + +S f () { + return S (); // { dg-error "reference" } +} diff --git a/gcc/testsuite/g++.dg/init/ctor9.C b/gcc/testsuite/g++.dg/init/ctor9.C new file mode 100644 index 000000000..02bb5700f --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor9.C @@ -0,0 +1,8 @@ +// PR c++/38427 +// { dg-do compile } + +struct S +{ + int &ref; + S() : ref() {}; // { dg-error "value-initialization of" } +}; diff --git a/gcc/testsuite/g++.dg/init/delete1.C b/gcc/testsuite/g++.dg/init/delete1.C new file mode 100644 index 000000000..698b12771 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/delete1.C @@ -0,0 +1,7 @@ +// PR c++/19811 + +class C; // { dg-error "forward" } + +void foo(void *p) { + delete [] ((C*)p) ; // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/init/delete2.C b/gcc/testsuite/g++.dg/init/delete2.C new file mode 100644 index 000000000..8a486beaa --- /dev/null +++ b/gcc/testsuite/g++.dg/init/delete2.C @@ -0,0 +1,55 @@ +// PR c++/15097 +// { dg-do run } + +typedef __SIZE_TYPE__ size_t; + +extern "C" void * malloc (size_t); +extern "C" void free (void *); +extern "C" void abort(void); + +void *saved; + +void * operator new (size_t size) +{ + void *p = malloc (size); + saved = p; + return p; +} + +void operator delete (void *p) +{ + if (p != saved) + abort (); + free (p); +} + +struct B1 +{ + virtual ~B1 () throw() {} + B1 (){} + int x; +}; +struct B2 +{ + virtual ~B2 () throw() {} + B2 (){} + int x; +}; +struct D : B1, B2 +{ + D (){} + ~D () throw() {} + int y; +}; +void f1 (D*); +void f2 (B2*); +void f3 (B1*); +int main (void) +{ + f1 (::new D); + f2 (::new D); + f3 (::new D); +} +void f1 ( D* p) { ::delete p; } +void f2 (B2* p) { ::delete p; } +void f3 (B1* p) { ::delete p; } diff --git a/gcc/testsuite/g++.dg/init/dso_handle1.C b/gcc/testsuite/g++.dg/init/dso_handle1.C new file mode 100644 index 000000000..97f67cad8 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/dso_handle1.C @@ -0,0 +1,11 @@ +// PR c++/17042 +// { dg-do assemble } +/* { dg-require-weak "" } */ +// { dg-options "-fuse-cxa-atexit" } + +struct A +{ A(); ~A(); }; +A a; +extern "C" { void* __dso_handle __attribute__ ((__weak__)); } +void f() +{ __dso_handle = 0; } diff --git a/gcc/testsuite/g++.dg/init/dtor1.C b/gcc/testsuite/g++.dg/init/dtor1.C new file mode 100644 index 000000000..624433897 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/dtor1.C @@ -0,0 +1,43 @@ +// { dg-do run } + +extern "C" void abort (); + +int d = 5; + +struct B +{ + int x; + B (int i) : x (i) { } + ~B () { if (d-- != x) abort (); } +}; + +struct C1 : public B { + C1 (int i) : B (i) {} +}; + +struct C2 : public B { + C2 (int i) : B (i) {} +}; + +struct D : public B { + D (int i) : B (i) {} +}; + +struct E : public B { + E (int i) : B (i) {} +}; + +struct A + : public C1, C2, virtual public D, virtual public E +{ + A () : D (0), E (1), C1 (2), C2 (3), x1(4), x2(5) {} + B x1; + B x2; +}; + + +int main () +{ + A a; + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/dtor2.C b/gcc/testsuite/g++.dg/init/dtor2.C new file mode 100644 index 000000000..56c7cac91 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/dtor2.C @@ -0,0 +1,28 @@ +// { dg-do run } + +extern "C" void abort (); + +struct A +{ + ~A(); +}; + +A::~A () { + abort (); +} + +struct B +{ + ~B(); +}; + +B::~B () { + if(true) return; + A a; +} + +int main() +{ + B b; + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/dtor3.C b/gcc/testsuite/g++.dg/init/dtor3.C new file mode 100644 index 000000000..2af1ffe46 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/dtor3.C @@ -0,0 +1,21 @@ +// PR c++/17976 +// { dg-do run } + +extern "C" void abort(); +struct A +{ + static int i; + A(){} + ~A(){i++;if(i>1)abort();} +}; + +int A::i = 0; + +A a; +extern A a; + +int main() +{ + return 0; +} + diff --git a/gcc/testsuite/g++.dg/init/elide1.C b/gcc/testsuite/g++.dg/init/elide1.C new file mode 100644 index 000000000..24e81e387 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/elide1.C @@ -0,0 +1,38 @@ +// { dg-do run } + +// Test that the destructor for a temporary passed by value isn't run +// until end of full-expression, as per [class.copy]: + +// Whenever a temporary class object is copied using a copy constructor, +// and this object and the copy have the same cv-unqualified type, an +// implementation is permitted to treat the original and the copy as two +// different ways of referring to the same object and not perform a copy +// at all, even if the class copy constructor or destructor have side +// effects.... In these cases, the +// object is destroyed at the later of times when the original and the +// copy would have been destroyed without the optimization. + +// Here, the temporary would be destroyed later than the parm, so either we +// must suppress the optimization in this case or destroy value parms in the +// caller. + +int d; + +struct A { + A () { } + A (const A&) { } + ~A() { ++d; } +}; + +void f (A a) { } + +int main () +{ + int r; + f (A ()), r = d; + + if (r < d && d) + return 0; + else + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/elide2.C b/gcc/testsuite/g++.dg/init/elide2.C new file mode 100644 index 000000000..e6d3300b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/elide2.C @@ -0,0 +1,30 @@ +// PR c++/8674 + +// Bug: Since B().a is an rvalue, we tried to treat it like a TARGET_EXPR +// and elide the copy. But that produces a bitwise copy, which causes us +// to abort in cp_expr_size. + +// Test that we actually run the A copy constructor when calling f(). + +// { dg-do run } + +int c; + +struct A +{ + A () { ++c; } + A (const A&) { ++c; } +}; + +struct B +{ + A a; +}; + +void f (A) { } + +int main () +{ + f (B().a); + return c < 2; +} diff --git a/gcc/testsuite/g++.dg/init/empty1.C b/gcc/testsuite/g++.dg/init/empty1.C new file mode 100644 index 000000000..bba179f98 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/empty1.C @@ -0,0 +1,30 @@ +// { dg-do run } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 3 Sept 2001 <nathan@codesourcery.com> + +// Bug 4203. We were bit copying empty bases including the +// padding. Which clobbers whatever they overlay. + +class EmptyBase0 {}; +class EmptyBase1 : public EmptyBase0 {}; +class Base1 +{ +public: +unsigned int t_; +Base1(unsigned int t) : t_(t) {} +}; + +class PEPE : public Base1, public EmptyBase1 +{ +public: +PEPE(unsigned int t) + : Base1(t), EmptyBase1(EmptyBase1()) {} +}; + +int main() +{ + PEPE pepe(0xff); + + return pepe.t_ != 255; +} diff --git a/gcc/testsuite/g++.dg/init/enum1.C b/gcc/testsuite/g++.dg/init/enum1.C new file mode 100644 index 000000000..4876e4594 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/enum1.C @@ -0,0 +1,18 @@ +/* { dg-options "-Wno-overflow" } */ + +#ifndef __SIZEOF_INT128__ +#define UNACCEPT 0xffffffffffffffffLL +#else +#define UNACCEPT ~((unsigned __int128) 0) +#endif + +enum test { + acceptable = -1, + unacceptable = UNACCEPT +}; // { dg-error "" } + +enum test t = acceptable, u = unacceptable; + +int main() { + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/enum2.C b/gcc/testsuite/g++.dg/init/enum2.C new file mode 100644 index 000000000..dea7dc17b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/enum2.C @@ -0,0 +1,9 @@ +#include <limits.h> +enum test { + z = 0, + c = UINT_MAX + 1LL +} x = z; + +int main() { + return x != z; +} diff --git a/gcc/testsuite/g++.dg/init/error1.C b/gcc/testsuite/g++.dg/init/error1.C new file mode 100644 index 000000000..bdd983f96 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/error1.C @@ -0,0 +1,7 @@ +// PR c++/12696 + +struct A { + static float b[10]; +} // { dg-error "after struct definition" } + +float A::b[] = {1,2,3}; diff --git a/gcc/testsuite/g++.dg/init/error2.C b/gcc/testsuite/g++.dg/init/error2.C new file mode 100644 index 000000000..43d24f13b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/error2.C @@ -0,0 +1,15 @@ +/* PR c++/29727 */ +/* { dg-do compile } */ + +template<int> struct A +{ + static int a[1]; +}; +template<int N> int A<N>::a[1] = { X:0 }; /* { dg-error "does not allow designated|was not declared|designated initializer for an array" } */ + +void foo() +{ + A<0>::a; +} + + diff --git a/gcc/testsuite/g++.dg/init/float1.C b/gcc/testsuite/g++.dg/init/float1.C new file mode 100644 index 000000000..d18ff3db0 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/float1.C @@ -0,0 +1,19 @@ +// PR c++/21089 +// { dg-do run } + +extern "C" void abort(); + +static const double a = 1.0; +struct S { + S(); +}; +static S s; +static const double b = a + 1.0; + +S::S() { + if (b < 1.9 || b > 2.1) + abort (); +} + +int main () { +} diff --git a/gcc/testsuite/g++.dg/init/for1.C b/gcc/testsuite/g++.dg/init/for1.C new file mode 100644 index 000000000..02f8a2d48 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/for1.C @@ -0,0 +1,28 @@ +// PR c++/13865 +// Bug: We were destroying 'a' before executing the loop. + +#include <stdio.h> + +int i; +int r; + +class A +{ +public: + A() { printf("A ctor\n"); } + ~A() + { + printf("A dtor\n"); + if (i != 1) + r = 1; + } +}; + +int main(int argc, char **argv) +{ + for (A a; i < 2; ++i) { + printf("iteration %d\n", i); + } + + return r; +} diff --git a/gcc/testsuite/g++.dg/init/for2.C b/gcc/testsuite/g++.dg/init/for2.C new file mode 100644 index 000000000..d66fea30e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/for2.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// PR 16012: Got the scope of I incorrect in templates only. + +template<int> void foo() +{ + for (int i=0 ;;) ; + int i; +} + +void bar() +{ + foo<0>(); +} diff --git a/gcc/testsuite/g++.dg/init/for3.C b/gcc/testsuite/g++.dg/init/for3.C new file mode 100644 index 000000000..c8ef3cc62 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/for3.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +struct A { int i; A(); A(const A&); }; + +void bar() +{ + A a; + for ( ;; a=A() ) ; +} diff --git a/gcc/testsuite/g++.dg/init/global1.C b/gcc/testsuite/g++.dg/init/global1.C new file mode 100644 index 000000000..21f1cac06 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/global1.C @@ -0,0 +1,16 @@ +// PR c++/18416 + +class errarg { + enum { EMPTY } type; +public: + errarg(); +}; +extern errarg empty_errarg; +extern void errprint(const char *, + const errarg &arg1 = empty_errarg, + const errarg &arg2 = empty_errarg, + const errarg &arg3 = empty_errarg); +errarg::errarg() : type(EMPTY) +{ +} +errarg empty_errarg; diff --git a/gcc/testsuite/g++.dg/init/goto1.C b/gcc/testsuite/g++.dg/init/goto1.C new file mode 100644 index 000000000..b0a0c5253 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/goto1.C @@ -0,0 +1,23 @@ +// PR c++/14724 +// { dg-do run } + +int j; + +template <class T> +struct C { + C() { ++j; } + ~C() { --j; } +}; + +int main(int, char **) { + { + int i = 0; + again: + C<int> v; + if (++i < 10) + goto again; + } + + return j; +} + diff --git a/gcc/testsuite/g++.dg/init/goto2.C b/gcc/testsuite/g++.dg/init/goto2.C new file mode 100644 index 000000000..3f4ecc04c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/goto2.C @@ -0,0 +1,11 @@ +// PR c++/20721 + +bool f(); +void g(int i) +{ + if (i) goto bad; // { dg-error "from" } + bool a = f(); // { dg-error "initialization" } + bad: // { dg-error "jump" } + ; +} + diff --git a/gcc/testsuite/g++.dg/init/init-ref1.C b/gcc/testsuite/g++.dg/init/init-ref1.C new file mode 100644 index 000000000..d0170cd18 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/init-ref1.C @@ -0,0 +1,45 @@ +// Submitted by Erik Rozendaal <dlr@acm.org> +// Test case for GNATS bug 787. +// { dg-do run } + +#include <stdio.h> +#include <stdlib.h> + +static int calls; + +int &foo (int &arg) +{ + calls++; + arg=0; + return arg; +} + +int &identity (int &x) +{ + return x; +} + +int main() +{ + int a; + + calls = 0; + int &b = ++foo (a); + if (calls > 1) + abort (); + if (&a != &b) + abort (); + if (a != 1) + abort (); + + calls = 0; + int &c = ++identity (++foo (a)); + if (calls > 1) + abort (); + if (&a != &c) + abort (); + if (a != 2) + abort (); + + exit (0); +} diff --git a/gcc/testsuite/g++.dg/init/init-ref2.C b/gcc/testsuite/g++.dg/init/init-ref2.C new file mode 100644 index 000000000..6d9448a8e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/init-ref2.C @@ -0,0 +1,42 @@ +// Submitted by Jason Merrill <jason_merrill@redhat.com> +// Test for proper handling of local static references. +// { dg-do run } + +int r; + +int c; +int f () +{ + // Test that we only initialize i once. + if (++c > 1) + ++r; + return 42; +} + +const int *p; +void g () +{ + static const int &i = f(); + + // Test that i points to the same place in both calls. + if (p && p != &i) + ++r; + // Test that if so, it points to static data. + if (i != 42) + ++r; + + p = &i; +} + +void h () +{ + int arr[] = { 1, 1, 1, 1, 1, 1, 1 }; + g (); +} + +int main () +{ + g (); + h (); + return r; +} diff --git a/gcc/testsuite/g++.dg/init/init-ref3.C b/gcc/testsuite/g++.dg/init/init-ref3.C new file mode 100644 index 000000000..e858fd74d --- /dev/null +++ b/gcc/testsuite/g++.dg/init/init-ref3.C @@ -0,0 +1,47 @@ +// Origin: Peter Schmid <schmid@snake.iap.physik.tu-darmstadt.de> + +// { dg-do link } + +template <class T> +class Ptr { +protected: + T * ptr; + +public: + + Ptr(void) : ptr(0) { } + Ptr(T * p) : ptr(p) { } + + ~Ptr(void) { delete ptr; } + + operator T & () { return *ptr; } +}; + +class base { +public: + base(void) { } + ~base(void) { } +}; + + +class foo : public base { +private: + foo(const foo & rv); + +public: + + foo(void) { } + ~foo(void) { } +}; + +void func2(base & b) { + // ... +} + +int main () { + Ptr<foo> f = new foo; + /* This should not result in a copy; the result of the conversion + operator should be bound directly to the reference argument to + `func2'. */ + func2(f); +} diff --git a/gcc/testsuite/g++.dg/init/init-ref4.C b/gcc/testsuite/g++.dg/init/init-ref4.C new file mode 100644 index 000000000..7cd6986ce --- /dev/null +++ b/gcc/testsuite/g++.dg/init/init-ref4.C @@ -0,0 +1,21 @@ +// Origin: dgregor@gcc.gnu.org +// PR c++/11384 +// foo<int>::_S_something was not being emitted (as a weak definition). + +// { dg-do run } +// { dg-require-weak "" } + +template<typename T> + struct foo + { + static const T _S_something; + }; + +template<typename T> + const T foo<T>::_S_something = T(); + +int main() +{ + const int* p = &foo<int>::_S_something; + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/inline1.C b/gcc/testsuite/g++.dg/init/inline1.C new file mode 100644 index 000000000..f3e323427 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/inline1.C @@ -0,0 +1,14 @@ +// PR c++/9167 +// { dg-options "-finline" } + +struct A { + ~A(); + A f(A) { } +}; + + +void f(void) +{ + A a; + a.f(a); +} diff --git a/gcc/testsuite/g++.dg/init/member1.C b/gcc/testsuite/g++.dg/init/member1.C new file mode 100644 index 000000000..88f9b3134 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/member1.C @@ -0,0 +1,21 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 13 Jun 2005 <nathan@codesourcery.com> + +// Origin: Ivan Godard <igodard@pacbell.net> +// Bug 20789: ICE on invalid + +template<typename> struct A; + +template<int> struct B {}; + +template<typename T> struct C +{ + static const int i = A<T>::i; // { dg-error "incomplete" } + static const int j = i; + B<j> b; +}; + +C<int> c; + +int i = C<int>::i; +int j = C<int>::j; diff --git a/gcc/testsuite/g++.dg/init/new1.C b/gcc/testsuite/g++.dg/init/new1.C new file mode 100644 index 000000000..5015d819f --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new1.C @@ -0,0 +1,19 @@ +// Origin: asharji@uwaterloo.ca + +// { dg-do compile } + +typedef __SIZE_TYPE__ size_t; + +class bar { + int i; + public : + void * operator new ( size_t , void * storage ); +}; + +class foo { + int storage[ 5 ]; + public: + void mem ( ) { + bar *s = new ( ( void * ) & storage ) bar; + } +}; diff --git a/gcc/testsuite/g++.dg/init/new10.C b/gcc/testsuite/g++.dg/init/new10.C new file mode 100644 index 000000000..e19629bc0 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new10.C @@ -0,0 +1,8 @@ +// PR c++/14452 +// We got confused trying to preevaluate the new-initializer. + +struct S {}; +void foo (bool b) +{ + new S(b ? S() : S()); +} diff --git a/gcc/testsuite/g++.dg/init/new11.C b/gcc/testsuite/g++.dg/init/new11.C new file mode 100644 index 000000000..bf06aa4e7 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new11.C @@ -0,0 +1,21 @@ +// PR c++/17670 +// { dg-do run } + +#include <cstdlib> +#include <new> + +bool abort_new; +void *operator new[](size_t bytes) throw (std::bad_alloc) { + if (abort_new) + abort(); + return operator new (bytes); +} + + +struct X {}; +int main () { + // Do not abort until main is running in case startup code uses + // operator new[]. + abort_new = true; + new (X); +} diff --git a/gcc/testsuite/g++.dg/init/new12.C b/gcc/testsuite/g++.dg/init/new12.C new file mode 100644 index 000000000..ce2acb237 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new12.C @@ -0,0 +1,6 @@ +// PR c++/18369 + +void breakme () +{ + int *v = new (int [5]); +} diff --git a/gcc/testsuite/g++.dg/init/new13.C b/gcc/testsuite/g++.dg/init/new13.C new file mode 100644 index 000000000..2ced6e3fe --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new13.C @@ -0,0 +1,11 @@ +// PR c++/22508 +// ICE on invalid operator new +// Origin: Flash Sheridan <flash@pobox.com> +// { dg-do compile } + +struct A +{ + void* operator new(__SIZE_TYPE__) throw(X); // { dg-error "expected|type" } +}; + +A* p = new A; diff --git a/gcc/testsuite/g++.dg/init/new14.C b/gcc/testsuite/g++.dg/init/new14.C new file mode 100644 index 000000000..5d13da20e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new14.C @@ -0,0 +1,11 @@ +// PR c++/23491 + +struct X +{ + int m; +}; + +void f(int n) +{ + const X *p = new const X[1] () ; +} diff --git a/gcc/testsuite/g++.dg/init/new15.C b/gcc/testsuite/g++.dg/init/new15.C new file mode 100644 index 000000000..b93b43c83 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new15.C @@ -0,0 +1,19 @@ +// PR c++/9782 + +extern "C" void printf(const char*, ...); + +template <int> +struct A { + A() {printf("A::A()\n");} +}; + + +struct B { + B() {printf("B::B()\n");} +}; + + +int main () { + new A<0>[1][1]; + new B [1][1]; +} diff --git a/gcc/testsuite/g++.dg/init/new16.C b/gcc/testsuite/g++.dg/init/new16.C new file mode 100644 index 000000000..c49f13f83 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new16.C @@ -0,0 +1,38 @@ +// { dg-do run } +// { dg-options "-O2 -fstrict-aliasing" } + +// Test that we don't let TBAA reorder an assignment across a +// placement new. +// See PR 29286. + +typedef __SIZE_TYPE__ size_t; + +inline void* operator new(size_t, void* __p) throw() { return __p; } + +void __attribute__((noinline)) bar() {} + +long __attribute__((noinline)) foo(double *p, int n) +{ + long *f; + for (int i=0; i<n; ++i) + { + int *l = (int *)p; + *l = 0; + f = new (p) long; + *f = -1; + } + bar (); + return *f; +} + +extern "C" void abort(void); +int main() +{ + union { + int i; + long l; + } u; + if (foo((double *)&u, 1) != -1) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/new17.C b/gcc/testsuite/g++.dg/init/new17.C new file mode 100644 index 000000000..42b9f077a --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new17.C @@ -0,0 +1,37 @@ +// { dg-do compile } +// { dg-options "-O2 -fstrict-aliasing -fdump-tree-optimized" } + +// Test that placement new does not introduce an unnecessary memory +// barrier. +// See PR 29286. + +typedef __SIZE_TYPE__ size_t; + +inline void* operator new(size_t, void* __p) throw() { return __p; } + +template <class T, int D> +class Vector +{ +public: + Vector() + { + for (int i = 0; i < D; ++i) + new (&x_m[i]) T(); + } + T& operator[](int i) { return x_m[i]; } + +private: + T x_m[D]; +}; + +void foo(Vector<float, 3> *m) +{ + Vector<float, 3> v; + v[0] = 1.0; + v[1] = 2.0; + v[3] = 3.0; + *m = v; +} + +// { dg-final { scan-tree-dump-times "= 0\.0" 1 "optimized" } } +// { dg-final { cleanup-tree-dump "optimized" } } diff --git a/gcc/testsuite/g++.dg/init/new18.C b/gcc/testsuite/g++.dg/init/new18.C new file mode 100644 index 000000000..45f6e7a09 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new18.C @@ -0,0 +1,45 @@ +// { dg-do compile } +// { dg-options "-O2 -fstrict-aliasing" } + +// This caused an ICE during placement new. + +namespace Pooma { + typedef int Context_t; + namespace Arch { + } + inline Context_t context() { + } + inline int contexts() { + } + } +template<class DomT, class T, class NewDom1T> struct DomainTraitsScalar { + }; +template<class T> struct DomainTraits : public DomainTraitsScalar<T, T, T> { + }; +template<int Dim> class Grid; +template<class DT> class DomainBase { + }; +template<int Dim, class DT> class Domain : public DomainBase<DT> { + }; +#include <vector> +template<> class Grid<1> : public Domain<1, DomainTraits<Grid<1> > > { + }; +namespace Pooma { + class PatchSizeSyncer { + typedef Grid<1> Grid_t; + PatchSizeSyncer(int contextKey, Grid_t &localGrid); + int myContext_m; + int numContexts_m; + int localKey_m; + Grid_t localGrid_m; + typedef std::pair<int,Grid_t *> Elem_t; + std::vector<Elem_t> gridList_m; + }; + } +namespace Pooma { + PatchSizeSyncer::PatchSizeSyncer(int contextKey, Grid_t &localGrid) : +myContext_m(Pooma::context()), numContexts_m(Pooma::contexts()), +localKey_m(contextKey), localGrid_m(localGrid) { + if (myContext_m == 0) gridList_m.reserve(numContexts_m); + } + } diff --git a/gcc/testsuite/g++.dg/init/new19.C b/gcc/testsuite/g++.dg/init/new19.C new file mode 100644 index 000000000..a25be7da7 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new19.C @@ -0,0 +1,73 @@ +// { dg-do compile } +// { dg-options "-O2 -fstrict-aliasing -fdump-tree-pre-details" } + +// Make sure we hoist invariants out of the loop even in the presence +// of placement new. This is similar to code in tramp3d. + +typedef __SIZE_TYPE__ size_t; + +inline void* operator new(size_t, void* __p) throw() { return __p; } + +template <class T, int D> +class Vector +{ +public: + Vector() + { + for (int i = 0; i < D; ++i) + new (&x_m[i]) T(); + } + T& operator[](int i) { return x_m[i]; } + +private: + T x_m[D]; +}; + +struct sia +{ + int ai[3]; +}; + +struct s +{ + struct si + { + sia* p; + } asi[3]; + float* pd; +}; + +class c +{ + int foo(int, int, int); + s sm; +}; + + +extern void bar(Vector<float, 3>*, int); +int c::foo(int f1, int f2, int f3) +{ + float sum = 0; + for (int i = 0; i < 3; ++i) + { + for (int j = 0; j < 3; ++j) + { + Vector<float, 3> v; + v[0] = 1.0; + v[1] = 2.0; + v[2] = 3.0; + for (int k = 0; k < 3; ++k) + { + float f = (f1 * this->sm.asi[0].p->ai[0] + + f2 * this->sm.asi[1].p->ai[0] + + f3 * this->sm.asi[2].p->ai[0]); + sum += f * v[k]; + } + *this->sm.pd = sum; + } + } + return sum; +} + +// { dg-final { scan-tree-dump "Replaced.*->ai\\\[0\\\]" "pre" } } +// { dg-final { cleanup-tree-dump "pre" } } diff --git a/gcc/testsuite/g++.dg/init/new2.C b/gcc/testsuite/g++.dg/init/new2.C new file mode 100644 index 000000000..8b207d0a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new2.C @@ -0,0 +1,17 @@ +// Origin: asharji@uwaterloo.ca + +// { dg-do compile } + +class bar { + public : + bar() { } + void * operator new ( __SIZE_TYPE__ , void * storage ) + { return (void *)1;} +}; + +class foo { + public: + void mem ( ) { + new ( 0 ) bar; + } +}; diff --git a/gcc/testsuite/g++.dg/init/new20.C b/gcc/testsuite/g++.dg/init/new20.C new file mode 100644 index 000000000..705c1be48 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new20.C @@ -0,0 +1,6 @@ +// PR c++/31743
+typedef int A[];
+A* p = new A; // { dg-error "invalid use of array with unspecified bounds" }
+A* q = new (A); // { dg-error "invalid use of array with unspecified bounds" }
+
+
diff --git a/gcc/testsuite/g++.dg/init/new21.C b/gcc/testsuite/g++.dg/init/new21.C new file mode 100644 index 000000000..5797ea981 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new21.C @@ -0,0 +1,10 @@ +// PR c++/32251 + +struct A { + A(); + void operator delete(void *, ...); +}; + +void foo () { + new A; // { dg-warning "deallocation" } +} diff --git a/gcc/testsuite/g++.dg/init/new22.C b/gcc/testsuite/g++.dg/init/new22.C new file mode 100644 index 000000000..2ce51ff28 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new22.C @@ -0,0 +1,3 @@ +// PR c++/29001 + +void* operator new (__SIZE_TYPE__) { return; } // { dg-error "with no value" } diff --git a/gcc/testsuite/g++.dg/init/new23.C b/gcc/testsuite/g++.dg/init/new23.C new file mode 100644 index 000000000..cedd898b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new23.C @@ -0,0 +1,20 @@ +// PR c++/33025 +// { dg-do run } +// { dg-options "-O2" } + +typedef __SIZE_TYPE__ size_t; +inline void *operator new (size_t, void *p) throw () { return p; } +extern "C" void abort (); + +int +main() +{ + const unsigned num = 10; + unsigned *data = new unsigned[2 * num]; + unsigned *ptr = data; + for (unsigned i = 0; i < 2 * num; ++i) + (i % 2 == 0) ? new (ptr) unsigned (2) : new (ptr++) unsigned (1); + if (ptr - data != num) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/new24.C b/gcc/testsuite/g++.dg/init/new24.C new file mode 100644 index 000000000..6f5613be7 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new24.C @@ -0,0 +1,18 @@ +// PR c++/33025 +// { dg-do compile } +// { dg-options "-O2" } + +typedef __SIZE_TYPE__ size_t; +inline void *operator new (size_t, void *p) throw () { return p; } +extern "C" void abort (); + +int +main() +{ + const unsigned num = 10; + unsigned *data = new unsigned[num]; + unsigned *ptr = new (data) unsigned (num); + static unsigned data2[10]; + unsigned *ptr2 = new (&data2[0]) unsigned (10); + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/new25.C b/gcc/testsuite/g++.dg/init/new25.C new file mode 100644 index 000000000..2d447f8f2 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new25.C @@ -0,0 +1,29 @@ +// PR c++/31988 +#include <new> + +class C +{ +public: + void* operator new(std::size_t = 32) throw (std::bad_alloc); // { dg-error "first parameter" } + void* operator new[](std::size_t = 32) throw (std::bad_alloc); // { dg-error "first parameter" } + void* operator new(std::size_t = 32, const std::nothrow_t&) throw(); // { dg-error "first parameter" } + void* operator new[](std::size_t = 32, const std::nothrow_t&) throw(); // { dg-error "first parameter" } +}; + +class D +{ +public: + void* operator new(std::size_t, + const std::nothrow_t& = std::nothrow_t()) throw(); + void* operator new[](std::size_t, + const std::nothrow_t& = std::nothrow_t()) throw(); +}; + +class E +{ +public: + void* operator new(std::size_t = 0, + const std::nothrow_t& = std::nothrow_t()) throw(); // { dg-error "first parameter" } + void* operator new[](std::size_t = 0, + const std::nothrow_t& = std::nothrow_t()) throw(); // { dg-error "first parameter" } +}; diff --git a/gcc/testsuite/g++.dg/init/new26.C b/gcc/testsuite/g++.dg/init/new26.C new file mode 100644 index 000000000..541de3058 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new26.C @@ -0,0 +1,44 @@ +// PR c++/33407 +// { dg-do run } +// { dg-options "-O2 -fstrict-aliasing" } + +extern "C" void * malloc(__SIZE_TYPE__); +extern "C" void abort(void); + +void *p; +void __attribute__((noinline)) init(void) +{ + p = malloc(4); +} + +inline void *operator new(__SIZE_TYPE__) +{ + return p; +} + +inline void operator delete (void*) {} + +int * __attribute__((noinline)) doit(int n) +{ + float *q; + int *r; + + for (int i=0; i<n; ++i) + { + q = new float; + *q = 1.0; + delete q; + r = new int; + *r = 1; + } + + return r; +} + +int main() +{ + init(); + if (*doit(1) != 1) + abort(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/new27.C b/gcc/testsuite/g++.dg/init/new27.C new file mode 100644 index 000000000..a6271c930 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new27.C @@ -0,0 +1,40 @@ +// PR c++/34862 +// { dg-do run } +// { dg-options "-O2" } + +typedef __SIZE_TYPE__ size_t; +extern "C" void abort (); + +struct T +{ + void *operator new (size_t, char *&); + T () { i[0] = 1; i[1] = 2; } + int i[2]; +}; + +void * +T::operator new (size_t size, char *&p) +{ + void *o = (void *) p; + p += size; + return o; +} + +T * +f (char *&x) +{ + return new (x) T (); +} + +char buf[10 * sizeof (T)] __attribute__((aligned (__alignof (T)))); + +int +main () +{ + char *p = buf; + T *t = f (p); + if (p != buf + sizeof (T)) + abort (); + if (t->i[0] != 1 || t->i[1] != 2) + abort (); +} diff --git a/gcc/testsuite/g++.dg/init/new28.C b/gcc/testsuite/g++.dg/init/new28.C new file mode 100644 index 000000000..41a78be2a --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new28.C @@ -0,0 +1,27 @@ +// PR c++/43951 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort (); + +class Foo +{ +public: + Foo () : xxx (1) {}; + const int xxx; +}; +Foo * +bar () +{ + return new Foo; +} + +int +main () +{ + Foo *p = bar (); + + if (p->xxx != 1) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/new29.C b/gcc/testsuite/g++.dg/init/new29.C new file mode 100644 index 000000000..1ca8ca06a --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new29.C @@ -0,0 +1,33 @@ +// PR c++/43951 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort (); + +class Foo +{ +public: + Foo () : xxx (1) {}; + const int xxx; +}; + +struct Foo2 +{ + Foo foo; +}; + +Foo2 * +bar () +{ + return new Foo2; +} + +int +main () +{ + Foo2 *p = bar (); + + if (p->foo.xxx != 1) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/new3.C b/gcc/testsuite/g++.dg/init/new3.C new file mode 100644 index 000000000..d0eab73cf --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new3.C @@ -0,0 +1,8 @@ +// Test that new-expressions at file scope work properly. + +struct A { static char* p; }; + +int i = 1; +char* A::p = new char[i]; + +void foo() {} diff --git a/gcc/testsuite/g++.dg/init/new30.C b/gcc/testsuite/g++.dg/init/new30.C new file mode 100644 index 000000000..24582d8fb --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new30.C @@ -0,0 +1,15 @@ +// PR c++/40975 + +struct data_type +{ + // constructor required to reproduce compiler bug + data_type() {} +}; + +struct ptr_type +{ + // array new as default argument required to reproduce compiler bug + ptr_type (data_type* ptr = new data_type[1]) { delete[] ptr; } +}; + +ptr_type obj; diff --git a/gcc/testsuite/g++.dg/init/new32.C b/gcc/testsuite/g++.dg/init/new32.C new file mode 100644 index 000000000..f82785749 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new32.C @@ -0,0 +1,16 @@ +// PR c++/48873 + +#include <new> + +struct D { +private: + ~D(); +}; + +template<class T> +T& create(); + +void f() +{ + D* dp = new (((void*) 0)) D(create<D>()); // # +} diff --git a/gcc/testsuite/g++.dg/init/new4.C b/gcc/testsuite/g++.dg/init/new4.C new file mode 100644 index 000000000..ab2fe3131 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new4.C @@ -0,0 +1 @@ +int *x = new int [2] (); diff --git a/gcc/testsuite/g++.dg/init/new5.C b/gcc/testsuite/g++.dg/init/new5.C new file mode 100644 index 000000000..0d99f93c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new5.C @@ -0,0 +1,18 @@ +// { dg-do run } + +#include <new> + +void * operator new[](std::size_t, std::nothrow_t const &) throw() +{ return 0; } + +struct X { + struct Inner { ~Inner() {} }; + + X() { + Inner * ic = new (std::nothrow) Inner[1]; // SegFault here + } +}; + +int main() { + X table; +} diff --git a/gcc/testsuite/g++.dg/init/new6.C b/gcc/testsuite/g++.dg/init/new6.C new file mode 100644 index 000000000..ecbafd13e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new6.C @@ -0,0 +1,8 @@ +// { dg-options "-fkeep-inline-functions" } + +struct B1 { virtual ~B1(); }; +struct B2 { virtual ~B2(); }; +struct D : B1, B2 {}; +struct X : D { X (); }; + +X::X () { new int; } diff --git a/gcc/testsuite/g++.dg/init/new7.C b/gcc/testsuite/g++.dg/init/new7.C new file mode 100644 index 000000000..e07d22617 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new7.C @@ -0,0 +1,7 @@ +template <class T> + struct Foo + {}; + + template <class T> + void Foo<T>::NON_EXISTENT(int* val = new int()) {} // { dg-error "" } + diff --git a/gcc/testsuite/g++.dg/init/new8.C b/gcc/testsuite/g++.dg/init/new8.C new file mode 100644 index 000000000..1fefc366b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new8.C @@ -0,0 +1,17 @@ +typedef __SIZE_TYPE__ size_t; + +enum Refcount_Type { + NO_REFCOUNT +}; + +struct d0_Unknown_Object +{ + void* operator new (size_t, size_t, Refcount_Type type); + void operator delete (void*, size_t, Refcount_Type); + d0_Unknown_Object (); +}; + +void make () +{ + new (10, NO_REFCOUNT) d0_Unknown_Object; +} diff --git a/gcc/testsuite/g++.dg/init/new9.C b/gcc/testsuite/g++.dg/init/new9.C new file mode 100644 index 000000000..6729d76fd --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new9.C @@ -0,0 +1,22 @@ +// PR 12337 + +class A {}; + +template <typename T> +class X : public A { +public: + X(T&); +}; + +class B { +public: + bool foo(A*); + template <typename T> + bool foo(T& t) { return foo(new X<T>(t)); } +}; + +int main() +{ + B x, y; + x.foo(y); +} diff --git a/gcc/testsuite/g++.dg/init/null1.C b/gcc/testsuite/g++.dg/init/null1.C new file mode 100644 index 000000000..eff3f6109 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/null1.C @@ -0,0 +1,6 @@ +// PR c++/16489 + +const int NULL = 0; +int main() { + double* p = NULL; +} diff --git a/gcc/testsuite/g++.dg/init/placement1.C b/gcc/testsuite/g++.dg/init/placement1.C new file mode 100644 index 000000000..382fae8ed --- /dev/null +++ b/gcc/testsuite/g++.dg/init/placement1.C @@ -0,0 +1,10 @@ +// PR c++/11266 +// We were expanding the same TARGET_EXPR twice, for placement new and +// delete. + +void* operator new (__SIZE_TYPE__, void*) throw(); +void operator delete (void*, void*) throw(); + +struct A { A(); }; + +void foo() { new(new A)A; } diff --git a/gcc/testsuite/g++.dg/init/placement2.C b/gcc/testsuite/g++.dg/init/placement2.C new file mode 100644 index 000000000..7a9d6d082 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/placement2.C @@ -0,0 +1,22 @@ +// Bug: We were calling f() twice, for both the placement new and placement +// delete calls. + +// { dg-do run } + +void* operator new (__SIZE_TYPE__ sz, void*) { return operator new (sz); } +void operator delete (void* p, void*) { operator delete (p); } + +struct A { A() { throw 1; } }; + +int c; +void *f() { ++c; return 0; } + +int main() +{ + try + { + new (f()) A; + } + catch (...) {} + return c != 1; +} diff --git a/gcc/testsuite/g++.dg/init/placement3.C b/gcc/testsuite/g++.dg/init/placement3.C new file mode 100644 index 000000000..919e2a816 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/placement3.C @@ -0,0 +1,30 @@ +typedef __SIZE_TYPE__ size_t; +extern "C" void *malloc (size_t); + +int i; + +struct S { + S(int) { + throw 3; + } + + void *operator new(size_t s, int) { + ++i; + return malloc (s); + } + + void operator delete(void *, int) { + --i; + } + + void operator delete(void *, int, int) ; +}; + +int main () { + try { + new (7) S (12); + } catch (int) { + if (i) + return 1; + } +} diff --git a/gcc/testsuite/g++.dg/init/placement4.C b/gcc/testsuite/g++.dg/init/placement4.C new file mode 100644 index 000000000..9c61eca2b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/placement4.C @@ -0,0 +1,32 @@ +// PR c++/34158 + +typedef __SIZE_TYPE__ size_t; +extern "C" void* malloc (size_t); +extern "C" void free (void *); + +template <class T> class undef; + +struct A { + A() { throw 1; } +}; + +template<typename T> class Pool { }; + +void *operator new(size_t size,Pool<int>& pool) +{ + return malloc(size); +} + +template<typename T> +void operator delete(void *p,Pool<T>& pool) +{ + undef<T> t; // { dg-error "incomplete" } + free(p); +} + +int main () +{ + Pool<int> pool; + new (pool) A(); // { dg-message "instantiated" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/placement5.C b/gcc/testsuite/g++.dg/init/placement5.C new file mode 100644 index 000000000..1d540daca --- /dev/null +++ b/gcc/testsuite/g++.dg/init/placement5.C @@ -0,0 +1,32 @@ +// 5.3.4/19: If the lookup finds the two-parameter form of a usual +// deallocation function (3.7.4.2) and that function, considered as a +// placement deallocation function, would have been selected as a match for +// the allocation function, the program is ill-formed. + +// But we should only complain about using op delete (void *, size_t) for +// placement delete if it would also be selected for normal delete, not if +// there's also an op delete (void *). + +typedef __SIZE_TYPE__ size_t; + +struct A +{ + A(); + void* operator new (size_t, size_t); + void operator delete (void *, size_t); // { dg-error "non-placement" } +}; + +struct B +{ + B(); + void * operator new (size_t); + void * operator new (size_t, size_t); + void operator delete (void *); + void operator delete (void *, size_t); +}; + +int main() +{ + A* ap = new (24) A; // { dg-error "placement delete" } + B* bp = new (24) B; +} diff --git a/gcc/testsuite/g++.dg/init/pm1.C b/gcc/testsuite/g++.dg/init/pm1.C new file mode 100644 index 000000000..c0aed2410 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pm1.C @@ -0,0 +1,88 @@ +// { dg-do run } + +// Copyright 2002 Free Software Foundation +// Contributed by Jason Merrill and Alexandre Oliva + +// Test zero-initialization of pointers to data members. Their NULL +// value is represented with -1, not 0. + +#include <stdlib.h> + +struct A +{ + int i; +}; + +int A::* gp; + +typedef int A::* iApm; + +iApm gp_zero = 0; +iApm gp_dflt = iApm(); +iApm gp_cast = (iApm)0; +iApm gp_func = iApm(0); +iApm gp_stat = static_cast<iApm>(0); + +struct AD : A {}; + +int AD::* gp_impl = gp_dflt; +int AD::* gp_down = static_cast<int AD::*>(gp_stat); + +int A::* ga[2]; + +// Test use in a simple struct. +struct B +{ + int A::* mp; +}; + +B gb; + +struct D; +struct C; +extern D gd; +extern C gc; + +// Test that in a class with a constructor, the pointer to member is +// zero-initialized until the constructor is run. +struct C +{ + int A::* mp; + inline C (); +}; + +int fail; +struct D +{ + int count; + inline D (); +}; + +C::C() : mp (&A::i) { gd.count++; } + +D::D() : count (0) +{ + if (gc.mp != 0) + abort (); +} + +// The D must come first for this to work. +D gd; +C gc; + +int main() +{ + static int A::* slp; + static int A::* sla[2]; + static B slb; + + if (gp != 0 || slp != 0 + || gp_zero != 0 || gp_dflt != 0 || gp_cast != 0 + || gp_func != 0 || gp_stat != 0 + || gp_impl != 0 || gp_down != 0) + abort (); + if (ga[1] != 0 || sla[1] != 0) + abort (); + if (gb.mp != 0 || slb.mp != 0) + abort (); +} diff --git a/gcc/testsuite/g++.dg/init/pm2.C b/gcc/testsuite/g++.dg/init/pm2.C new file mode 100644 index 000000000..35b9b32fe --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pm2.C @@ -0,0 +1,7 @@ +struct S { + S (); + int S::* sp; + int i; +}; + +S s[2] = {}; diff --git a/gcc/testsuite/g++.dg/init/pm3.C b/gcc/testsuite/g++.dg/init/pm3.C new file mode 100644 index 000000000..980790db3 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pm3.C @@ -0,0 +1,10 @@ +// PR c++/12218 +// { dg-do run } + +struct C { int i, j; }; +typedef int C::*mPtr; +extern const mPtr should_be_0 = &C::i; +extern const mPtr should_be_4 = &C::j; + +int main () { +} diff --git a/gcc/testsuite/g++.dg/init/pmf1.C b/gcc/testsuite/g++.dg/init/pmf1.C new file mode 100644 index 000000000..93c67bdd7 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pmf1.C @@ -0,0 +1,17 @@ +// PR c++/14089 +// { dg-do compile } +// +// C++ front end generated assignment between types that were not +// compatible in any sense visible to the optimizers. + +struct pair { + typedef void (pair::*fp)(); + int first; + pair::fp second; + pair(const int& a, const pair::fp& b) : first(a), second(b) {} + void f(const int& a, const pair::fp& b) { first = a; second = b; } +}; + +void op() { + pair(5, pair::fp()); +} diff --git a/gcc/testsuite/g++.dg/init/pr25811-2.C b/gcc/testsuite/g++.dg/init/pr25811-2.C new file mode 100644 index 000000000..3a36dd49c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr25811-2.C @@ -0,0 +1,26 @@ +// { dg-do compile } +// { dg-options -fpermissive } + +struct A +{ + int const i; // { dg-message "should be initialized" } +}; + +struct B +{ + int& r; // { dg-message "should be initialized" } +}; + +struct C +{ + int const i : 1; // { dg-message "should be initialized" } +}; + +void f() +{ + new A; // { dg-warning "uninitialized" } + new B; // { dg-warning "uninitialized" } + new C; // { dg-warning "uninitialized" } + C c; // { dg-warning "uninitialized" } + A a[1]; // { dg-warning "uninitialized" } +} diff --git a/gcc/testsuite/g++.dg/init/pr25811-3.C b/gcc/testsuite/g++.dg/init/pr25811-3.C new file mode 100644 index 000000000..631da5b4c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr25811-3.C @@ -0,0 +1,38 @@ +// { dg-do compile } + +struct A { int const i; }; +struct B { int& i; }; +struct C { int i; }; + +template< class T > +class is_constructible_via_new_without_initializer +{ + template<int> class size {}; + + typedef char yes_type; + struct no_type { char data[2]; }; + + template <class U> + static yes_type sfinae (size< sizeof (new U) >*); + + template <class U> + static no_type sfinae (...); + +public: + static const bool value = sizeof (sfinae<T>(0)) == sizeof (yes_type); +}; + +#define JOIN( X, Y ) DO_JOIN( X, Y ) +#define DO_JOIN( X, Y ) DO_JOIN2(X,Y) +#define DO_JOIN2( X, Y ) X##Y + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr) +#else +# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1] +#endif + +STATIC_ASSERT (!is_constructible_via_new_without_initializer<A>::value); +STATIC_ASSERT (!is_constructible_via_new_without_initializer<B>::value); +STATIC_ASSERT (is_constructible_via_new_without_initializer<C>::value); + diff --git a/gcc/testsuite/g++.dg/init/pr25811-4.C b/gcc/testsuite/g++.dg/init/pr25811-4.C new file mode 100644 index 000000000..abfb3d9f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr25811-4.C @@ -0,0 +1,38 @@ +// { dg-do compile } +// { dg-options "-fpermissive" } + +struct A { int const i; }; +struct B { int& i; }; +struct C { int i; }; + +template< class T > +class is_constructible_via_new_without_initializer +{ + template<int> class size {}; + + typedef char yes_type; + struct no_type { char data[2]; }; + + template <class U> + static yes_type sfinae (size< sizeof (new U) >*); + + template <class U> + static no_type sfinae (...); + +public: + static const bool value = sizeof (sfinae<T>(0)) == sizeof (yes_type); +}; + +#define JOIN( X, Y ) DO_JOIN( X, Y ) +#define DO_JOIN( X, Y ) DO_JOIN2(X,Y) +#define DO_JOIN2( X, Y ) X##Y + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr) +#else +# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1] +#endif + +STATIC_ASSERT (!is_constructible_via_new_without_initializer<A>::value); +STATIC_ASSERT (!is_constructible_via_new_without_initializer<B>::value); +STATIC_ASSERT (is_constructible_via_new_without_initializer<C>::value); diff --git a/gcc/testsuite/g++.dg/init/pr25811.C b/gcc/testsuite/g++.dg/init/pr25811.C new file mode 100644 index 000000000..c906a9bbd --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr25811.C @@ -0,0 +1,195 @@ +// PR c++/25811 +// { dg-do compile } + +struct A1 +{ + int const j; // { dg-message "should be initialized" } +}; + +struct A2 +{ + int const volatile i; // { dg-message "should be initialized" } +}; + +struct A3 +{ + int& ref; // { dg-message "should be initialized" } +}; + +struct A4 +{ + int const& ref; // { dg-message "should be initialized" } +}; + +struct A5 +{ + int& ref; // { dg-message "should be initialized" } + int const i; // { dg-message "should be initialized" } +}; + +template <class T> struct S1 +{ + T const i; // { dg-message "should be initialized" } +}; + +template <class T> struct S2 +{ + T const volatile i; // { dg-message "should be initialized" } +}; + +template <class T> struct S3 +{ + T& ref; // { dg-message "should be initialized" } +}; + +template <class T> struct S4 +{ + T const i; // { dg-message "should be initialized" } + T& ref; // { dg-message "should be initialized" } +}; + +struct X +{ + X () : c (0), r (c) {} + int const c; + int const& r; +}; + +struct Y11 +{ + int const i; // { dg-message "should be initialized" } +}; + +struct Y1 +{ + Y11 a[1]; +}; + +struct Y22 +{ + int& ref; // { dg-message "should be initialized" } +}; + +struct Y2 +{ + Y22 a[1]; +}; + +struct Z1 +{ + int const i; // { dg-message "should be initialized" } +}; + +struct Z2 +{ + int& ref; // { dg-message "should be initialized" } +}; + +struct Z3 +{ + int const i; // { dg-message "should be initialized" } +}; + +struct Z4 +{ + int& ref; // { dg-message "should be initialized" } +}; + +struct Z5 +{ + int i; +}; + +struct Z +{ + Z1 z1; + Z2 z2; + Z3 z3; + Z4 z4; + Z5 z5; +}; + +union U +{ + int const i; // { dg-message "should be initialized" } +}; + +void f1 () +{ + new A1; // { dg-error "uninitialized const member" } +} + +void f2 () +{ + new A2; // { dg-error "uninitialized const member" } +} + +void f3 () +{ + new A3; // { dg-error "uninitialized reference member" } +} + +void f4 () +{ + new A4; // { dg-error "uninitialized reference member" } +} + +void f5 () +{ + new A5; // { dg-error "uninitialized reference member|uninitialized const member" } +} + +void f6 () +{ + new S1<int>; // { dg-error "uninitialized const member" } +} + +void f7 () +{ + new S2<int>; // { dg-error "uninitialized const member" } +} + +void f8 () +{ + new S3<int>; // { dg-error "uninitialized reference member" } +} + +void f9 () +{ + new S4<int>; // { dg-error "uninitialized reference member|uninitialized const member" } +} + +void f10 () +{ + new X; +} + +void f11 () +{ + new A1[1]; // { dg-error "uninitialized const member" } +} + +void f12 () +{ + new A3[1]; // { dg-error "uninitialized reference member" } +} + +void f13 () +{ + new Y1; // { dg-error "uninitialized const member" } +} + +void f14 () +{ + new Y2; // { dg-error "uninitialized reference member" } +} + +void f15 () +{ + new Z; // { dg-error "uninitialized reference member|uninitialized const member" } +} + +void f16 () +{ + new U; // { dg-error "uninitialized const member" } +} diff --git a/gcc/testsuite/g++.dg/init/pr29043.C b/gcc/testsuite/g++.dg/init/pr29043.C new file mode 100644 index 000000000..6ed31b5d6 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr29043.C @@ -0,0 +1,52 @@ +// PR c++/29043 +// { dg-do compile } + +struct S +{ + int const i; // { dg-message "should be initialized" } +}; + +class C +{ +public: + C() {} // { dg-error "uninitialized const member" } + S s; +}; + +struct S2 +{ + int& ref; // { dg-message "should be initialized" } +}; + +class C2 +{ +public: + C2() {} // { dg-error "uninitialized reference member" } + S2 s; +}; + +class C3 +{ + C3() { } + struct s { + const int i; + }; +}; + +struct S4 +{ + int const i; // { dg-message "should be initialized" } +}; + +struct C4 +{ + C4() {} // { dg-error "uninitialized const member" } + S4 s4[ 1 ]; +}; + +struct C5 +{ + C5() {} // { dg-message "uninitialized" } + int const iit[ 1 ]; +}; + diff --git a/gcc/testsuite/g++.dg/init/pr29571.C b/gcc/testsuite/g++.dg/init/pr29571.C new file mode 100644 index 000000000..9e8e6093e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr29571.C @@ -0,0 +1,8 @@ +// PR c++/29571 + +struct A +{ + static const int i = 0/0 + ""; // { dg-warning "division by zero" } + // { dg-error "field initializer is not constant" "" { target *-*-* } 5 } + static const int j = int(i); +}; diff --git a/gcc/testsuite/g++.dg/init/pr42556.C b/gcc/testsuite/g++.dg/init/pr42556.C new file mode 100644 index 000000000..27370af79 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr42556.C @@ -0,0 +1,10 @@ +// { dg-do compile } +// { dg-options "-fdump-tree-gimple" } + +void foo (int a, int b, int c, int d) +{ + int v[4] = {a, b, c, d}; +} + +// { dg-final { scan-tree-dump-not "v = {}" "gimple" } } +// { dg-final { cleanup-tree-dump "gimple" } } diff --git a/gcc/testsuite/g++.dg/init/pr42844.C b/gcc/testsuite/g++.dg/init/pr42844.C new file mode 100644 index 000000000..299a30a91 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr42844.C @@ -0,0 +1,56 @@ +// PR c++/42844 +// { dg-do compile } + +struct A +{ + A(){} +}; + +struct B : A { int i; }; // { dg-message "user-provided default constructor" } + +struct C : A { int i; }; // { dg-message "user-provided default constructor" } + +struct D : B { D() {} }; + +struct E { int i; }; // { dg-message "user-provided default constructor" } + +template <class T> +struct F : A { T t; }; // { dg-message "user-provided default constructor" } + +template <class T> +struct G { T t; }; // { dg-message "user-provided default constructor" } + +void f () +{ + B const b; // { dg-error "uninitialized const" } + extern B const bext; + + C const c[ 1 ]; // { dg-error "uninitialized const" } + extern C const cext[ 1 ]; + + D const d; + extern D const dext; + + E const e; // { dg-error "uninitialized const" } + extern E const eext; + + F<int> const f; // { dg-error "uninitialized const" } + extern F<int> const fext; + + G<int> const g; // { dg-error "uninitialized const" } + extern G<int> const gext; +} + +struct H { int i; }; // { dg-message "user-provided default constructor" } + +struct I : A { int i; }; // { dg-message "user-provided default constructor" } + +template <class T> +void g () +{ + T const t; // { dg-error "uninitialized const" } + extern T const text; +} + +template void g<H> (); +template void g<I> (); diff --git a/gcc/testsuite/g++.dg/init/pr43719.C b/gcc/testsuite/g++.dg/init/pr43719.C new file mode 100644 index 000000000..d3487c94a --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr43719.C @@ -0,0 +1,197 @@ +// PR c++/43719 +// { dg-do compile } + +struct A1 +{ + int const j; // { dg-message "should be initialized" } +}; + +struct A2 +{ + int const volatile i; // { dg-message "should be initialized" } +}; + +struct A3 +{ + int& ref; // { dg-message "should be initialized" } +}; + +struct A4 +{ + int const& ref; // { dg-message "should be initialized" } +}; + +struct A5 +{ + int& ref; // { dg-message "should be initialized" } + int const i; // { dg-message "should be initialized" } +}; + +template <class T> struct S1 +{ + T const i; // { dg-message "should be initialized" } +}; + +template <class T> struct S2 +{ + T const volatile i; // { dg-message "should be initialized" } +}; + +template <class T> struct S3 +{ + T& ref; // { dg-message "should be initialized" } +}; + +template <class T> struct S4 +{ + T const i; // { dg-message "should be initialized" } + T& ref; // { dg-message "should be initialized" } +}; + +struct X +{ + X () : c (0), r (c) {} + int const c; + int const& r; +}; + +struct Y11 +{ + int const i; // { dg-message "should be initialized" } +}; + +struct Y1 +{ + Y11 a[1]; +}; + +struct Y22 +{ + int& ref; // { dg-message "should be initialized" } +}; + +struct Y2 +{ + Y22 a[1]; +}; + +struct Z1 +{ + int const i; // { dg-message "should be initialized" } +}; + +struct Z2 +{ + int& ref; // { dg-message "should be initialized" } +}; + +struct Z3 +{ + int const i; // { dg-message "should be initialized" } +}; + +struct Z4 +{ + int& ref; // { dg-message "should be initialized" } +}; + +struct Z5 +{ + int i; +}; + +struct Z +{ + Z1 z1; + Z2 z2; + Z3 z3; + Z4 z4; + Z5 z5; +}; + +union U +{ + int const i; // { dg-message "should be initialized" } +}; + + +void f1 () +{ + A1 a1; // { dg-error "uninitialized const member" } +} + +void f2 () +{ + A2 a2; // { dg-error "uninitialized const member" } +} + +void f3 () +{ + A3 a3; // { dg-error "uninitialized reference member" } +} + +void f4 () +{ + A4 a4; // { dg-error "uninitialized reference member" } +} + +void f5 () +{ + A5 a5; // { dg-error "uninitialized reference member|uninitialized const member" } +} + +void f6 () +{ + S1<int> s; // { dg-error "uninitialized const member" } +} + +void f7 () +{ + S2<int> s; // { dg-error "uninitialized const member" } +} + +void f8 () +{ + S3<int> s; // { dg-error "uninitialized reference member" } +} + +void f9 () +{ + S4<int> s; // { dg-error "uninitialized reference member|uninitialized const member" } +} + +void f10 () +{ + X x; +} + +void f11 () +{ + A1 a[ 1 ]; // { dg-error "uninitialized const member" } +} + +void f12 () +{ + A3 a[ 1 ]; // { dg-error "uninitialized reference member" } +} + +void f13 () +{ + Y1 y1; // { dg-error "uninitialized const member" } +} + +void f14 () +{ + Y2 y2; // { dg-error "uninitialized reference member" } +} + +void f15 () +{ + Z z; // { dg-error "uninitialized reference member|uninitialized const member" } +} + +void f16 () +{ + U u; // { dg-error "uninitialized const member" } +} + diff --git a/gcc/testsuite/g++.dg/init/pr43890.C b/gcc/testsuite/g++.dg/init/pr43890.C new file mode 100644 index 000000000..1b2807d0d --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr43890.C @@ -0,0 +1,39 @@ +// PR c++/43890 +// { dg-do compile } + +class Outer +{ + public: + Outer() + : i(*this) + { + } + + class Inner + { + public: + Inner(Outer& o) + : o(o) + , i(0) + { + } + + private: + Outer& o; + int const i; + }; + + private: + Inner i; +}; + +class A { + Outer o; +}; + +int main() +{ + A *a = new A; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/pr44086.C b/gcc/testsuite/g++.dg/init/pr44086.C new file mode 100644 index 000000000..e3304f4a2 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr44086.C @@ -0,0 +1,15 @@ +// PR c++/44086 +// { dg-do compile } + +struct A +{ + int const i : 2; // { dg-message "should be initialized" } +}; + +void f() +{ + A a; // { dg-error "uninitialized const" } + new A; // { dg-error "uninitialized const" } + A(); + new A(); +} diff --git a/gcc/testsuite/g++.dg/init/pr48859.C b/gcc/testsuite/g++.dg/init/pr48859.C new file mode 100644 index 000000000..8ef5c2ee4 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr48859.C @@ -0,0 +1,14 @@ +// PR c++/48859 +// { dg-do compile } + +struct HasConstructor { + HasConstructor() {} +}; + +class ConstMember { + const HasConstructor empty_; +}; + +void foo() { + new ConstMember; +} diff --git a/gcc/testsuite/g++.dg/init/ptrfn1.C b/gcc/testsuite/g++.dg/init/ptrfn1.C new file mode 100644 index 000000000..0cbabbf80 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ptrfn1.C @@ -0,0 +1,12 @@ +// PR c++/29016 +// { dg-options "-O2" } + +class A; +class B +{ + typedef void (*C[5]) (A *); + static C D; + static void E (A*) {} +}; +B::C B::D={E}; + diff --git a/gcc/testsuite/g++.dg/init/ptrfn2.C b/gcc/testsuite/g++.dg/init/ptrfn2.C new file mode 100644 index 000000000..0ca922b9c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ptrfn2.C @@ -0,0 +1,14 @@ +// { dg-options "" } +// { dg-do compile } +// C++/30221 +// We would ICE while trying to reshape the pointer to +// member function element which is not needed. + + +class abstract {}; +typedef void (abstract::*fptr1) (short & s ) const; +struct s {}; +s array[] = +{ + (fptr1)0 +};// { dg-error "" } diff --git a/gcc/testsuite/g++.dg/init/ptrfn3.C b/gcc/testsuite/g++.dg/init/ptrfn3.C new file mode 100644 index 000000000..960085063 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ptrfn3.C @@ -0,0 +1,14 @@ +// { dg-options "" } +// { dg-do compile } +// C++/30221 +// We would ICE while trying to reshape the pointer to +// member function element which is not needed. + + +class abstract {}; +typedef void (abstract::*fptr1) (short & s ) const; +struct s {fptr1 f;}; +s array[] = +{ + (fptr1)0 +}; diff --git a/gcc/testsuite/g++.dg/init/ptrmem1.C b/gcc/testsuite/g++.dg/init/ptrmem1.C new file mode 100644 index 000000000..6f1604faf --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ptrmem1.C @@ -0,0 +1,7 @@ +// PR c++/16853 + +struct A {}; +struct B {}; + +int B::* b; +int A::* a = b; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/init/ptrmem2.C b/gcc/testsuite/g++.dg/init/ptrmem2.C new file mode 100644 index 000000000..54b69215b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ptrmem2.C @@ -0,0 +1,12 @@ +// PR c++/19916 +// { dg-do run } + +struct S { + char k; +}; + +char const volatile S::* const p01 = &S::k; +int main(void) +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/ptrmem3.C b/gcc/testsuite/g++.dg/init/ptrmem3.C new file mode 100644 index 000000000..95b60379b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ptrmem3.C @@ -0,0 +1,8 @@ +// PR c++/28148 + +struct foo { +public: + virtual int bar(int); +}; + +void (foo::*__Virtual__foo__Var1)() = (void (foo::*)())(&foo::bar); diff --git a/gcc/testsuite/g++.dg/init/ptrmem4.C b/gcc/testsuite/g++.dg/init/ptrmem4.C new file mode 100644 index 000000000..44ab8cf65 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ptrmem4.C @@ -0,0 +1,13 @@ +// PR c++/32245 +// { dg-do run } + +struct foo { + int mem1; + int foo::* mem2; +}; + +int main () { + foo x = { 0 } ; + if (x.mem2 != foo().mem2) + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/ref1.C b/gcc/testsuite/g++.dg/init/ref1.C new file mode 100644 index 000000000..12caff2d0 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref1.C @@ -0,0 +1,5 @@ +void f(void) +{ + short x = 0; + const int &y = x; +} diff --git a/gcc/testsuite/g++.dg/init/ref10.C b/gcc/testsuite/g++.dg/init/ref10.C new file mode 100644 index 000000000..7a280dd41 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref10.C @@ -0,0 +1,14 @@ +// PR c++/13478 + +struct A {}; +struct B : protected A { + B() {} + B(const A& ) {} +private: + B(const B& ) {} +}; + +void foo(const A* ap) +{ + const B& br = *ap; +} diff --git a/gcc/testsuite/g++.dg/init/ref11.C b/gcc/testsuite/g++.dg/init/ref11.C new file mode 100644 index 000000000..b283e3a69 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref11.C @@ -0,0 +1,13 @@ +// PR c++/14230 + +struct A { + A (); + A (const A&); + A& operator= (const A&); +}; + +struct D { + A a; +}; + +const A& z = D().a; diff --git a/gcc/testsuite/g++.dg/init/ref12.C b/gcc/testsuite/g++.dg/init/ref12.C new file mode 100644 index 000000000..4430e174b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref12.C @@ -0,0 +1,30 @@ +// PR c++/17435 +// { dg-do run } + +extern "C" void abort (); + +bool ok; + +struct A +{ + void func() const + { + ok = 1; + } + + ~A() + { + if (!ok) + abort (); + } +}; + +struct B : public A +{ +}; + +int main() +{ + A const& r1 = B(); + r1.func(); +} diff --git a/gcc/testsuite/g++.dg/init/ref13.C b/gcc/testsuite/g++.dg/init/ref13.C new file mode 100644 index 000000000..6be57aa2e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref13.C @@ -0,0 +1,7 @@ +// PR c++/28338 + +void foo() +{ + { static const int& i = 0; } + { static const int& i = 0; } +} diff --git a/gcc/testsuite/g++.dg/init/ref14.C b/gcc/testsuite/g++.dg/init/ref14.C new file mode 100644 index 000000000..212e6e95d --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref14.C @@ -0,0 +1,11 @@ +// PR c++/33459 + +union A +{ + int &i; // { dg-error "may not have reference type" } +}; + +void foo() +{ + A(); +} diff --git a/gcc/testsuite/g++.dg/init/ref15.C b/gcc/testsuite/g++.dg/init/ref15.C new file mode 100644 index 000000000..bc9c01dc2 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref15.C @@ -0,0 +1,34 @@ +// PR c++/20416. We correctly constructed the temporary S in foo(), +// but incorrectly destroyed it every time foo() was called. +// When using a wrapped target, there is no way to override the exit +// code after returning from main. +// { dg-do run { target unwrapped } } +extern "C" void abort (void); +extern "C" void _exit (int); + +int c, exiting; +struct S { + S() { ++c; } + S(const S &) { ++c; } + ~S() + { + if (!exiting) abort (); + _exit (0); + } +}; +void +foo (void) +{ + static const S &s = S(); +} +int main () +{ + if (c != 0) + abort (); + foo (); + foo (); + if (c != 1) + abort (); + exiting = 1; + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/ref16.C b/gcc/testsuite/g++.dg/init/ref16.C new file mode 100644 index 000000000..2d56395cb --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref16.C @@ -0,0 +1,23 @@ +// PR c++/35548 +// { dg-do run } + +int c; +struct A +{ + A() { ++c; } + A(const A&) { ++c; } + ~A() { --c; } +}; + +A f() +{ + return A(); +} + +int i; +const A* ap; +int main() +{ + const A& ar = i ? *ap : f(); + return (c == 0); +} diff --git a/gcc/testsuite/g++.dg/init/ref17.C b/gcc/testsuite/g++.dg/init/ref17.C new file mode 100644 index 000000000..2c8c22b8d --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref17.C @@ -0,0 +1,23 @@ +// PR c++/35650 +// { dg-do compile } + +void f1 (); + +namespace N +{ + using::f1; + void f2 (); + void f3 (); +} + +using N::f3; + +void +test () +{ + void (&a) () = f1; + void (&b) () = N::f1; + void (&c) () = N::f2; + void (&d) () = f3; + void (&e) () = ::f3; +} diff --git a/gcc/testsuite/g++.dg/init/ref19.C b/gcc/testsuite/g++.dg/init/ref19.C new file mode 100644 index 000000000..ed78c939b --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref19.C @@ -0,0 +1,17 @@ +// PR c++/49528 +// { dg-do run } + +int d; + +struct A +{ + int i; + ~A() { ++d; }; +}; + +int main() +{ + const int &r = A().i; + if (d != 1) + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/ref2.C b/gcc/testsuite/g++.dg/init/ref2.C new file mode 100644 index 000000000..231ea047f --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref2.C @@ -0,0 +1,10 @@ +struct Base { + Base(); + Base(const Base &); + Base & operator = (const Base &); +}; + +struct Derived : public Base {}; + +Derived derived(); +const Base &b = derived(); diff --git a/gcc/testsuite/g++.dg/init/ref20.C b/gcc/testsuite/g++.dg/init/ref20.C new file mode 100644 index 000000000..b64cb57e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref20.C @@ -0,0 +1,8 @@ +// PR c++/50787 +// { dg-do run } + +int main() { + const int Ci = 0; + const int &rCi = Ci; + if (!(&Ci == &rCi)) __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/init/ref3.C b/gcc/testsuite/g++.dg/init/ref3.C new file mode 100644 index 000000000..776f2d0c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref3.C @@ -0,0 +1,12 @@ +struct Base { }; +struct Derived : public Base { }; +struct Choose { + operator Base&(); + operator Derived&(); +}; + +void f() +{ + Choose c; + Base& ref = c; +} diff --git a/gcc/testsuite/g++.dg/init/ref4.C b/gcc/testsuite/g++.dg/init/ref4.C new file mode 100644 index 000000000..6b65d9925 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref4.C @@ -0,0 +1,18 @@ +// { dg-do run } + +int c; + +struct Base { + Base() {} + Base(const Base &) { ++c; } + Base & operator = (const Base &); +}; + +struct Derived : public Base {}; + +const Base &b = Derived(); + +int main() +{ + return c; // No copies should be required. +} diff --git a/gcc/testsuite/g++.dg/init/ref5.C b/gcc/testsuite/g++.dg/init/ref5.C new file mode 100644 index 000000000..ad1c30c36 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref5.C @@ -0,0 +1,12 @@ +struct A { }; +struct B : public A { }; +struct X { + operator B(); +}; +X x; + +int main() +{ + const A& r = x; + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/ref6.C b/gcc/testsuite/g++.dg/init/ref6.C new file mode 100644 index 000000000..50a963603 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref6.C @@ -0,0 +1,12 @@ +struct B { + void g() { } +}; + +struct A { + void f() { + B &b = b; + b.g(); + } +}; + +int main(void) { } diff --git a/gcc/testsuite/g++.dg/init/ref7.C b/gcc/testsuite/g++.dg/init/ref7.C new file mode 100644 index 000000000..0832069e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref7.C @@ -0,0 +1,9 @@ +class hop +{ +public: + hop operator* () const; +}; +int main(void) +{ + const hop &x = *x; +} diff --git a/gcc/testsuite/g++.dg/init/ref8.C b/gcc/testsuite/g++.dg/init/ref8.C new file mode 100644 index 000000000..406cc1040 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref8.C @@ -0,0 +1,10 @@ +struct A { + A operator=(const A&); +}; + +A operator*(A, A); + +A& operator+=(A& a, const A& b) +{ + return a = a * b; // { dg-error "non-const reference" } +} diff --git a/gcc/testsuite/g++.dg/init/ref9.C b/gcc/testsuite/g++.dg/init/ref9.C new file mode 100644 index 000000000..127b7d8e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ref9.C @@ -0,0 +1,36 @@ +// { dg-do run } + +struct ex; +struct basic { + int refcount; + ex eval() const; + basic() : refcount(0) {} +}; + +struct ex { + basic *bp; + ex() : bp(0) { } + ex(const basic &); + virtual ~ex(); + void construct_from_basic(const basic &); +}; + +ex basic::eval() const { + throw 1; +} + +inline ex::ex(const basic &b) { construct_from_basic (b); } +inline ex::~ex() { if (--bp->refcount == 0) delete bp; } +void ex::construct_from_basic(const basic &b) { + const ex & tmpex = b.eval(); + bp = tmpex.bp; + bp->refcount++; +} + +ex pow() { return basic(); } + +int main() +{ + try { pow (); } catch (int) {} + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/reference1.C b/gcc/testsuite/g++.dg/init/reference1.C new file mode 100644 index 000000000..7ce5f90fb --- /dev/null +++ b/gcc/testsuite/g++.dg/init/reference1.C @@ -0,0 +1,11 @@ +// { dg-do compile } +// This code used to be accepted but it is invalid as there is no +// value initialization of a reference type. +// PR c++/36695 + +int main() +{ + typedef int& T; + T a = T(); // { dg-error "value-initialization of reference" } +} + diff --git a/gcc/testsuite/g++.dg/init/reference2.C b/gcc/testsuite/g++.dg/init/reference2.C new file mode 100644 index 000000000..42f537426 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/reference2.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// This code used to be accepted but it is invalid as there is no +// value initialization of a reference type. +// PR c++/36695 + +// We should we able to diagnostic this without instantiating the template +template <int a1> +int f() +{ + typedef int& T; + T a = T(); // { dg-error "value-initialization of reference" } +} + diff --git a/gcc/testsuite/g++.dg/init/reference3.C b/gcc/testsuite/g++.dg/init/reference3.C new file mode 100644 index 000000000..344e94e10 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/reference3.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// This code used to be accepted but it is invalid as there is no +// value initialization of a reference type. +// PR c++/36695 + +template <typename T> +T f() +{ + T a = T(); // { dg-error "value-initialization of reference" } +} + +int &a = f<int&>(); // { dg-message "instantiated from here" } + diff --git a/gcc/testsuite/g++.dg/init/save1.C b/gcc/testsuite/g++.dg/init/save1.C new file mode 100644 index 000000000..2358eb50c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/save1.C @@ -0,0 +1,20 @@ +// PR c++/8748 +// We were wrapping the ARRAY_REF in a SAVE_EXPR, causing us to try to make a bitwise +// copy of b[0]. + +struct A +{ + int i; +}; + +struct B : A +{ + virtual ~B(); +}; + +struct C +{ + B b[1]; +}; + +void foo() { C().b[0].i; } diff --git a/gcc/testsuite/g++.dg/init/self1.C b/gcc/testsuite/g++.dg/init/self1.C new file mode 100644 index 000000000..dd37c8e60 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/self1.C @@ -0,0 +1,19 @@ +// PR c++/29106 +// { dg-do run } + +int i; + +void f(__SIZE_TYPE__) { + i = 3; +} + + +int main() +{ + int* const savepos = sizeof(*savepos) ? 0 : 0; + + f (sizeof (*savepos)); + + if (i != 3) + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/static-init1.C b/gcc/testsuite/g++.dg/init/static-init1.C new file mode 100644 index 000000000..298d17140 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/static-init1.C @@ -0,0 +1,5 @@ +// Related to the patch for 38880. +// Make sure we don't think we can initialize a at compile time. + +char c; +short a[] = { (short)((__PTRDIFF_TYPE__)&c + (__PTRDIFF_TYPE__)&c) }; diff --git a/gcc/testsuite/g++.dg/init/static-init2.C b/gcc/testsuite/g++.dg/init/static-init2.C new file mode 100644 index 000000000..34bf2b238 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/static-init2.C @@ -0,0 +1,3 @@ +// PR c++/36912 +// { dg-options -frounding-math } +const double c = .1, d = c+1; diff --git a/gcc/testsuite/g++.dg/init/static1.C b/gcc/testsuite/g++.dg/init/static1.C new file mode 100644 index 000000000..7609215dd --- /dev/null +++ b/gcc/testsuite/g++.dg/init/static1.C @@ -0,0 +1,4 @@ +struct A { + static const int size = BOGUS; // { dg-error "" } +}; +const int A::size; diff --git a/gcc/testsuite/g++.dg/init/static2.C b/gcc/testsuite/g++.dg/init/static2.C new file mode 100644 index 000000000..b0344f480 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/static2.C @@ -0,0 +1,25 @@ +// PR 14804 +// { dg-do run } + +struct A { + virtual void foo() = 0; +}; + +struct B : public A { + virtual void bar() = 0; +}; + +typedef void (A::*mfptr)(); + +struct D { + mfptr p; +}; + +static const D ds[] = { + { reinterpret_cast<mfptr>(&B::bar) }, +}; + +int main() +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/static3.C b/gcc/testsuite/g++.dg/init/static3.C new file mode 100644 index 000000000..8fac85fbc --- /dev/null +++ b/gcc/testsuite/g++.dg/init/static3.C @@ -0,0 +1,26 @@ +// { dg-do run } + +struct T +{ + static void (*handler)(); + static void func() {} +}; + +bool fail; + +struct S { + S() { + if (T::handler != T::func) + fail = true; + } +}; + +static S s; + +void (*T::handler)() = func; + +int main() +{ + if (fail) + return 1; +} diff --git a/gcc/testsuite/g++.dg/init/string1.C b/gcc/testsuite/g++.dg/init/string1.C new file mode 100644 index 000000000..597b8619e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/string1.C @@ -0,0 +1,8 @@ +extern void f (char*); + +extern const char * const target = "foo"; + +void g () +{ + f (target); // { dg-error "conversion" } +} diff --git a/gcc/testsuite/g++.dg/init/struct1.C b/gcc/testsuite/g++.dg/init/struct1.C new file mode 100644 index 000000000..e23faef50 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/struct1.C @@ -0,0 +1,6 @@ +struct bug { + const char *name; + __SIZE_TYPE__ type; +}; + +struct bug s = { 0, (__SIZE_TYPE__) &s | 1 }; diff --git a/gcc/testsuite/g++.dg/init/struct2.C b/gcc/testsuite/g++.dg/init/struct2.C new file mode 100644 index 000000000..85aacc6fa --- /dev/null +++ b/gcc/testsuite/g++.dg/init/struct2.C @@ -0,0 +1,22 @@ +/* PR c++/23180. */ +/* Initialize a local structure with an expression that attempts to use + pointer arithmetic to calculate another structure field offset. */ + +void saveLoadEntries(const void *); + +void saveOrLoad() { + struct Track { + char soundName[15]; + }; + struct SaveLoadEntry { + int offs; + int type; + int size; + }; + + SaveLoadEntry trackEntries = { + ((long) (__SIZE_TYPE__) (&((Track *) 42)->soundName[0])) - 42, + 0, 1 + }; + saveLoadEntries(&trackEntries); +} diff --git a/gcc/testsuite/g++.dg/init/struct3.C b/gcc/testsuite/g++.dg/init/struct3.C new file mode 100644 index 000000000..53804b3d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/struct3.C @@ -0,0 +1,15 @@ +/* PR c++/23180. */ +/* Initialize a global variable with an expression that attempts to use + pointer arithmetic to calculate a structure field offset. */ + +struct Track { + char soundName[15]; +}; + +struct SaveLoadEntry { + int offs; + int type; + int size; +}; + +int foobar = ((long) (__SIZE_TYPE__) (& ((Track *) 42)->soundName[0])) - 42; diff --git a/gcc/testsuite/g++.dg/init/switch1.C b/gcc/testsuite/g++.dg/init/switch1.C new file mode 100644 index 000000000..b0b06b748 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/switch1.C @@ -0,0 +1,8 @@ +int f(int c) +{ + switch (c) + { + case d: /* { dg-error "'d' was not declared" } */ + int optBzip2 = true; + } +} diff --git a/gcc/testsuite/g++.dg/init/synth1.C b/gcc/testsuite/g++.dg/init/synth1.C new file mode 100644 index 000000000..6c00bc022 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/synth1.C @@ -0,0 +1,17 @@ +// PR middle-end/17525 + +struct A +{ + ~A(); + int a; +}; + +struct B : public A +{ + virtual ~B(); +}; + +void run (B& b, B& b1) +{ + b1 = b; +} diff --git a/gcc/testsuite/g++.dg/init/synth2.C b/gcc/testsuite/g++.dg/init/synth2.C new file mode 100644 index 000000000..ed5046715 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/synth2.C @@ -0,0 +1,18 @@ +// PR c++/34180 + +struct G { + G(); // { dg-message "" "candidate" } + G(G&); // { dg-message "" "candidate" } +}; + +class A // { dg-error "" } +// { dg-message "candidate" "candidate note" { target *-*-* } 8 } +{ + const G g; +}; + +int main() +{ + A a; + A b = a; // { dg-message "required here|deleted" } +} diff --git a/gcc/testsuite/g++.dg/init/synth3.C b/gcc/testsuite/g++.dg/init/synth3.C new file mode 100644 index 000000000..d656ddb2e --- /dev/null +++ b/gcc/testsuite/g++.dg/init/synth3.C @@ -0,0 +1,21 @@ +// Test that synthesizing the C copy constructor doesn't require B<int> to +// be complete. + +template <class T> +struct B +{ + typename T::NT nt; +}; + +struct A +{ + A (); + A (const A&); + A (const B<int>&); +}; + +struct C: A { }; + +C c; +C c2(c); + diff --git a/gcc/testsuite/g++.dg/init/synth4.C b/gcc/testsuite/g++.dg/init/synth4.C new file mode 100644 index 000000000..2b0b0b95a --- /dev/null +++ b/gcc/testsuite/g++.dg/init/synth4.C @@ -0,0 +1,18 @@ +// PR c++/45822 + +struct A +{ + A(int); +}; + +struct B +{ + B(A = 0); +}; + +struct C +{ + B b; +}; + +C c; diff --git a/gcc/testsuite/g++.dg/init/union1.C b/gcc/testsuite/g++.dg/init/union1.C new file mode 100644 index 000000000..0049f4429 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/union1.C @@ -0,0 +1,5 @@ +// PR c++/14401 + +union U { + int& i; // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/init/union2.C b/gcc/testsuite/g++.dg/init/union2.C new file mode 100644 index 000000000..ac39f6092 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/union2.C @@ -0,0 +1,13 @@ +// PR c++/15938 +// { dg-do compile } +// { dg-options "" } + +typedef union +{ + struct { int i; }; + struct { char c; }; +} A; + +A a = { 0 }; +A b = {{ 0 }}; +A c = {{{ 0 }}}; // { dg-error "braces" } diff --git a/gcc/testsuite/g++.dg/init/value1.C b/gcc/testsuite/g++.dg/init/value1.C new file mode 100644 index 000000000..9dbc2e067 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value1.C @@ -0,0 +1,22 @@ +// Test that with value-initialization, i is initialized to 0 +// and the vtable pointer is properly initialized. + +// { dg-do run } + +struct A +{ + int i; + virtual void f() {} +}; + +void f (A& a) +{ + a.f(); +} + +int main() +{ + A a = A(); + f (a); + return a.i; +} diff --git a/gcc/testsuite/g++.dg/init/value10.C b/gcc/testsuite/g++.dg/init/value10.C new file mode 100644 index 000000000..2066410a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value10.C @@ -0,0 +1,27 @@ +// PR c++/51331 +// { dg-do run } + +struct A { + A(): x(10) {} + virtual ~A() {} + + int x; +}; + +struct B: public virtual A { +}; + +struct C: public virtual A { +}; + +struct D: public B, virtual public C { + D(): B(), C() {} // note an explicit call to C() which is auto-generated +}; + +int main() { + D* d = new D(); + + // Crashes here with the following message: + // *** glibc detected *** ./test: free(): invalid next size (fast) + delete d; +} diff --git a/gcc/testsuite/g++.dg/init/value2.C b/gcc/testsuite/g++.dg/init/value2.C new file mode 100644 index 000000000..fbe166471 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value2.C @@ -0,0 +1,23 @@ +// PR c++/35116 +// Test that break_out_target_exprs works properly with complex +// value-initialization. + +struct A +{ + virtual void f (); +}; + +struct B +{ + A a; +}; + +struct C +{ + C (int, B = B()); +}; + +void f () +{ + C c (4); +} diff --git a/gcc/testsuite/g++.dg/init/value3.C b/gcc/testsuite/g++.dg/init/value3.C new file mode 100644 index 000000000..487baabec --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value3.C @@ -0,0 +1,31 @@ +// Testcase for value-initialization in new-expressions. +// { dg-do run } + +#include <stdlib.h> +#include <string.h> + +// Make sure that we return memory that isn't already set to 0. +void *operator new(size_t s) +{ + void *p = malloc (s); + memset (p, 42, s); + return p; +} + +struct A { A() {} ~A() {} }; +struct B { A a; int i; }; + +int main() +{ + B *p = new B(); + if (p->i != 0) + abort(); + + p = new B[2](); + if (p[0].i != 0 || p[1].i != 0) + abort(); + + B(*p2)[2] = new B[2][2](); + if (p2[0][0].i != 0 || p2[0][1].i != 0) + abort(); +} diff --git a/gcc/testsuite/g++.dg/init/value4.C b/gcc/testsuite/g++.dg/init/value4.C new file mode 100644 index 000000000..fa7a02cc7 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value4.C @@ -0,0 +1,35 @@ +// PR c++/38233 + +template<class _T1, class _T2> + struct pair + { + _T1 first; + _T2 second; + + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 265. std::pair::pair() effects overly restrictive + /** The default constructor creates @c first and @c second using their + * respective default constructors. */ + pair() + : first(), second() { } +}; + +class a { + public: + a(); +}; + +class b { + public: + // implicit default ctor + bool operator<(const b& rhs) const; + + private: + a a_val; +}; + +typedef pair<const b, int> my_pair; + +void func() { + my_pair x; +} diff --git a/gcc/testsuite/g++.dg/init/value5.C b/gcc/testsuite/g++.dg/init/value5.C new file mode 100644 index 000000000..d705f87b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value5.C @@ -0,0 +1,17 @@ +// PR c++/38232 + +class base { + public: + base(); + virtual ~base(); + + private: + int& int_ref; // initialized by base ctor, not visible here +}; + +class derived : public base { +}; + +base *make_derived() { + return new derived(); +} diff --git a/gcc/testsuite/g++.dg/init/value6.C b/gcc/testsuite/g++.dg/init/value6.C new file mode 100644 index 000000000..d7d29bf0a --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value6.C @@ -0,0 +1,13 @@ +// PR c++/39109 + +struct N +{ + private: + virtual ~N (); +}; + +N * +foo () +{ + return new N (); +} diff --git a/gcc/testsuite/g++.dg/init/value7.C b/gcc/testsuite/g++.dg/init/value7.C new file mode 100644 index 000000000..c79de4a68 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value7.C @@ -0,0 +1,17 @@ +// PR c++/30111 +// { dg-do run } + +struct pod { + int i; +}; + +struct inherit : pod { + inherit() : pod() {} +}; + +int main() +{ + inherit i; + return i.i != 0; +} + diff --git a/gcc/testsuite/g++.dg/init/value8.C b/gcc/testsuite/g++.dg/init/value8.C new file mode 100644 index 000000000..0a9b90b64 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value8.C @@ -0,0 +1,19 @@ +// PR c++/45315 + +struct A +{ + A (); +}; + +template < int > struct B : A +{ + void foo () + { + new B < 0 > (); + } +}; + +int main() +{ + B<1>().foo(); +} diff --git a/gcc/testsuite/g++.dg/init/value9.C b/gcc/testsuite/g++.dg/init/value9.C new file mode 100644 index 000000000..4899bd810 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/value9.C @@ -0,0 +1,32 @@ +// PR c++/50793 +// { dg-do run } + +struct NonTrivial +{ + NonTrivial() { } +}; + +struct S +{ + NonTrivial nt; + int i; +}; + +int f(S s) +{ + s.i = 0xdeadbeef; + return s.i; +} + +int g(S s = S()) +{ + return s.i; +} + +int main() +{ + f(S()); // make stack dirty + + if ( g() ) + __builtin_abort(); +} diff --git a/gcc/testsuite/g++.dg/init/vbase1.C b/gcc/testsuite/g++.dg/init/vbase1.C new file mode 100644 index 000000000..bbfd58f5c --- /dev/null +++ b/gcc/testsuite/g++.dg/init/vbase1.C @@ -0,0 +1,39 @@ +// PR c++/50618 +// { dg-do run } + +struct Base +{ + const int text; + Base():text(1) {} + Base(int aText) + : text(aText) {} +}; +struct SubA : public virtual Base +{ +protected: + int x; +public: + SubA(int aX) + : x(aX) {} +}; +class SubB : public virtual Base +{}; +struct Diamond : public SubA, public SubB +{ + Diamond(int text) + : Base(text), SubA(5), SubB() {} + + void printText() + { + if(text != 2) + __builtin_abort(); + if(x!=5) + __builtin_abort(); + } +}; + +int main(int, char**) +{ + Diamond x(2); + x.printText(); +} diff --git a/gcc/testsuite/g++.dg/init/vector1.C b/gcc/testsuite/g++.dg/init/vector1.C new file mode 100644 index 000000000..ce4f40c90 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/vector1.C @@ -0,0 +1,78 @@ +// PR c++/19263 +// { dg-do run } +// { dg-options "-O2" } + +typedef signed char v8qi __attribute__ ((vector_size (8))); + +extern "C" void abort (void); + +static unsigned char S[16]; + +struct A +{ + int i; + v8qi j, k; + int l; +}; + +void +foo (unsigned char v) +{ + A a = { 1, { v, v, v, v, v, v, v, v }, + { v + 1, v + 1, v + 1, v + 1, v + 1, v + 1, v + 1, v + 1 }, 3 }; + v8qi *s = (v8qi *) &S[0]; + *s = a.j; + s[1] = a.k; +} + +void +bar (unsigned char v) +{ + v8qi val8 = { v, v, v, v, v, v, v, v }; + v8qi *s = (v8qi *) &S[0]; + *s = val8; +} + +int n = 5, cnt; + +int +num (void) +{ + ++cnt; + return n; +} + +void +baz (void) +{ + static A a = { 0, { num (), num (), num (), num (), 6, 6, 6, 6 }, + { 7, 7, 7, 7, 8, 8, 8, 8 }, 0 }; + v8qi *s = (v8qi *) &S[0]; + *s = a.j; + s[1] = a.k; +} + +int +main () +{ + int i; + foo (1); + for (i = 0; i < 8; ++i) + if (S[i] != 1) + abort (); + for (; i < 16; ++i) + if (S[i] != 2) + abort (); + bar (3); + for (i = 0; i < 8; ++i) + if (S[i] != 3) + abort (); + return 0; + baz (); + if (cnt != 4) + abort (); + for (i = 0; i < 16; ++i) + if (S[i] != 5 + (i / 4)) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/init/volatile1.C b/gcc/testsuite/g++.dg/init/volatile1.C new file mode 100644 index 000000000..9080ed5dc --- /dev/null +++ b/gcc/testsuite/g++.dg/init/volatile1.C @@ -0,0 +1,16 @@ +// PR c++/26577 +// The call to bar() was causing an inappropriate dereference of *this, +// which led to an abort in cp_expr_size. + +struct A +{ + A(const A&); + A& operator=(const A&); + static void bar(); + void baz() volatile; +}; + +void A::baz() volatile +{ + bar(); +} diff --git a/gcc/testsuite/g++.dg/init/volatile2.C b/gcc/testsuite/g++.dg/init/volatile2.C new file mode 100644 index 000000000..036d5f162 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/volatile2.C @@ -0,0 +1,13 @@ +// PR c++/47003 + +struct A +{ + A(int); +}; + +volatile int i; + +int main() +{ + A *q = new A (i); +} diff --git a/gcc/testsuite/g++.dg/ipa/20090113-1.C b/gcc/testsuite/g++.dg/ipa/20090113-1.C new file mode 100644 index 000000000..3f371257e --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/20090113-1.C @@ -0,0 +1,25 @@ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +struct S1 { + S1() { } +}; + +struct S2 { + int n; + S1* p; + void f() { + p = new S1[n = 1]; + } +}; + +struct S3 { + S2 s2; + void g() { + s2.f(); + } +}; + +void h() { + S3().g(); +} diff --git a/gcc/testsuite/g++.dg/ipa/devirt-1.C b/gcc/testsuite/g++.dg/ipa/devirt-1.C new file mode 100644 index 000000000..de0f665c4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-1.C @@ -0,0 +1,62 @@ +/* Verify that simple virtual calls are converted to direct calls by ipa-cp. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */ + +extern "C" void abort (void); + +class A +{ +public: + int data; + virtual int foo (int i); +}; + +class B : public A +{ +public: + virtual int foo (int i); +}; + +class C : public A +{ +public: + virtual int foo (int i); +}; + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int C::foo (int i) +{ + return i + 3; +} + +static int middleman (class A *obj, int i) +{ + return obj->foo (i); +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +int main (int argc, char *argv[]) +{ + class B b; + if (middleman (&b, get_input ()) != 3) + abort (); + return 0; +} + +/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*B::foo" "cp" } } */ +/* { dg-final { scan-tree-dump-times "OBJ_TYPE_REF" 0 "optimized"} } */ +/* { dg-final { cleanup-ipa-dump "cp" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/devirt-2.C b/gcc/testsuite/g++.dg/ipa/devirt-2.C new file mode 100644 index 000000000..d3181e4c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-2.C @@ -0,0 +1,62 @@ +/* Verify that simple virtual calls using this pointer are converted + to direct calls by ipa-cp. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp" } */ + +extern "C" void abort (void); + +class A +{ +public: + int data; + virtual int foo (int i); + int middleman (int i) + { + return foo (i); + } +}; + +class B : public A +{ +public: + virtual int foo (int i); +}; + +class C : public A +{ +public: + virtual int foo (int i); +}; + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int C::foo (int i) +{ + return i + 3; +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +int main (int argc, char *argv[]) +{ + class B b; + int i; + for (i = 0; i < get_input(); i++) + if (b.middleman (get_input ()) != 3) + abort (); + return 0; +} + +/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*B::foo" "cp" } } */ +/* { dg-final { cleanup-ipa-dump "cp" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/devirt-3.C b/gcc/testsuite/g++.dg/ipa/devirt-3.C new file mode 100644 index 000000000..2d7bb0ab0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-3.C @@ -0,0 +1,63 @@ +/* Verify that simple virtual calls on an object refrence are + converted to simple calls by ipa-cp. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */ + +extern "C" void abort (void); + +class A +{ +public: + int data; + virtual int foo (int i); +}; + +class B : public A +{ +public: + virtual int foo (int i); +}; + +class C : public A +{ +public: + virtual int foo (int i); +}; + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int C::foo (int i) +{ + return i + 3; +} + +static int middleman (class A &obj, int i) +{ + return obj.foo (i); +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +int main (int argc, char *argv[]) +{ + class B b; + if (middleman (b, get_input ()) != 3) + abort (); + return 0; +} + +/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*B::foo" "cp" } } */ +/* { dg-final { scan-tree-dump-times "OBJ_TYPE_REF" 0 "optimized"} } */ +/* { dg-final { cleanup-ipa-dump "cp" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/devirt-4.C b/gcc/testsuite/g++.dg/ipa/devirt-4.C new file mode 100644 index 000000000..72c883b3f --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-4.C @@ -0,0 +1,68 @@ +/* Verify that ipa-co can convert virtual calls to direct ones even + when a typecast to an ancestor is involved along the way. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */ + +extern "C" void abort (void); + +class A +{ +public: + int data; + virtual int foo (int i); +}; + +class B : public A +{ +public: + virtual int foo (int i); +}; + +class C : public A +{ +public: + virtual int foo (int i); +}; + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int C::foo (int i) +{ + return i + 3; +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +static int middleman_1 (class A *obj, int i) +{ + return obj->foo (i); +} + +static int middleman_2 (class B *obj, int i) +{ + return middleman_1 (obj, i); +} + +int main (int argc, char *argv[]) +{ + class B b; + if (middleman_2 (&b, get_input ()) != 3) + abort (); + return 0; +} + +/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*B::foo" "cp" } } */ +/* { dg-final { scan-tree-dump-times "OBJ_TYPE_REF" 0 "optimized"} } */ +/* { dg-final { cleanup-ipa-dump "cp" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/devirt-5.C b/gcc/testsuite/g++.dg/ipa/devirt-5.C new file mode 100644 index 000000000..575bc0271 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-5.C @@ -0,0 +1,79 @@ +/* Verify that ipa-cp can convert simple virtual calls to a direct + ones even when a typecast to an ancestor is involved along the way + and that ancestor is not the first one with virtual functions. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */ + +extern "C" void abort (void); + +class Distraction +{ +public: + float f; + double d; + Distraction () + { + f = 8.3; + d = 10.2; + } + virtual float bar (float z); +}; + +class A +{ +public: + int data; + virtual int foo (int i); +}; + + +class B : public Distraction, public A +{ +public: + virtual int foo (int i); +}; + +float Distraction::bar (float z) +{ + f += z; + return f/2; +} + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +static int middleman_1 (class A *obj, int i) +{ + return obj->foo (i); +} + +static int middleman_2 (class B *obj, int i) +{ + return middleman_1 (obj, i); +} + +int main (int argc, char *argv[]) +{ + class B b; + + if (middleman_2 (&b, get_input ()) != 3) + abort (); + return 0; +} + +/* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*B::foo" "cp" } } */ +/* { dg-final { scan-tree-dump-times "OBJ_TYPE_REF" 0 "optimized"} } */ +/* { dg-final { cleanup-ipa-dump "cp" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/devirt-6.C b/gcc/testsuite/g++.dg/ipa/devirt-6.C new file mode 100644 index 000000000..e9a5d7093 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-6.C @@ -0,0 +1,38 @@ +/* Verify that we either do not do any devirtualization or correctly + spot that foo changes the dynamic type of the passed object. */ + +/* { dg-do run } */ +/* { dg-options "-O3" } */ + +extern "C" void abort (void); +extern "C" void *malloc(__SIZE_TYPE__); + +inline void* operator new(__SIZE_TYPE__, void* __p) throw() { return __p;} + +int x; + +class A { +public: + virtual ~A() { } +}; + +class B : public A { +public: + virtual ~B() { if (x == 1) abort (); x = 1; } +}; + +void __attribute__((noinline,noclone)) foo (void *p) +{ + B *b = reinterpret_cast<B *>(p); + b->~B(); + new (p) A; +} + +int main() +{ + void *p = __builtin_malloc (sizeof (B)); + new (p) B; + foo(p); + reinterpret_cast<A *>(p)->~A(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ipa/devirt-c-1.C b/gcc/testsuite/g++.dg/ipa/devirt-c-1.C new file mode 100644 index 000000000..df2230d4c --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-c-1.C @@ -0,0 +1,71 @@ +/* Verify that ipa-cp correctly detects the dynamic type of an object + under construction when doing devirtualization. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline" } */ + +extern "C" void abort (void); + +class A +{ +public: + int data; + A(); + virtual int foo (int i); +}; + +class B : public A +{ +public: + virtual int foo (int i); +}; + +class C : public A +{ +public: + virtual int foo (int i); +}; + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int C::foo (int i) +{ + return i + 3; +} + +static int middleman (class A *obj, int i) +{ + return obj->foo (i); +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +A::A () +{ + if (middleman (this, get_input ()) != 2) + abort (); +} + +static void bah () +{ + class B b; +} + +int main (int argc, char *argv[]) +{ + int i; + + for (i = 0; i < 10; i++) + bah (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ipa/devirt-c-2.C b/gcc/testsuite/g++.dg/ipa/devirt-c-2.C new file mode 100644 index 000000000..d37fe50cd --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-c-2.C @@ -0,0 +1,79 @@ +/* Verify that ipa-cp correctly detects the dynamic type of an object + under construction when doing devirtualization. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline" } */ + +extern "C" void abort (void); + +class Distraction +{ +public: + float f; + double d; + Distraction () + { + f = 8.3; + d = 10.2; + } + virtual float bar (float z); +}; + +class A +{ +public: + int data; + A(); + virtual int foo (int i); +}; + +class B : public Distraction, public A +{ +public: + virtual int foo (int i); +}; + +float Distraction::bar (float z) +{ + f += z; + return f/2; +} + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +static int middleman (class A *obj, int i) +{ + return obj->foo (i); +} + +A::A() +{ + if (middleman (this, get_input ()) != 2) + abort (); +} + +static void bah () +{ + class B b; +} + +int main (int argc, char *argv[]) +{ + int i; + + for (i = 0; i < 10; i++) + bah (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ipa/devirt-c-3.C b/gcc/testsuite/g++.dg/ipa/devirt-c-3.C new file mode 100644 index 000000000..c8791f79e --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-c-3.C @@ -0,0 +1,80 @@ +/* Verify that ipa-cp correctly detects the dynamic type of an object + under construction when doing devirtualization. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-inline" } */ + +extern "C" void abort (void); + +class Distraction +{ +public: + float f; + double d; + Distraction () + { + f = 8.3; + d = 10.2; + } + virtual float bar (float z); +}; + +class A +{ +public: + int data; + A(); + virtual int foo (int i); +}; + +class B : public Distraction, public A +{ +public: + virtual int foo (int i); +}; + +float Distraction::bar (float z) +{ + f += z; + return f/2; +} + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +static int __attribute__ ((noinline)) +middleman (class A *obj, int i) +{ + return obj->foo (i); +} + +inline __attribute__ ((always_inline)) A::A() +{ + if (middleman (this, get_input ()) != 2) + abort (); +} + +static void bah () +{ + class B b; +} + +int main (int argc, char *argv[]) +{ + int i; + + for (i = 0; i < 10; i++) + bah (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ipa/devirt-c-4.C b/gcc/testsuite/g++.dg/ipa/devirt-c-4.C new file mode 100644 index 000000000..56d41e496 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-c-4.C @@ -0,0 +1,110 @@ +/* Verify that ipa-cp correctly detects the dynamic type of an object + under construction when doing devirtualization. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-inline" } */ + +extern "C" void abort (void); + +class Distraction +{ +public: + float f; + double d; + Distraction () + { + f = 8.3; + d = 10.2; + } + virtual float bar (float z); +}; + +class A +{ +public: + int data; + A(); + virtual int foo (int i); +}; + +class B : public Distraction, public A +{ +public: + B(); + virtual int foo (int i); +}; + +class C : public B +{ +public: + virtual int foo (int i); +}; + + +float Distraction::bar (float z) +{ + f += z; + return f/2; +} + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int C::foo (int i) +{ + return i + 3; +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +static int __attribute__ ((noinline)) +middleman (class A *obj, int i) +{ + return obj->foo (i); +} + +static void __attribute__ ((noinline)) +sth2 (A *a) +{ + if (a->foo (get_input ()) != 3) + abort (); +} + +inline void __attribute__ ((always_inline)) sth1 (B *b) +{ + sth2 (b); +} + +inline __attribute__ ((always_inline)) A::A() +{ + if (middleman (this, get_input ()) != 2) + abort (); +} + +B::B() : Distraction(), A() +{ + sth1 (this); +} + +static void bah () +{ + class C c; +} + +int main (int argc, char *argv[]) +{ + int i; + + for (i = 0; i < 10; i++) + bah (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ipa/devirt-c-5.C b/gcc/testsuite/g++.dg/ipa/devirt-c-5.C new file mode 100644 index 000000000..637d7d4be --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-c-5.C @@ -0,0 +1,79 @@ +/* Verify that ipa-cp correctly detects the dynamic type of an object + under construction when doing devirtualization. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline" } */ + +extern "C" void abort (void); + +class B; + +class A +{ +public: + int data; + A(); + A(B *b); + virtual int foo (int i); +}; + +class B : public A +{ +public: + virtual int foo (int i); +}; + +class C : public A +{ +public: + virtual int foo (int i); +}; + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int C::foo (int i) +{ + return i + 3; +} + +static int middleman (class A *obj, int i) +{ + return obj->foo (i); +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +A::A () +{ +} + +A::A (B *b) +{ + if (middleman (b, get_input ()) != 3) + abort (); +} + +static void bah () +{ + B b; + A a(&b); +} + +int main (int argc, char *argv[]) +{ + int i; + + for (i = 0; i < 10; i++) + bah (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ipa/devirt-c-6.C b/gcc/testsuite/g++.dg/ipa/devirt-c-6.C new file mode 100644 index 000000000..f9b8b6954 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-c-6.C @@ -0,0 +1,72 @@ +/* Verify that ipa-cp correctly detects the dynamic type of an object + under construction when doing devirtualization. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-inline" } */ + +extern "C" void abort (void); + +class A +{ +public: + int data; + A(); + virtual int foo (int i); +}; + +class B : public A +{ +public: + virtual int foo (int i); +}; + +class C : public A +{ +public: + virtual int foo (int i); +}; + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int C::foo (int i) +{ + return i + 3; +} + +static inline int __attribute__ ((always_inline)) +middleman (class A *obj, int i) +{ + return obj->foo (i); +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +__attribute__ ((noinline)) A::A () +{ + if (middleman (this, get_input ()) != 2) + abort (); +} + +static void bah () +{ + class B b; +} + +int main (int argc, char *argv[]) +{ + int i; + + for (i = 0; i < 10; i++) + bah (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ipa/devirt-d-1.C b/gcc/testsuite/g++.dg/ipa/devirt-d-1.C new file mode 100644 index 000000000..3897a7782 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-d-1.C @@ -0,0 +1,71 @@ +/* Verify that ipa-cp correctly detects the dynamic type of an object + under destruction when doing devirtualization. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline" } */ + +extern "C" void abort (void); + +class A +{ +public: + int data; + ~A(); + virtual int foo (int i); +}; + +class B : public A +{ +public: + virtual int foo (int i); +}; + +class C : public A +{ +public: + virtual int foo (int i); +}; + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int C::foo (int i) +{ + return i + 3; +} + +static int middleman (class A *obj, int i) +{ + return obj->foo (i); +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +A::~A () +{ + if (middleman (this, get_input ()) != 2) + abort (); +} + +static void bah () +{ + class B b; +} + +int main (int argc, char *argv[]) +{ + int i; + + for (i = 0; i < 10; i++) + bah (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ipa/iinline-1.C b/gcc/testsuite/g++.dg/ipa/iinline-1.C new file mode 100644 index 000000000..9f9989322 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/iinline-1.C @@ -0,0 +1,49 @@ +/* Verify that simple indirect calls are inlined even without early + inlining.. */ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining" } */ +/* { dg-add-options bind_pic_locally } */ + +extern void non_existent (const char *, int); + +class String +{ +private: + const char *data; + +public: + String (const char *d) : data(d) + {} + + int funcOne (int delim) const; + int printStuffTwice (int delim) const; +}; + + +int String::funcOne (int delim) const +{ + int i; + for (i = 0; i < delim; i++) + non_existent(data, i); + + return 1; +} + +int docalling (int (String::* f)(int delim) const) +{ + String S ("muhehehe"); + + return (S.*f)(4); +} + +int main (int argc, char *argv[]) +{ + int i = 0; + while (i < 1000) + i += docalling (&String::funcOne); + non_existent ("done", i); + return 0; +} + +/* { dg-final { scan-ipa-dump "String::funcOne\[^\\n\]*inline copy in int main" "inline" } } */ +/* { dg-final { cleanup-ipa-dump "inline" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/iinline-2.C b/gcc/testsuite/g++.dg/ipa/iinline-2.C new file mode 100644 index 000000000..670a5dd95 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/iinline-2.C @@ -0,0 +1,61 @@ +/* Verify that simple indirect calls are inlined even without early + inlining.. */ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining" } */ +/* { dg-add-options bind_pic_locally } */ + +extern void non_existent (const char *, int); + +class String +{ +private: + const char *data; + +public: + String (const char *d) : data(d) + {} + + int funcOne (int delim) const; + int printStuffTwice (int delim) const; +}; + + +int String::funcOne (int delim) const +{ + int i; + for (i = 0; i < delim; i++) + non_existent(data, i); + + return 1; +} + +extern int global; + +int docalling (int c, int (String::* f)(int delim) const) +{ + String S ("muhehehe"); + + if (c > 2) + global = 3; + else + global = 5; + + return (S.*f)(4); +} + +int __attribute__ ((noinline,noclone)) get_input (void) +{ + return 1; +} + +int main (int argc, char *argv[]) +{ + int i = 0; + while (i < 1000) + i += docalling (get_input (), &String::funcOne); + non_existent ("done", i); + return 0; +} + +/* { dg-final { scan-ipa-dump "String::funcOne\[^\\n\]*inline copy in int main" "inline" } } */ +/* { dg-final { cleanup-ipa-dump "inline" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/iinline-3.C b/gcc/testsuite/g++.dg/ipa/iinline-3.C new file mode 100644 index 000000000..3daee9a86 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/iinline-3.C @@ -0,0 +1,64 @@ +/* Verify that we do not indirect-inline using member pointer + parameters which have been modified. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-early-inlining" } */ +/* { dg-add-options bind_pic_locally } */ + +extern "C" void abort (void); + +class String +{ +private: + const char *data; + +public: + String (const char *d) : data(d) + {} + + int funcOne (int stuff) const; + int funcTwo (int stuff) const; +}; + + +int String::funcOne (int stuff) const +{ + return stuff + 1; +} + +int String::funcTwo (int stuff) const +{ + return stuff + 100; +} + +int (String::* gmp)(int stuff) const = &String::funcTwo; + +int docalling_1 (int (String::* f)(int stuff) const) +{ + String S ("muhehehe"); + + return (S.*f)(4); +} + +int docalling (int a, int (String::* f)(int stuff) const) +{ + if (a < 200) + f = gmp; + + return docalling_1 (f); +} + +int __attribute__ ((noinline,noclone)) get_input (void) +{ + return 1; +} + +int main (int argc, char *argv[]) +{ + int i = 0; + while (i < 10) + i += docalling (get_input (), &String::funcOne); + + if (i != 104) + abort(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ipa/ivinline-1.C b/gcc/testsuite/g++.dg/ipa/ivinline-1.C new file mode 100644 index 000000000..fc63e6085 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/ivinline-1.C @@ -0,0 +1,64 @@ +/* Verify that simple virtual calls are inlined even without early + inlining. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */ + +extern "C" void abort (void); + +class A +{ +public: + int data; + virtual int foo (int i); +}; + +class B : public A +{ +public: + virtual int foo (int i); +}; + +class C : public A +{ +public: + virtual int foo (int i); +}; + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int C::foo (int i) +{ + return i + 3; +} + +int middleman (class A *obj, int i) +{ + return obj->foo (i); +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +int main (int argc, char *argv[]) +{ + class B b; + int i; + + for (i = 0; i < get_input (); i++) + if (middleman (&b, get_input ()) != 3) + abort (); + return 0; +} + +/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" } } */ +/* { dg-final { cleanup-ipa-dump "inline" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/ivinline-2.C b/gcc/testsuite/g++.dg/ipa/ivinline-2.C new file mode 100644 index 000000000..f99330361 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/ivinline-2.C @@ -0,0 +1,63 @@ +/* Verify that simple virtual calls using this pointer are inlined + even without early inlining.. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */ + +extern "C" void abort (void); + +class A +{ +public: + int data; + virtual int foo (int i); + int middleman (int i) + { + return foo (i); + } +}; + +class B : public A +{ +public: + virtual int foo (int i); +}; + +class C : public A +{ +public: + virtual int foo (int i); +}; + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int C::foo (int i) +{ + return i + 3; +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +int main (int argc, char *argv[]) +{ + class B b; + int i; + + for (i = 0; i < get_input (); i++) + if (b.middleman (get_input ()) != 3) + abort (); + return 0; +} + +/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" } } */ +/* { dg-final { cleanup-ipa-dump "inline" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/ivinline-3.C b/gcc/testsuite/g++.dg/ipa/ivinline-3.C new file mode 100644 index 000000000..d9a47f860 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/ivinline-3.C @@ -0,0 +1,64 @@ +/* Verify that simple virtual calls on an object refrence are inlined + even without early inlining. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */ + +extern "C" void abort (void); + +class A +{ +public: + int data; + virtual int foo (int i); +}; + +class B : public A +{ +public: + virtual int foo (int i); +}; + +class C : public A +{ +public: + virtual int foo (int i); +}; + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int C::foo (int i) +{ + return i + 3; +} + +int middleman (class A &obj, int i) +{ + return obj.foo (i); +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +int main (int argc, char *argv[]) +{ + class B b; + int i; + + for (i = 0; i < get_input (); i++) + if (middleman (b, get_input ()) != 3) + abort (); + return 0; +} + +/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" } } */ +/* { dg-final { cleanup-ipa-dump "inline" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/ivinline-4.C b/gcc/testsuite/g++.dg/ipa/ivinline-4.C new file mode 100644 index 000000000..93cbe0c7d --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/ivinline-4.C @@ -0,0 +1,70 @@ +/* Verify that simple virtual calls are inlined even without early + inlining, even when a typecast to an ancestor is involved along the + way. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */ + +extern "C" void abort (void); + +class A +{ +public: + int data; + virtual int foo (int i); +}; + +class B : public A +{ +public: + virtual int foo (int i); +}; + +class C : public A +{ +public: + virtual int foo (int i); +}; + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int C::foo (int i) +{ + return i + 3; +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +static int middleman_1 (class A *obj, int i) +{ + return obj->foo (i); +} + +static int middleman_2 (class B *obj, int i) +{ + return middleman_1 (obj, i); +} + +int main (int argc, char *argv[]) +{ + class B b; + int i; + + for (i = 0; i < get_input (); i++) + if (middleman_2 (&b, get_input ()) != 3) + abort (); + return 0; +} + +/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" } } */ +/* { dg-final { cleanup-ipa-dump "inline" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/ivinline-5.C b/gcc/testsuite/g++.dg/ipa/ivinline-5.C new file mode 100644 index 000000000..91e8f4e3e --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/ivinline-5.C @@ -0,0 +1,55 @@ +/* Verify that virtual call inlining does not pick a wrong method when + there is a user defined ancestor in an object. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */ + +extern "C" void abort (void); + +class A +{ +public: + int data; + virtual int foo (int i); +}; + +class B : public A +{ +public: + class A confusion; + virtual int foo (int i); +}; + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int middleman (class A *obj, int i) +{ + return obj->foo (i); +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +int main (int argc, char *argv[]) +{ + class B b; + int i, j = get_input (); + + for (i = 0; i < j; i++) + if ((middleman (&b, j) + 100 * middleman (&b.confusion, j)) != 203) + abort (); + return 0; +} + +/* { dg-final { scan-ipa-dump "A::foo\[^\\n\]*inline copy in int main" "inline" } } */ +/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" } } */ +/* { dg-final { cleanup-ipa-dump "inline" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/ivinline-7.C b/gcc/testsuite/g++.dg/ipa/ivinline-7.C new file mode 100644 index 000000000..5f3596d8d --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/ivinline-7.C @@ -0,0 +1,79 @@ +/* Verify that simple virtual calls are inlined even without early + inlining, even when a typecast to an ancestor is involved along the + way and that ancestor is not the first one with virtual functions. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */ + +extern "C" void abort (void); + +class Distraction +{ +public: + float f; + double d; + Distraction () + { + f = 8.3; + d = 10.2; + } + virtual float bar (float z); +}; + +class A +{ +public: + int data; + virtual int foo (int i); +}; + + +class B : public Distraction, public A +{ +public: + virtual int foo (int i); +}; + +float Distraction::bar (float z) +{ + f += z; + return f/2; +} + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +static int middleman_1 (class A *obj, int i) +{ + return obj->foo (i); +} + +static int middleman_2 (class B *obj, int i) +{ + return middleman_1 (obj, i); +} + +int main (int argc, char *argv[]) +{ + class B b; + int i; + + for (i = 0; i < get_input (); i++) + if (middleman_2 (&b, get_input ()) != 3) + abort (); + return 0; +} + +/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" } } */ +/* { dg-final { cleanup-ipa-dump "inline" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/ivinline-8.C b/gcc/testsuite/g++.dg/ipa/ivinline-8.C new file mode 100644 index 000000000..3bdf4c15b --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/ivinline-8.C @@ -0,0 +1,77 @@ +/* Verify that virtual calls are inlined (ithout early inlining) even + when their caller is itself indirectly inlined. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */ + +extern "C" void abort (void); + +class A +{ +public: + int data; + virtual int bar (int i); + virtual int foo (int i); +}; + +class B : public A +{ +public: + virtual int bar (int i); + virtual int foo (int i); +}; + +class C : public A +{ +public: + virtual int foo (int i); +}; + +int A::bar (int i) +{ + return i + 100 * i; +} + +int A::foo (int i) +{ + return bar (i) + 1; +} + +int B::bar (int i) +{ + return i + 100 * (i + 2); +} + +int B::foo (int i) +{ + return bar (i) + 2; +} + +int C::foo (int i) +{ + return i + 3; +} + +int middleman (class A *obj, int i) +{ + return obj->foo (i); +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +int main (int argc, char *argv[]) +{ + class B b; + int i; + + for (i = 0; i < get_input (); i++) + if (middleman (&b, get_input ()) != 303) + abort (); + return 0; +} + +/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" } } */ +/* { dg-final { scan-ipa-dump "B::bar\[^\\n\]*inline copy in int main" "inline" } } */ +/* { dg-final { cleanup-ipa-dump "inline" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/ivinline-9.C b/gcc/testsuite/g++.dg/ipa/ivinline-9.C new file mode 100644 index 000000000..429b6f4f0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/ivinline-9.C @@ -0,0 +1,93 @@ +/* Verify that simple virtual calls are inlined even without early + inlining, even when a typecast to an ancestor is involved along the + way and that ancestor itself has an ancestor wich is not the + primary base class. */ +/* { dg-do run } */ +/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */ + +extern "C" void abort (void); + +class Distraction +{ +public: + float f; + double d; + Distraction () + { + f = 8.3; + d = 10.2; + } + virtual float bar (float z); +}; + +class A +{ +public: + int data; + virtual int foo (int i); +}; +/* +class D2 +{ +public: + virtual float baz (float z) + { + abort(); + } +}; +*/ +class A2 : public Distraction, public A +{ + int i2; +}; + +class B : public A2 +{ +public: + virtual int foo (int i); +}; + +float Distraction::bar (float z) +{ + f += z; + return f/2; +} + +int A::foo (int i) +{ + return i + 1; +} + +int B::foo (int i) +{ + return i + 2; +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +static int middleman_1 (class A *obj, int i) +{ + return obj->foo (i); +} + +static int middleman_2 (class B *obj, int i) +{ + return middleman_1 (obj, i); +} + +int main (int argc, char *argv[]) +{ + class B b; + int i; + + for (i = 0; i < get_input (); i++) + if (middleman_2 (&b, get_input ()) != 3) + abort (); + return 0; +} + +/* { dg-final { scan-ipa-dump "B::foo\[^\\n\]*inline copy in int main" "inline" } } */ +/* { dg-final { cleanup-ipa-dump "inline" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/pr43695.C b/gcc/testsuite/g++.dg/ipa/pr43695.C new file mode 100644 index 000000000..a01478324 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr43695.C @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-fipa-cp -fipa-cp-clone" } */ + +extern void baz(int) __attribute__ ((noreturn)); + +struct S { + ~S(); +}; + +__attribute__ ((noreturn, noinline)) +void bar(int i) +{ + baz(i); +} + +void foo() +{ + S s; + bar(0); +} diff --git a/gcc/testsuite/g++.dg/ipa/pr43812.C b/gcc/testsuite/g++.dg/ipa/pr43812.C new file mode 100644 index 000000000..cc46eed65 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr43812.C @@ -0,0 +1,38 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fwhole-program -fipa-cp" } */ + +typedef float scoord_t; +typedef scoord_t sdist_t; +typedef sdist_t dist_t; +template<typename T> class TRay { }; +typedef TRay<dist_t> Ray; +class BBox { }; +class RenderContext { }; +class RefCounted { +public: + void deref () const { + if (--ref_count <= 0) { + delete this; + } + } + mutable int ref_count; +}; +template<class T> class Ref { +public: + ~Ref () { + if (obj) obj->deref (); + } + T *obj; +}; +class Material : public RefCounted { }; +class Surface { +public: + virtual ~Surface () { } + class IsecInfo { }; + virtual const IsecInfo *intersect (Ray &ray, RenderContext &context) const; + Ref<const Material> material; +}; +class LocalSurface : public Surface { + virtual BBox bbox () const; +}; +BBox LocalSurface::bbox () const { } diff --git a/gcc/testsuite/g++.dg/ipa/pr44372.C b/gcc/testsuite/g++.dg/ipa/pr44372.C new file mode 100644 index 000000000..22aa747e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr44372.C @@ -0,0 +1,48 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fipa-cp -fipa-cp-clone" } */ + +template < typename > class S3; + +struct S1 +{ + struct + { + int i[10]; + } s0; + S1 () : s0 () + { } + template < typename T > S1 (S3 < T > s3, int) + { + f (s3); + } +}; + +struct S2 +{ + template < typename T > S2 s (S3 < T > s3) + { + S1 (s3, 0); + } + S2 (int i) : j (i) + { } + int j; + S1 s1[10]; +}; + +template < typename > struct S3 +{ + S3 () + { + S2 (0).s (*this); + } +}; + +static inline void +f (S3 < int > s3) +{ + extern bool m; + if (m) + S2 (0).s (s3); +} + +S3 < int >s3; diff --git a/gcc/testsuite/g++.dg/ipa/pr45565.C b/gcc/testsuite/g++.dg/ipa/pr45565.C new file mode 100644 index 000000000..c04de12e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr45565.C @@ -0,0 +1,29 @@ +// { dg-do compile } +// { dg-options "-O -fno-toplevel-reorder -fno-inline -fipa-cp -fipa-cp-clone -fkeep-inline-functions" } + +template < typename Derived > struct AnyMatrixBase +{ +}; + +struct Matrix Random (); + +struct Matrix:AnyMatrixBase < Matrix > +{ + void bar () + { + throw; + } + void foo (Matrix other) + { + bar (); + Matrix (AnyMatrixBase < Matrix > (Random ())); + } + template + < typename OtherDerived > Matrix (AnyMatrixBase < OtherDerived > other) + { + foo (other); + } +}; + +Matrix x (Random ()); + diff --git a/gcc/testsuite/g++.dg/ipa/pr45572-1.C b/gcc/testsuite/g++.dg/ipa/pr45572-1.C new file mode 100644 index 000000000..82f347052 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr45572-1.C @@ -0,0 +1,64 @@ +// { dg-do compile } +// { dg-options "-finline-small-functions -findirect-inlining -finline-functions -O" } + +extern "C" { +typedef long unsigned int size_t; +typedef long int __ssize_t; +typedef struct _IO_FILE FILE; +typedef struct +{ +} __mbstate_t; +extern __inline __attribute__ ((__gnu_inline__)) int +fgetc_unlocked (FILE *__fp) +{ +} +extern __inline __attribute__ ((__gnu_inline__)) int +putc_unlocked (int __c, FILE *__stream) +{ +} +extern __inline __attribute__ ((__gnu_inline__)) __ssize_t +getline (char **__lineptr, size_t *__n, FILE *__stream) +{ +} +extern __inline __attribute__ ((__gnu_inline__)) int +ferror_unlocked (FILE *__stream) throw () +{ +} +} +typedef struct +{} __mpf_struct; +typedef __mpf_struct mpf_t[1]; +typedef const __mpf_struct *mpf_srcptr; +typedef __mpf_struct *mpf_ptr; +extern "C" { + void __gmpf_add (mpf_ptr, mpf_srcptr, mpf_srcptr); +} +class _knumber +{ + public: + enum NumType {SpecialType, IntegerType, FractionType, FloatType}; + virtual NumType type(void) const = 0; + virtual _knumber * add(_knumber const & arg2) const = 0; + virtual operator long int(void) const = 0; +}; +class _knumfloat : public _knumber +{ + _knumfloat(double num = 1.0) + ; + virtual NumType type(void) const ; + virtual _knumber * add(_knumber const & arg2) const; + virtual operator long int (void) const; + mpf_t _mpf; +}; +_knumber *_knumfloat::add(_knumber const & arg2) const +{ + if (arg2.type() == SpecialType) + return arg2.add(*this); +{ + _knumfloat tmp_num(arg2); + return tmp_num.add(*this); + } + _knumfloat * tmp_num = new _knumfloat(); + __gmpf_add(tmp_num->_mpf, _mpf, + dynamic_cast<_knumfloat const &>(arg2)._mpf); +} diff --git a/gcc/testsuite/g++.dg/ipa/pr45572-2.C b/gcc/testsuite/g++.dg/ipa/pr45572-2.C new file mode 100644 index 000000000..8b583d9c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr45572-2.C @@ -0,0 +1,39 @@ +// { dg-do compile } +// { dg-options "-finline-small-functions -findirect-inlining -finline-function+ +typedef struct +{} __mpf_struct; +typedef __mpf_struct mpf_t[1]; +typedef const __mpf_struct *mpf_srcptr; +typedef __mpf_struct *mpf_ptr; +extern "C" { + void __gmpf_add (mpf_ptr, mpf_srcptr, mpf_srcptr); +} +class _knumber +{ + public: + enum NumType {SpecialType, IntegerType, FractionType, FloatType}; + virtual NumType type(void) const = 0; + virtual _knumber * add(_knumber const & arg2) const = 0; + virtual operator long int(void) const = 0; +}; +class _knumfloat : public _knumber +{ + _knumfloat(double num = 1.0) + ; + virtual NumType type(void) const ; + virtual _knumber * add(_knumber const & arg2) const; + virtual operator long int (void) const; + mpf_t _mpf; +}; +_knumber *_knumfloat::add(_knumber const & arg2) const +{ + if (arg2.type() == SpecialType) + return arg2.add(*this); +{ + _knumfloat tmp_num(arg2); + return tmp_num.add(*this); + } + _knumfloat * tmp_num = new _knumfloat(); + __gmpf_add(tmp_num->_mpf, _mpf, + dynamic_cast<_knumfloat const &>(arg2)._mpf); +} diff --git a/gcc/testsuite/g++.dg/ipa/pr45875.C b/gcc/testsuite/g++.dg/ipa/pr45875.C new file mode 100644 index 000000000..34f02e300 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr45875.C @@ -0,0 +1,48 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fno-early-inlining -fno-ipa-cp" } */ + +extern "C" void abort (void); + +class A +{ +public: + virtual int foo (int i); +}; + +class B +{ +public: + class A confusion; +}; + +int A::foo (int i) +{ + return i + 1; +} + +int __attribute__ ((noinline,noclone)) get_input(void) +{ + return 1; +} + +static int middleman_a (class A *obj, int i) +{ + return obj->foo (i); +} + +static int middleman_b (class B *obj, int i) +{ + return middleman_a (&obj->confusion, i); +} + + +int main (int argc, char *argv[]) +{ + class B b; + int i, j = get_input (); + + for (i = 0; i < j; i++) + if (middleman_b (&b, j) != 2) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ipa/pr46053.C b/gcc/testsuite/g++.dg/ipa/pr46053.C new file mode 100644 index 000000000..7be6fc3a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr46053.C @@ -0,0 +1,41 @@ +/* { dg-do run } */ +/* { dg-options "-O -fipa-cp -fno-early-inlining" } */ + +extern "C" void abort (); + +struct A +{ + virtual void foo () = 0; +}; + +struct B : A +{ + virtual void foo () = 0; +}; + +struct C : A +{ +}; + +struct D : C, B +{ + int i; + D () : i(0xaaaa) {} + virtual void foo () + { + if (i != 0xaaaa) + abort(); + } +}; + +static inline void bar (B &b) +{ + b.foo (); +} + +int main() +{ + D d; + bar (d); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ipa/pr46287-1.C b/gcc/testsuite/g++.dg/ipa/pr46287-1.C new file mode 100644 index 000000000..0755529bd --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr46287-1.C @@ -0,0 +1,67 @@ +// Check that indirect calls to thunks do not lead to errors. +// { dg-do run } +// { dg-options "-O" } + +extern "C" void abort (); + +class A +{ +public: + virtual void foo () {abort();} +}; + +class B : public A +{ +public: + int z; + virtual void foo () {abort();} +}; + +class C : public A +{ +public: + void *a[32]; + unsigned long b; + long c[32]; + + virtual void foo () {abort();} +}; + +class D : public C, public B +{ +public: + D () : C(), B() + { + int i; + for (i = 0; i < 32; i++) + { + a[i] = (void *) 0; + c[i] = 0; + } + b = 0xaaaa; + } + + virtual void foo (); +}; + +inline void D::foo() +{ + if (b != 0xaaaa) + abort(); +} + +static inline void bar (B &b) +{ + + b.foo (); +} + +int main() +{ + int i; + D d; + + for (i = 0; i < 5000; i++) + bar (d); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ipa/pr46287-2.C b/gcc/testsuite/g++.dg/ipa/pr46287-2.C new file mode 100644 index 000000000..272852bad --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr46287-2.C @@ -0,0 +1,68 @@ +// Check that indirect calls to thunks do not lead to errors. +// { dg-do run } +// { dg-options "-O -finline -finline-small-functions -finline-functions" } + + +extern "C" void abort (); + +class A +{ +public: + virtual void foo () {abort();} +}; + +class B : public A +{ +public: + int z; + virtual void foo () {abort();} +}; + +class C : public A +{ +public: + void *a[32]; + unsigned long b; + long c[32]; + + virtual void foo () {abort();} +}; + +class D : public C, public B +{ +public: + D () : C(), B() + { + int i; + for (i = 0; i < 32; i++) + { + a[i] = (void *) 0; + c[i] = 0; + } + b = 0xaaaa; + } + + virtual void foo (); +}; + +void D::foo() +{ + if (b != 0xaaaa) + abort(); +} + +static inline void bar (B &b) +{ + + b.foo (); +} + +int main() +{ + int i; + D d; + + for (i = 0; i < 5000; i++) + bar (d); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ipa/pr46287-3.C b/gcc/testsuite/g++.dg/ipa/pr46287-3.C new file mode 100644 index 000000000..5f291ce1f --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr46287-3.C @@ -0,0 +1,67 @@ +// Check that indirect calls to thunks do not lead to errors. +// { dg-do run } +// { dg-options "-O -fipa-cp" } + +extern "C" void abort (); + +class A +{ +public: + virtual void foo () {abort();} +}; + +class B : public A +{ +public: + int z; + virtual void foo () {abort();} +}; + +class C : public A +{ +public: + void *a[32]; + unsigned long b; + long c[32]; + + virtual void foo () {abort();} +}; + +class D : public C, public B +{ +public: + D () : C(), B() + { + int i; + for (i = 0; i < 32; i++) + { + a[i] = (void *) 0; + c[i] = 0; + } + b = 0xaaaa; + } + + virtual void foo (); +}; + +void D::foo() +{ + if (b != 0xaaaa) + abort(); +} + +static void bar (B &b) +{ + + b.foo (); +} + +int main() +{ + int i; + D d; + + for (i = 0; i < 5000; i++) + bar (d); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ipa/pr46984.C b/gcc/testsuite/g++.dg/ipa/pr46984.C new file mode 100644 index 000000000..464ceb14a --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr46984.C @@ -0,0 +1,63 @@ +// { dg-options "-O -fipa-cp -fno-early-inlining -flto" } +// { dg-do run } +// { dg-require-effective-target lto } + +extern "C" void abort (); + +class A +{ +public: + virtual void foo () {abort();} +}; + +class B : public A +{ +public: + int z; + virtual void foo () {abort();} +}; + +class C : public A +{ +public: + void *a[32]; + unsigned long b; + long c[32]; + + virtual void foo () {abort();} +}; + +class D : public C, public B +{ +public: + D () : C(), B() + { + int i; + for (i = 0; i < 32; i++) + { + a[i] = (void *) 0; + c[i] = 0; + } + b = 0xaaaa; + } + + virtual void foo (); +}; + +void D::foo() +{ + if (b != 0xaaaa) + abort(); +} + +static inline void bar (B &b) +{ + b.foo (); +} + +int main() +{ + D d; + bar (d); + return 0; +} diff --git a/gcc/testsuite/g++.dg/ipa/pr51759.C b/gcc/testsuite/g++.dg/ipa/pr51759.C new file mode 100644 index 000000000..accfaf2dc --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr51759.C @@ -0,0 +1,26 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +extern "C" void abort (void); +struct S +{ + void __attribute__((noinline)) set(unsigned val) + { + data = val; + if (data != val) + abort (); + } + int pad0; + unsigned pad1 : 8; + unsigned data : 24; + int pad2; +}; +int main() +{ + S s; + s.pad2 = -1; + s.set(0); + if (s.pad2 != -1) + abort (); +} + diff --git a/gcc/testsuite/g++.dg/ipa/pr55264.C b/gcc/testsuite/g++.dg/ipa/pr55264.C new file mode 100644 index 000000000..cf54d6ae2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr55264.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-early-inlining -fno-weak" } */ + +struct S +{ + S(); + virtual inline void foo () + { + foo(); + } +}; + +void +B () +{ + S().foo (); +} diff --git a/gcc/testsuite/g++.dg/lookup/ambig1.C b/gcc/testsuite/g++.dg/lookup/ambig1.C new file mode 100644 index 000000000..1cf9ab4f0 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/ambig1.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 24 Aug 2004 <nathan@codesourcery.com> +// Origin: Wolfgang Bangerth <bangerth@dealii.org> + +// Bug 16889:Undetected ambiguity. + +struct B { + int f(); // { dg-error "int B::f" "" } +}; + +struct B1 : virtual B {}; +struct B2 : B {}; +struct BB : B1, B2 {}; + +int i = BB().f(); // { dg-error "ambiguous" "" } diff --git a/gcc/testsuite/g++.dg/lookup/ambig2.C b/gcc/testsuite/g++.dg/lookup/ambig2.C new file mode 100644 index 000000000..4d423d170 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/ambig2.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 24 Aug 2004 <nathan@codesourcery.com> +// Origin: Wolfgang Bangerth <bangerth@dealii.org> + +// Bug 16889:Undetected ambiguity. + +struct B { + int i; // { dg-error "int B::i" "" } +}; + +struct B1 : virtual B {}; +struct B2 : B {}; +struct BB : B1, B2 {}; + +int i = BB().i; // { dg-error "ambiguous" "" } diff --git a/gcc/testsuite/g++.dg/lookup/ambig3.C b/gcc/testsuite/g++.dg/lookup/ambig3.C new file mode 100644 index 000000000..7a0a8377a --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/ambig3.C @@ -0,0 +1,18 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 23 Sep 2004 <nathan@codesourcery.com> +// Origin: Wolfgang Bangerth <bangerth@dealii.org> + +// Follow on from Bug 16889:Undetected ambiguity. + +struct B { + int f(); // { dg-error "int B::f" "" } +}; + +struct B1 : virtual B {}; +struct B2 : B {}; +struct B2_2 : B2 {}; +struct BB : B1, B2_2 {}; + +int i = BB().f(); // { dg-error "ambiguous" "" } diff --git a/gcc/testsuite/g++.dg/lookup/ambig4.C b/gcc/testsuite/g++.dg/lookup/ambig4.C new file mode 100644 index 000000000..3a74f7d1c --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/ambig4.C @@ -0,0 +1,14 @@ +// PR c++/13377 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } + +namespace N +{ + int i; // { dg-error "i" } +} + +int i; // { dg-error "i" } + +using namespace N; + +void foo() { i; } // { dg-error "ambiguous" } diff --git a/gcc/testsuite/g++.dg/lookup/ambig5.C b/gcc/testsuite/g++.dg/lookup/ambig5.C new file mode 100644 index 000000000..cebec2779 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/ambig5.C @@ -0,0 +1,13 @@ +// PR c++/13377 +// Origin: Boris Kolpackov <boris@kolpackov.net> +// { dg-do compile } + +namespace N +{ + namespace M {} // { dg-error "M" } +} + +namespace M {} // { dg-error "M" } + +using namespace N; +using namespace M; // { dg-error "namespace-name|ambiguous" } diff --git a/gcc/testsuite/g++.dg/lookup/anon1.C b/gcc/testsuite/g++.dg/lookup/anon1.C new file mode 100644 index 000000000..e4db50d94 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/anon1.C @@ -0,0 +1,47 @@ +// PR c++/2039 +// Test that a scoped reference to a member of an anonymous union member of +// a base class works properly. + +// { dg-do run } + +struct A +{ + long ia1; + union + { + long ia2; + }; +}; + +struct B : public A +{ + void f1(); + void f2(); +}; + +void B::f1() +{ + ia1 = 11; + ia2 = 22; +} + +void B::f2() +{ + ia1 = 33; + A::ia2 = 44; // <<< !!!???? +} + +int main() +{ + B x; + + x.f1(); + if (x.ia1 != 11 || x.ia2 != 22) + return 1; + + x.f2(); + if (x.ia1 != 33 || x.ia2 != 44) + return 1; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/lookup/anon2.C b/gcc/testsuite/g++.dg/lookup/anon2.C new file mode 100644 index 000000000..d556ba003 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/anon2.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// { dg-options "" } + +// Make sure we issue a diagnostic if a type with no linkage is used +// to declare a a variable that has linkage. + +struct { int i; } a; // { dg-warning "anonymous type" } + +void foo() { a.i; } diff --git a/gcc/testsuite/g++.dg/lookup/anon3.C b/gcc/testsuite/g++.dg/lookup/anon3.C new file mode 100644 index 000000000..2523e0a7d --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/anon3.C @@ -0,0 +1,11 @@ +// Test that anonymous unions work with explicit scope. + +static union +{ + int i; +}; + +int main() +{ + return ::i; +} diff --git a/gcc/testsuite/g++.dg/lookup/anon4.C b/gcc/testsuite/g++.dg/lookup/anon4.C new file mode 100644 index 000000000..40c4ab40a --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/anon4.C @@ -0,0 +1,9 @@ +static union { + int i; +}; + +int *ip; + +void g() { + ip = &i; +} diff --git a/gcc/testsuite/g++.dg/lookup/anon5.C b/gcc/testsuite/g++.dg/lookup/anon5.C new file mode 100644 index 000000000..c3d36c20f --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/anon5.C @@ -0,0 +1,21 @@ +// PR c++/28409 +// shouldIbevisible should be emitted because it's an extern "C" decl with +// external linkage, even though it's in the anonymous namespace. + +namespace +{ + extern "C" int shouldIbevisible() + { + return 0; + } +} + +namespace t +{ + extern "C" int shouldIbevisible(void); +} + +int main(void) +{ + return t::shouldIbevisible(); +} diff --git a/gcc/testsuite/g++.dg/lookup/anon6.C b/gcc/testsuite/g++.dg/lookup/anon6.C new file mode 100644 index 000000000..09fa7f8f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/anon6.C @@ -0,0 +1,11 @@ +extern int v1; // { dg-error "declared" } +static union { int v1; }; // { dg-error "redeclaration" } + +static union { int v2; }; // { dg-error "declared" } +extern int v2; // { dg-error "redeclaration" } + +int v3; // { dg-error "declared" } +static union { int v3; }; // { dg-error "redeclaration" } + +static union { int v4; }; // { dg-error "declared" } +static union { int v4; }; // { dg-error "redeclaration" } diff --git a/gcc/testsuite/g++.dg/lookup/anon7.C b/gcc/testsuite/g++.dg/lookup/anon7.C new file mode 100644 index 000000000..79cad0acb --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/anon7.C @@ -0,0 +1,26 @@ +// PR c++/39560 +// { dg-options -Wunused } + +struct X { }; + +class Z { +public: + X* cc(int c); +}; + +class F { +public: + typedef X* (Z::*MethO)(int); + typedef X* (F::*MethF)(int); + template<MethO m> + X* xwrapper(int i) { + union { + Z *z; + F *f; + }; // { dg-bogus "unused" } + f = this; + return ((z->*m)(i)); + } +}; + +F::MethF meth = &F::xwrapper<&Z::cc>; diff --git a/gcc/testsuite/g++.dg/lookup/builtin1.C b/gcc/testsuite/g++.dg/lookup/builtin1.C new file mode 100644 index 000000000..5f25f2889 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/builtin1.C @@ -0,0 +1,12 @@ +// PR c++/19367 +// { dg-do link } + +void abort (void) { throw 3; } + +namespace std { using ::abort; } + +int main () +{ + using std::abort; + abort(); +} diff --git a/gcc/testsuite/g++.dg/lookup/builtin2.C b/gcc/testsuite/g++.dg/lookup/builtin2.C new file mode 100644 index 000000000..be0a6f65d --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/builtin2.C @@ -0,0 +1,19 @@ +/* { dg-do compile } */ + +/* PR c++/21087 */ + +/* We used to overload the template function with the built-in + declaration, instead of replacing it as we should, and then barf at + the using decl because of a test that none of the overload set + members were anticipated built-ins. */ + +extern "C" signed int toupper(signed int __c) throw(); +namespace std +{ + template< typename a > a toupper(a,int){} + using ::toupper; +} + +int f () { + std::toupper((signed int)'a'); +} diff --git a/gcc/testsuite/g++.dg/lookup/builtin3.C b/gcc/testsuite/g++.dg/lookup/builtin3.C new file mode 100644 index 000000000..3a29d8783 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/builtin3.C @@ -0,0 +1,15 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild <aaw@google.com> +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> +// { dg-do compile } + +// PR 31749: ICE with redeclaration of builtin + +namespace std +{ + union abort; +} + +void abort(); + +using std::abort; diff --git a/gcc/testsuite/g++.dg/lookup/builtin4.C b/gcc/testsuite/g++.dg/lookup/builtin4.C new file mode 100644 index 000000000..b1785dcc7 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/builtin4.C @@ -0,0 +1,15 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild <aaw@google.com> +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> +// { dg-do compile } + +// PR 31749: ICE with redeclaration of builtin + +namespace std +{ + union abort; +} + +union abort; + +using std::abort; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/lookup/builtin5.C b/gcc/testsuite/g++.dg/lookup/builtin5.C new file mode 100644 index 000000000..1bd67dce5 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/builtin5.C @@ -0,0 +1,16 @@ +// PR c++/37276 + +// { dg-final { scan-assembler "_ZSt5atanhd" } } + +namespace std +{ + inline double + atanh(double __x) + { return __builtin_atanh(__x); } +} + +int main() +{ + std::atanh(.3); + return 0; +} diff --git a/gcc/testsuite/g++.dg/lookup/class-member-1.C b/gcc/testsuite/g++.dg/lookup/class-member-1.C new file mode 100644 index 000000000..37d40b4cc --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/class-member-1.C @@ -0,0 +1,11 @@ +// Copyright (C) 2002 Free Software Foundation +// Origin: PR/7621, Vaclav.Haisman@logout.sh.cvut.cz +// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net> + +struct A { }; + +int main() +{ + A a; + a.i = 9; // { dg-error "no member" "" } +} diff --git a/gcc/testsuite/g++.dg/lookup/class-member-2.C b/gcc/testsuite/g++.dg/lookup/class-member-2.C new file mode 100644 index 000000000..8e4dbe72d --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/class-member-2.C @@ -0,0 +1,7 @@ +template <typename T> struct A +{ + void foo () const {} + char A; +}; + +void bar() { A<void>().foo(); } diff --git a/gcc/testsuite/g++.dg/lookup/conv-1.C b/gcc/testsuite/g++.dg/lookup/conv-1.C new file mode 100644 index 000000000..0c4393e8a --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/conv-1.C @@ -0,0 +1,27 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 21 Jul 2004 <nathan@codesourcery.com> + +// Failed to spot ambiguous conversion + +struct A1 +{ + operator int () const; // { dg-message "A1::operator" "" } +}; + +struct A2 +{ + operator int () const; // { dg-message "A2::operator" "" } +}; + +struct B : A1, A2 +{ +}; + +int Foo (B const &b) +{ + return b; // { dg-error "ambiguous" "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 24 } +} + diff --git a/gcc/testsuite/g++.dg/lookup/conv-2.C b/gcc/testsuite/g++.dg/lookup/conv-2.C new file mode 100644 index 000000000..6a087e183 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/conv-2.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 21 Jul 2004 <nathan@codesourcery.com> + +// { dg-final { scan-assembler "_ZNK2A1cviEv" } } + +struct A1 +{ + operator int () const; // this one +}; + +struct A2 : A1 +{ + template<typename T> operator T () const; +}; + +int Foo (A2 const &b) +{ + return b; +} + diff --git a/gcc/testsuite/g++.dg/lookup/conv-3.C b/gcc/testsuite/g++.dg/lookup/conv-3.C new file mode 100644 index 000000000..14b1446a2 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/conv-3.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 21 Jul 2004 <nathan@codesourcery.com> + +// { dg-final { scan-assembler "_ZNK2A1IiEcviEv" } } + +template <typename T> struct A1 +{ + operator T () const; // this one +}; + +struct A2 : A1<int> +{ + template<typename T> operator T () const; +}; + +int Foo (A2 const &b) +{ + return b; +} + diff --git a/gcc/testsuite/g++.dg/lookup/conv-4.C b/gcc/testsuite/g++.dg/lookup/conv-4.C new file mode 100644 index 000000000..cd85b2ad3 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/conv-4.C @@ -0,0 +1,35 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 21 Jul 2004 <nathan@codesourcery.com> + +// { dg-final { scan-assembler "_ZNK1AcviEv" } } +// { dg-final { scan-assembler-not "_ZNK1VcviEv" } } + +struct V +{ + operator int () const; +}; + +struct A : virtual V +{ + operator int () const; // this one +}; + +struct B1 : A, virtual V +{ +}; + +struct B2 : virtual V, A +{ +}; + + +int Foo (B1 const &b) +{ + return b; +} +int Foo (B2 const &b) +{ + return b; +} diff --git a/gcc/testsuite/g++.dg/lookup/conv-5.C b/gcc/testsuite/g++.dg/lookup/conv-5.C new file mode 100644 index 000000000..f8df71092 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/conv-5.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 17 Dec 2004 <nathan@codesourcery.com> + +// PR 18721. bogus error +// Origin: Mikael Kilpel?inen <belz@kolumbus.fi> + +struct A { + template<typename T> + operator T() const; + + operator float() const; +}; + diff --git a/gcc/testsuite/g++.dg/lookup/crash1.C b/gcc/testsuite/g++.dg/lookup/crash1.C new file mode 100644 index 000000000..cd90685c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/crash1.C @@ -0,0 +1,31 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 25 Aug 2003 <nathan@codesourcery.com> +// Origin pr 11871 Dirk Mueller <mueller@kde.org> + +// PR c++/11871 Regression + +namespace std +{ + class A + { + public: + enum result + { + ok + }; + }; + + template<typename T> class B : public A + { + public: + typedef A::result result; + }; +} + +int main() +{ + for(float result = 1.0;;); +} + diff --git a/gcc/testsuite/g++.dg/lookup/crash2.C b/gcc/testsuite/g++.dg/lookup/crash2.C new file mode 100644 index 000000000..82735245f --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/crash2.C @@ -0,0 +1,20 @@ +// PR c++/14086 + +struct ClassA +{ + ClassA(); +}; + +struct ClassB +{ + enum Enum {ClassB}; // { dg-error "" } + ClassA key; + + ClassB(); + virtual ~ClassB(); +}; + + +ClassB::ClassB() +{ +} diff --git a/gcc/testsuite/g++.dg/lookup/crash3.C b/gcc/testsuite/g++.dg/lookup/crash3.C new file mode 100644 index 000000000..24a3360ba --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/crash3.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// Contributed by Wolfgang Wieser <wwieser at gmx dot de> +// PR c++/15967: ICE with ambiguous operator new + +typedef __SIZE_TYPE__ size_t; + +struct A { void *operator new(size_t s){} }; // { dg-error "operator new" } +struct B { void *operator new(size_t s){} }; // { dg-error "operator new" } + +struct C : A,B {}; + +int crash() +{ + C *c=new C(); // { dg-error "ambiguous" } +} diff --git a/gcc/testsuite/g++.dg/lookup/crash4.C b/gcc/testsuite/g++.dg/lookup/crash4.C new file mode 100644 index 000000000..65686512a --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/crash4.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// +// PR 3761 + +struct A {}; + +struct B {}; + +template <class T> +struct Foo : A, B +{ + void func(void); + + struct Nested + { + friend void Foo::func(void); + }; +}; diff --git a/gcc/testsuite/g++.dg/lookup/crash5.C b/gcc/testsuite/g++.dg/lookup/crash5.C new file mode 100644 index 000000000..6584ee645 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/crash5.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// +// PR 17618 + +void foo() +{ + p; // { dg-error "not declared" } + (void*) p; +} diff --git a/gcc/testsuite/g++.dg/lookup/crash6.C b/gcc/testsuite/g++.dg/lookup/crash6.C new file mode 100644 index 000000000..0e49324bf --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/crash6.C @@ -0,0 +1,8 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +// PR c++/18652: ICE redeclaring variable as template. + +int A; // { dg-error "previous declaration" } +template<int> struct A; // { dg-error "different kind of symbol" } diff --git a/gcc/testsuite/g++.dg/lookup/crash7.C b/gcc/testsuite/g++.dg/lookup/crash7.C new file mode 100644 index 000000000..a3389a01a --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/crash7.C @@ -0,0 +1,9 @@ +// PR c++/35323 +// { dg-options "" } + +void foo(int); + +void bar() +{ + foo(1r); // { dg-error "not supported" } +} diff --git a/gcc/testsuite/g++.dg/lookup/decl1.C b/gcc/testsuite/g++.dg/lookup/decl1.C new file mode 100644 index 000000000..d9af65604 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/decl1.C @@ -0,0 +1,32 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 24 Dec 2002 <nathan@codesourcery.com> + +// PR 8702. Failure to match templates. + +template <typename X> struct C1{}; + +template <typename X> +struct C2 { + template<typename Y> operator C1<Y>(); + template<typename Y> operator C2<Y>(); +}; + +template<typename X> template<typename Y> +C2<X>::operator C1<Y>() +{ + return C1<Y>(); +} + +struct A +{ + operator int (); // { dg-error "operator" "" } + operator float (); // { dg-error "operator" "" } + operator float () const; // { dg-error "operator" "" } + template <typename T> operator T * (); // { dg-error "candidates" "" } +}; + +A::operator short () { // { dg-error "prototype for" "" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/lookup/decl2.C b/gcc/testsuite/g++.dg/lookup/decl2.C new file mode 100644 index 000000000..75ce0967a --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/decl2.C @@ -0,0 +1,27 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 24 Dec 2002 <nathan@codesourcery.com> +// Source Martin Buchholz martin@xemacs.org + +// PR 9053. Failed to consider templates that are disambiguated by +// return type. + +template <typename T> class bar; +template <> struct bar<const char*> { typedef void type; }; +template <typename T> class qux; +template <> struct qux<int> { typedef void type; }; + +template <typename T> +typename bar<T>::type foo (T t) { } + +template <typename T> +typename qux<T>::type foo (T t) { } + + +int +main (int argc, char *argv[]) +{ + foo ("foo"); + foo (7); +} diff --git a/gcc/testsuite/g++.dg/lookup/delete1.C b/gcc/testsuite/g++.dg/lookup/delete1.C new file mode 100644 index 000000000..beaed209d --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/delete1.C @@ -0,0 +1,16 @@ +// PR c++/2136 +// Test that overloaded op new and delete don't prevent us from using the +// global versions with an explicit scope. + +#include <stddef.h> + +struct A { + void *operator new (size_t, float); + void operator delete (void *, float); +}; + +int main () +{ + A *p = ::new A; + ::delete p; +} diff --git a/gcc/testsuite/g++.dg/lookup/disamb1.C b/gcc/testsuite/g++.dg/lookup/disamb1.C new file mode 100644 index 000000000..7585a32e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/disamb1.C @@ -0,0 +1,15 @@ +// PR c++/525 +// Bug: With -pedantic, we weren't converting this to B1* for the call. + +struct A +{ + void f(); +}; + +struct B1: public A {}; +struct B2: public A {}; + +struct C: public B1, public B2 +{ + void g() { B1::f(); } +}; diff --git a/gcc/testsuite/g++.dg/lookup/duperr1.C b/gcc/testsuite/g++.dg/lookup/duperr1.C new file mode 100644 index 000000000..cfb348d49 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/duperr1.C @@ -0,0 +1,5 @@ +// PR c++/29048 + +class A { int i; }; // { dg-bogus "is private.*is private" } +// { dg-error "is private" "" { target *-*-* } 3 } +class B:public A { B() { A::i=0; } }; // { dg-error "within this context" } diff --git a/gcc/testsuite/g++.dg/lookup/enum1.C b/gcc/testsuite/g++.dg/lookup/enum1.C new file mode 100644 index 000000000..9422814e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/enum1.C @@ -0,0 +1,5 @@ +// PR c++/14476 + +struct tree_common { + enum tree_code code : 8; // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/lookup/error1.C b/gcc/testsuite/g++.dg/lookup/error1.C new file mode 100644 index 000000000..3eb4b9721 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/error1.C @@ -0,0 +1,10 @@ +// PR c++/17609 +// Origin: <papadopo@shfj.cea.fr> +// { dg-do compile } + +namespace N { int i; } // { dg-message "N::i" } +void foo() { i; } // { dg-error "not declared" } + // { dg-message "suggested alternative" "suggested alternative" { target *-*-* } 6 } + +using namespace N; +void bar() { i; } diff --git a/gcc/testsuite/g++.dg/lookup/exception1.C b/gcc/testsuite/g++.dg/lookup/exception1.C new file mode 100644 index 000000000..b5fcd0a6c --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/exception1.C @@ -0,0 +1,33 @@ +/* PR 2743 */ +/* { dg-do compile } */ + +namespace ns { + class Exception + { + }; +} + +namespace ns +{ + class Test { + public: + inline Test() throw( Exception ); + inline Test(int n ) throw( Exception ); + private: + int i; + }; +} + +// This line used to fail because Exception wasn't looked up in the +// right scope. +ns::Test::Test() throw( Exception ) : i( 1 ) +{ +} + +ns::Test::Test( int n ) throw( Exception ) : i( n ) +{ +} + +int main(int argc, char* argv[]) { + ns::Test test; +} diff --git a/gcc/testsuite/g++.dg/lookup/extern-c-redecl.C b/gcc/testsuite/g++.dg/lookup/extern-c-redecl.C new file mode 100644 index 000000000..31d100a74 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/extern-c-redecl.C @@ -0,0 +1,11 @@ +// Contributed by Dodji Seketeli <dseketel@redhat.com> +// Origin: PR c++/13699 +// { dg-do compile } + +namespace A { + extern "C" void foo_func () throw(); // { dg-error "conflicts" } +} +// next line should trigger an error because +// it conflicts with previous declaration of foo_func (), due to +// different exception specifications. +extern "C" void foo_func (); // { dg-error "C language|exception specifications" } diff --git a/gcc/testsuite/g++.dg/lookup/extern-c-redecl2.C b/gcc/testsuite/g++.dg/lookup/extern-c-redecl2.C new file mode 100644 index 000000000..055148f38 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/extern-c-redecl2.C @@ -0,0 +1,21 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/41020 +// { dg-do compile } + +extern "C" +{ + int fork (void); +} + +class frok +{ + int this_errno; + friend int fork (void); +}; + +extern "C" int +fork (void) +{ + frok grouped; + return grouped.this_errno; +} diff --git a/gcc/testsuite/g++.dg/lookup/extern-c-redecl3.C b/gcc/testsuite/g++.dg/lookup/extern-c-redecl3.C new file mode 100644 index 000000000..56dcefa76 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/extern-c-redecl3.C @@ -0,0 +1,23 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/41020 +// { dg-options "" } +// { dg-do compile } +// { dg-final { scan-assembler-not "call\[\t \]+\[^\$\]*?_Z4forkv" { target i?86-*-* x86_64-*-* } } } +// { dg-final { scan-assembler "call\[\t \]+_?fork" { target i?86-*-* x86_64-*-* } } } + +extern "C" int fork (void); + +void +foo () +{ + extern int fork (void); + fork (); +} + +extern "C" +int +fork (void) +{ + return 0; +} + diff --git a/gcc/testsuite/g++.dg/lookup/extern-c-redecl4.C b/gcc/testsuite/g++.dg/lookup/extern-c-redecl4.C new file mode 100644 index 000000000..c385ea701 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/extern-c-redecl4.C @@ -0,0 +1,18 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/41020 + +// { dg-options "" } +// { dg-do compile } +// { dg-final { scan-assembler "call\[\t \]+\[^\$\]*?_Z4forkv" { target i?86-*-* x86_64-*-* } } } + +class frok +{ + int this_errno; + friend int fork (void); +}; + +void +foo () +{ + fork (); +} diff --git a/gcc/testsuite/g++.dg/lookup/extern-c-redecl5.C b/gcc/testsuite/g++.dg/lookup/extern-c-redecl5.C new file mode 100644 index 000000000..51a342d43 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/extern-c-redecl5.C @@ -0,0 +1,18 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/41020 +// { dg-do compile } + + +class frok +{ + int this_errno; + friend int fork (void); // { dg-error "previous declaration .*?C\\+\\+. linkage" } +}; + +extern "C" int +fork (void) // { dg-error "conflicts with new declaration .*?C. linkage" }} +{ + frok grouped; + return grouped.this_errno; +} + diff --git a/gcc/testsuite/g++.dg/lookup/forscope1.C b/gcc/testsuite/g++.dg/lookup/forscope1.C new file mode 100644 index 000000000..e694d6f23 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/forscope1.C @@ -0,0 +1,25 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 4 Sept 2001 <nathan@codesourcery.com> + +// Bug 4206. We were nesting SCOPE_STMTs badly. + +struct A +{ + A (); + ~A (); +}; + + +void Go( ) +{ + while (1) + { + switch (1) { + default: {} + } + A d; + } + +} diff --git a/gcc/testsuite/g++.dg/lookup/forscope2.C b/gcc/testsuite/g++.dg/lookup/forscope2.C new file mode 100644 index 000000000..1fed957a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/forscope2.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +struct S { + void foo() { + for (_ptr; ;) {} // { dg-error "not declared" } + _ptr = 0; + } +}; + diff --git a/gcc/testsuite/g++.dg/lookup/friend1.C b/gcc/testsuite/g++.dg/lookup/friend1.C new file mode 100644 index 000000000..47fe05565 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend1.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Origin: <matz@suse.de> + +// PR c++/9970: In-class friend function definition after +// declaration lexical scope problem. + +void f(); +struct X +{ + enum { k = 1 }; + friend void f() { + char a[k]; + } +}; diff --git a/gcc/testsuite/g++.dg/lookup/friend10.C b/gcc/testsuite/g++.dg/lookup/friend10.C new file mode 100644 index 000000000..fa2eccbea --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend10.C @@ -0,0 +1,22 @@ +// PR c++/18681 +// Bug: The friend declaration in A failed to give C::D access to A::B +// as specified in DR 45. + +class A +{ + struct B; + friend class C; +}; + +class C +{ + struct D + { + void f(); + }; +}; + +void C::D::f() +{ + A::B* p; +} diff --git a/gcc/testsuite/g++.dg/lookup/friend11.C b/gcc/testsuite/g++.dg/lookup/friend11.C new file mode 100644 index 000000000..2b4ffda83 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend11.C @@ -0,0 +1,23 @@ +/* PR c++/30917 */ +/* This used to ICE */ +/* { dg-do compile } */ + + +class QGList; +unsigned count() { + class QGListIterator { + friend class QGList; + QGListIterator( const QGList & ); // OK, finds ::QGList. + }; + return 0; +} + +// This is valid. +unsigned count2() { + class QGList2; + class QGListIterator2 { + friend class QGList2; + QGListIterator2( const QGList2 & ); + }; + return 0; +} diff --git a/gcc/testsuite/g++.dg/lookup/friend12.C b/gcc/testsuite/g++.dg/lookup/friend12.C new file mode 100644 index 000000000..95cfd5fb4 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend12.C @@ -0,0 +1,10 @@ +// PR c++/34912 + +void foo() +{ + struct A + { + friend void bar(); // { dg-error "without prior declaration" } + }; + bar(); // { dg-error "not declared" } +} diff --git a/gcc/testsuite/g++.dg/lookup/friend13.C b/gcc/testsuite/g++.dg/lookup/friend13.C new file mode 100644 index 000000000..bec71df37 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend13.C @@ -0,0 +1,6 @@ +// PR c++/37558 + +class Foo { + friend class Bar; + friend void func(const class Bar*); +}; diff --git a/gcc/testsuite/g++.dg/lookup/friend14.C b/gcc/testsuite/g++.dg/lookup/friend14.C new file mode 100644 index 000000000..5c244112a --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend14.C @@ -0,0 +1,17 @@ +// PR c++/35109 + +struct C; +void f() { + struct A { + friend struct B; + friend struct C; + void g() + { + B *b; // { dg-error "not declared" } + C* c; // OK, finds ::C + } + }; + C *c; // OK, finds ::C + struct B {}; + B *b; // OK, now it isn't hidden +} diff --git a/gcc/testsuite/g++.dg/lookup/friend15.C b/gcc/testsuite/g++.dg/lookup/friend15.C new file mode 100644 index 000000000..1e271fc3f --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend15.C @@ -0,0 +1,12 @@ +// Origin: PR c++/35109 +// { dg-do compile } + +void foo() +{ + struct A + { + friend class B; + }; + B::B() {} // { dg-error "has not been declared" } +// { dg-error "expected" "expected" { target *-*-* } 10 } +} diff --git a/gcc/testsuite/g++.dg/lookup/friend2.C b/gcc/testsuite/g++.dg/lookup/friend2.C new file mode 100644 index 000000000..765c69b67 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend2.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +// Origin: Albert Chin <bugzilla-gcc@thewrittenword.com> +// Wolfgang Bangerth <bangerth@dealii.org> + +// PR c++/14513, unqualified lookup of friend class. + +struct S { + void test (void); +}; + +namespace NS { + class X { + friend class S; + static int *i; // { dg-error "private" } + }; +} + +void S::test () { + NS::X::i; // { dg-error "this context" } +} diff --git a/gcc/testsuite/g++.dg/lookup/friend3.C b/gcc/testsuite/g++.dg/lookup/friend3.C new file mode 100644 index 000000000..2a58dd8ca --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend3.C @@ -0,0 +1,19 @@ +// Copyright (C) 2004 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +// Friend name lookup in class defined outside its namespace + +namespace A { + class B; + class C; +} + +class A::B { + friend class C; + typedef int i; +}; + +class A::C { + A::B::i j; +}; diff --git a/gcc/testsuite/g++.dg/lookup/friend4.C b/gcc/testsuite/g++.dg/lookup/friend4.C new file mode 100644 index 000000000..86ac91561 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend4.C @@ -0,0 +1,22 @@ +// Copyright (C) 2004 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +// Friend name lookup in class defined outside its namespace +// (Local class case) + +void f() { + class A { + class B; + class C; + }; + + class A::B { + friend class C; + typedef int i; + }; + + class A::C { + A::B::i j; + }; +} diff --git a/gcc/testsuite/g++.dg/lookup/friend5.C b/gcc/testsuite/g++.dg/lookup/friend5.C new file mode 100644 index 000000000..5be37bbd5 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend5.C @@ -0,0 +1,34 @@ +// { dg-do compile } + +// Origin: aroach@stoic.electriceyeball.com + +// PR c++/3332: Friend function lookup in class defined outside its +// namespace + +namespace N +{ + class A; +} + +class N::A +{ + void x(); + friend void func(void); +}; + +namespace N +{ + void func(void); +} + +void N::func(void) +{ + N::A a; + a.x(); +} + +int main() +{ + return 0; +} + diff --git a/gcc/testsuite/g++.dg/lookup/friend6.C b/gcc/testsuite/g++.dg/lookup/friend6.C new file mode 100644 index 000000000..e3dafb1d6 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend6.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Origin: Matt Austern <austern@apple.com> + +// PR c++/19258: Wrong lookup scope for friend defined in class. + +class X { + template<class T> friend int ff(T*, int y=anX.x) { return y; } + int f() { return ff(&anX); } + + static X anX; + int x; +}; + +X dummy; diff --git a/gcc/testsuite/g++.dg/lookup/friend7.C b/gcc/testsuite/g++.dg/lookup/friend7.C new file mode 100644 index 000000000..ce9b79f8f --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend7.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// PR c++/7874: Don't inject friend functions into global name space. + +namespace N { template<typename T> struct A { friend void f(A) { } }; } +int main() +{ + N::A<int> a; + N::f(a); // { dg-error "not a member" } +} + +struct S { friend void g(); friend void h(S); }; +struct T { friend void g(); friend void h(T); }; +void i() { + g(); // { dg-error "not declared" } + S s; + h(s); + T t; + h(t); +} diff --git a/gcc/testsuite/g++.dg/lookup/friend8.C b/gcc/testsuite/g++.dg/lookup/friend8.C new file mode 100644 index 000000000..e9992cdad --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend8.C @@ -0,0 +1,12 @@ +// Test that we look up a friend declared at top level ahead of an +// undeclared friend found by argument dependent lookup. + +// { dg-do run } + +int f(int) { return 0; } + +struct S { + friend int f(char) { return 1; } +}; + +int main () { return f('a'); } diff --git a/gcc/testsuite/g++.dg/lookup/friend9.C b/gcc/testsuite/g++.dg/lookup/friend9.C new file mode 100644 index 000000000..caf685c3e --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend9.C @@ -0,0 +1,23 @@ +// PR c++/25492 + +class Base { +public: + class Nested {}; +}; + +class Derived:public Base { +public: + class Nested { + public: + void m(); + }; + class AnotherNested { + friend class Nested; + AnotherNested() {} + }; +}; + +void Derived::Nested::m() { + Derived::AnotherNested instance; + +} diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class1.C b/gcc/testsuite/g++.dg/lookup/hidden-class1.C new file mode 100644 index 000000000..b3be4e8e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-class1.C @@ -0,0 +1,8 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +class A { + friend class B; + B *b; // { dg-error "type|expected" } +}; diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class10.C b/gcc/testsuite/g++.dg/lookup/hidden-class10.C new file mode 100644 index 000000000..c9b5ca9f6 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-class10.C @@ -0,0 +1,11 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild <aaw@google.com> +// { dg-do compile } + +// Verify that a friend class is hidden even if it overrides a builtin +// function name. + +class A { + friend class abort; + abort *b; // { dg-error "type|expected" } +}; diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class11.C b/gcc/testsuite/g++.dg/lookup/hidden-class11.C new file mode 100644 index 000000000..8432e32d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-class11.C @@ -0,0 +1,23 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild <aaw@google.com> +// { dg-do compile } + +// Verify that a friend class is hidden even if it is hidden by a non-builtin +// function name. + +namespace M { + void F (void); + class F; +} + +namespace N { + void F(void); + class A { + friend class F; + }; +} + +using namespace M; +using namespace N; + +class F *b; diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class12.C b/gcc/testsuite/g++.dg/lookup/hidden-class12.C new file mode 100644 index 000000000..4a3f2d761 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-class12.C @@ -0,0 +1,24 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/36019 +// { dg-do compile } + +struct F { + static const int x = 0; +}; + +struct A { + template <typename A> + static int f () + { + return A::x; + } +}; + + +int +main () +{ + int i = A::f<F> (); + return i; +} + diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class13.C b/gcc/testsuite/g++.dg/lookup/hidden-class13.C new file mode 100644 index 000000000..2f685b2cb --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-class13.C @@ -0,0 +1,25 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/36019 +// { dg-do compile } + +struct F { + static const int x = 0; +}; + +struct B { + template <typename B> + struct C + { + static int f () + { + return B::x; + } + }; +}; + +int +main () +{ + int j = B::C<F>::f (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class14.C b/gcc/testsuite/g++.dg/lookup/hidden-class14.C new file mode 100644 index 000000000..99bd6731b --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-class14.C @@ -0,0 +1,23 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/36019 +// { dg-do compile } + +struct F { + static const int x = 0; + typedef int A; +}; + +struct A { + template <typename A> + struct G : public F + { + static const A i = 0; + }; +}; + +int +main () +{ + return A::G<F>::i ; +} + diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class15.C b/gcc/testsuite/g++.dg/lookup/hidden-class15.C new file mode 100644 index 000000000..b0ed660a6 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-class15.C @@ -0,0 +1,30 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/36019 +// { dg-do compile } + +struct F { + static const int y = 0; +}; + +struct A { + static const int x = 0; +}; + +struct B : public A { + template <typename A> + struct C + { + static int f () + { + return A::x; // { dg-error "'x' is not a member of 'F'" } + } + }; +}; + +int +main () +{ + int j = B::C<F>::f (); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class16.C b/gcc/testsuite/g++.dg/lookup/hidden-class16.C new file mode 100644 index 000000000..25cc40294 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-class16.C @@ -0,0 +1,27 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/36019 +// { dg-do compile } + +struct F { + static const int y = 0; +}; + +struct A { + static const int x = 0; +}; + +struct B : public A { + template <typename A> + static int f () + { + return A::x; // { dg-error "'x' is not a member of 'F'" } + } +}; + +int +main () +{ + int j = B::f<F> (); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class2.C b/gcc/testsuite/g++.dg/lookup/hidden-class2.C new file mode 100644 index 000000000..19287a5fb --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-class2.C @@ -0,0 +1,9 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +class A { + friend class B; +}; + +class B* b; diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class3.C b/gcc/testsuite/g++.dg/lookup/hidden-class3.C new file mode 100644 index 000000000..50a7e331c --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-class3.C @@ -0,0 +1,10 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +class A { + friend class B; + + class B; + B *b; +}; diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class4.C b/gcc/testsuite/g++.dg/lookup/hidden-class4.C new file mode 100644 index 000000000..c407692ca --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-class4.C @@ -0,0 +1,10 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +class A { + friend class B; +}; + +class B *b; +B *c; diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class5.C b/gcc/testsuite/g++.dg/lookup/hidden-class5.C new file mode 100644 index 000000000..c2413546b --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-class5.C @@ -0,0 +1,9 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +class A { + friend class B; +}; + +B* b; // { dg-error "type|expected" } diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class6.C b/gcc/testsuite/g++.dg/lookup/hidden-class6.C new file mode 100644 index 000000000..964253539 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-class6.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Origin: Jay Cox <jaycox@gimp.org> + +// PR c++/1016: Name lookup for injected friend class + +class B; + +namespace N { + class A { + friend class B; + B* b; + }; +} diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class7.C b/gcc/testsuite/g++.dg/lookup/hidden-class7.C new file mode 100644 index 000000000..a46ae711d --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-class7.C @@ -0,0 +1,13 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +class A { + friend class B; +}; + +class C { + friend class B; +}; + +B *b; // { dg-error "type|expected" } diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class8.C b/gcc/testsuite/g++.dg/lookup/hidden-class8.C new file mode 100644 index 000000000..ea4e2f1bb --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-class8.C @@ -0,0 +1,12 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +namespace N { + class A { + friend class B; + }; +} + +class N::B { // { dg-error "not name a class" } +}; diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class9.C b/gcc/testsuite/g++.dg/lookup/hidden-class9.C new file mode 100644 index 000000000..de86b1269 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-class9.C @@ -0,0 +1,11 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +namespace N { + class A { + friend class B; + }; +} + +using N::B; // { dg-error "declared" } diff --git a/gcc/testsuite/g++.dg/lookup/hidden-temp-class1.C b/gcc/testsuite/g++.dg/lookup/hidden-temp-class1.C new file mode 100644 index 000000000..8cdb235e8 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-temp-class1.C @@ -0,0 +1,8 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +class A { + template <class T> friend class B; + B<int> *b; // { dg-error "type|expected" } +}; diff --git a/gcc/testsuite/g++.dg/lookup/hidden-temp-class10.C b/gcc/testsuite/g++.dg/lookup/hidden-temp-class10.C new file mode 100644 index 000000000..2134635a2 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-temp-class10.C @@ -0,0 +1,12 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +namespace N { + class A { + template <class T> friend class B; + }; +} + +template <class T> class N::B { // { dg-error "not name a class" } +}; diff --git a/gcc/testsuite/g++.dg/lookup/hidden-temp-class11.C b/gcc/testsuite/g++.dg/lookup/hidden-temp-class11.C new file mode 100644 index 000000000..6e8cbdbb6 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-temp-class11.C @@ -0,0 +1,11 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +namespace N { + class A { + template <class T> friend class B; + }; +} + +using N::B; // { dg-error "declared" } diff --git a/gcc/testsuite/g++.dg/lookup/hidden-temp-class2.C b/gcc/testsuite/g++.dg/lookup/hidden-temp-class2.C new file mode 100644 index 000000000..56ba76b3a --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-temp-class2.C @@ -0,0 +1,9 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +class A { + template <class T> friend class B; +}; + +class B* b; // { dg-error "argument required|invalid" } diff --git a/gcc/testsuite/g++.dg/lookup/hidden-temp-class3.C b/gcc/testsuite/g++.dg/lookup/hidden-temp-class3.C new file mode 100644 index 000000000..3f96622ea --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-temp-class3.C @@ -0,0 +1,9 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +class A { + template <class T> friend class B; + template <class T> class B; + B<int> *b; +}; diff --git a/gcc/testsuite/g++.dg/lookup/hidden-temp-class4.C b/gcc/testsuite/g++.dg/lookup/hidden-temp-class4.C new file mode 100644 index 000000000..3d085e224 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-temp-class4.C @@ -0,0 +1,9 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +class A { + template <class T> friend class B; +}; + +B<int> *b; // { dg-error "type|expected" } diff --git a/gcc/testsuite/g++.dg/lookup/hidden-temp-class5.C b/gcc/testsuite/g++.dg/lookup/hidden-temp-class5.C new file mode 100644 index 000000000..e6b30b291 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-temp-class5.C @@ -0,0 +1,10 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +class A { + template <class T> friend class B; +}; + +template <class T> class B; +B<int>* b; diff --git a/gcc/testsuite/g++.dg/lookup/hidden-temp-class6.C b/gcc/testsuite/g++.dg/lookup/hidden-temp-class6.C new file mode 100644 index 000000000..2072695ba --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-temp-class6.C @@ -0,0 +1,11 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +class B; +namespace N { + class A { + template <class T> friend class B; + B* b; + }; +} diff --git a/gcc/testsuite/g++.dg/lookup/hidden-temp-class7.C b/gcc/testsuite/g++.dg/lookup/hidden-temp-class7.C new file mode 100644 index 000000000..19dd95248 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-temp-class7.C @@ -0,0 +1,13 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +class A { + template <class T> friend class B; +}; + +class C { + template <class T> friend class B; +}; + +B<int> *b; // { dg-error "type|expected" } diff --git a/gcc/testsuite/g++.dg/lookup/hidden-temp-class8.C b/gcc/testsuite/g++.dg/lookup/hidden-temp-class8.C new file mode 100644 index 000000000..247c78cf3 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-temp-class8.C @@ -0,0 +1,11 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +class A { + template <class T> friend class B; +}; + +class C { + friend class B; // { dg-error "argument required|friend" } +}; diff --git a/gcc/testsuite/g++.dg/lookup/hidden-temp-class9.C b/gcc/testsuite/g++.dg/lookup/hidden-temp-class9.C new file mode 100644 index 000000000..783139b66 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/hidden-temp-class9.C @@ -0,0 +1,11 @@ +// Copyright (C) 2005 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +class A { + friend class B; +}; + +class C { + template <class T> friend class B; // { dg-error "not a template" } +}; diff --git a/gcc/testsuite/g++.dg/lookup/java1.C b/gcc/testsuite/g++.dg/lookup/java1.C new file mode 100644 index 000000000..0d9b22ee1 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/java1.C @@ -0,0 +1,68 @@ +// { dg-do compile } +// { dg-options "-fdollars-in-identifiers" } +// Origin: Giovanni Bajo <giovannibajo at libero dot it> +// Make sure that Java special functions can be called correctly. + +extern "Java" +{ + typedef __java_int jint; + namespace java + { + namespace lang + { + class Class; + class Object; + class Throwable {}; + class Foo; + } + } +} + +typedef struct java::lang::Object* jobject; +typedef struct java::lang::Throwable* jthrowable; +typedef class java::lang::Class* jclass; +using java::lang::Foo; + +class Foo : public java::lang::Throwable +{ +public: + static ::java::lang::Class class$; +}; + + +/* + * Step 1: no declarations. A declaration for _Jv_Throw is created. + */ + +void Bar1(void) +{ + Foo* f = new java::lang::Foo; // { dg-error "call to Java constructor" } + throw (f); +} + + +/* + * Step 2: constructor declaration + */ + +extern "C" jobject _Jv_AllocObject (jclass) __attribute__((__malloc__)); + +void Bar2(void) +{ + Foo* f = new java::lang::Foo; + throw (f); +} + + +/* + * Step 3: overloads + */ + +jobject _Jv_AllocObject (jclass, jint, float) __attribute__((__malloc__)); +void _Jv_Throw (int, float) __attribute__ ((__noreturn__)); + +void Bar3(void) +{ + Foo* f = new java::lang::Foo; // { dg-error "should never be overloaded" } + throw (f); // { dg-error "should never be overloaded" } +} diff --git a/gcc/testsuite/g++.dg/lookup/java2.C b/gcc/testsuite/g++.dg/lookup/java2.C new file mode 100644 index 000000000..26fd36922 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/java2.C @@ -0,0 +1,47 @@ +// { dg-do compile } +// { dg-options "-fdollars-in-identifiers" } +// Origin: Giovanni Bajo <giovannibajo at libero dot it> +// Make sure that Java special functions can be called correctly. +// (continue from java1.C) + +extern "Java" +{ + typedef __java_int jint; + namespace java + { + namespace lang + { + class Class; + class Object; + class Throwable {}; + class Foo; + } + } +} + +typedef struct java::lang::Object* jobject; +typedef struct java::lang::Throwable* jthrowable; +typedef class java::lang::Class* jclass; +using java::lang::Foo; + +class Foo : public java::lang::Throwable +{ +public: + static ::java::lang::Class class$; +}; + +/* + * Step 4: Manual declaration of _Jv_Throw + * This is the last case we need to test. In the other file we're testing + * the compiler is able to generate an artifical declaration for this + * function, so we need to test here if it works with a normal declaration. + */ + +extern "C" jobject _Jv_AllocObject (jclass) __attribute__((__malloc__)); +extern "C" void _Jv_Throw (jthrowable) __attribute__ ((__noreturn__)); + +void Bar4(void) +{ + Foo* f = new java::lang::Foo; + throw (f); +} diff --git a/gcc/testsuite/g++.dg/lookup/koenig1.C b/gcc/testsuite/g++.dg/lookup/koenig1.C new file mode 100644 index 000000000..727372719 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/koenig1.C @@ -0,0 +1,13 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 24 Mar 2003 <nathan@codesourcery.com> + +// PR 10026. We ICE'd + +class X; + +void foo() { + X x(1); // { dg-error "incomplete type" "" } + bar(x); // { dg-error "not declared" "" } +} diff --git a/gcc/testsuite/g++.dg/lookup/koenig10.C b/gcc/testsuite/g++.dg/lookup/koenig10.C new file mode 100644 index 000000000..f2fce9cf7 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/koenig10.C @@ -0,0 +1,12 @@ +// Test for proper handling of class-scope enums. + +struct A +{ + enum E { e }; + friend void f (E); +}; + +int main() +{ + f(A::e); +} diff --git a/gcc/testsuite/g++.dg/lookup/koenig11.C b/gcc/testsuite/g++.dg/lookup/koenig11.C new file mode 100644 index 000000000..dab853bf0 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/koenig11.C @@ -0,0 +1,12 @@ +// Test that we treat unions like other classes in arg-dep lookup. + +union U +{ + friend void f (U); +}; + +int main() +{ + U u; + f(u); +} diff --git a/gcc/testsuite/g++.dg/lookup/koenig12.C b/gcc/testsuite/g++.dg/lookup/koenig12.C new file mode 100644 index 000000000..c13589939 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/koenig12.C @@ -0,0 +1,18 @@ +// PR c++/41305 +// We got into infinite recursion instantiating the B<U> series. + +template <class T> struct A { }; +template <class T, class U = A<T> > struct B; +template <class T> struct C { }; + +template <class T, class U> struct B: C<B<U> > +{ + friend void f(B) { } +}; + +B<int> b; + +int main() +{ + f(b); +} diff --git a/gcc/testsuite/g++.dg/lookup/koenig13.C b/gcc/testsuite/g++.dg/lookup/koenig13.C new file mode 100644 index 000000000..625a181f6 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/koenig13.C @@ -0,0 +1,16 @@ +// PR c++/42687 +// DR 705 + +namespace N +{ + struct S { }; + void f(const S &) { } +} + +void f(const N::S &) { } + +int main() +{ + N::S v; + (f)(v); // no ambiguity: ADL is prevented with (), only ::f is considered +} diff --git a/gcc/testsuite/g++.dg/lookup/koenig2.C b/gcc/testsuite/g++.dg/lookup/koenig2.C new file mode 100644 index 000000000..04f952589 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/koenig2.C @@ -0,0 +1,15 @@ +struct S +{ + template <typename T> void operator() (T) {} +}; + +namespace N +{ + S s; + struct A {} a; +} + +using N::s; + +void f () { s(N::a); } + diff --git a/gcc/testsuite/g++.dg/lookup/koenig3.C b/gcc/testsuite/g++.dg/lookup/koenig3.C new file mode 100644 index 000000000..c5dedbe70 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/koenig3.C @@ -0,0 +1,13 @@ +extern "C" void abort (); + +struct S { +}; +void f(S, int) { abort(); } +void f(S, double) {} + +S s; + +int main() { + extern void f(S, int); + f(s, 3.0); +} diff --git a/gcc/testsuite/g++.dg/lookup/koenig4.C b/gcc/testsuite/g++.dg/lookup/koenig4.C new file mode 100644 index 000000000..49fa5eaa6 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/koenig4.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 5 Oct 2004 <nathan@codesourcery.com> + +// Origin: Wolfgang Bangerth <bangerth@dealii.org> +// Incorrect koenig lookup + +struct A {}; + +struct B { + static void foo(); + static void bar(const A &); +}; + +void bar(const A &){} + +void B::foo () { + A a; + bar (a); +} diff --git a/gcc/testsuite/g++.dg/lookup/koenig5.C b/gcc/testsuite/g++.dg/lookup/koenig5.C new file mode 100644 index 000000000..c44543bd5 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/koenig5.C @@ -0,0 +1,49 @@ +// Koenig lookup is not defined as intended in the std. DR 218 gives +// an indication of what is meant. This test case encapsulates the +// current conservative behaviour + +// Copyright (C) 2006 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 27 Aug 2006 <nathan@codesourcery.com> + +namespace N +{ + struct A {}; + void One (...); // { dg-message "N::One" } + void (*Two) (...); // { dg-message "N::Two" } + namespace Three {} // { dg-message "N::Three" } +} + +namespace M +{ + struct B {}; + struct One {}; // { dg-message "M::One" } + void (*Two) (...); // { dg-message "M::Two" } + void Three (...); // { dg-message "M::Three" } +} + +namespace O +{ + struct C {}; + void Two (...); // { dg-message "O::Two" } +} + +void g (N::A *a, M::B *b, O::C *c) +{ + One (a); // ok + One (a, b); // ok + One (b); // { dg-error "not declared" } + // { dg-message "suggested alternatives" "suggested alternative for One" { target *-*-* } 34 } + + Two (c); // ok + Two (a, c); // ok + Two (a); // { dg-error "not declared" } + // { dg-message "suggested alternatives" "suggested alternative for Two" { target *-*-* } 39 } + Two (a, a); // error masked by earlier error + Two (b); // error masked by earlier error + Two (a, b); // error masked by earlier error + + Three (b); // ok + Three (a, b); // ok + Three (a); // { dg-error "not declared" } + // { dg-message "suggested alternatives" "suggested alternative for Three" { target *-*-* } 47 } +} diff --git a/gcc/testsuite/g++.dg/lookup/koenig6.C b/gcc/testsuite/g++.dg/lookup/koenig6.C new file mode 100644 index 000000000..9fdf771e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/koenig6.C @@ -0,0 +1,18 @@ +// PR c++/17365 +// ADL should not find B::N. + +namespace A +{ + namespace B + { + template <typename T> struct N {int n_;}; + } + template <typename T> int N( T p ) { return p->n_; } + template <typename T> void f( T p ) { N(p); } // #1 +} +int main() +{ + A::B::N<int> n; + A::f(&n); + return 0; +} diff --git a/gcc/testsuite/g++.dg/lookup/koenig7.C b/gcc/testsuite/g++.dg/lookup/koenig7.C new file mode 100644 index 000000000..bc54ba96b --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/koenig7.C @@ -0,0 +1,12 @@ +// PR c++/34870 + +template <typename T> +struct Foo +{ + friend void func(const Foo &) {} +}; + +void check(const Foo<int> & x) +{ + func(x); +} diff --git a/gcc/testsuite/g++.dg/lookup/koenig8.C b/gcc/testsuite/g++.dg/lookup/koenig8.C new file mode 100644 index 000000000..b5558552d --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/koenig8.C @@ -0,0 +1,14 @@ +// PR c++/42026, DR 239 +// The local extern declaration prevents arg-dependent lookup. +// { dg-do link } + +namespace NS { + class T { }; + void g(T, int); +} +NS::T parm; +void g(NS::T, float) { } +int main() { + extern void g(NS::T, float); + g(parm, 1); +} diff --git a/gcc/testsuite/g++.dg/lookup/koenig9.C b/gcc/testsuite/g++.dg/lookup/koenig9.C new file mode 100644 index 000000000..f867a32ec --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/koenig9.C @@ -0,0 +1,25 @@ +// Test for sensible handling of template-ids with arg-dep lookup. +// This is still an open issue. + +namespace N +{ + struct A { }; + void f(void (*)(int, N::A)); +} + +namespace M +{ + struct B { }; + void f(void (*)(B, N::A)); +} + +template <class T> +void g(T, N::A); + +void g(); + +int main() +{ + f(g<int>); + f(g<M::B>); +} diff --git a/gcc/testsuite/g++.dg/lookup/linkage1.C b/gcc/testsuite/g++.dg/lookup/linkage1.C new file mode 100644 index 000000000..6f6bdfdea --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/linkage1.C @@ -0,0 +1,4 @@ +// DR 563 + +extern int i; // { dg-error "linkage" } +extern "C" int i; // { dg-error "linkage" } diff --git a/gcc/testsuite/g++.dg/lookup/linkage2.C b/gcc/testsuite/g++.dg/lookup/linkage2.C new file mode 100644 index 000000000..994264d3e --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/linkage2.C @@ -0,0 +1,7 @@ +// PR c++/27227 + +namespace x { + extern "C" const int y; +} +using x::y; +extern "C" int const y=0; diff --git a/gcc/testsuite/g++.dg/lookup/main1.C b/gcc/testsuite/g++.dg/lookup/main1.C new file mode 100644 index 000000000..1de834235 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/main1.C @@ -0,0 +1,3 @@ +struct main {}; + +int main () {} diff --git a/gcc/testsuite/g++.dg/lookup/member1.C b/gcc/testsuite/g++.dg/lookup/member1.C new file mode 100644 index 000000000..82bb657f5 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/member1.C @@ -0,0 +1,11 @@ +// PR c++/14186 + +struct Base +{ + enum { Derived }; +}; + +class Derived : public Base +{ + Derived(); +}; diff --git a/gcc/testsuite/g++.dg/lookup/name-clash1.C b/gcc/testsuite/g++.dg/lookup/name-clash1.C new file mode 100644 index 000000000..6ee4be350 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/name-clash1.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +// Origin: Jakub Jelinek <jakub@redhat.com> +// PR c++/5402 + +struct A +{ + struct B {}; +}; + +struct C +{ + typedef int B; +}; + +struct D : A +{ + struct E : C {}; + struct B {}; +}; diff --git a/gcc/testsuite/g++.dg/lookup/name-clash2.C b/gcc/testsuite/g++.dg/lookup/name-clash2.C new file mode 100644 index 000000000..c200eeebd --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/name-clash2.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Origin: Sven Bilke <bilkes@mail.nih.gov> +// PR c++/9777 + +struct A +{ + struct X {}; + struct Y { void X(); }; +}; + +struct B : A +{ + struct Y : A::Y {}; + struct X : A::X {}; +}; diff --git a/gcc/testsuite/g++.dg/lookup/name-clash3.C b/gcc/testsuite/g++.dg/lookup/name-clash3.C new file mode 100644 index 000000000..eb52a7c10 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/name-clash3.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// PR c++/12102 + +struct A +{ + struct C {} C; +}; + +struct B : A +{ + struct C {} C; +}; diff --git a/gcc/testsuite/g++.dg/lookup/name-clash4.C b/gcc/testsuite/g++.dg/lookup/name-clash4.C new file mode 100644 index 000000000..490f7500e --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/name-clash4.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +// PR c++/18100: Invalid nested type. + +struct A +{ + template<int> struct A {}; // { dg-error "same name" } +}; + +A::A<0> a; // { dg-error "not a template|constructor" } diff --git a/gcc/testsuite/g++.dg/lookup/name-clash5.C b/gcc/testsuite/g++.dg/lookup/name-clash5.C new file mode 100644 index 000000000..7f220d887 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/name-clash5.C @@ -0,0 +1,13 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild <aaw@google.com> +// { dg-do compile } + +// C++ Standard, 3.3, clause 4: +// "[Note: a namespace name or a class template name must be unique in its +// declarative region (7.3.2, clause 14). ]" + +namespace N +{ // { dg-error "previous declaration" } +} + +class N; // { dg-error "redeclared" } diff --git a/gcc/testsuite/g++.dg/lookup/name-clash6.C b/gcc/testsuite/g++.dg/lookup/name-clash6.C new file mode 100644 index 000000000..63a0b15bf --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/name-clash6.C @@ -0,0 +1,13 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild <aaw@google.com> +// { dg-do compile } + +// C++ Standard, 3.3, clause 4: +// "[Note: a namespace name or a class template name must be unique in its +// declarative region (7.3.2, clause 14). ]" + +class N; // { dg-error "previous declaration" } + +namespace N +{ // { dg-error "redeclared" } +} diff --git a/gcc/testsuite/g++.dg/lookup/name-clash7.C b/gcc/testsuite/g++.dg/lookup/name-clash7.C new file mode 100644 index 000000000..5c0690aa8 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/name-clash7.C @@ -0,0 +1,11 @@ +// PR c++/28513 + +class foo { // { dg-error "changes meaning" } +public: + typedef int bar; +}; + +class baz { +public: + foo::bar foo; // { dg-error "declaration" } +}; diff --git a/gcc/testsuite/g++.dg/lookup/name-clash8.C b/gcc/testsuite/g++.dg/lookup/name-clash8.C new file mode 100644 index 000000000..40c487d6a --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/name-clash8.C @@ -0,0 +1,8 @@ +// PR c++/38278 + +struct foo { }; +void bar(); + +struct baz { + static foo (bar)(); +}; diff --git a/gcc/testsuite/g++.dg/lookup/nested1.C b/gcc/testsuite/g++.dg/lookup/nested1.C new file mode 100644 index 000000000..c8988e278 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/nested1.C @@ -0,0 +1,25 @@ +// Build don't link: +// +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Raymond <raymond@magma.magma-da.com>. +// +// PR c++/47 The parser failed to resolve 'B' in the return type of +// A::C::D::foo. + +class A { +public: + class B; + class C; +}; + +class A::B { +}; + +class A::C { + class D; +}; + +class A::C::D { +public: + B* foo(); +}; diff --git a/gcc/testsuite/g++.dg/lookup/new1.C b/gcc/testsuite/g++.dg/lookup/new1.C new file mode 100644 index 000000000..11a6d97dd --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/new1.C @@ -0,0 +1,14 @@ +// { dg-do compile } +// Origin: <igodard at rational dot com> +// PR c++/2518: operator new must not be looked up in local scope + +int main() { + int i; + void* operator new(__SIZE_TYPE__ s, int* p); + int* e = new(&i) int; // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 8 } + int* f = new int; + return 0; +} + +// { dg-message "operator new|candidate expects" "" { target *-*-* } 0 } diff --git a/gcc/testsuite/g++.dg/lookup/new2.C b/gcc/testsuite/g++.dg/lookup/new2.C new file mode 100644 index 000000000..d468182c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/new2.C @@ -0,0 +1,11 @@ +// { dg-do compile } +// Reject [de-]allocation functions declared in a namespace, or +// declared as static. + +namespace A { + void* operator new(__SIZE_TYPE__ s, int* p); // { dg-error "namespace" } + void operator delete(void*); // { dg-error "namespace" } +} + +static void* operator new(__SIZE_TYPE__ s, int* p); // { dg-error "static" } +static void operator delete(void*); // { dg-error "static" } diff --git a/gcc/testsuite/g++.dg/lookup/ns1.C b/gcc/testsuite/g++.dg/lookup/ns1.C new file mode 100644 index 000000000..feeaf751c --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/ns1.C @@ -0,0 +1,22 @@ +// PR c++/12862 + +typedef int Thingo; + +namespace A +{ + void + Thingo(); +} + +void +A::Thingo() +{ + ; +} + +int +main() +{ + A::Thingo(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/lookup/ns2.C b/gcc/testsuite/g++.dg/lookup/ns2.C new file mode 100644 index 000000000..2ad2ec0e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/ns2.C @@ -0,0 +1,17 @@ +// PR c++/18161 + +namespace m +{ + namespace n + { + } +} + +namespace n +{ +} + +namespace o +{ + namespace n = ::m::n; +} diff --git a/gcc/testsuite/g++.dg/lookup/ns3.C b/gcc/testsuite/g++.dg/lookup/ns3.C new file mode 100644 index 000000000..144cba73d --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/ns3.C @@ -0,0 +1,5 @@ +// PR c++/32898 + +namespace N { } + +int N::i; // { dg-error "should have been declared inside" } diff --git a/gcc/testsuite/g++.dg/lookup/ns4.C b/gcc/testsuite/g++.dg/lookup/ns4.C new file mode 100644 index 000000000..aabfcfcb7 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/ns4.C @@ -0,0 +1,21 @@ +// PR c++/43145 +// { dg-do link } + +namespace N { + void f(); +} + +void N::f() +{ + extern int i; + extern void g(); + i = 1; + g(); +} + +namespace N { + int i; + void g() { } +} + +int main() { } diff --git a/gcc/testsuite/g++.dg/lookup/pretty1.C b/gcc/testsuite/g++.dg/lookup/pretty1.C new file mode 100644 index 000000000..a03bd3c3e --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/pretty1.C @@ -0,0 +1 @@ +void foo() { for ( __PRETTY_FUNCTION__ ; ; ) ; } diff --git a/gcc/testsuite/g++.dg/lookup/ptrmem1.C b/gcc/testsuite/g++.dg/lookup/ptrmem1.C new file mode 100644 index 000000000..5bdef2621 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/ptrmem1.C @@ -0,0 +1,15 @@ +struct A { + virtual void f (); +}; + +struct B : public A { +}; + +struct C : public A { +}; + +struct D : public B, C { + virtual void f (); +}; + +void (D::*p)() = &D::f; diff --git a/gcc/testsuite/g++.dg/lookup/redecl1.C b/gcc/testsuite/g++.dg/lookup/redecl1.C new file mode 100644 index 000000000..436316ca0 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/redecl1.C @@ -0,0 +1,7 @@ +// PR c++/14668 + +class A {}; // { dg-error "" } +class B { + static A *A; // { dg-error "" } +}; +A *B::A = 0; diff --git a/gcc/testsuite/g++.dg/lookup/scope-operator1.C b/gcc/testsuite/g++.dg/lookup/scope-operator1.C new file mode 100644 index 000000000..fde36f01e --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/scope-operator1.C @@ -0,0 +1,20 @@ +/* PR c++/250 */ +/* { dg-do compile } */ + +template <class T> void Bar(T *p) +{ +} + +template <class T> class Foo +{ +public: + Foo(T *p) { Bar(p); } + // The global scope operator wasn't respected in this case under gcc 3.0 + void Bar(T *p) { ::Bar<T>(p); } +}; + +int main() +{ + double* d; + Foo<double> f(d); +} diff --git a/gcc/testsuite/g++.dg/lookup/scoped1.C b/gcc/testsuite/g++.dg/lookup/scoped1.C new file mode 100644 index 000000000..f1d3f403e --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/scoped1.C @@ -0,0 +1,22 @@ +// Test that explicitly scoped references to static members work even if +// they belong to an inaccessible base. + +struct A +{ + static int i1; + int i2; // { dg-error "inaccessible" "" } + static void f1 (); + void f2 (); +}; + +struct B: private A { }; +struct C: public B +{ + void g () + { + ::A::i1 = 1; + ::A::i2 = 1; // { dg-error "(access)|(context)" "" } + ::A::f1 (); + ::A::f2 (); // { dg-error "" } + } +}; diff --git a/gcc/testsuite/g++.dg/lookup/scoped2.C b/gcc/testsuite/g++.dg/lookup/scoped2.C new file mode 100644 index 000000000..99cedcec8 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/scoped2.C @@ -0,0 +1,19 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 16 Sep 2002 <nathan@codesourcery.com> + +// Seg faulted. + +struct Base +{ +}; + +struct Derived : Base +{ + void Foo () + { + Base::Baz (); // { dg-error "is not a member" "" } + + } +}; diff --git a/gcc/testsuite/g++.dg/lookup/scoped3.C b/gcc/testsuite/g++.dg/lookup/scoped3.C new file mode 100644 index 000000000..12ef8c8a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/scoped3.C @@ -0,0 +1,23 @@ + +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 24 Dec 2002 <nathan@codesourcery.com> + +// PR 7964. ICE with scoped method call + +struct A { + virtual void ostr() const; +}; + +class B : public virtual A {}; + +template<typename T> +struct C : public B +{ + void ostr() const + { B::ostr(); } +}; + + +template struct C<int>; diff --git a/gcc/testsuite/g++.dg/lookup/scoped4.C b/gcc/testsuite/g++.dg/lookup/scoped4.C new file mode 100644 index 000000000..2d9d90a17 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/scoped4.C @@ -0,0 +1,15 @@ +/* PR c++/754 */ +/* { dg-do compile } */ + +namespace foo +{ + namespace bar + { + enum x {foo + }; + enum {ubit0 = 0x0001}; + // Used to get a parse error before "::" token. + int i=foo::bar::ubit0; + } +} + diff --git a/gcc/testsuite/g++.dg/lookup/scoped5.C b/gcc/testsuite/g++.dg/lookup/scoped5.C new file mode 100644 index 000000000..a4aa7298f --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/scoped5.C @@ -0,0 +1,19 @@ +// { dg-do compile } + +// Origin: pepeaty@yahoo.com + +// PR c++/10230: ICE while determining if refered non-static member +// is from a base type of the current class. + +class A { +public: + class B { + public: + int a; + }; +}; + +class C { +public: + void f(void) { sizeof(A::B::a); } +}; diff --git a/gcc/testsuite/g++.dg/lookup/scoped6.C b/gcc/testsuite/g++.dg/lookup/scoped6.C new file mode 100644 index 000000000..b83b08fe9 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/scoped6.C @@ -0,0 +1,17 @@ +template <typename X> +class Foo { + int i; +public: + Foo() { + X::explode(); // { dg-error "" } + } +}; + +class Bar { + Foo<int> foo_; +public: + Bar() {} // { dg-message "instantiated" } +}; + +template class Foo<int>; + diff --git a/gcc/testsuite/g++.dg/lookup/scoped7.C b/gcc/testsuite/g++.dg/lookup/scoped7.C new file mode 100644 index 000000000..a9d70d06e --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/scoped7.C @@ -0,0 +1,20 @@ +//PR c++/11507 +// Origin: kai-gcc-bugs@khms.westfalen.de and bangerth@dealii.org +//The new parser used to fail on this. + +// { dg-do compile } + +namespace NS +{ + void foo(bool arg1); +} + +namespace M { + namespace K { + bool Bc(bool x); + } + + void bar() { + NS::foo (K::Bc(true)); // GCC could not find K or Bc. + } +} diff --git a/gcc/testsuite/g++.dg/lookup/scoped8.C b/gcc/testsuite/g++.dg/lookup/scoped8.C new file mode 100644 index 000000000..2764f75c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/scoped8.C @@ -0,0 +1,18 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> + +// PR c++/10371: Incorrect tree node built in +// finish_non_static_data_member. + +struct A +{ + int i; // { dg-error "non-static" } +}; + +template <int> struct B +{ + int foo() { return A::i; } // { dg-error "this location" } +}; + +template struct B<0>; diff --git a/gcc/testsuite/g++.dg/lookup/strong-using-1.C b/gcc/testsuite/g++.dg/lookup/strong-using-1.C new file mode 100644 index 000000000..aa0c5f9be --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/strong-using-1.C @@ -0,0 +1,16 @@ +// PR c++/13594 (secondary) + +// { dg-options "" } +// { dg-do compile } + +namespace fool { + inline namespace foo { + template <class T> void swap(T, T); + } + template <class T> void swap(T); +} + +int main() { + // we used to fail to look up the associated namespace here + fool::swap(1, 1); +} diff --git a/gcc/testsuite/g++.dg/lookup/strong-using-2.C b/gcc/testsuite/g++.dg/lookup/strong-using-2.C new file mode 100644 index 000000000..38bb54c2f --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/strong-using-2.C @@ -0,0 +1,24 @@ +// PR c++/13594 + +// { dg-options "" } +// { dg-do compile } + +namespace foo { + inline namespace foo_impl { + class T; // { dg-error "T" "" } + } +} +namespace bar { + inline namespace bar_impl { + class T; // { dg-error "T" "" } + } + using namespace foo; +} +namespace baz { + using namespace foo; + using namespace bar; +} + +foo::T *t1; +bar::T *t2; +baz::T *t3; // { dg-error "(ambiguous|does not name a type)" "" } diff --git a/gcc/testsuite/g++.dg/lookup/strong-using-3.C b/gcc/testsuite/g++.dg/lookup/strong-using-3.C new file mode 100644 index 000000000..7679c6f1d --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/strong-using-3.C @@ -0,0 +1,18 @@ +// PR c++/13659 + +// { dg-options "" } +// { dg-do compile } + +namespace bar { + inline namespace foo { + template <class T> void f(T, T); + } + template <class T> void f(T); +} + +int main() { + // Make sure both declarations are brought in. + using bar::f; + f(1); + f(1, 1); +} diff --git a/gcc/testsuite/g++.dg/lookup/strong-using-4.C b/gcc/testsuite/g++.dg/lookup/strong-using-4.C new file mode 100644 index 000000000..5ea17844a --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/strong-using-4.C @@ -0,0 +1,8 @@ +// PR c++/16301 + +// { dg-do compile } + +namespace NS2 +{ + using namespace NS1 __attribute__ ((strong)); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/lookup/strong-using-5.C b/gcc/testsuite/g++.dg/lookup/strong-using-5.C new file mode 100644 index 000000000..555adb0c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/strong-using-5.C @@ -0,0 +1,26 @@ +// PR c++/33486 + +// { dg-options "" } + +namespace A +{ + inline namespace B + { + struct T + { + struct U { }; + U f(); + }; + } + + inline namespace C + { + void g (T::U); + } +} + +int main() +{ + A::T t; + g(t.f()); +} diff --git a/gcc/testsuite/g++.dg/lookup/struct-hack1.C b/gcc/testsuite/g++.dg/lookup/struct-hack1.C new file mode 100644 index 000000000..e84d65b33 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/struct-hack1.C @@ -0,0 +1,38 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 19 Apr 2003 <nathan@codesourcery.com> + +// PR 10405. ICE + +#define MEM_ENUM(name) int name; enum name {}; + +struct Base +{ + MEM_ENUM (a) + MEM_ENUM (b) + MEM_ENUM (c) + MEM_ENUM (d) + MEM_ENUM (e) + MEM_ENUM (f) + MEM_ENUM (g) + MEM_ENUM (h) + MEM_ENUM (i) + MEM_ENUM (j) + MEM_ENUM (k) + MEM_ENUM (l) + MEM_ENUM (m) + MEM_ENUM (n) + MEM_ENUM (o) + MEM_ENUM (p) + MEM_ENUM (q) + MEM_ENUM (r) + MEM_ENUM (s) + MEM_ENUM (t) + MEM_ENUM (u) + MEM_ENUM (v) + MEM_ENUM (w) + }; + +struct D : Base {}; + diff --git a/gcc/testsuite/g++.dg/lookup/struct1.C b/gcc/testsuite/g++.dg/lookup/struct1.C new file mode 100644 index 000000000..f4b83ecf6 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/struct1.C @@ -0,0 +1,14 @@ +// Various struct lookup tests. We didn't used to complain about +// the definition of C. + +struct A; +typedef struct A B; // { dg-error "previous declaration" } +struct B; // { dg-error "using typedef-name" } + +typedef struct { int i; } C; // { dg-error "previous declaration" } +struct C; // { dg-error "using typedef-name" } + +struct D; +typedef struct D D; +typedef struct D { int i; } D; +typedef struct D D; diff --git a/gcc/testsuite/g++.dg/lookup/struct2.C b/gcc/testsuite/g++.dg/lookup/struct2.C new file mode 100644 index 000000000..a66f403c2 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/struct2.C @@ -0,0 +1,7 @@ +// PR c++/14510 + +struct c {}; +namespace A { + int c(struct c*req); +} +int A::c(struct c*req) {} diff --git a/gcc/testsuite/g++.dg/lookup/suggestions1.C b/gcc/testsuite/g++.dg/lookup/suggestions1.C new file mode 100644 index 000000000..1185d5841 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/suggestions1.C @@ -0,0 +1,8 @@ +// { dg-do compile } + +namespace N { namespace M { int foo; } } // { dg-message "N::M::foo" } +int f (void) { return N::foo; } // { dg-error "not a member" } +// { dg-message "suggested alternative" "missing namespace" { target *-*-* } 4 } + +int g (void) { return ::foo; } // { dg-error "not been declared" } +// { dg-message "suggested alternative" "omitted namespace" { target *-*-* } 7 } diff --git a/gcc/testsuite/g++.dg/lookup/template1.C b/gcc/testsuite/g++.dg/lookup/template1.C new file mode 100644 index 000000000..44b599a6d --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/template1.C @@ -0,0 +1,23 @@ +/* PR c++/3009 */ +/* { dg-do run } */ +// According to 14.6.2.4 of C++ Standard: +// "If a base class is a dependent type, a member of that +// class cannot hide a name declared within a template, or a +// name from the template's enclosing scopes." + +class B { +public: + int foo() { return 1; } +}; + +int foo() { return 0; } + +template <class T> class C : public T { +public: + int caller() { return foo(); } // This must be ::foo, not B::foo. +}; + +int main() { + C<B> c; + return c.caller(); // Returns 1 if we got the wrong one. +} diff --git a/gcc/testsuite/g++.dg/lookup/template2.C b/gcc/testsuite/g++.dg/lookup/template2.C new file mode 100644 index 000000000..0e8921261 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/template2.C @@ -0,0 +1,31 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 24 Mar 2003 <nathan@codesourcery.com> + +// PR 10199. Lookup problems + +class X { +public: + template<int d> + int bar (); +}; + +template<int x> +int fooo (); + +template<class T> +void bar (T& g) +{ + int kk = fooo<17>(); // OK + X x; + int k = x.bar<17>(); // Not OK +} + +int main () +{ + X x; + int k=x.bar<17>(); // OK + int n; + bar(n); +} diff --git a/gcc/testsuite/g++.dg/lookup/template3.C b/gcc/testsuite/g++.dg/lookup/template3.C new file mode 100644 index 000000000..e5f6f18ed --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/template3.C @@ -0,0 +1,35 @@ +// Origin PR c++/47957 +// { dg-do compile } + +struct S +{ + int m; + + S() + : m(0) + { + } +}; + +struct Base +{ + typedef S T; +}; + +template<class T> +struct Derived : public Base +{ + int + foo() + { + T a; // This is Base::T, not the template parameter. + return a.m; + } +}; + +int +main() +{ + Derived<char> d; + return d.foo(); +} diff --git a/gcc/testsuite/g++.dg/lookup/this1.C b/gcc/testsuite/g++.dg/lookup/this1.C new file mode 100644 index 000000000..20051bf75 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/this1.C @@ -0,0 +1,8 @@ +// PR c++/27581 +// { dg-do compile } + +struct A +{ + template<int> static void foo(); + static void bar() { this->A::foo<0>(); } // { dg-error "unavailable" } +}; diff --git a/gcc/testsuite/g++.dg/lookup/two-stage1.C b/gcc/testsuite/g++.dg/lookup/two-stage1.C new file mode 100644 index 000000000..db7117656 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/two-stage1.C @@ -0,0 +1,18 @@ +/* PR c++/2437 */ +/* { dg-do run } */ + +// Test of two-stage name lookup. + +int g(double) { return 0; } + +template <class T> struct X +{ + int f() { return g(2); } // should call g(double) +}; + +inline int g(int) { return 1; } + +int main() +{ + return X<int>().f(); // should call g(double), but used to call g(int) +} diff --git a/gcc/testsuite/g++.dg/lookup/two-stage2.C b/gcc/testsuite/g++.dg/lookup/two-stage2.C new file mode 100644 index 000000000..67d8ab521 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/two-stage2.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// PR c++/2922 + +char& f(char); + +template<class T> +void g(T t) +{ + char& c1 = f(1); // not dependent + char& c2 = f(t); // dependent +} + +int&f (int); + +int main() +{ + g(2); // two f(char) + g('a'); // two f(char) +} diff --git a/gcc/testsuite/g++.dg/lookup/two-stage3.C b/gcc/testsuite/g++.dg/lookup/two-stage3.C new file mode 100644 index 000000000..fff853c1b --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/two-stage3.C @@ -0,0 +1,22 @@ +// { dg-do compile } +// PR c++/2922 + +namespace tpl_ { + +template<class T> +char test(T); + +template<class T> +struct check +{ + static T const t; + enum { value = 1 == sizeof(test(t)) }; +}; + +double test(int); + +} + +bool const two_phase_lookup_supported = tpl_::check<int>::value; + +int compile_time_assert[two_phase_lookup_supported ? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/lookup/two-stage4.C b/gcc/testsuite/g++.dg/lookup/two-stage4.C new file mode 100644 index 000000000..bbb44afa0 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/two-stage4.C @@ -0,0 +1,20 @@ + +// Contributed by Douglas Gregor <doug.gregor@gmail.com> + +template<class T> struct wrap {}; + +template<typename T> bool& operator==(wrap<T>, wrap<T>); + +template<typename T> +void g(T, wrap<wrap<int> > x) +{ + bool& b = x == x; // { dg-bogus "invalid initialization of reference" "" { xfail *-*-*} } +} + +template<typename T> int& operator==(wrap<wrap<T> >, wrap<wrap<T> >); + +void h() +{ + wrap<wrap<int> > x; + g(17, x); +} diff --git a/gcc/testsuite/g++.dg/lookup/two-stage5.C b/gcc/testsuite/g++.dg/lookup/two-stage5.C new file mode 100644 index 000000000..bfc405b99 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/two-stage5.C @@ -0,0 +1,19 @@ +// { dg-do run } +extern "C" void abort (); + +namespace N { +template <class T> T foo (T) { return T (); } +template <class T> T bar (T t) { return foo (t); } +} + +struct S { S (int i = 0): i_ (i) { } int i_; }; + +namespace N { +/* template <> */ S foo (S) { return S (1); } +} + +int main () +{ + if (1 == N::bar (S()).i_) + abort (); +} diff --git a/gcc/testsuite/g++.dg/lookup/typedef1.C b/gcc/testsuite/g++.dg/lookup/typedef1.C new file mode 100644 index 000000000..f712fc25a --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/typedef1.C @@ -0,0 +1,32 @@ +// PR c++/33516 +// { dg-do compile } + +struct S1; +typedef S1 T1; +struct S1 { + typedef int U; + T1::U i; +}; +struct S2; +typedef S2 T2; +struct S2 { + typedef int U; +}; +T2::U j; +struct S3; +typedef S3 T3; +struct S3 { + typedef int U; + S3::U i; +}; + +void +foo () +{ + S1 s1; + S2 s2; + S3 s3; + s1.i = 6; + j = 7; + s3.i = 8; +} diff --git a/gcc/testsuite/g++.dg/lookup/used-before-declaration.C b/gcc/testsuite/g++.dg/lookup/used-before-declaration.C new file mode 100644 index 000000000..b51d270c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/used-before-declaration.C @@ -0,0 +1,5 @@ +// Copyroght (C) 2003 Free Software Foundation +// Origin: PR/12832, Jonathan Wakely <redi@gcc.gnu.org> + +void f() { g(); } // { dg-error "not declared" "" } +void g() { } diff --git a/gcc/testsuite/g++.dg/lookup/using-10.C b/gcc/testsuite/g++.dg/lookup/using-10.C new file mode 100644 index 000000000..1ca8a7832 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using-10.C @@ -0,0 +1,22 @@ +// PR c++/13659 + +// { dg-do compile } + +namespace foo1 { + template <class T> void f(T); +} +namespace foo2 { + template <class T> void f(T, T); +} +namespace foo { + using namespace foo1; + using namespace foo2; +} + +// Make sure we bring in both declarations. +using foo::f; + +int main() { + f(1); + f(1, 1); +} diff --git a/gcc/testsuite/g++.dg/lookup/using.C b/gcc/testsuite/g++.dg/lookup/using.C new file mode 100644 index 000000000..30e22c067 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using.C @@ -0,0 +1,23 @@ +// { dg-do compile } + +struct X { }; +struct Y { }; +struct Z { }; + +struct Base { + X f() { return X(); } + Y f() const { return Y(); } +}; + +struct Derived : Base { + using Base::f; + Z f(int) { return Z(); } +}; + +int main() +{ + Derived d; + X x = d.f(); // { dg-bogus "Y" "" } +} + + diff --git a/gcc/testsuite/g++.dg/lookup/using11.C b/gcc/testsuite/g++.dg/lookup/using11.C new file mode 100644 index 000000000..9eb7e9fe7 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using11.C @@ -0,0 +1,9 @@ +namespace N1 { + enum e { a }; + void e(char); +} + +void f() { + using N1::e; + enum e x; +} diff --git a/gcc/testsuite/g++.dg/lookup/using12.C b/gcc/testsuite/g++.dg/lookup/using12.C new file mode 100644 index 000000000..4aa5ce681 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using12.C @@ -0,0 +1,4 @@ +// PR c++/16707 + +int i; +using N::i; // { dg-error "'N' has not been declared" } diff --git a/gcc/testsuite/g++.dg/lookup/using13.C b/gcc/testsuite/g++.dg/lookup/using13.C new file mode 100644 index 000000000..c102fdcf8 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using13.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +// Origin: Stefan Straßer <sstrasser@systemhaus-gruppe.de> + +// PR c++/20240: + +namespace A { int a; } + +namespace C{ + int a; + using A::a; // { dg-error "already declared" } +} diff --git a/gcc/testsuite/g++.dg/lookup/using14.C b/gcc/testsuite/g++.dg/lookup/using14.C new file mode 100644 index 000000000..c953bccc2 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using14.C @@ -0,0 +1,9 @@ +// PR c++/21784 +// { dg-options "" } + +namespace mine +{ + int cpow; +} + +using mine::cpow; diff --git a/gcc/testsuite/g++.dg/lookup/using15.C b/gcc/testsuite/g++.dg/lookup/using15.C new file mode 100644 index 000000000..b5ca3a876 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using15.C @@ -0,0 +1,10 @@ +// PR c++/27933 +// { dg-do compile } + +template<int> struct A +{ + int i; + A() { using i; } // { dg-error "nested-name-specifier|declared" } +}; + +A<0> a; diff --git a/gcc/testsuite/g++.dg/lookup/using16.C b/gcc/testsuite/g++.dg/lookup/using16.C new file mode 100644 index 000000000..a396afb97 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using16.C @@ -0,0 +1,18 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild <aaw@google.com> +// { dg-do compile } + +namespace M { + struct S {}; // { dg-error "struct M::S" "candidate 1" } +} + +namespace N { + int S; + struct S {}; // { dg-error "struct N::S" "candidate 2" } +} + +using namespace M; +using namespace N; + +struct ::S s; // { dg-bogus "ambiguous.*ambiguous" "duplicate error" } +// { dg-error "reference to 'S' is ambiguous|invalid type" "" { target *-*-* } 17 }} diff --git a/gcc/testsuite/g++.dg/lookup/using17.C b/gcc/testsuite/g++.dg/lookup/using17.C new file mode 100644 index 000000000..b98b21a0c --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using17.C @@ -0,0 +1,14 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild <aaw@google.com> +// { dg-do compile } + +namespace M { + struct S {}; // { dg-error "struct M::S" "candidate 2" } +} + +int S; +struct S {}; // { dg-error "candidates are: struct S" "candidate 1" } + +using namespace M; + +struct S s; // { dg-error "reference to 'S' is ambiguous|invalid type in declaration" "" } diff --git a/gcc/testsuite/g++.dg/lookup/using18.C b/gcc/testsuite/g++.dg/lookup/using18.C new file mode 100644 index 000000000..37557148e --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using18.C @@ -0,0 +1,20 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild <aaw@google.com> +// { dg-do compile } + +namespace N1 { + void f (); + struct f; // { dg-error "" "candidate" } +} + +namespace N2 { + void f (int); + struct f; // { dg-error "" "candidate" } +} + +namespace M { + using namespace N1; + using namespace N2; +} + +using M::f; // { dg-error "ambiguous" } diff --git a/gcc/testsuite/g++.dg/lookup/using19.C b/gcc/testsuite/g++.dg/lookup/using19.C new file mode 100644 index 000000000..973998bc0 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using19.C @@ -0,0 +1,21 @@ +// Copyright (C) 2007 Free Software Foundation +// Contributed by Ollie Wild <aaw@google.com> +// { dg-do compile } + + +// C++ Standard, 7.3.3, clause 10: +// "Since a using-declaration is a declaration, the restrictions on +// declarations of the same name in the same declarative region (3.3) also +// apply to using-declarations." + +namespace M +{ + union A; + void B(); +} + +void A(); +union B; + +using M::A; +using M::B; diff --git a/gcc/testsuite/g++.dg/lookup/using2.C b/gcc/testsuite/g++.dg/lookup/using2.C new file mode 100644 index 000000000..cd878b9fe --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using2.C @@ -0,0 +1,45 @@ +// Copyright (C) 2001, 2002, 2009 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// Contributed by Gabriel Dos Reis <gdr@codesourcery.com> + +// { dg-do compile } + +namespace N +{ + template<int> void f() {} +} + +using N; // { dg-error "(using-declaration)|(nested-name)" "" } +using ::N; // { dg-error "using-declaration" "" } +using N::f< 0 >; // { dg-error "using-declaration" "" } + +struct A { + template <class T> void f(T); + template <class T> struct X { }; +}; + +struct B : A { + using A::X; // OK + using A::f; // OK +}; + +struct C : A { + using A::f<double>; // { dg-error "using-declaration" "" } + using A::X<int>; // { dg-error "using-declaration" "" } +}; + diff --git a/gcc/testsuite/g++.dg/lookup/using20.C b/gcc/testsuite/g++.dg/lookup/using20.C new file mode 100644 index 000000000..dc1d293a2 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using20.C @@ -0,0 +1,18 @@ +// PR c++/40476 + +namespace A +{ + int i; // { dg-error "i" } +} +using namespace A; +namespace B +{ + namespace B2 + { + int i; // { dg-error "i" } + } + using namespace B2; +} +using namespace B; + +int j = ::i; // { dg-error "ambiguous" } diff --git a/gcc/testsuite/g++.dg/lookup/using21.C b/gcc/testsuite/g++.dg/lookup/using21.C new file mode 100644 index 000000000..3db97b4b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using21.C @@ -0,0 +1,13 @@ +// PR c++/40799 + +namespace Bar { + typedef int A; +} +class CollectionDeleteGuard { +public: + CollectionDeleteGuard(int); +}; +CollectionDeleteGuard::CollectionDeleteGuard(int) +{ + using Bar::A; +} diff --git a/gcc/testsuite/g++.dg/lookup/using22.C b/gcc/testsuite/g++.dg/lookup/using22.C new file mode 100644 index 000000000..2396f9ab1 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using22.C @@ -0,0 +1,17 @@ +// PR c++/39786 + +namespace A { + char (*f(char *p))[13] { return 0; } +} + +namespace B { + namespace C { + char (*f(int p))[42] { return 0; } + } + using namespace C; +} + +using namespace B; +using namespace A; + +char x[sizeof *::f(0) == 42 ? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/lookup/using3.C b/gcc/testsuite/g++.dg/lookup/using3.C new file mode 100644 index 000000000..f36427597 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using3.C @@ -0,0 +1,12 @@ +// PR c++/9798 + +namespace std { } +namespace STL { using namespace std; } +namespace std { + using namespace STL; +} +namespace STL { + struct A { + void B() { using namespace std; } + }; +} diff --git a/gcc/testsuite/g++.dg/lookup/using4.C b/gcc/testsuite/g++.dg/lookup/using4.C new file mode 100644 index 000000000..a6421c875 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using4.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Origin: Richard Guenther <rguenth@tat.physik.uni-tuebingen.de> + +// PR c++/9432: ICE in validate_nonmember_using_decl when decl is a +// SCOPE_REF. + +template <class T> struct Foo; +template <class T> +struct Bar : public Foo<T> { + void foo() + { + using Foo<T>::i; // { dg-error "not a namespace" } + } +}; diff --git a/gcc/testsuite/g++.dg/lookup/using5.C b/gcc/testsuite/g++.dg/lookup/using5.C new file mode 100644 index 000000000..b443b9774 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using5.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> + +// PR c++/10554: ICE for member using declaration with failed +// scope name lookup. + +template <typename> struct A +{ + typedef A X; + void foo(); +}; + +template <typename T> struct B : A<T> +{ + using X::foo; // { dg-error "declared|nested-name-specifier|non-member" } +}; diff --git a/gcc/testsuite/g++.dg/lookup/using6.C b/gcc/testsuite/g++.dg/lookup/using6.C new file mode 100644 index 000000000..416f0b525 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using6.C @@ -0,0 +1,11 @@ +// { dg-do compile } + +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/9022, nested namespace in using declaration + +namespace gnu { + namespace gcc { + } +} +using gnu::gcc; // { dg-error "namespace" } diff --git a/gcc/testsuite/g++.dg/lookup/using7.C b/gcc/testsuite/g++.dg/lookup/using7.C new file mode 100644 index 000000000..69e27da47 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using7.C @@ -0,0 +1,12 @@ +template <typename T, bool=T::X> struct A +{ + int i; +}; + +template <typename T> struct B : A<T> // { dg-error "incomplete" } +{ + using A<T>::i; // { dg-error "incomplete" "incomplete" } + // { dg-error "using" "using" { target *-*-* } 8 } +}; + +B<void> b; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/lookup/using8.C b/gcc/testsuite/g++.dg/lookup/using8.C new file mode 100644 index 000000000..26eb4d325 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using8.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// Origin: Bill Clarke <llib at computer dot org> +// PR c++/11097: using declartion for a converter operator to a nested class +// in a base type + +template <typename T> +struct A +{ + struct Nested {}; + operator Nested*(); +}; + +template <typename T> +struct B : A<T> +{ + using A<T>::operator typename A<T>::Nested*; +}; + +template struct B<int>; diff --git a/gcc/testsuite/g++.dg/lookup/using9.C b/gcc/testsuite/g++.dg/lookup/using9.C new file mode 100644 index 000000000..32abb5371 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/using9.C @@ -0,0 +1,31 @@ +// { dg-do compile } +// Origin: C++ Standard Draft (7.3.3/12) +// PR c++/2294: using declarations should not conflict, but only cause +// an ambiguous overload set to be created. + +namespace B { + void f(int); // { dg-message "note" } + void f(double); // { dg-message "note" } +} + +namespace C { + void f(int); // { dg-message "note" } + void f(double); // { dg-message "note" } + void f(char); // { dg-message "note" } +} + +void h() +{ + using B::f; + using C::f; + f('h'); + f(1); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 22 } + void f(int); // { dg-error "previous using declaration" } +} + +void m() +{ + void f(int); + using B::f; // { dg-error "already declared" } +} diff --git a/gcc/testsuite/g++.dg/lto/20080709_0.C b/gcc/testsuite/g++.dg/lto/20080709_0.C new file mode 100644 index 000000000..55ae8c9ec --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20080709_0.C @@ -0,0 +1,11 @@ +// { dg-lto-do run } + +class Init { +}; + +int f(Init *a) { +} + +int main(void){ + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20080829_0.C b/gcc/testsuite/g++.dg/lto/20080829_0.C new file mode 100644 index 000000000..0890cf66d --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20080829_0.C @@ -0,0 +1,9 @@ +// { dg-lto-do assemble } + +/* The replacement of cos+sin with __builtin_cexpi done by + pass_cse_sincos was using a builtin for which we had no attributes. + This was causing the operand scanner to materialize a VDEF at the + builtin call-site which was not marked for renaming, thus tripping + up the SSA verifier. */ +extern "C" { extern double cos (double); extern double sin (double); } +double func(double &in) { return cos(in) + sin(in); } diff --git a/gcc/testsuite/g++.dg/lto/20080904_0.C b/gcc/testsuite/g++.dg/lto/20080904_0.C new file mode 100644 index 000000000..0161a00be --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20080904_0.C @@ -0,0 +1,37 @@ +// { dg-lto-do run } + +/* This test will fail to link if the vtable for Derived is not emitted. */ + +class Base { +public: + Base(char *buf, unsigned len) + : _buf(buf), + _len(len) + {} + + virtual int length () { return _len; } + +private: + char * _buf; + unsigned _len; +}; + +class Derived : public Base { +public: + Derived(char *buf, unsigned len) + : Base(buf, len), + _ctr(len) + {} + + virtual int length () { return _ctr; } + +private: + unsigned _ctr; +}; + +int main () +{ + Derived *d = new Derived (new char[256], 256); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20080907_0.C b/gcc/testsuite/g++.dg/lto/20080907_0.C new file mode 100644 index 000000000..9a4552310 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20080907_0.C @@ -0,0 +1,3 @@ +// { dg-lto-do assemble } +struct Foo { void func (); }; Foo & bar () { } struct Baz { Baz (Baz &); }; +Baz dummy() { bar().func(); } diff --git a/gcc/testsuite/g++.dg/lto/20080908-1_0.C b/gcc/testsuite/g++.dg/lto/20080908-1_0.C new file mode 100644 index 000000000..8b761c084 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20080908-1_0.C @@ -0,0 +1,36 @@ +/* { dg-lto-do run } */ +extern "C" { extern void *memcpy (void *, const void *, unsigned); } + +inline int +bci (const float &source) +{ + int dest; + memcpy (&dest, &source, sizeof (dest)); + return dest; +} + +inline float +bcf (const int &source) +{ + float dest; + memcpy (&dest, &source, sizeof (dest)); + return dest; +} + +float +Foo () +{ + const int foo = bci (0.0f); + int bar = foo; + const int baz = foo & 1; + if (!baz && (foo & 2)) + bar = 0; + return bcf (bar); +} + +int main () +{ + if (Foo () != 0.0) + return 1; + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20080908-2_0.C b/gcc/testsuite/g++.dg/lto/20080908-2_0.C new file mode 100644 index 000000000..7042b3d08 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20080908-2_0.C @@ -0,0 +1,3 @@ +/* { dg-lto-do assemble } */ +struct Foo { double x[3]; }; +Foo func() { Foo f = { { 0, 0, 0 } }; return f; } diff --git a/gcc/testsuite/g++.dg/lto/20080908-3_0.C b/gcc/testsuite/g++.dg/lto/20080908-3_0.C new file mode 100644 index 000000000..dac3cddb6 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20080908-3_0.C @@ -0,0 +1,16 @@ +/* { dg-lto-do run } */ + +volatile double bar; + +int foo() +{ + double baz = -__builtin_huge_val(); + return baz <= -bar; +} + +int main() +{ + if (foo () != 1) + return 1; + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20080909-1_0.C b/gcc/testsuite/g++.dg/lto/20080909-1_0.C new file mode 100644 index 000000000..245ca58f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20080909-1_0.C @@ -0,0 +1,3 @@ +// { dg-lto-do assemble } +// { dg-lto-options {{-flto}} } +int *i = (int[]) {0}; diff --git a/gcc/testsuite/g++.dg/lto/20080910-1_0.C b/gcc/testsuite/g++.dg/lto/20080910-1_0.C new file mode 100644 index 000000000..48e9e5d15 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20080910-1_0.C @@ -0,0 +1,2 @@ +// { dg-lto-do assemble } +struct Foo { Foo(int); }; void func() { new Foo(0); } diff --git a/gcc/testsuite/g++.dg/lto/20080912-1_0.C b/gcc/testsuite/g++.dg/lto/20080912-1_0.C new file mode 100644 index 000000000..ebead90e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20080912-1_0.C @@ -0,0 +1,3 @@ +// { dg-lto-do assemble } +struct Foo { double x[3]; }; +Foo func() { Foo f = { { 0, 0, 0 } }; return f; } diff --git a/gcc/testsuite/g++.dg/lto/20080912_0.C b/gcc/testsuite/g++.dg/lto/20080912_0.C new file mode 100644 index 000000000..7b3039fbf --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20080912_0.C @@ -0,0 +1,4 @@ +// { dg-lto-do assemble } +class Foo { virtual void f(); }; +class Bar:public Foo { }; +void func() { Bar(); } diff --git a/gcc/testsuite/g++.dg/lto/20080915_0.C b/gcc/testsuite/g++.dg/lto/20080915_0.C new file mode 100644 index 000000000..3789765a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20080915_0.C @@ -0,0 +1,29 @@ +// { dg-lto-do assemble } +struct Foo { + static const int dummy; + + int bit_field:1; + int dummy2:1; + int dummy3:1; +}; + +struct Bar { + Foo foo; +}; + +int func(const Bar& b) { + return b.foo.bit_field; +} + +struct Baz { + Bar& operator*() {} +}; + +void func1(Baz baz, int i, Bar bar) { + i || func(bar); + *baz = bar; +} + +void func2(Baz baz, Bar bar) { + func1(baz, 0, bar); +} diff --git a/gcc/testsuite/g++.dg/lto/20080916_0.C b/gcc/testsuite/g++.dg/lto/20080916_0.C new file mode 100644 index 000000000..3c900cd43 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20080916_0.C @@ -0,0 +1,12 @@ +/* { dg-lto-do assemble } */ + +enum _Ios_Fmtflags { + _S_boolalpha }; + +class ios_base { + static const _Ios_Fmtflags boolalpha = _S_boolalpha; + _Ios_Fmtflags _M_flags; +}; + +ios_base& g() { +} diff --git a/gcc/testsuite/g++.dg/lto/20080917_0.C b/gcc/testsuite/g++.dg/lto/20080917_0.C new file mode 100644 index 000000000..2f4f33bd0 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20080917_0.C @@ -0,0 +1,29 @@ +// { dg-lto-do assemble } +// { dg-lto-options {{-O2 -flto -funsigned-char}} } +int +foo (char *s, int flag) +{ + for (;;) + { + unsigned char c; + if (flag) + c = *s; + else + c = *s; + return c; + } +} + +int +baz (const char *s, int flag) +{ + for (;;) + { + unsigned char c; + if (flag) + c = *s; + else + c = *s; + return c; + } +} diff --git a/gcc/testsuite/g++.dg/lto/20080924_0.C b/gcc/testsuite/g++.dg/lto/20080924_0.C new file mode 100644 index 000000000..b1e381351 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20080924_0.C @@ -0,0 +1,16 @@ +// { dg-lto-do assemble } +// { dg-lto-options {{-O2 -flto -fno-strict-aliasing}} } + +namespace ns +{ + template <class> class hash_set { }; +} + +struct Foo +{ + long long f1, f2, f3; +}; + +void func(ns::hash_set<int>) { + Foo foo = { 0, 0, 0 }; +} diff --git a/gcc/testsuite/g++.dg/lto/20080926_0.C b/gcc/testsuite/g++.dg/lto/20080926_0.C new file mode 100644 index 000000000..d6a7bbffc --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20080926_0.C @@ -0,0 +1,4 @@ +// { dg-lto-do assemble } +// { dg-lto-options {{-O2 -flto -fno-strict-aliasing}} } +extern int foo(); +void bar() { try { int i = foo(); } catch(int) { } } diff --git a/gcc/testsuite/g++.dg/lto/20081008_0.C b/gcc/testsuite/g++.dg/lto/20081008_0.C new file mode 100644 index 000000000..258265a4f --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081008_0.C @@ -0,0 +1,36 @@ +// { dg-lto-do assemble } +// { dg-lto-options {{-flto}} } + +struct Foo +{ + virtual void func() = 0; +}; + +struct Bar +{ + Foo *field; + void func2(); +}; + +struct Baz +{ + Bar &bar(); + Baz(); +}; + +struct Zonk +{ + virtual ~Zonk() { + } + virtual void func3() = 0; +}; + +void Mumble(Zonk *) { +} + +extern "C" +{ + void __attribute__ ((nothrow)) __cxa_pure_virtual() { + Baz().bar().func2(); + } +} diff --git a/gcc/testsuite/g++.dg/lto/20081022.h b/gcc/testsuite/g++.dg/lto/20081022.h new file mode 100644 index 000000000..bccd2ad7b --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081022.h @@ -0,0 +1,8 @@ +class foo +{ +public: + int bar () + { + return 0; + } +}; diff --git a/gcc/testsuite/g++.dg/lto/20081022_0.C b/gcc/testsuite/g++.dg/lto/20081022_0.C new file mode 100644 index 000000000..219f92d6a --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081022_0.C @@ -0,0 +1,11 @@ +#include "20081022.h" + +int +f (foo * a) +{ + return a->bar (); +} + +main() +{ +} diff --git a/gcc/testsuite/g++.dg/lto/20081022_1.C b/gcc/testsuite/g++.dg/lto/20081022_1.C new file mode 100644 index 000000000..94c5aecfd --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081022_1.C @@ -0,0 +1,7 @@ +#include "20081022.h" + +int +g (foo * a) +{ + return a->bar (); +} diff --git a/gcc/testsuite/g++.dg/lto/20081023_0.C b/gcc/testsuite/g++.dg/lto/20081023_0.C new file mode 100644 index 000000000..ab3fc36f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081023_0.C @@ -0,0 +1,14 @@ +// { dg-lto-do link } +extern inline void __attribute__ ((__always_inline__)) func (void) +{ +} + +void +f (void) +{ + func (); +} + +main() +{ +} diff --git a/gcc/testsuite/g++.dg/lto/20081109-1_0.C b/gcc/testsuite/g++.dg/lto/20081109-1_0.C new file mode 100644 index 000000000..474ceba79 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081109-1_0.C @@ -0,0 +1,5 @@ +// { dg-lto-do link } +// { dg-lto-options {{-fPIC -flto -flto-partition=1to1}} } +// { dg-extra-ld-options "-fPIC -flto -flto-partition=1to1 -r -nostdlib -fno-exceptions" } +void func(); class Foo { }; +void bar() { try { func(); } catch (Foo) { } }; diff --git a/gcc/testsuite/g++.dg/lto/20081109-2_0.C b/gcc/testsuite/g++.dg/lto/20081109-2_0.C new file mode 100644 index 000000000..dc43286bf --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081109-2_0.C @@ -0,0 +1,15 @@ +/* { dg-lto-do assemble } */ +extern void func(int); + +struct Foo +{ + void bar() { + static int local; + func(local); + } + void baz(); +}; + +void Foo::baz() { + bar(); +} diff --git a/gcc/testsuite/g++.dg/lto/20081109_0.C b/gcc/testsuite/g++.dg/lto/20081109_0.C new file mode 100644 index 000000000..93cfc67ff --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081109_0.C @@ -0,0 +1,28 @@ +extern "C" { void abort (void);} +int foo (int); + +class A +{ + int x; + +public: + A() { x = 2304; } + ~A() { if (x != 2305) abort (); } + void inc () { x++; } +}; + + +int main() +{ + A x; + x.inc(); + try + { + foo (0); + abort (); // Should not execute + } + catch (int e) + { + return 0; + } +} diff --git a/gcc/testsuite/g++.dg/lto/20081109_1.C b/gcc/testsuite/g++.dg/lto/20081109_1.C new file mode 100644 index 000000000..3395e1355 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081109_1.C @@ -0,0 +1,4 @@ +int foo (int x) +{ + throw 10; +} diff --git a/gcc/testsuite/g++.dg/lto/20081118-1_0.C b/gcc/testsuite/g++.dg/lto/20081118-1_0.C new file mode 100644 index 000000000..99e024f9e --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081118-1_0.C @@ -0,0 +1,27 @@ +/* { dg-lto-do link } */ + +class C { + public: + C(); + virtual ~C(); + virtual void foo(); +}; +void bar() { + new C(); +} + +C::C() { + +} + +C::~C() { + +} + +void C::foo() { +} + +int main(void) +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20081118-1_1.C b/gcc/testsuite/g++.dg/lto/20081118-1_1.C new file mode 100644 index 000000000..fc654fe91 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081118-1_1.C @@ -0,0 +1,12 @@ +class C { + public: + C(); + virtual ~C(); + virtual void foo(); +}; +class D { + ~D(); + C lexer_; +}; +D::~D() { +} diff --git a/gcc/testsuite/g++.dg/lto/20081118_0.C b/gcc/testsuite/g++.dg/lto/20081118_0.C new file mode 100644 index 000000000..f11c76b67 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081118_0.C @@ -0,0 +1,20 @@ +/* { dg-lto-do link } */ +/* { dg-lto-options {{-fPIC -flto -flto-partition=1to1 -r -nostdlib}} } */ + +/* We used to ICE because of dangling pointers. */ + +class object +{ +public: + virtual ~object() {} +}; + +class foo : public object +{ + virtual int method(void); +}; + +int +foo::method(void) +{ +} diff --git a/gcc/testsuite/g++.dg/lto/20081118_1.C b/gcc/testsuite/g++.dg/lto/20081118_1.C new file mode 100644 index 000000000..a1bf08186 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081118_1.C @@ -0,0 +1,21 @@ +class object { +public: + virtual ~object() {} +}; + +class bar : public object +{ + static bar *method(void); +}; + +class quxx : public bar +{ + public: + static void method(); +}; + +bar* +bar::method (void) +{ + quxx::method(); +} diff --git a/gcc/testsuite/g++.dg/lto/20081119-1.h b/gcc/testsuite/g++.dg/lto/20081119-1.h new file mode 100644 index 000000000..be193581d --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081119-1.h @@ -0,0 +1,8 @@ +namespace __gnu_cxx +{ + template < typename _Tp > class new_allocator + { + public: + unsigned max_size () const throw (); + }; +} diff --git a/gcc/testsuite/g++.dg/lto/20081119-1_0.C b/gcc/testsuite/g++.dg/lto/20081119-1_0.C new file mode 100644 index 000000000..a2d5bd320 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081119-1_0.C @@ -0,0 +1,12 @@ +/* { dg-lto-do link } */ +/* { dg-lto-options {{-fPIC -flto -flto-partition=1to1 -r -nostdlib}} } */ + +#include "20081119-1.h" + +extern __gnu_cxx::new_allocator<int> X; + +int +f (__gnu_cxx::new_allocator<int> * a) +{ + return a->max_size () + X.max_size(); +} diff --git a/gcc/testsuite/g++.dg/lto/20081119-1_1.C b/gcc/testsuite/g++.dg/lto/20081119-1_1.C new file mode 100644 index 000000000..c2ba78d6e --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081119-1_1.C @@ -0,0 +1,9 @@ +#include "20081119-1.h" + +__gnu_cxx::new_allocator<int> X; + +int +f (__gnu_cxx::new_allocator<int> a) +{ + return a.max_size (); +} diff --git a/gcc/testsuite/g++.dg/lto/20081119_0.C b/gcc/testsuite/g++.dg/lto/20081119_0.C new file mode 100644 index 000000000..c77a43098 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081119_0.C @@ -0,0 +1,24 @@ +class foo { + public: + foo () {} + virtual ~foo() {} + virtual void m() {} +}; + +template<typename t> +class bar : public foo { + public: + bar () {} +}; + +void +f1 (bar<int> *p) +{ + p->m(); +} + +int +main () +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20081119_1.C b/gcc/testsuite/g++.dg/lto/20081119_1.C new file mode 100644 index 000000000..71a2a5c02 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081119_1.C @@ -0,0 +1,18 @@ +class foo { + public: + foo () {} + virtual ~foo() {} + virtual void m() {} +}; + +template<typename t> +class bar : public foo { + public: + bar () {} +}; + +void +f2 (bar<int> *p) +{ + p->m(); +} diff --git a/gcc/testsuite/g++.dg/lto/20081120-1_0.C b/gcc/testsuite/g++.dg/lto/20081120-1_0.C new file mode 100644 index 000000000..682733778 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081120-1_0.C @@ -0,0 +1,10 @@ +// { dg-lto-do link } +// { dg-lto-options {{-flto -r -nostdlib}} } +extern "C" +{ + extern __inline __attribute__((__gnu_inline__)) int pthread_equal(int, int) + { + } +} +static __typeof(pthread_equal) + __gthrw_pthread_equal __attribute__((__weakref__("pthread_equal"))); diff --git a/gcc/testsuite/g++.dg/lto/20081120-1_1.C b/gcc/testsuite/g++.dg/lto/20081120-1_1.C new file mode 100644 index 000000000..e7e24a58b --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081120-1_1.C @@ -0,0 +1,8 @@ +extern "C" +{ + extern __inline __attribute__((__gnu_inline__)) int pthread_equal(int, int) + { + } +} +static __typeof(pthread_equal) + __gthrw_pthread_equal __attribute__((__weakref__("pthread_equal"))); diff --git a/gcc/testsuite/g++.dg/lto/20081120-2_0.C b/gcc/testsuite/g++.dg/lto/20081120-2_0.C new file mode 100644 index 000000000..3efe26c01 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081120-2_0.C @@ -0,0 +1,13 @@ +// { dg-lto-do link } +// { dg-lto-options {{-flto -r -nostdlib}} } +template < typename > struct Foo +{ + inline void rdstate() { + } +}; + +extern template struct Foo<int>; + +struct Bar:virtual public Foo<int> +{ +}; diff --git a/gcc/testsuite/g++.dg/lto/20081120-2_1.C b/gcc/testsuite/g++.dg/lto/20081120-2_1.C new file mode 100644 index 000000000..242d50a41 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081120-2_1.C @@ -0,0 +1,11 @@ +template < typename > struct Foo +{ + inline void rdstate() { + } +}; + +extern template struct Foo<int>; + +struct Bar:virtual public Foo<int> +{ +}; diff --git a/gcc/testsuite/g++.dg/lto/20081123_0.C b/gcc/testsuite/g++.dg/lto/20081123_0.C new file mode 100644 index 000000000..8817be8f0 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081123_0.C @@ -0,0 +1,8 @@ +// { dg-lto-do link } +// { dg-lto-options {{-flto -flto-partition=1to1 -r -nostdlib -fPIC}} } + +int +f(void) +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20081123_1.C b/gcc/testsuite/g++.dg/lto/20081123_1.C new file mode 100644 index 000000000..aef512e8e --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081123_1.C @@ -0,0 +1,16 @@ +struct foo { + const int* int_array; + const void* default_instance; +}; +struct bar { + static const bar& _default_instance; + static const foo _internal_foo; +}; +struct quxx { + static int trouble[]; +}; +int quxx::trouble[] = { }; +const foo bar::_internal_foo = { + quxx::trouble, + &bar::_default_instance +}; diff --git a/gcc/testsuite/g++.dg/lto/20081125.h b/gcc/testsuite/g++.dg/lto/20081125.h new file mode 100644 index 000000000..bc470040a --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081125.h @@ -0,0 +1,15 @@ +class base +{ + public: + base() {} + virtual ~base() {} + static base *factory (void); +}; + +class object : public base +{ + public: + object() {} + object (int); + virtual void key_method (void); +}; diff --git a/gcc/testsuite/g++.dg/lto/20081125_0.C b/gcc/testsuite/g++.dg/lto/20081125_0.C new file mode 100644 index 000000000..629c2b3d9 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081125_0.C @@ -0,0 +1,18 @@ +// { dg-lto-do link } +// { dg-lto-options {{-flto -flto-partition=1to1}} } +#include "20081125.h" + +object::object (int x) +{ +} + +void +object::key_method (void) +{ +} + +int +main () +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20081125_1.C b/gcc/testsuite/g++.dg/lto/20081125_1.C new file mode 100644 index 000000000..d52b9edca --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081125_1.C @@ -0,0 +1,7 @@ +#include "20081125.h" + +base * +base::factory(void) +{ + return new object (); +} diff --git a/gcc/testsuite/g++.dg/lto/20081127_0.C b/gcc/testsuite/g++.dg/lto/20081127_0.C new file mode 100644 index 000000000..a5200ff4b --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081127_0.C @@ -0,0 +1,2 @@ +struct Foo { Foo(); }; +static void func() { new Foo(); } diff --git a/gcc/testsuite/g++.dg/lto/20081127_1.C b/gcc/testsuite/g++.dg/lto/20081127_1.C new file mode 100644 index 000000000..6488ac8d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081127_1.C @@ -0,0 +1,3 @@ +struct Foo { Foo(); }; +Foo::Foo() { } +main() { return 0; } diff --git a/gcc/testsuite/g++.dg/lto/20081203_0.C b/gcc/testsuite/g++.dg/lto/20081203_0.C new file mode 100644 index 000000000..e92d89a4c --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081203_0.C @@ -0,0 +1,5 @@ +extern void f(); +extern void g(); +struct Foo { static inline void Bar() { f(); } }; +static void Func() { Foo::Bar(); } +int main() { g (); Func(); return 0; } diff --git a/gcc/testsuite/g++.dg/lto/20081203_1.C b/gcc/testsuite/g++.dg/lto/20081203_1.C new file mode 100644 index 000000000..83de109ea --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081203_1.C @@ -0,0 +1,4 @@ +void f () {} +struct Foo { static inline void Bar() { f(); } }; +static void Func() { Foo::Bar(); } +void g () { Func (); } diff --git a/gcc/testsuite/g++.dg/lto/20081204-1_0.C b/gcc/testsuite/g++.dg/lto/20081204-1_0.C new file mode 100644 index 000000000..0d2487889 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081204-1_0.C @@ -0,0 +1,14 @@ +/* { dg-lto-do link } */ +/* { dg-lto-options {{-flto -flto-partition=1to1 -fPIC -r -nostdlib}} } */ + +/* Tests for the absence during linking of: + lto1: error: type of '_ZTVN10__cxxabiv120__si_class_type_infoE' does + not match original declaration */ + +struct Foo { virtual ~Foo(); }; +namespace __cxxabiv1 +{ + struct __si_class_type_info: public Foo { }; + struct Baz: public Foo { virtual void Func(); }; + void Baz::Func() { } +} diff --git a/gcc/testsuite/g++.dg/lto/20081204-1_1.C b/gcc/testsuite/g++.dg/lto/20081204-1_1.C new file mode 100644 index 000000000..20627b5c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081204-1_1.C @@ -0,0 +1,3 @@ +struct Foo { virtual ~Foo(); }; +struct Bar:public Foo { Bar() { } }; +void Func() { new Bar(); } diff --git a/gcc/testsuite/g++.dg/lto/20081204-2_0.C b/gcc/testsuite/g++.dg/lto/20081204-2_0.C new file mode 100644 index 000000000..81a42693c --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081204-2_0.C @@ -0,0 +1,10 @@ +// { dg-lto-do link } +// { dg-lto-options {{-flto -flto-partition=1to1 -O3}} } +extern void foo (void); + +int +main () +{ + foo (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20081204-2_1.C b/gcc/testsuite/g++.dg/lto/20081204-2_1.C new file mode 100644 index 000000000..676b9b27d --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081204-2_1.C @@ -0,0 +1,14 @@ +namespace { +class c +{ + public: + c () {} + virtual ~c() {} +}; +}; + +void +foo (void) +{ + c x; +} diff --git a/gcc/testsuite/g++.dg/lto/20081209_0.C b/gcc/testsuite/g++.dg/lto/20081209_0.C new file mode 100644 index 000000000..3744a9ac4 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081209_0.C @@ -0,0 +1,18 @@ +/* { dg-lto-do link } */ + +class foo { + public: + foo (); + virtual ~foo (); +}; + +foo::foo () +{ +} + +int +main () +{ + foo dummy; + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20081209_1.C b/gcc/testsuite/g++.dg/lto/20081209_1.C new file mode 100644 index 000000000..83eee3e46 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081209_1.C @@ -0,0 +1,9 @@ +class foo { + public: + foo (); + virtual ~foo (); +}; + +foo::~foo () +{ +} diff --git a/gcc/testsuite/g++.dg/lto/20081211-1.h b/gcc/testsuite/g++.dg/lto/20081211-1.h new file mode 100644 index 000000000..f9a8ca755 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081211-1.h @@ -0,0 +1,6 @@ +class foo { + public: + foo () {} + virtual ~foo () {} + virtual void key_method (void); +}; diff --git a/gcc/testsuite/g++.dg/lto/20081211-1_0.C b/gcc/testsuite/g++.dg/lto/20081211-1_0.C new file mode 100644 index 000000000..89c06acf5 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081211-1_0.C @@ -0,0 +1,19 @@ +#include "20081211-1.h" + +foo * +create_foo (void) +{ + return new foo; +} + +void +destroy_foo (foo *p) +{ + delete p; +} + +int +main () +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20081211-1_1.C b/gcc/testsuite/g++.dg/lto/20081211-1_1.C new file mode 100644 index 000000000..124d69a7c --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081211-1_1.C @@ -0,0 +1,6 @@ +#include "20081211-1.h" + +void +foo::key_method (void) +{ +} diff --git a/gcc/testsuite/g++.dg/lto/20081217-1_0.C b/gcc/testsuite/g++.dg/lto/20081217-1_0.C new file mode 100644 index 000000000..c91872bd2 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081217-1_0.C @@ -0,0 +1,28 @@ +class base1 +{ + public: + base1 () {} + virtual ~base1 () {} +}; + +class base2 +{ + public: + base2 () {} + virtual ~base2 () {} +}; + +class mi_class : public base1, base2 +{ + public: + mi_class () {} + ~mi_class () {} +}; + +mi_class dummy; + +int +main () +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20081217-2_0.C b/gcc/testsuite/g++.dg/lto/20081217-2_0.C new file mode 100644 index 000000000..a47b0b578 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081217-2_0.C @@ -0,0 +1,20 @@ +struct A { + virtual int foo() {} +}; +struct B { + virtual int f() {return 1; } +}; +struct C : public A, public B { + C(); + virtual int f() { return 0; } +}; + +C::C() +{ +} + +main() +{ + C c; + return c.f(); +} diff --git a/gcc/testsuite/g++.dg/lto/20081219_0.C b/gcc/testsuite/g++.dg/lto/20081219_0.C new file mode 100644 index 000000000..432a60c45 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081219_0.C @@ -0,0 +1,72 @@ +// { dg-lto-do link } +// { dg-lto-options {{-fPIC -flto -flto-partition=1to1 -O2}} } +// { dg-extra-ld-options "-O2 -fPIC -flto -flto-partition=1to1 -r -nostdlib" } + +typedef long int ptrdiff_t; +extern "C" +{ + typedef struct + { + } + __mbstate_t; + namespace std + { + class exception + { + }; + } +} +namespace std __attribute__ ((__visibility__ ("default"))) +{ + template < typename _Alloc > class allocator; + template < class _CharT > struct char_traits; +} +typedef __mbstate_t mbstate_t; +namespace std __attribute__ ((__visibility__ ("default"))) +{ + using::mbstate_t; + typedef ptrdiff_t streamsize; + template < typename _CharT, typename _Traits = + char_traits < _CharT > >class basic_istream; + template < typename _CharT, typename _Traits = + char_traits < _CharT >, typename _Alloc = + allocator < _CharT > >class basic_stringbuf; + class ios_base + { + public:class failure:public exception + { + }; + virtual ~ ios_base (); + }; + template < typename _CharT, typename _Traits > class basic_streambuf + { + }; +template < typename _CharT, typename _Traits > class basic_ios:public + ios_base + { + }; +template < typename _CharT, typename _Traits > class basic_istream:virtual public basic_ios < _CharT, + _Traits + > + { + typedef basic_streambuf < _CharT, _Traits > __streambuf_type; + protected:streamsize _M_gcount; + public: explicit basic_istream (__streambuf_type * __sb):_M_gcount (streamsize + (0)) + { + } + }; +template < typename _CharT, typename _Traits, typename _Alloc > class basic_stringbuf:public basic_streambuf < _CharT, + _Traits + > + { + }; + template < typename V, typename I, typename S = std::mbstate_t > struct character + { + }; + typedef character < unsigned short, unsigned int >pod_ushort; + typedef basic_stringbuf < pod_ushort > stringbuf_type; + typedef basic_istream < pod_ushort > istream_type; + stringbuf_type strbuf01; + istream_type stream (&strbuf01); +} diff --git a/gcc/testsuite/g++.dg/lto/20081219_1.C b/gcc/testsuite/g++.dg/lto/20081219_1.C new file mode 100644 index 000000000..1bb96ef37 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20081219_1.C @@ -0,0 +1,42 @@ +typedef struct +{ +} +__mbstate_t; +typedef __mbstate_t mbstate_t; +namespace std __attribute__ ((__visibility__ ("default"))) +{ + using::mbstate_t; + typedef int *__c_locale; + class locale + { + class facet; + }; + class locale::facet + { + }; +template < typename _CharT > class numpunct:public locale::facet + { + void _M_initialize_numpunct (__c_locale __cloc = __null); + }; +} +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) +{ + template < typename V, typename I, typename S = std::mbstate_t > struct character + { + }; +} + +namespace __gnu_test +{ + using __gnu_cxx::character; + typedef character < unsigned short, unsigned int >pod_ushort; +} +namespace std +{ + using __gnu_test::pod_ushort; + template <> void numpunct < + pod_ushort >::_M_initialize_numpunct (__c_locale) + { + pod_ushort *__truename = new pod_ushort[4 + 1]; + } +} diff --git a/gcc/testsuite/g++.dg/lto/20090106_0.C b/gcc/testsuite/g++.dg/lto/20090106_0.C new file mode 100644 index 000000000..8c4d3952e --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090106_0.C @@ -0,0 +1,203 @@ +// { dg-lto-do link } +typedef long unsigned int size_t; +namespace std __attribute__ ((__visibility__ ("default"))) { + using ::size_t; + template<typename _Tp> + struct __is_char + { + }; +# 422 "/usr/include/c++/4.4.0/bits/cpp_type_traits.h" 3 +} +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) { + template<bool, typename> + struct __enable_if + { + }; +} +namespace std __attribute__ ((__visibility__ ("default"))) { + template<class _T1, class _T2> + struct pair + { + }; +} +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) { + template<typename _Tp> + class new_allocator + { + }; +} +namespace std __attribute__ ((__visibility__ ("default"))) { + template<typename _Tp> + class allocator: public __gnu_cxx::new_allocator<_Tp> + { + }; + template<typename _Arg1, typename _Arg2, typename _Result> + struct binary_function + { + }; + template<typename _Tp> + struct less : public binary_function<_Tp, _Tp, bool> + { + }; + template<typename _CharT> + struct char_traits + { + typedef _CharT char_type; + static std::size_t + length(const char_type* __s); + }; + template<typename _CharT> + std::size_t + char_traits<_CharT>:: + length(const char_type* __p) + { + } + template<typename _CharT, typename _Traits = char_traits<_CharT> > + class istreambuf_iterator; + template<typename _CharT, typename _Traits, typename _Alloc> + class basic_string + { + }; +} +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) { + template<typename _CharT, typename _Traits, typename _Alloc> + class __versa_string; + template<typename _CharT, typename _Traits, typename _Alloc> + struct __vstring_utility + { + }; + template<typename _CharT, typename _Traits, typename _Alloc> + class __rc_string_base + { + typedef __vstring_utility<_CharT, _Traits, _Alloc> _Util_Base; + typedef typename _Util_Base::_CharT_alloc_type _CharT_alloc_type; + typedef typename _CharT_alloc_type::size_type size_type; + struct _Rep + { + union + { + }; + static _Rep* + _S_create(size_type, size_type, const _Alloc&); + }; + }; + template<typename _CharT, typename _Traits, typename _Alloc> + typename __rc_string_base<_CharT, _Traits, _Alloc>::_Rep* + __rc_string_base<_CharT, _Traits, _Alloc>::_Rep:: + _S_create(size_type __capacity, size_type __old_capacity, + const _Alloc& __alloc) + { + }; +} +template<typename _CharT, typename _Traits = std::char_traits<_CharT>, + typename _Alloc = std::allocator<_CharT> > +class basic_string + : public __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc> { +}; +template<typename _CharT, typename _Traits, typename _Alloc> + operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs, + const std::basic_string<_CharT, _Traits, _Alloc>& __rhs) + { +} +namespace std __attribute__ ((__visibility__ ("default"))) { + struct __uninitialized_copy + { + template<typename _InputIterator, typename _ForwardIterator> + uninitialized_copy(_InputIterator __first, _InputIterator __last, + _ForwardIterator __result) + { + } + }; + template<typename _InputIterator, typename _ForwardIterator> + uninitialized_copy(_InputIterator __first, _InputIterator __last, + _ForwardIterator __result) + { + } + class locale + { + class facet; + }; + class locale::facet + { + }; + class ios_base + { + template<typename _CharT2> + friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, + istreambuf_iterator<_CharT2> >::__type + find(istreambuf_iterator<_CharT2>, istreambuf_iterator<_CharT2>, + const _CharT2&); + }; + template<typename _CharT, typename _OutIter> + class num_put : public locale::facet + { + typedef _CharT char_type; + typedef _OutIter iter_type; + template<typename _ValueT> + iter_type + _M_insert_float(iter_type, ios_base& __io, char_type __fill, + char __mod, _ValueT __v) const; + }; + template<typename _CharT, typename _OutIter> + template<typename _ValueT> + _OutIter + num_put<_CharT, _OutIter>:: + _M_insert_float(_OutIter __s, ios_base& __io, _CharT __fill, char __mod, + _ValueT __v) const + { + } + template<typename _CharT, typename _OutIter> + class basic_ios : public ios_base + { + }; + template<typename _CharT, typename _Traits> + class basic_istream : virtual public basic_ios<_CharT, _Traits> + { + typedef basic_istream<_CharT, _Traits> __istream_type; + template<typename _ValueT> + __istream_type& + _M_extract(_ValueT& __v); + }; + template<typename _CharT, typename _Traits> + template<typename _ValueT> + basic_istream<_CharT, _Traits>& + basic_istream<_CharT, _Traits>:: + _M_extract(_ValueT& __v) + { + } + class hash_map + { + }; +} +class CDE { + public: + virtual ~CDE() { } +}; +namespace std __attribute__ ((__visibility__ ("default"))) { + template <typename _Key, typename _Tp, typename _Compare = std::less<_Key>, + typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > > + class map + { + }; + template<typename _Key, typename _Tp, typename _Compare, typename _Alloc> + operator==(const map<_Key, _Tp, _Compare, _Alloc>& __x, + const map<_Key, _Tp, _Compare, _Alloc>& __y) + { return !(__x < __y); } +} +namespace xyz { +class XYZ; +}; +class ABC { + public: + virtual ~ABC() { } +}; +class FGH : public CDE, public ABC { + public: + explicit FGH(CDE* efg); +}; +namespace { +class LMN : public FGH { + LMN(CDE* efg, xyz::XYZ* hij) : FGH(efg) { } +}; +} +main(){} diff --git a/gcc/testsuite/g++.dg/lto/20090112_0.C b/gcc/testsuite/g++.dg/lto/20090112_0.C new file mode 100644 index 000000000..b9dc24bc1 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090112_0.C @@ -0,0 +1,11 @@ +// { dg-lto-do run } +const char *func(int val) { + switch (val) { + case 2147483647: return "foo"; + default: return ""; + } +} + +int main() { + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20090128_0.C b/gcc/testsuite/g++.dg/lto/20090128_0.C new file mode 100644 index 000000000..d03cfc6a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090128_0.C @@ -0,0 +1,88 @@ +// { dg-lto-do assemble } +// { dg-lto-options {{-fpreprocessed -O2 -flto -flto-partition=1to1 -funsigned-char}} } +typedef unsigned char uint8; +extern const uint8 array[256]; +static inline bool +g (unsigned char c) +{ + return array[c] & 0x80; +} + +class Class1 +{ + static bool f1 (char **dst, const char *end, char c); + static bool f2 (const char *map, const char **src, char **dst, + const char *end); + static bool f3 (const char *src, char *dst, const char *end); +}; + +enum JTipL +{ + KXHR8 = 0, KXNU3, KX_HASH, KXYYZ, KXFI9, KXX3, KXAFA, KXV4Z, KXZ11, +}; + +static const char + p9t42[256] = { KXYYZ, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, + KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, + KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, + KXX3, KXX3, KXX3, KXX3, KXX3, KXAFA, KXX3, KX_HASH, KXAFA, + KXFI9, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXV4Z, KXAFA, KXAFA, + KXAFA, KXV4Z, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, + KXAFA, KXAFA, KXAFA, KXAFA, KXHR8, KXX3, KXV4Z, KXX3, KXNU3, + KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, + KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, + KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, + KXX3, KXX3, KXX3, KXX3, KXAFA, KXX3, KXAFA, KXAFA, KXAFA, KXAFA, + KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, + KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, KXAFA, + KXAFA, KXAFA, KXAFA, KXAFA, KXX3, KXX3, KXX3, KXAFA, KXX3, KXX3, + KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, + KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, + KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, + KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, + KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, + KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, + KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, + KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, + KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, + KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, + KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, + KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, + KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, KXX3, +}; + +inline bool +Class1::f2 (const char *map, const char **src, char **dst, + const char *end) +{ + if (g ((*src)[1]) && g ((*src)[2])) + { + char c = (static_cast < unsigned char >((*src)[1])) & 0xf; + if (map[c] == KXAFA) + { + } + else if (f1 (dst, end, c)) + { + } + } + return true; +} + +bool +Class1::f3 (const char *src, char *dst, const char *end) +{ + while (dst < end) + { + char c = *src; + char m = p9t42[c]; + switch (m) + { + case KXYYZ: + *dst = '\0'; + case KXFI9: + if (!f2 (p9t42, &src, &dst, end)) + ; + } + } + return false; +} diff --git a/gcc/testsuite/g++.dg/lto/20090221_0.C b/gcc/testsuite/g++.dg/lto/20090221_0.C new file mode 100644 index 000000000..5bf031906 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090221_0.C @@ -0,0 +1,53 @@ +// { dg-lto-do assemble } +extern void some_function (const char *); +extern bool some_other_function (); + +struct Foo +{ + long long a; + int b; +}; + +bool Foo_eq(Foo x, Foo y) +{ + return x.a == y.a && x.b == y.b; +} + +struct Bar +{ + Foo a; + int b; +}; + +struct Baz +{ + Bar a; + Baz(Bar &a):a(a) { } +}; + +struct Zonk +{ + Baz baz; + + Bar func_1(const Bar & bar) { + if (Foo_eq(bar.a, baz.a.a) && bar.b == baz.a.b || some_other_function ()) + return bar; + } + + void func_2(const Baz & baz) { + func_1(baz.a); + some_function(__PRETTY_FUNCTION__); + } +}; + +void func() { + Bar bar; + Zonk *rep; + rep->func_1(bar); + rep->func_2(Baz(bar)); +} + +void foo () +{ + func(); +} diff --git a/gcc/testsuite/g++.dg/lto/20090302_0.C b/gcc/testsuite/g++.dg/lto/20090302_0.C new file mode 100644 index 000000000..76de7baf0 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090302_0.C @@ -0,0 +1,9 @@ +/* { dg-lto-do link } */ +/* { dg-lto-options {{-fPIC -flto -flto-partition=1to1 -r -nostdlib}} } */ +struct Foo { + bool Mumble(); + static void Bar() { if (foo_->Mumble()) foo_ = 0; } + static void Baz() { Bar(); } + static Foo *foo_; +}; +void Unused() { Foo::Bar(); Foo::Baz(); } diff --git a/gcc/testsuite/g++.dg/lto/20090302_1.C b/gcc/testsuite/g++.dg/lto/20090302_1.C new file mode 100644 index 000000000..0ccaf3c82 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090302_1.C @@ -0,0 +1,7 @@ +struct Foo { + bool Mumble(); + static void Bar() { if (foo_->Mumble()) foo_ = 0; } + static void Baz() { Bar(); } + static Foo *foo_; +}; +Foo *Foo::foo_; diff --git a/gcc/testsuite/g++.dg/lto/20090303_0.C b/gcc/testsuite/g++.dg/lto/20090303_0.C new file mode 100644 index 000000000..36c8588bb --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090303_0.C @@ -0,0 +1,23 @@ +/* { dg-lto-do run } */ +/* { dg-lto-options {{-flto -flto-partition=1to1 -fPIC}} } */ +/* { dg-lto-options {{-flto -flto-partition=1to1}} { target sparc*-*-* } } */ +/* { dg-suppress-ld-options {-fPIC} } */ +void foobar(int *, int* __x) ; +int test_ints[30]; +int j; + +void foobar (int *x, int *y) +{ + *x = *y = 0; +} + +void Test() { + int int_set_; + foobar (&int_set_, &test_ints[j]); +} +main() +{ + Test(); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/lto/20090311-1.h b/gcc/testsuite/g++.dg/lto/20090311-1.h new file mode 100644 index 000000000..389d94f00 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090311-1.h @@ -0,0 +1,22 @@ +typedef unsigned long uint32; +typedef int JSIntn; +#define JS_DLL_CALLBACK +typedef JSIntn JSBool; +typedef struct JSContext JSContext; +typedef struct JSObject JSObject; +typedef long long JSInt64; +typedef JSInt64 JSWord; +typedef JSWord jsword; +typedef jsword jsval; + +typedef JSBool +(* JS_DLL_CALLBACK JSPropertyOp)(JSContext *cx, JSObject *ojb, jsval id, + jsval *vp); + +struct JSClass { + const char *name; + uint32 flags; + JSPropertyOp addProperty; +}; + +extern struct JSClass K; diff --git a/gcc/testsuite/g++.dg/lto/20090311-1_0.C b/gcc/testsuite/g++.dg/lto/20090311-1_0.C new file mode 100644 index 000000000..6d4032724 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090311-1_0.C @@ -0,0 +1,34 @@ +/* { dg-lto-do run } */ +#include "20090311-1.h" +bool flag; + +struct B { + int a; + enum { ANOTHER, ONE } f2_; + float c; +}; + +extern struct B x[]; + +struct C { + int x; + struct B *p; + float d; +}; + +C c = { 0, 0, 3.4 }; + +struct A { + enum { UNO, DOS, TRES } f1_; + int x; +}; + +A a; + +extern int foo(); +main() +{ + a.x = 4 + c.x; + foo(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20090311-1_1.C b/gcc/testsuite/g++.dg/lto/20090311-1_1.C new file mode 100644 index 000000000..520aa957a --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090311-1_1.C @@ -0,0 +1,28 @@ +#include "20090311-1.h" + +struct A { + enum { UNO, DOS, TRES } f1_; + int x; +}; + +struct B; + +extern struct B x[]; + +struct C { + int x; + struct B *p; + float d; +}; + +extern A a; +extern B b; +extern bool flag; +extern C c; + +int foo() +{ + if (!flag) + return a.x - c.x; + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20090311_0.C b/gcc/testsuite/g++.dg/lto/20090311_0.C new file mode 100644 index 000000000..cc54bbfdc --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090311_0.C @@ -0,0 +1,13 @@ +class C1 { +public: virtual ~C1() { +} +}; +class C2 : public C1 { +public: + C2(void *q); + virtual void A(); +}; +int main(int argc, char **argv) { + C2 h(0); + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20090311_1.C b/gcc/testsuite/g++.dg/lto/20090311_1.C new file mode 100644 index 000000000..e78da7223 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090311_1.C @@ -0,0 +1,13 @@ +class C1 { +public: virtual ~C1() { +} +}; +class C2 : public C1 { + C2(void *q); + virtual void A(); +}; +void C2::A() { +} +C2::C2(void *q) +{ +} diff --git a/gcc/testsuite/g++.dg/lto/20090312.h b/gcc/testsuite/g++.dg/lto/20090312.h new file mode 100644 index 000000000..c902e93c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090312.h @@ -0,0 +1,2 @@ +enum Values { ONE, TWO, THREE }; +typedef const char * (* JSErrorCallback)(void *, const char *, const int); diff --git a/gcc/testsuite/g++.dg/lto/20090312_0.C b/gcc/testsuite/g++.dg/lto/20090312_0.C new file mode 100644 index 000000000..b2222c2aa --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090312_0.C @@ -0,0 +1,14 @@ +#include "20090312.h" + +extern "C" { + extern enum Values x; + extern JSErrorCallback p; +}; + +main() +{ + if ( x == ONE && p == 0) + return 0; + + return 1; +} diff --git a/gcc/testsuite/g++.dg/lto/20090312_1.C b/gcc/testsuite/g++.dg/lto/20090312_1.C new file mode 100644 index 000000000..a0f9085f5 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090312_1.C @@ -0,0 +1,21 @@ +#include "20090312.h" + +/* This file should be compiled with the C front end. This + should be testing what happens when LTO merges enum types and function + prototypes compiled by the C and C++ FEs. Since both FEs generate + slightly different representations for these, LTO was emitting an + ODR violation error. + + Once dejagnu can deal with multiple languages in a single test, remove + the __cplusplus checks and force this file to be compiled with the + C front end. */ +#ifdef __cplusplus +extern "C" { +#endif + +JSErrorCallback p = 0; +enum Values x = ONE; + +#ifdef __cplusplus +} +#endif diff --git a/gcc/testsuite/g++.dg/lto/20090313_0.C b/gcc/testsuite/g++.dg/lto/20090313_0.C new file mode 100644 index 000000000..70029e651 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090313_0.C @@ -0,0 +1,5 @@ +// { dg-lto-do link } +// { dg-lto-options {{-flto -flto-partition=1to1 -fPIC}} } +// { dg-extra-ld-options "-flto -flto-partition=1to1 -r -nostdlib" } + +int X; diff --git a/gcc/testsuite/g++.dg/lto/20090313_1.C b/gcc/testsuite/g++.dg/lto/20090313_1.C new file mode 100644 index 000000000..088792b2d --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090313_1.C @@ -0,0 +1,12 @@ +struct Foo { + virtual void X(); + virtual void Y(); +}; +struct Bar: public Foo { + Bar(Foo *); + void Y(); +}; +void Baz() { + Foo f; + Bar b(&f); +} diff --git a/gcc/testsuite/g++.dg/lto/20090315_0.C b/gcc/testsuite/g++.dg/lto/20090315_0.C new file mode 100644 index 000000000..930fb16e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090315_0.C @@ -0,0 +1,9 @@ +// { dg-lto-do run } +struct Foo { + bool Mumble() { return true; } + static void Bar() { if (foo_->Mumble()) foo_ = 0; } + static void Baz() { Bar(); } + static Foo *foo_; +}; +Foo *Foo::foo_; +main() { return 0; } diff --git a/gcc/testsuite/g++.dg/lto/20090315_1.C b/gcc/testsuite/g++.dg/lto/20090315_1.C new file mode 100644 index 000000000..0a2fba552 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20090315_1.C @@ -0,0 +1,7 @@ +struct Foo { + bool Mumble() { return true; } + static void Bar() { if (foo_->Mumble()) foo_ = 0; } + static void Baz() { Bar(); } + static Foo *foo_; +}; +void Unused() { Foo::Bar(); Foo::Baz(); } diff --git a/gcc/testsuite/g++.dg/lto/20091002-1_0.C b/gcc/testsuite/g++.dg/lto/20091002-1_0.C new file mode 100644 index 000000000..050211ac3 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091002-1_0.C @@ -0,0 +1,58 @@ +// { dg-lto-do link } +// { dg-lto-options {{-fPIC -flto}} } +// { dg-extra-ld-options "-fPIC -r -nostdlib" } + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + template<class _CharT> struct char_traits; + template<typename _CharT, typename _Traits = char_traits<_CharT> > + class basic_ostream; + template<typename _CharT, typename _Traits = char_traits<_CharT> > + class istreambuf_iterator; + typedef basic_ostream<char> ostream; + template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> > + class num_get; + class locale { + class facet; + }; + class locale::facet { + }; + enum _Ios_Iostate { _S_beg = 0, _S_cur = 1, _S_end = 2, + _S_ios_seekdir_end = 1L << 16 }; + class ios_base { + public: + typedef _Ios_Iostate iostate; + }; + template<typename _CharT, typename _InIter> + class num_get : public locale::facet { + typedef _InIter iter_type; + template<typename _ValueT> iter_type + _M_extract_int(iter_type, iter_type, ios_base&, + ios_base::iostate&, _ValueT&) const; + virtual iter_type + do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const; + }; + extern template class num_get<char>; + template<typename _CharT, typename _Traits> + class basic_ios : public ios_base { + typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> > + __num_get_type; + const __num_get_type* _M_num_get; + }; + template<typename _CharT, typename _Traits> + class basic_ostream : virtual public basic_ios<_CharT, _Traits> { + public: + typedef basic_ostream<_CharT, _Traits> __ostream_type; + __ostream_type& operator<<(double __f) { } + }; + typedef double Real; + class Vector { + public: + Real operator[](int n) const { } + }; + std::ostream& operator<<(std::ostream& s, const Vector& vec) + { + int i; + s << vec[i] << ')'; + } +} diff --git a/gcc/testsuite/g++.dg/lto/20091002-2_0.C b/gcc/testsuite/g++.dg/lto/20091002-2_0.C new file mode 100644 index 000000000..c150e977d --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091002-2_0.C @@ -0,0 +1,20 @@ +// { dg-lto-do link } +// { dg-lto-options {{-fPIC}} } +// { dg-extra-ld-options "-fPIC -r -nostdlib" } + +class DataArray { + int max() const { } +}; +template < class HashItem > +class DataHashTable { + template < class ElemHashItem > + class Element { }; + typedef Element< HashItem > Elem; + DataArray m_elem; +}; +class Name { }; +class NameSet { + DataHashTable < Name > hashtab; +}; +NameSet p; + diff --git a/gcc/testsuite/g++.dg/lto/20091002-3_0.C b/gcc/testsuite/g++.dg/lto/20091002-3_0.C new file mode 100644 index 000000000..3c77f4b59 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091002-3_0.C @@ -0,0 +1,15 @@ +// { dg-lto-do link } +// { dg-lto-options {{-fPIC}} } +// { dg-extra-ld-options "-fPIC -r -nostdlib" } + +template < class T > +class DataArray { + int max() const { } +}; +class Name { }; +class DataHashTable { + template < class ElemHashItem > class Element { }; + DataArray < Element < Name > > m_elem; +}; +DataHashTable p; + diff --git a/gcc/testsuite/g++.dg/lto/20091004-1_0.C b/gcc/testsuite/g++.dg/lto/20091004-1_0.C new file mode 100644 index 000000000..d65cf29ff --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091004-1_0.C @@ -0,0 +1,35 @@ +// { dg-lto-do link } +// { dg-lto-options {{-fPIC -O -flto}} } + +typedef double Real; +class Vector { + int dimen; + Real* val; +public: + Vector& operator=(const Vector& vec); + Vector(int p_dimen, Real *p_val) + : dimen(p_dimen), val(p_val) { } + int dim() const; +}; +class DVector : public Vector { +public: + void reDim(int newdim); + explicit DVector(const Vector& old); + DVector& operator=(const Vector& vec) { + reDim(vec.dim()); + Vector::operator=(vec); + } +}; +Vector& Vector::operator=(const Vector& vec) +{ + dimen = vec.dimen; + val = vec.val; +} +int Vector::dim() const { return dimen; } +DVector::DVector(const Vector& old) : Vector(0, 0) +{ + *this = old; +} +void DVector::reDim(int newdim) {} +int main() {} + diff --git a/gcc/testsuite/g++.dg/lto/20091004-1_1.C b/gcc/testsuite/g++.dg/lto/20091004-1_1.C new file mode 100644 index 000000000..0328abaae --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091004-1_1.C @@ -0,0 +1,26 @@ +typedef double Real; +class Vector { + int dimen; + Real* val; +public: + Vector& operator=(const Vector& vec); + Vector(int p_dimen, Real *p_val) + : dimen(p_dimen), val(p_val) { } + int dim() const; +}; +class DVector : public Vector { +public: + void reDim(int newdim); + explicit DVector(const Vector& old); + DVector& operator=(const Vector& vec) { + reDim(vec.dim()); + Vector::operator=(vec); + } +}; +class SLUFactor { + DVector vec; + void solveRight (Vector& x, const Vector& b); +}; +void SLUFactor::solveRight (Vector& x, const Vector& b) { + vec = b; +} diff --git a/gcc/testsuite/g++.dg/lto/20091004-2_0.C b/gcc/testsuite/g++.dg/lto/20091004-2_0.C new file mode 100644 index 000000000..321e50bc2 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091004-2_0.C @@ -0,0 +1,29 @@ +// { dg-lto-do link } +// { dg-lto-options {{-fPIC -O -flto}} } + +typedef double Real; +class Vector { + int dimen; + Real* val; +public: + Vector& operator=(const Vector& vec); + Vector(int p_dimen, Real *p_val) + : dimen(p_dimen), val(p_val) { } + int dim() const; +}; +class DVector : public Vector { +public: + void reDim(int newdim); + explicit DVector(const Vector& old); + DVector& operator=(const Vector& vec) { + reDim(vec.dim()); + Vector::operator=(vec); + } +}; +class SLUFactor { + DVector vec; + void solveRight (Vector& x, const Vector& b); +}; +void SLUFactor::solveRight (Vector& x, const Vector& b) { + vec = b; +} diff --git a/gcc/testsuite/g++.dg/lto/20091004-2_1.C b/gcc/testsuite/g++.dg/lto/20091004-2_1.C new file mode 100644 index 000000000..9bbcd51f7 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091004-2_1.C @@ -0,0 +1,32 @@ +typedef double Real; +class Vector { + int dimen; + Real* val; +public: + Vector& operator=(const Vector& vec); + Vector(int p_dimen, Real *p_val) + : dimen(p_dimen), val(p_val) { } + int dim() const; +}; +class DVector : public Vector { +public: + void reDim(int newdim); + explicit DVector(const Vector& old); + DVector& operator=(const Vector& vec) { + reDim(vec.dim()); + Vector::operator=(vec); + } +}; +Vector& Vector::operator=(const Vector& vec) +{ + dimen = vec.dimen; + val = vec.val; +} +int Vector::dim() const { return dimen; } +DVector::DVector(const Vector& old) : Vector(0, 0) +{ + *this = old; +} +void DVector::reDim(int newdim) {} +int main() {} + diff --git a/gcc/testsuite/g++.dg/lto/20091004-3_0.C b/gcc/testsuite/g++.dg/lto/20091004-3_0.C new file mode 100644 index 000000000..124eea5e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091004-3_0.C @@ -0,0 +1,18 @@ +// { dg-lto-do assemble } +// { dg-lto-options {{-O -flto}} } + +extern "C" double sqrt (double __x) throw (); +typedef double VECTOR[3]; +enum { X = 0, Y = 1, Z = 2, T = 3 }; +inline void VLength(double& a, const VECTOR b) +{ + a = sqrt(b[X] * b[X] + b[Y] * b[Y] + b[Z] * b[Z]); +} +void +determine_subpatch_flatness(void) +{ + double temp1; + VECTOR TempV; + VLength(temp1, TempV); + VLength(temp1, TempV); +} diff --git a/gcc/testsuite/g++.dg/lto/20091004-3_1.C b/gcc/testsuite/g++.dg/lto/20091004-3_1.C new file mode 100644 index 000000000..641c7495b --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091004-3_1.C @@ -0,0 +1,16 @@ +extern "C" double sqrt (double __x) throw (); +typedef double VECTOR[3]; +enum { X = 0, Y = 1, Z = 2, T = 3 }; +inline void VLength(double& a, const VECTOR b) +{ + a = sqrt(b[X] * b[X] + b[Y] * b[Y] + b[Z] * b[Z]); +} +int +All_Torus_Intersections(void) +{ + double len; + VECTOR D; + VLength(len, D); + VLength(len, D); +} + diff --git a/gcc/testsuite/g++.dg/lto/20091022-1_0.C b/gcc/testsuite/g++.dg/lto/20091022-1_0.C new file mode 100644 index 000000000..cb3f20a4e --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091022-1_0.C @@ -0,0 +1,13 @@ +// { dg-lto-do link } +// { dg-extra-ld-options "-fwhole-program" } + +template <int dim> +struct AutoDerivativeFunction { + virtual void gradient_list (void); +}; +template <int dim> +void AutoDerivativeFunction<dim>::gradient_list (void) +{ +} +template class AutoDerivativeFunction<1>; +int main() {} diff --git a/gcc/testsuite/g++.dg/lto/20091022-2_0.C b/gcc/testsuite/g++.dg/lto/20091022-2_0.C new file mode 100644 index 000000000..29ed9b6b0 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091022-2_0.C @@ -0,0 +1,12 @@ +// { dg-lto-do link } +// { dg-lto-options {{-O3 -flto -Winline}} } + +#include <string> + +int +main() +{ + std::string i; + i = "abc"; +} + diff --git a/gcc/testsuite/g++.dg/lto/20091026-1_0.C b/gcc/testsuite/g++.dg/lto/20091026-1_0.C new file mode 100644 index 000000000..5c74f29cc --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091026-1_0.C @@ -0,0 +1,11 @@ +// { dg-lto-do link } +// { dg-extra-ld-options "-r -nostdlib" } + +#include "20091026-1_a.h" +cObject *cHead::find(const char *objname) const +{ + return firstchildp; +} +class cNetworkType : public cObject { }; +cNetworkType *networktype; + diff --git a/gcc/testsuite/g++.dg/lto/20091026-1_1.C b/gcc/testsuite/g++.dg/lto/20091026-1_1.C new file mode 100644 index 000000000..28816100e --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091026-1_1.C @@ -0,0 +1,14 @@ +#include "20091026-1_a.h" +extern cHead networks; +class cNetworkType; +inline cNetworkType *findNetwork(const char *s) +{ + return (cNetworkType *)networks.find(s); +} +int run(const char *opt_network_name) +{ + cNetworkType *network = findNetwork(opt_network_name); + if (!network) + throw 1; +} + diff --git a/gcc/testsuite/g++.dg/lto/20091026-1_a.h b/gcc/testsuite/g++.dg/lto/20091026-1_a.h new file mode 100644 index 000000000..314dd9610 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091026-1_a.h @@ -0,0 +1,9 @@ +class cObject { +public: + cObject *firstchildp; +}; +class cHead : public cObject { +public: + cObject *find(const char *objname) const; +}; + diff --git a/gcc/testsuite/g++.dg/lto/20091210-1_0.C b/gcc/testsuite/g++.dg/lto/20091210-1_0.C new file mode 100644 index 000000000..3bdfd9d56 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091210-1_0.C @@ -0,0 +1,3 @@ +// { dg-lto-do link } +#include "20091210-1_0.h" +void Base::f() {} diff --git a/gcc/testsuite/g++.dg/lto/20091210-1_0.h b/gcc/testsuite/g++.dg/lto/20091210-1_0.h new file mode 100644 index 000000000..a46f3c2db --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091210-1_0.h @@ -0,0 +1,9 @@ +struct Base1 { + virtual ~Base1() {} +}; +struct Base2 { + virtual void f() = 0; +}; +struct Base : Base1, Base2 { + virtual void f(); +}; diff --git a/gcc/testsuite/g++.dg/lto/20091210-1_1.C b/gcc/testsuite/g++.dg/lto/20091210-1_1.C new file mode 100644 index 000000000..4fb15cd5f --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091210-1_1.C @@ -0,0 +1,9 @@ +#include "20091210-1_0.h" + +struct Foo : Base { + virtual void g(); +}; + +void Foo::g() {} + +int main() {} diff --git a/gcc/testsuite/g++.dg/lto/20091219_0.C b/gcc/testsuite/g++.dg/lto/20091219_0.C new file mode 100644 index 000000000..b76a95a9d --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20091219_0.C @@ -0,0 +1,17 @@ +// { dg-lto-do run } +// { dg-lto-options {{-O3 -flto}} } + +#include <string> +#include <map> + +int main () +{ + typedef std::map<int, std::string> Map; + static Map m; + + Map::const_iterator it = m.find(0); + if (it != m.end()) + std::string s = it->second; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20100302.h b/gcc/testsuite/g++.dg/lto/20100302.h new file mode 100644 index 000000000..7260be10c --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20100302.h @@ -0,0 +1,9 @@ +typedef float mm128 __attribute ((vector_size (16))); + +template <class T> +struct A +{ + static T t; +}; + +void f (mm128 *); diff --git a/gcc/testsuite/g++.dg/lto/20100302_0.C b/gcc/testsuite/g++.dg/lto/20100302_0.C new file mode 100644 index 000000000..0551e6ebc --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20100302_0.C @@ -0,0 +1,9 @@ +// Test for ABI forward-compatibility aliases with LTO. +// { dg-skip-if "" { { ! { i?86-*-* x86_64-*-* } } || { *-*-darwin* } } { "*" } { "" } } +// { dg-lto-options {"-flto -fabi-version=2"} } + +#include "20100302.h" + +void f(mm128 *) { } + +template <> mm128 A<mm128>::t = { }; diff --git a/gcc/testsuite/g++.dg/lto/20100302_1.C b/gcc/testsuite/g++.dg/lto/20100302_1.C new file mode 100644 index 000000000..48548b63a --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20100302_1.C @@ -0,0 +1,8 @@ +// { dg-options "-fabi-version=0" } + +#include "20100302.h" + +int main() +{ + f(& A<mm128>::t); +} diff --git a/gcc/testsuite/g++.dg/lto/20100423-1_0.C b/gcc/testsuite/g++.dg/lto/20100423-1_0.C new file mode 100644 index 000000000..f6a741dad --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20100423-1_0.C @@ -0,0 +1,38 @@ +// { dg-lto-do assemble } +// { dg-lto-options {{-g -flto}} } + +namespace llvm +{ + class Function; + class MachineCodeInfo; + class ExecutionEngine + { + }; + class JIT : public ExecutionEngine + { + void runJITOnFunction (Function * F, MachineCodeInfo * MCI = 0); + }; + class JITEventListener + { + public: + JITEventListener () + { + } + virtual ~JITEventListener (); + }; +} + +using namespace llvm; +void +JIT::runJITOnFunction (Function * F, MachineCodeInfo * MCI) +{ + class MCIListener:public JITEventListener + { + MachineCodeInfo *const MCI; + public: + MCIListener (MachineCodeInfo * mci):MCI (mci) + { + } + }; +} + diff --git a/gcc/testsuite/g++.dg/lto/20100423-2_0.C b/gcc/testsuite/g++.dg/lto/20100423-2_0.C new file mode 100644 index 000000000..2ab6bdc56 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20100423-2_0.C @@ -0,0 +1,14 @@ +// { dg-lto-do assemble } +// { dg-lto-options {{-flto -g}} } + +struct A +{ + virtual ~A(); +}; + +void foo() +{ + struct B : A {}; + B b; +} + diff --git a/gcc/testsuite/g++.dg/lto/20100423-3_0.C b/gcc/testsuite/g++.dg/lto/20100423-3_0.C new file mode 100644 index 000000000..49564a586 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20100423-3_0.C @@ -0,0 +1,14 @@ +// { dg-lto-do assemble } +// { dg-lto-options {{-flto -g}} } + +inline int foo() +{ + static union { int i; }; + return i; +} + +void bar() +{ + foo(); +} + diff --git a/gcc/testsuite/g++.dg/lto/20100519-1_0.C b/gcc/testsuite/g++.dg/lto/20100519-1_0.C new file mode 100644 index 000000000..bc2ddf140 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20100519-1_0.C @@ -0,0 +1,23 @@ +// { dg-lto-do link } + +template <typename Ordinal> +struct DirectSerializationTraits +{ + static void fromCountToDirectBytes(const Ordinal count) {} +}; +template<typename Ordinal> class SerializationTraits + : public DirectSerializationTraits<Ordinal> { }; +template <typename Ordinal> +class ConstValueTypeSerializationBuffer +{ +public: + ConstValueTypeSerializationBuffer(const Ordinal count) + { + typedef SerializationTraits<Ordinal> SerT; + SerT::fromCountToDirectBytes(count); + } +}; +int main () +{ + ConstValueTypeSerializationBuffer<int> charSendBuffer(1); +} diff --git a/gcc/testsuite/g++.dg/lto/20100603-1_0.C b/gcc/testsuite/g++.dg/lto/20100603-1_0.C new file mode 100644 index 000000000..8fe11a2f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20100603-1_0.C @@ -0,0 +1,14 @@ +/* { dg-lto-do link } */ + +extern "C" { + typedef struct {} CvImage; + extern CvImage* Cv_ImageNew(void); +} +void __attribute__((noinline,noclone)) +_Raytrace(CvImage* LImage) { __asm volatile (""); } +int main(int LArgC, char** LArgV) +{ + CvImage* LImage = Cv_ImageNew(); + _Raytrace(LImage); +} + diff --git a/gcc/testsuite/g++.dg/lto/20100603-1_1.c b/gcc/testsuite/g++.dg/lto/20100603-1_1.c new file mode 100644 index 000000000..fddce5d4b --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20100603-1_1.c @@ -0,0 +1,2 @@ +typedef struct {} CvImage; +CvImage* Cv_ImageNew(void) { } diff --git a/gcc/testsuite/g++.dg/lto/20100721-1_0.C b/gcc/testsuite/g++.dg/lto/20100721-1_0.C new file mode 100644 index 000000000..09132e599 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20100721-1_0.C @@ -0,0 +1,9 @@ +/* { dg-lto-do assemble } */ + +static inline int __gthread_active_p (void) { } +template <int rank, int dim> class Tensor; +template <int dimension> struct G; +template <int dim> class T { + typedef void A; + typedef Tensor<1,dim> F[G<dim>::v]; +}; diff --git a/gcc/testsuite/g++.dg/lto/20100722-1_0.C b/gcc/testsuite/g++.dg/lto/20100722-1_0.C new file mode 100644 index 000000000..72393950d --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20100722-1_0.C @@ -0,0 +1,5 @@ +/* { dg-lto-do assemble } */ + +template <class T> void void_cast_register(T *) __attribute__ ((used)); +template <class T> void void_cast_register(T *) { } + diff --git a/gcc/testsuite/g++.dg/lto/20100723-1_0.C b/gcc/testsuite/g++.dg/lto/20100723-1_0.C new file mode 100644 index 000000000..d39963593 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20100723-1_0.C @@ -0,0 +1,12 @@ +/* { dg-lto-do link } */ +/* { dg-lto-options {{-fcompare-debug -flto -flto-partition=none} {-fcompare-debug -flto -flto-partition=1to1}} } */ + +struct S { + virtual void f() { } +}; + +int main(int, char *[]) +{ + S s; + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20100724-1_0.C b/gcc/testsuite/g++.dg/lto/20100724-1_0.C new file mode 100644 index 000000000..084c07f08 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20100724-1_0.C @@ -0,0 +1,7 @@ +/* { dg-lto-do link } */ +/* { dg-lto-options {{-ftoplevel-reorder -flto -flto-partition=none} {-ftoplevel-reorder -flto -flto-partition=1to1}} } */ +/* { dg-extra-ld-options {-r -nostdlib} } */ + +struct Foo { virtual ~Foo(); }; +struct Bar:public Foo { Bar() { } }; +void Func() { new Bar(); } diff --git a/gcc/testsuite/g++.dg/lto/20101009-1_0.C b/gcc/testsuite/g++.dg/lto/20101009-1_0.C new file mode 100644 index 000000000..b7cc5bc47 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20101009-1_0.C @@ -0,0 +1,14 @@ +// { dg-lto-do link } + +template < typename > struct X +{ + template < typename > static int test (); + static const int i = sizeof (test < int >()); +}; + +template struct X < int >; + +int main() +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20101010-1_0.C b/gcc/testsuite/g++.dg/lto/20101010-1_0.C new file mode 100644 index 000000000..6eb40efc8 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20101010-1_0.C @@ -0,0 +1,109 @@ +// { dg-lto-do link } + +typedef long size_t; +template < class, class > struct pair +{ +} +; +template < typename > class allocator; +template < typename > struct equal_to; + +template < class > struct hash; +template +< +class, class, class, class, class, class > struct dense_hashtable_iterator; +template +< +class, + class, class, class, class, class > struct dense_hashtable_const_iterator; +template +< +class +Value, + class + Key, + class + HashFcn, + class ExtractKey, class EqualKey, class Alloc > class dense_hashtable +{ +public: + typedef Key key_type; + typedef Value value_type; + typedef size_t size_type; + typedef + dense_hashtable_iterator + < Value, Key, HashFcn, ExtractKey, EqualKey, Alloc > iterator; + typedef + dense_hashtable_const_iterator + < Value, Key, HashFcn, ExtractKey, EqualKey, Alloc > const_iterator; + static const size_type ILLEGAL_BUCKET = (-1); + pair < size_type, size_type > find_position (key_type) + { + size_type insert_pos = ILLEGAL_BUCKET; + } + pair < iterator, bool > insert_noresize (value_type obj) + { + pair < size_type, size_type > pos = find_position ((obj)); + } + pair < iterator, bool > insert (value_type & obj) + { + insert_noresize (obj); + } + ExtractKey get_key; +} + +; +template +< +class +Value, + class + HashFcn + = + hash + < + Value + >, + class + EqualKey + = + equal_to < Value >, class Alloc = allocator < Value > >class dense_hash_set +{ + struct Identity + { + } + ; + typedef + dense_hashtable < Value, Value, HashFcn, Identity, EqualKey, Alloc > ht; + ht rep; +public: + typedef typename ht::value_type value_type; + typedef typename ht::const_iterator iterator; + pair < iterator, bool > insert (value_type obj) + { + pair < typename ht::iterator, bool > p = rep.insert (obj); + } +} + +; +class blah_46 +{ +} +; +struct foo_10:dense_hash_set < blah_46 > +{ +} +; +class foo_14 +{ + void hmmmmh_5 (blah_46); + foo_10 negative_rrrrrrr_type_data_; +} +; +void +foo_14::hmmmmh_5 (blah_46 hahaha_id) +{ + negative_rrrrrrr_type_data_.insert (hahaha_id); +} + +int main () { return 0; } diff --git a/gcc/testsuite/g++.dg/lto/20101010-2_0.C b/gcc/testsuite/g++.dg/lto/20101010-2_0.C new file mode 100644 index 000000000..c68bcd632 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20101010-2_0.C @@ -0,0 +1,32 @@ +// { dg-lto-do link } + +typedef int size_t; +template < size_t _Nw > struct _Base_bitset +{ + typedef unsigned _WordT; + _WordT _M_w[_Nw]; + void _M_do_set () + { + for (size_t __i;;) + _M_w[__i] = static_cast < _WordT > (0); + } +}; + +template < size_t > class bitset: +_Base_bitset < ((sizeof (unsigned)) + ((sizeof (unsigned)) ? : 1)) > +{ +public: + bitset set () + { + _M_do_set (); + } +}; + +void +test01 () +{ + bitset < 96 > z6; + z6.set (); +} + +int main() { return 0; } diff --git a/gcc/testsuite/g++.dg/lto/20101010-3_0.C b/gcc/testsuite/g++.dg/lto/20101010-3_0.C new file mode 100644 index 000000000..ed3b8d6bc --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20101010-3_0.C @@ -0,0 +1,5 @@ +// { dg-lto-do link } +// { dg-lto-options { "-flto -std=c++0x" } } + +decltype(nullptr) a; +int main() { return 0; } diff --git a/gcc/testsuite/g++.dg/lto/20101010-4_0.C b/gcc/testsuite/g++.dg/lto/20101010-4_0.C new file mode 100644 index 000000000..01beb2167 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20101010-4_0.C @@ -0,0 +1,9 @@ +// { dg-lto-do link } +// { dg-lto-options { { -std=c++0x -flto -r -nostdlib } { -std=c++0x -flto -g -r -nostdlib } } } + +typedef decltype(nullptr) nullptr_t; +class shared_ptr { +public: + shared_ptr(nullptr_t __p); +}; +shared_ptr p = nullptr; diff --git a/gcc/testsuite/g++.dg/lto/20101014-1_0.C b/gcc/testsuite/g++.dg/lto/20101014-1_0.C new file mode 100644 index 000000000..d2f599e40 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20101014-1_0.C @@ -0,0 +1,16 @@ +// { dg-lto-do run } + +static const char *fname; +struct S +{ + S () { fname = __func__; } +}; +extern "C" void abort (void); +int +main () +{ + S tmp; + if (fname[0] != 'S') + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/20101014-2_0.C b/gcc/testsuite/g++.dg/lto/20101014-2_0.C new file mode 100644 index 000000000..0b2a52c61 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20101014-2_0.C @@ -0,0 +1,8 @@ +// { dg-lto-do assemble } + +template<class T, unsigned long l> +inline unsigned long foo (T (&)[l]) { return l; } + +struct S { char *s[4]; S (); }; + +S::S () { typedef int T[foo (s) == 4 ? 1 : -1]; } diff --git a/gcc/testsuite/g++.dg/lto/20101015-1_0.C b/gcc/testsuite/g++.dg/lto/20101015-1_0.C new file mode 100644 index 000000000..a3b296ee0 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20101015-1_0.C @@ -0,0 +1,31 @@ +// { dg-lto-do assemble } + +class DOMString { }; +class DocumentImpl; +class NodeImpl { +public: + static const DOMString& + mapPrefix(const DOMString &prefix, const DOMString &namespaceURI, short nType); + static DOMString getXmlnsURIString(); +}; +class DOM_Node { +public: + enum NodeType { ATTRIBUTE_NODE = 2 }; +}; +class AttrImpl: public NodeImpl { +public: + AttrImpl(DocumentImpl *ownerDocument, const DOMString &aName); +}; +class AttrNSImpl: public AttrImpl { + AttrNSImpl(DocumentImpl *ownerDoc, const DOMString &namespaceURI, const DOMString &qualifiedName); +}; +AttrNSImpl::AttrNSImpl(DocumentImpl *ownerDoc, + const DOMString &fNamespaceURI, + const DOMString &qualifiedName) + : AttrImpl(ownerDoc, qualifiedName) +{ + DOMString xmlnsURI = NodeImpl::getXmlnsURIString(); + DOMString prefix; + bool xmlnsAlone = false; + const DOMString& URI = xmlnsAlone ? xmlnsURI : mapPrefix(prefix, fNamespaceURI, DOM_Node::ATTRIBUTE_NODE); +} diff --git a/gcc/testsuite/g++.dg/lto/20101015-2_0.C b/gcc/testsuite/g++.dg/lto/20101015-2_0.C new file mode 100644 index 000000000..9015f53a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20101015-2_0.C @@ -0,0 +1,6 @@ +// { dg-lto-do link } +// { dg-lto-options { { -flto } { -g -flto } } } +// { dg-extra-ld-options "-r -nostdlib" } + +struct Base { ~Base (); }; +void fun(void) { struct Deriv : Base { } x; } diff --git a/gcc/testsuite/g++.dg/lto/20101020-1_0.C b/gcc/testsuite/g++.dg/lto/20101020-1_0.C new file mode 100644 index 000000000..e92bcf8ac --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20101020-1_0.C @@ -0,0 +1,8 @@ +// { dg-lto-do link } + +#include "20101020-1_0.h" +A::A () +{ + foo (&A::bar); +} +int main() { return 0; } diff --git a/gcc/testsuite/g++.dg/lto/20101020-1_0.h b/gcc/testsuite/g++.dg/lto/20101020-1_0.h new file mode 100644 index 000000000..2de1d3c76 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20101020-1_0.h @@ -0,0 +1,23 @@ +struct A; +typedef void (A::*Am1) (void *); +typedef void (A::*Am2) (); + +struct B +{ + Am2 am2; +}; + +struct A +{ + A (); + struct B b; + struct C *c; + struct D *d; + void foo (Am1); + void bar (void *); +}; + +struct C +{ +}; + diff --git a/gcc/testsuite/g++.dg/lto/20101020-1_1.C b/gcc/testsuite/g++.dg/lto/20101020-1_1.C new file mode 100644 index 000000000..5c83fbfdb --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20101020-1_1.C @@ -0,0 +1,11 @@ +#include "20101020-1_0.h" +struct D +{ +}; +void A::bar (void *) +{ +} +void A::foo (Am1) +{ +} + diff --git a/gcc/testsuite/g++.dg/lto/20101126-1_0.C b/gcc/testsuite/g++.dg/lto/20101126-1_0.C new file mode 100644 index 000000000..93a1cf3af --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20101126-1_0.C @@ -0,0 +1,5 @@ +typedef struct { int i; } T1; +typedef T1 T2; +extern T1 a; +extern T2 b; +int main() { return a.i + b.i; } diff --git a/gcc/testsuite/g++.dg/lto/20101126-1_1.c b/gcc/testsuite/g++.dg/lto/20101126-1_1.c new file mode 100644 index 000000000..628e89b6c --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20101126-1_1.c @@ -0,0 +1,4 @@ +typedef struct { int i; } T1; +typedef T1 T2; +T1 a; +T2 b; diff --git a/gcc/testsuite/g++.dg/lto/20110311-1_0.C b/gcc/testsuite/g++.dg/lto/20110311-1_0.C new file mode 100644 index 000000000..c63951e5b --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/20110311-1_0.C @@ -0,0 +1,51 @@ +/* { dg-lto-do link } */ +/* { dg-extra-ld-options "-r -nostdlib" } */ + +struct NullType {}; + +template <class T, class U> +struct TList +{ + typedef T Head; + typedef U Tail; +}; + +template <class T> +struct TListLength {}; + +template <class T, class U> +struct TListLength<TList<T,U> > +{ + enum + { + Ret = 1 + TListLength<U>::Ret + }; +}; + +template <> +struct TListLength<NullType> +{ + enum + { + Ret = 0 + }; +}; + +template <class Moves> +class DDQMC +{ +public: + int* moves[TListLength<Moves>::Ret]; + inline DDQMC(); +private: +}; + +template <class Moves> +DDQMC<Moves>::DDQMC() +{ +} + +int main() +{ + typedef DDQMC< TList<float, TList<int, NullType> > > mytype; +} diff --git a/gcc/testsuite/g++.dg/lto/README b/gcc/testsuite/g++.dg/lto/README new file mode 100644 index 000000000..5fa3123b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/README @@ -0,0 +1,35 @@ +This directory contains tests for link-time optimization (LTO). +Tests in this directory may span multiple files, so the naming of +the files is significant. + +The name of every file must end with '_N' where N is an integer. +All the files with the same name base and different _N suffixes +will be compiled separately and linked together to form the final +executable. + +By default, each set of files will be compiled with list of +options listed in LTO_OPTIONS (../../lib/lto.exp), which can be +overwritten in the shell environment or using the 'dg-lto-options' +command in the main file of the set (i.e., the file with _0 +suffix). + +For example, given the files a_0.C a_1.C a_2.C, they will be +compiled as: + +$ g++ -c <flags> a_0.C +$ g++ -c <flags> a_1.C +$ g++ -c <flags> a_2.C +$ g++ -o <executable> a_0.o a_1.o a_2.o + +Tests that do not need more than one file are a special case +where there is a single file named 'foo_0.C'. + +The only supported dg-lto-do option are 'compile', 'run' and 'link'. +Additionally, these can only be used in the main file. If +'compile' is used, only the individual object files are +generated. If 'link' is used, the final executable is generated +but not executed (in this case, function main() needs to exist +but it does not need to do anything). If 'run' is used, the +final executable is generated and the resulting binary executed. + +The default value for dg-lto-do is 'run'. diff --git a/gcc/testsuite/g++.dg/lto/lto.exp b/gcc/testsuite/g++.dg/lto/lto.exp new file mode 100644 index 000000000..62d825031 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/lto.exp @@ -0,0 +1,60 @@ +# Copyright (C) 2009 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. +# +# Contributed by Diego Novillo <dnovillo@google.com> + + +# Test link-time optimization across multiple files. +# +# Programs are broken into multiple files. Each one is compiled +# separately with LTO information. The final executable is generated +# by collecting all the generated object files using regular LTO or WHOPR. + +if $tracelevel then { + strace $tracelevel +} + +# Load procedures from common libraries. +load_lib standard.exp +load_lib g++.exp +load_lib target-libpath.exp + +# Load the language-independent compabibility support procedures. +load_lib lto.exp + +g++_init +lto_init no-mathlib + +# Define an identifier for use with this suite to avoid name conflicts +# with other lto tests running at the same time. +set sid "cp_lto" + +# If LTO has not been enabled, bail. +if { ![check_effective_target_lto] } { + return +} + +# Main loop. +foreach src [lsort [find $srcdir/$subdir *_0.C]] { + # If we're only testing specific files and this isn't one of them, skip it. + if ![runtest_file_p $runtests $src] then { + continue + } + + lto-execute $src $sid +} + +lto_finish diff --git a/gcc/testsuite/g++.dg/lto/pr40818_0.C b/gcc/testsuite/g++.dg/lto/pr40818_0.C new file mode 100644 index 000000000..8430f9cd0 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr40818_0.C @@ -0,0 +1,11 @@ +// { dg-lto-do assemble } +// Test case from Eugene A. Strizhov. + +extern int i; +struct S { S (); }; + +S::S () +{ + enum { fifty = 0x50 }; + if (i > fifty); +} diff --git a/gcc/testsuite/g++.dg/lto/pr45621.h b/gcc/testsuite/g++.dg/lto/pr45621.h new file mode 100644 index 000000000..81a764225 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr45621.h @@ -0,0 +1,8 @@ +struct S +{ + void m (); + virtual void v1 (); + virtual void v2 (); +}; + +extern S s; diff --git a/gcc/testsuite/g++.dg/lto/pr45621_0.C b/gcc/testsuite/g++.dg/lto/pr45621_0.C new file mode 100644 index 000000000..746079cdc --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr45621_0.C @@ -0,0 +1,10 @@ +// { dg-lto-do assemble } +// { dg-extra-ld-options "-O2 -fipa-cp-clone -flto -nostdlib -r" } +#include "pr45621.h" + +void +foo () +{ + s.v1 (); + s.m (); +} diff --git a/gcc/testsuite/g++.dg/lto/pr45621_1.C b/gcc/testsuite/g++.dg/lto/pr45621_1.C new file mode 100644 index 000000000..2ada6a879 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr45621_1.C @@ -0,0 +1,13 @@ +#include "pr45621.h" + +void +S::v1 () +{ + v2 (); +} + +void +S::m () +{ + v1 (); +} diff --git a/gcc/testsuite/g++.dg/lto/pr45679-1_0.C b/gcc/testsuite/g++.dg/lto/pr45679-1_0.C new file mode 100644 index 000000000..349f5c2c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr45679-1_0.C @@ -0,0 +1,28 @@ +// { dg-lto-do link } +// { dg-lto-options {{-O3 -Wno-multichar}} } +// { dg-extra-ld-options "-flto -flto-partition=1to1 -r -nostdlib" } + + extern "C" { + typedef struct __locale_struct { + } + *__locale_t; + } + typedef void * POVMSContext; + struct POVMSData { + }; + int POVMS_OpenContext (POVMSContext *contextrefptr); + enum { + kPOVMsgIdent_InitInfo = 'InIn', kPOVMsgIdent_RenderOptions = 'ROpt', kPOVMsgIdent_RenderAll = 'RAll', kPOVMsgIdent_RenderArea = 'RAre', kPOVMsgIdent_RenderPause = 'RPau', kPOVMsgIdent_RenderStop = 'RSto', kPOVMsgIdent_RenderStarted = 'RRun', kPOVMsgIdent_RenderDone = 'REnd', kPOVMsgIdent_FrameStatistics = 'FSta', kPOVMsgIdent_ParseStatistics = 'PSta', kPOVMsgIdent_RenderStatistics = 'RSta', kPOVMsgIdent_Progress = 'Prog', kPOVMsgIdent_Warning = 'Warn', kPOVMsgIdent_Error = 'ErrW', kPOVMsgIdent_FatalError = 'ErrF', kPOVMsgIdent_Debug = 'Dbug' }; + namespace pov { + } + using namespace pov; + namespace pov { + int pre_init_flag = 0; + } + POVMSContext POVMS_Render_Context = __null; + void povray_init() { + if (pre_init_flag == 0) { + int err; + err = POVMS_OpenContext(&POVMS_Render_Context); + } + } diff --git a/gcc/testsuite/g++.dg/lto/pr45679-1_1.C b/gcc/testsuite/g++.dg/lto/pr45679-1_1.C new file mode 100644 index 000000000..c5e2db061 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr45679-1_1.C @@ -0,0 +1,77 @@ + extern "C" { + typedef struct _IO_FILE FILE; + extern struct _IO_FILE *stderr; + extern int fprintf (FILE *__restrict __stream, __const char *__restrict __format, ...); + } + enum { + kPOVMSObjectClassID = 'OCLA', kPOVMSMessageClassID = 'MCLA', kPOVMSMessageIdentID = 'MIDE', kPOVMSSourceAddressID = 'MSRC', kPOVMSDestinationAddressID = 'MDST', kPOVMSMessageTimeoutID = 'TOUT', kPOVMSMessageErrorID = 'MERR' }; + typedef void * POVMSContext; + typedef struct POVMSData POVMSObject, *POVMSObjectPtr; + typedef struct POVMSData POVMSAttribute, *POVMSAttributePtr; + struct POVMSData { + union { + struct POVMSNode *root; + }; + }; + struct POVMSNode { + struct POVMSNode *next; + unsigned int key; + struct POVMSData data; + }; + int POVMSObject_New (POVMSObjectPtr object, unsigned int objclass); + int POVMSObject_Set (POVMSObjectPtr object, POVMSAttributePtr attr, unsigned int key); + int POVMSAttr_Copy (POVMSAttributePtr sourceattr, POVMSAttributePtr destattr); + int POVMSUtil_GetType (POVMSObjectPtr object, unsigned int key, unsigned int *typevalue); + namespace pov_base { + enum { + kNoError = 0, kNoErr = kNoError, kParamErr = -1, kMemFullErr = -2, kOutOfMemoryErr = kMemFullErr, kInvalidDataSizeErr = -3, kCannotHandleDataErr = -4, kNullPointerErr = -5, kChecksumErr = -6, kParseErr = -7, kCannotOpenFileErr = -8, kInvalidDestAddrErr = -9, kCannotConnectErr = -10, kDisconnectedErr = -11, kHostDisconnectedErr = -12, kNetworkDataErr = -13, kNetworkConnectionErr = -14, kObjectAccessErr = -15, kVersionErr = -16, kFileDataErr = -17, kAuthorisationErr = -18, kDataTypeErr = -19, kTimeoutErr = -20, kInvalidContextErr = -21 }; + } + using namespace pov_base; + struct POVMSContextData { + }; + int POVMS_AssertFunction (int cond, const char *str, const char *filename, int line); + int POVMS_OpenContext(POVMSContext *contextrefptr) { + POVMSContextData *context = __null; + if(contextrefptr == __null) return kParamErr; + if(POVMS_AssertFunction(context != __null, "POVMS_Open_Context failed, out of memory", "povms.cpp", 283) == false) return kMemFullErr; + return kNoErr; + } + int POVMS_AssertFunction(int cond, const char *str, const char *filename, int line) { + if(cond == false) { + fprintf(stderr, "POVMS_ASSERT failed in %s line %d: %s\n", filename, (int)line, str); + } + } + int POVMSObject_Copy(POVMSObjectPtr sourceobject, POVMSObjectPtr destobject) { + POVMSNode *cur = __null; + POVMSAttribute attr; + unsigned int t; + int ret = kNoErr; + if(sourceobject == destobject) return kParamErr; + if(POVMSUtil_GetType(sourceobject, kPOVMSObjectClassID, &t) != kNoErr) return kObjectAccessErr; + if(POVMSObject_New(destobject, t) != kNoErr) return kObjectAccessErr; + for(cur = sourceobject->root; + cur != __null; + cur = cur->next) { + if(POVMS_AssertFunction(POVMSAttr_Copy(&(cur->data), &attr) == kNoErr, "POVMSObject_Copy failed, out of memory", "povms.cpp", 2028) == false) { + } + if(POVMS_AssertFunction(POVMSObject_Set(destobject, &attr, cur->key) == kNoErr, "POVMSObject_Copy failed, out of memory", "povms.cpp", 2034) == false) { + } + } + return ret; + } + int POVMSObject_Merge(POVMSObjectPtr sourceobject, POVMSObjectPtr destobject) { + POVMSNode *cur = __null; + POVMSAttribute attr; + unsigned int t1, t2; + int ret = kNoErr; + if(destobject == __null) return kParamErr; + if(POVMSUtil_GetType(sourceobject, kPOVMSObjectClassID, &t1) != kNoErr) return kObjectAccessErr; + if(POVMSUtil_GetType(sourceobject, kPOVMSObjectClassID, &t2) != kNoErr) return kObjectAccessErr; + for(cur = sourceobject->root; + cur != __null; + cur = cur->next) { + if(POVMS_AssertFunction(POVMSObject_Set(destobject, &attr, cur->key) == kNoErr, "POVMSObject_Merge failed, out of memory", "povms.cpp", 2090) == false) { + } + } + return ret; + } diff --git a/gcc/testsuite/g++.dg/lto/pr45679-2_0.C b/gcc/testsuite/g++.dg/lto/pr45679-2_0.C new file mode 100644 index 000000000..549741902 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr45679-2_0.C @@ -0,0 +1,119 @@ +// { dg-lto-do link } +// { dg-lto-options {{-O3 -Wno-multichar}} } +// { dg-extra-ld-options "-flto -flto-partition=1to1 -r -nostdlib" } + extern "C" { + typedef struct { + union { + } + __value; + } + __mbstate_t; + struct _IO_marker { + }; + extern "C" { + } + }; + namespace pov_base { + class IOBase { + }; + } + namespace pov { + typedef double VECTOR[3]; + enum { + X = 0, Y = 1, Z = 2, T = 3 }; + inline void Assign_Vector(VECTOR d, VECTOR s) { + } + typedef float BBOX_VAL; + typedef BBOX_VAL BBOX_VECT[3]; + typedef struct Bounding_Box_Struct BBOX; + struct Bounding_Box_Struct { + }; + inline void Make_BBox_from_min_max(BBOX& BBox, BBOX_VECT mins, BBOX_VECT maxs) { + } + typedef long long COUNTER; + inline double DBL_Counter(COUNTER x) { + } + struct Image_Struct { + union { + } + data; + }; + struct Density_file_Data_Struct { + union { + } + Vals; + }; + struct Pigment_Struct { + union { + struct { + } + Brick; + struct { + } + Fractal; + struct { + } + Function; + } + Vals; + }; + typedef enum shelltype { + PRE_SCENE_SHL = 0, PRE_FRAME_SHL, POST_FRAME_SHL, POST_SCENE_SHL, USER_ABORT_SHL, FATAL_SHL, MAX_SHL } + SHELLRET; + } + typedef void * POVMSContext; + struct POVMSData { + }; + int POVMS_OpenContext (POVMSContext *contextrefptr); + namespace pov_base { + enum { + kFalseErr = 1, kOutOfSyncErr = 2, kNotNowErr = kOutOfSyncErr, kQueueFullErr = 3 }; + } + namespace pov_base { + class OTextStream { + }; + } + enum { + kPOVMsgClass_RenderControl = 'Ctrl', kPOVMsgClass_RenderOutput = 'Outp', kPOVMsgClass_IniOptions = 'IniO', kPOVMsgClass_Miscellaneous = 'Misc' }; + namespace pov_base { + class PlatformBase { + }; + } + class POVMS_Container { + template<class T> void Read(T& stream) { + } + }; + class POVMS_MessageReceiver { + private: class HandlerOO { + }; + protected: template<class T> class MemberHandlerOO : public HandlerOO { + }; + class FunctionHandlerOO : public HandlerOO { + }; + template<class T> void InstallFront(unsigned int hclass, unsigned int hid, T *cptr, typename MemberHandlerOO<T>::MemberHandlerPtr hptr) { + } + }; + namespace pov_base { + class TextStreamBuffer { + }; + } + namespace pov_frontend { + using namespace pov_base; + class MessageOutput : public POVMS_MessageReceiver { + }; + class DefaultPlatformBase : public PlatformBase { + }; + } + using namespace pov; + namespace pov { + int pre_init_flag = 0; + } + POVMSContext POVMS_Render_Context = __null; + int main(int argc, char **argv) { + } + void povray_init() { + if (pre_init_flag == 0) { + int err; + err = POVMS_OpenContext(&POVMS_Render_Context); + } + } diff --git a/gcc/testsuite/g++.dg/lto/pr45679-2_1.C b/gcc/testsuite/g++.dg/lto/pr45679-2_1.C new file mode 100644 index 000000000..23ba08aec --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr45679-2_1.C @@ -0,0 +1,100 @@ +extern "C" { + typedef struct __locale_struct { + } + *__locale_t; + union wait { + }; + extern "C" { + } + typedef struct _IO_FILE FILE; + typedef struct { + union { + } + __value; + } + _G_fpos64_t; + struct _IO_marker { + } + _IO_cookie_io_functions_t; + extern struct _IO_FILE *stderr; + extern int fprintf (FILE *__restrict __stream, __const char *__restrict __format, ...); + } + enum { + kPOVMSObjectClassID = 'OCLA', kPOVMSMessageClassID = 'MCLA', kPOVMSMessageIdentID = 'MIDE', kPOVMSSourceAddressID = 'MSRC', kPOVMSDestinationAddressID = 'MDST', kPOVMSMessageTimeoutID = 'TOUT', kPOVMSMessageErrorID = 'MERR' }; + typedef void * POVMSContext; + typedef struct POVMSData POVMSObject, *POVMSObjectPtr; + typedef struct POVMSData POVMSAttribute, *POVMSAttributePtr; + typedef struct POVMSData POVMSAttributeList, *POVMSAttributeListPtr; + struct POVMSData { + int size; + union { + void *ptr; + struct POVMSNode *root; + }; + }; + struct POVMSNode { + struct POVMSNode *next; + unsigned int key; + struct POVMSData data; + }; + int POVMSObject_Set (POVMSObjectPtr object, POVMSAttributePtr attr, unsigned int key); + int POVMSAttr_Copy (POVMSAttributePtr sourceattr, POVMSAttributePtr destattr); + int POVMSUtil_GetType (POVMSObjectPtr object, unsigned int key, unsigned int *typevalue); + namespace pov_base { + enum { + kNoError = 0, kNoErr = kNoError, kParamErr = -1, kMemFullErr = -2, kOutOfMemoryErr = kMemFullErr, kInvalidDataSizeErr = -3, kCannotHandleDataErr = -4, kNullPointerErr = -5, kChecksumErr = -6, kParseErr = -7, kCannotOpenFileErr = -8, kInvalidDestAddrErr = -9, kCannotConnectErr = -10, kDisconnectedErr = -11, kHostDisconnectedErr = -12, kNetworkDataErr = -13, kNetworkConnectionErr = -14, kObjectAccessErr = -15, kVersionErr = -16, kFileDataErr = -17, kAuthorisationErr = -18, kDataTypeErr = -19, kTimeoutErr = -20, kInvalidContextErr = -21 }; + } + using namespace pov_base; + struct POVMSContextData { + }; + int POVMS_AssertFunction (int cond, const char *str, const char *filename, int line); + int POVMS_OpenContext(POVMSContext *contextrefptr) { + POVMSContextData *context = __null; + if(contextrefptr == __null) return kParamErr; + if(POVMS_AssertFunction(context != __null, "POVMS_Open_Context failed, out of memory", "povms.cpp", 283) == false) return kMemFullErr; + return kNoErr; + } + int POVMS_AssertFunction(int cond, const char *str, const char *filename, int line) { + if(cond == false) { + fprintf(stderr, "POVMS_ASSERT failed in %s line %d: %s\n", filename, (int)line, str); + } + } + int POVMSObject_Copy(POVMSObjectPtr sourceobject, POVMSObjectPtr destobject) { + POVMSNode *cur = __null; + POVMSAttribute attr; + unsigned int t1, t2; + int ret = kNoErr; + if(destobject == __null) return kParamErr; + if(POVMSUtil_GetType(sourceobject, kPOVMSObjectClassID, &t1) != kNoErr) return kObjectAccessErr; + if(POVMSUtil_GetType(sourceobject, kPOVMSObjectClassID, &t2) != kNoErr) return kObjectAccessErr; + if(t1 != t2) return kDataTypeErr; + for(cur = sourceobject->root; + cur != __null; + cur = cur->next) { + if(POVMS_AssertFunction(POVMSAttr_Copy(&(cur->data), &attr) == kNoErr, "POVMSObject_Merge failed, out of memory", "povms.cpp", 2084) == false) { + } + if(POVMS_AssertFunction(POVMSObject_Set(destobject, &attr, cur->key) == kNoErr, "POVMSObject_Merge failed, out of memory", "povms.cpp", 2090) == false) { + } + } + return ret; + } + int POVMSObject_Set(POVMSObjectPtr object, POVMSAttributePtr attr, unsigned int key) { + } + int POVMSAttrList_Copy(POVMSAttributeListPtr sourcelist, POVMSAttributeListPtr destlist) { + int cnt; + int err = kNoErr; + if(sourcelist == __null) return kParamErr; + if(destlist == __null) return kParamErr; + if(sourcelist == destlist) return kParamErr; + if(sourcelist->size < 0) return kParamErr; + if(sourcelist->size > 0) { + if(sourcelist->ptr != __null) { + if(POVMS_AssertFunction(destlist->ptr != __null, "POVMSAttrList_Copy failed, out of memory", "povms.cpp", 3020) == false) return -1; + } + for(cnt = 0; + cnt < sourcelist->size; + cnt++) { + } + } + return err; + } diff --git a/gcc/testsuite/g++.dg/lto/pr45983_0.C b/gcc/testsuite/g++.dg/lto/pr45983_0.C new file mode 100644 index 000000000..a2c9ba609 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr45983_0.C @@ -0,0 +1,20 @@ +// PR c++/45983 + +template <int N> +class T1 { + int m[N]; + typedef float scalar_type_t; + typedef scalar_type_t scalar_array_t[1]; + const scalar_array_t &decay(void) const; +}; +class T2 { +public: + float vals[1]; + float get_value(void) const { return vals[0]; } +}; +T2 channel_params; +float output_audio(void) { + return channel_params.get_value(); +} + +int main(){} diff --git a/gcc/testsuite/g++.dg/lto/pr47333.C b/gcc/testsuite/g++.dg/lto/pr47333.C new file mode 100644 index 000000000..60873ca07 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr47333.C @@ -0,0 +1,944 @@ +namespace std +{ + typedef unsigned int size_t; + typedef int ptrdiff_t; + +} + +namespace std __attribute__ ((__visibility__ ("default"))) { + + template<typename _Alloc> + class allocator; + + template<class _CharT> + struct char_traits; + + template<typename _CharT, typename _Traits = char_traits<_CharT>, + typename _Alloc = allocator<_CharT> > + class basic_string; + + template<> struct char_traits<char>; + + typedef basic_string<char> string; + + template<> struct char_traits<wchar_t>; + + typedef basic_string<wchar_t> wstring; +} + +namespace std __attribute__ ((__visibility__ ("default"))) { + void + __throw_bad_alloc(void) __attribute__((__noreturn__)); +} + +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) { + template<typename _Iterator, typename _Container> + class __normal_iterator; +} + +namespace std __attribute__ ((__visibility__ ("default"))) { + + template<typename _Tp> + inline _Tp* + __addressof(_Tp& __r) + { + return reinterpret_cast<_Tp*> + (&const_cast<char&>(reinterpret_cast<const volatile char&>(__r))); + } +} + +namespace std __attribute__ ((__visibility__ ("default"))) { + template<class _T1, class _T2> + struct pair + { + typedef _T1 first_type; + typedef _T2 second_type; + + _T1 first; + _T2 second; + + pair() + : first(), second() { } + + pair(const _T1& __a, const _T2& __b) + : first(__a), second(__b) { } + }; +} + +namespace std __attribute__ ((__visibility__ ("default"))) { + struct input_iterator_tag { }; + + struct output_iterator_tag { }; + + struct forward_iterator_tag : public input_iterator_tag { }; + + struct bidirectional_iterator_tag : public forward_iterator_tag { }; + + struct random_access_iterator_tag : public bidirectional_iterator_tag { }; + template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t, + typename _Pointer = _Tp*, typename _Reference = _Tp&> + struct iterator + { + typedef _Category iterator_category; + typedef _Tp value_type; + typedef _Distance difference_type; + typedef _Pointer pointer; + typedef _Reference reference; + }; + + template<typename _Iterator> + struct iterator_traits + { + typedef typename _Iterator::iterator_category iterator_category; + typedef typename _Iterator::value_type value_type; + typedef typename _Iterator::difference_type difference_type; + typedef typename _Iterator::pointer pointer; + typedef typename _Iterator::reference reference; + }; +} + +namespace std __attribute__ ((__visibility__ ("default"))) { + template<typename _Iterator> + class reverse_iterator + : public iterator<typename iterator_traits<_Iterator>::iterator_category, + typename iterator_traits<_Iterator>::value_type, + typename iterator_traits<_Iterator>::difference_type, + typename iterator_traits<_Iterator>::pointer, + typename iterator_traits<_Iterator>::reference> + { + protected: + _Iterator current; + typedef iterator_traits<_Iterator> __traits_type; + }; +} + +struct _IO_FILE; + +typedef struct _IO_FILE FILE; + +typedef struct _IO_FILE __FILE; + +typedef __builtin_va_list __gnuc_va_list; + +typedef unsigned int size_t; +typedef unsigned int wint_t; + +typedef struct +{ + int __count; + union + { + unsigned int __wch; + char __wchb[4]; + } __value; +} __mbstate_t; + + +typedef __mbstate_t mbstate_t; + +namespace std __attribute__ ((__visibility__ ("default"))) { + using ::mbstate_t; +} + +namespace std __attribute__ ((__visibility__ ("default"))) { + typedef long long streamoff; + + typedef ptrdiff_t streamsize; + template<typename _StateT> + class fpos + { + private: + streamoff _M_off; + _StateT _M_state; + + public: + + fpos() + : _M_off(0), _M_state() { } + fpos(streamoff __off) + : _M_off(__off), _M_state() { } + + operator streamoff() const { return _M_off; } + + }; + + typedef fpos<mbstate_t> streampos; + + typedef fpos<mbstate_t> wstreampos; +} + +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) { + template<typename _CharT> + struct _Char_types + { + typedef unsigned long int_type; + typedef std::streampos pos_type; + typedef std::streamoff off_type; + typedef std::mbstate_t state_type; + }; + template<typename _CharT> + struct char_traits + { + typedef _CharT char_type; + typedef typename _Char_types<_CharT>::int_type int_type; + typedef typename _Char_types<_CharT>::pos_type pos_type; + typedef typename _Char_types<_CharT>::off_type off_type; + typedef typename _Char_types<_CharT>::state_type state_type; + + static const char_type* + find(const char_type* __s, std::size_t __n, const char_type& __a); + }; +} + +namespace std __attribute__ ((__visibility__ ("default"))) { + template<class _CharT> + struct char_traits : public __gnu_cxx::char_traits<_CharT> + { }; + + template<> + struct char_traits<char> + { + typedef char char_type; + typedef int int_type; + typedef streampos pos_type; + typedef streamoff off_type; + typedef mbstate_t state_type; + + static const char_type* + find(const char_type* __s, size_t __n, const char_type& __a) + { return static_cast<const char_type*>(__builtin_memchr(__s, __a, __n)); } + }; +} + +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) { + + using std::size_t; + using std::ptrdiff_t; + template<typename _Tp> + class new_allocator + { + public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + + new_allocator() throw() { } + + new_allocator(const new_allocator&) throw() { } + + template<typename _Tp1> + new_allocator(const new_allocator<_Tp1>&) throw() { } + + ~new_allocator() throw() { } + + pointer + allocate(size_type __n, const void* = 0) + { + if (__n > this->max_size()) + std::__throw_bad_alloc(); + + return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp))); + } + void + deallocate(pointer __p, size_type) + { ::operator delete(__p); } + + void + destroy(pointer __p) { __p->~_Tp(); } + }; +} + +namespace std __attribute__ ((__visibility__ ("default"))) { + template<typename _Tp> + class allocator; + + template<typename _Tp> + class allocator: public __gnu_cxx::new_allocator<_Tp> + { + public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + + template<typename _Tp1> + struct rebind + { typedef allocator<_Tp1> other; }; + + allocator() throw() { } + + allocator(const allocator& __a) throw() + : __gnu_cxx::new_allocator<_Tp>(__a) { } + + template<typename _Tp1> + allocator(const allocator<_Tp1>&) throw() { } + + ~allocator() throw() { } + }; +} + +namespace std __attribute__ ((__visibility__ ("default"))) { + template<typename _Arg, typename _Result> + struct unary_function + { + typedef _Arg argument_type; + typedef _Result result_type; + }; + + template<typename _Arg1, typename _Arg2, typename _Result> + struct binary_function + { + typedef _Arg1 first_argument_type; + typedef _Arg2 second_argument_type; + typedef _Result result_type; + }; + + template<typename _Tp> + struct less : public binary_function<_Tp, _Tp, bool> + { + bool + operator()(const _Tp& __x, const _Tp& __y) const + { return __x < __y; } + }; + + template<typename _Pair> + struct _Select1st : public unary_function<_Pair, + typename _Pair::first_type> + { + typename _Pair::first_type& + operator()(_Pair& __x) const + { return __x.first; } + + const typename _Pair::first_type& + operator()(const _Pair& __x) const + { return __x.first; } + }; +} + +extern "C" { + +typedef int __sig_atomic_t; + +typedef struct + { + unsigned long int __val[(1024 / (8 * sizeof (unsigned long int)))]; + } __sigset_t; +typedef __sigset_t sigset_t; +} +typedef unsigned long int pthread_t; + +typedef struct __pthread_internal_slist +{ + struct __pthread_internal_slist *__next; +} __pthread_slist_t; + +typedef union +{ + struct __pthread_mutex_s + { + int __lock; + unsigned int __count; + int __owner; + int __kind; + + unsigned int __nusers; + __extension__ union + { + int __spins; + __pthread_slist_t __list; + }; + + } __data; + char __size[24]; + long int __align; +} pthread_mutex_t; + +typedef unsigned int pthread_key_t; + +typedef int pthread_once_t; + +extern int pthread_once (pthread_once_t *__once_control, + void (*__init_routine) (void)) __attribute__ ((__nonnull__ (1, 2))); + +extern int pthread_mutex_lock (pthread_mutex_t *__mutex) + throw () __attribute__ ((__nonnull__ (1))); + +extern int pthread_mutex_unlock (pthread_mutex_t *__mutex) + throw () __attribute__ ((__nonnull__ (1))); + +typedef pthread_t __gthread_t; +typedef pthread_key_t __gthread_key_t; +typedef pthread_once_t __gthread_once_t; +typedef pthread_mutex_t __gthread_mutex_t; + +static __typeof(pthread_once) __gthrw_pthread_once __attribute__ ((__weakref__("pthread_once"))); + +static __typeof(pthread_mutex_lock) __gthrw_pthread_mutex_lock __attribute__ ((__weakref__("pthread_mutex_lock"))); + +static __typeof(pthread_mutex_unlock) __gthrw_pthread_mutex_unlock __attribute__ ((__weakref__("pthread_mutex_unlock"))); + +static volatile int __gthread_active = -1; + +static void +__gthread_trigger (void) +{ + __gthread_active = 1; +} + +static inline int +__gthread_active_p (void) +{ + static pthread_mutex_t __gthread_active_mutex = { { 0, 0, 0, 0, 0, { 0 } } }; + static pthread_once_t __gthread_active_once = 0; + + int __gthread_active_latest_value = __gthread_active; + + if (__builtin_expect (__gthread_active_latest_value < 0, 0)) + { + if (__gthrw_pthread_once) + { + __gthrw_pthread_mutex_lock (&__gthread_active_mutex); + __gthrw_pthread_once (&__gthread_active_once, __gthread_trigger); + __gthrw_pthread_mutex_unlock (&__gthread_active_mutex); + } + + if (__gthread_active < 0) + __gthread_active = 0; + __gthread_active_latest_value = __gthread_active; + } + + return __gthread_active_latest_value != 0; +} + +typedef int _Atomic_word; + +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) { + + static inline _Atomic_word + __exchange_and_add(volatile _Atomic_word* __mem, int __val) + { return __sync_fetch_and_add(__mem, __val); } + + static inline void + __atomic_add(volatile _Atomic_word* __mem, int __val) + { __sync_fetch_and_add(__mem, __val); } + static inline _Atomic_word + __exchange_and_add_single(_Atomic_word* __mem, int __val) + { + _Atomic_word __result = *__mem; + *__mem += __val; + return __result; + } + + static inline void + __atomic_add_single(_Atomic_word* __mem, int __val) + { *__mem += __val; } + + static inline _Atomic_word + __attribute__ ((__unused__)) + __exchange_and_add_dispatch(_Atomic_word* __mem, int __val) + { + if (__gthread_active_p()) + return __exchange_and_add(__mem, __val); + else + return __exchange_and_add_single(__mem, __val); + } + + static inline void + __attribute__ ((__unused__)) + __atomic_add_dispatch(_Atomic_word* __mem, int __val) + { + if (__gthread_active_p()) + __atomic_add(__mem, __val); + else + __atomic_add_single(__mem, __val); + } +} + +namespace std __attribute__ ((__visibility__ ("default"))) { + template<typename _CharT, typename _Traits, typename _Alloc> + class basic_string + { + typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type; + + public: + typedef _Traits traits_type; + typedef typename _Traits::char_type value_type; + typedef _Alloc allocator_type; + typedef typename _CharT_alloc_type::size_type size_type; + typedef typename _CharT_alloc_type::difference_type difference_type; + typedef typename _CharT_alloc_type::reference reference; + typedef typename _CharT_alloc_type::const_reference const_reference; + typedef typename _CharT_alloc_type::pointer pointer; + typedef typename _CharT_alloc_type::const_pointer const_pointer; + typedef __gnu_cxx::__normal_iterator<pointer, basic_string> iterator; + typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string> + const_iterator; + typedef std::reverse_iterator<const_iterator> const_reverse_iterator; + typedef std::reverse_iterator<iterator> reverse_iterator; + + private: + struct _Rep_base + { + size_type _M_length; + size_type _M_capacity; + _Atomic_word _M_refcount; + }; + + struct _Rep : _Rep_base + { + + typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc; + static const size_type _S_max_size; + static const _CharT _S_terminal; + + static size_type _S_empty_rep_storage[]; + + static _Rep& + _S_empty_rep() + { + void* __p = reinterpret_cast<void*>(&_S_empty_rep_storage); + return *reinterpret_cast<_Rep*>(__p); + } + + _CharT* + _M_refdata() throw() + { return reinterpret_cast<_CharT*>(this + 1); } + + void + _M_dispose(const _Alloc& __a) + { + if (__builtin_expect(this != &_S_empty_rep(), false)) + { + ; + if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount, + -1) <= 0) + { + ; + _M_destroy(__a); + } + } + } + + void + _M_destroy(const _Alloc&) throw(); + + _CharT* + _M_refcopy() throw() + { + if (__builtin_expect(this != &_S_empty_rep(), false)) + __gnu_cxx::__atomic_add_dispatch(&this->_M_refcount, 1); + return _M_refdata(); + } + }; + + struct _Alloc_hider : _Alloc + { + _Alloc_hider(_CharT* __dat, const _Alloc& __a) + : _Alloc(__a), _M_p(__dat) { } + + _CharT* _M_p; + }; + + private: + + mutable _Alloc_hider _M_dataplus; + + _CharT* + _M_data() const + { return _M_dataplus._M_p; } + + _Rep* + _M_rep() const + { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); } + + void + _M_leak_hard(); + + public: + + ~basic_string() + { _M_rep()->_M_dispose(this->get_allocator()); } + + public: + + allocator_type + get_allocator() const + { return _M_dataplus; } + }; +} + +namespace std __attribute__ ((__visibility__ ("default"))) { + enum _Rb_tree_color { _S_red = false, _S_black = true }; + + struct _Rb_tree_node_base + { + typedef _Rb_tree_node_base* _Base_ptr; + typedef const _Rb_tree_node_base* _Const_Base_ptr; + + _Rb_tree_color _M_color; + _Base_ptr _M_parent; + _Base_ptr _M_left; + _Base_ptr _M_right; + + static _Base_ptr + _S_minimum(_Base_ptr __x) + { + while (__x->_M_left != 0) __x = __x->_M_left; + return __x; + } + + static _Const_Base_ptr + _S_minimum(_Const_Base_ptr __x) + { + while (__x->_M_left != 0) __x = __x->_M_left; + return __x; + } + + static _Base_ptr + _S_maximum(_Base_ptr __x) + { + while (__x->_M_right != 0) __x = __x->_M_right; + return __x; + } + + static _Const_Base_ptr + _S_maximum(_Const_Base_ptr __x) + { + while (__x->_M_right != 0) __x = __x->_M_right; + return __x; + } + }; + + template<typename _Val> + struct _Rb_tree_node : public _Rb_tree_node_base + { + typedef _Rb_tree_node<_Val>* _Link_type; + _Val _M_value_field; + }; + + __attribute__ ((__pure__)) _Rb_tree_node_base* + _Rb_tree_increment(_Rb_tree_node_base* __x) throw (); + + __attribute__ ((__pure__)) const _Rb_tree_node_base* + _Rb_tree_increment(const _Rb_tree_node_base* __x) throw (); + + __attribute__ ((__pure__)) _Rb_tree_node_base* + _Rb_tree_decrement(_Rb_tree_node_base* __x) throw (); + + __attribute__ ((__pure__)) const _Rb_tree_node_base* + _Rb_tree_decrement(const _Rb_tree_node_base* __x) throw (); + + template<typename _Tp> + struct _Rb_tree_iterator + { + typedef _Tp value_type; + typedef _Tp& reference; + typedef _Tp* pointer; + + typedef bidirectional_iterator_tag iterator_category; + typedef ptrdiff_t difference_type; + + typedef _Rb_tree_iterator<_Tp> _Self; + typedef _Rb_tree_node_base::_Base_ptr _Base_ptr; + typedef _Rb_tree_node<_Tp>* _Link_type; + + _Rb_tree_iterator() + : _M_node() { } + + explicit + _Rb_tree_iterator(_Link_type __x) + : _M_node(__x) { } + + bool + operator==(const _Self& __x) const + { return _M_node == __x._M_node; } + + bool + operator!=(const _Self& __x) const + { return _M_node != __x._M_node; } + + _Base_ptr _M_node; + }; + + template<typename _Tp> + struct _Rb_tree_const_iterator + { + typedef _Tp value_type; + typedef const _Tp& reference; + typedef const _Tp* pointer; + + typedef _Rb_tree_iterator<_Tp> iterator; + + typedef bidirectional_iterator_tag iterator_category; + typedef ptrdiff_t difference_type; + + typedef _Rb_tree_const_iterator<_Tp> _Self; + typedef _Rb_tree_node_base::_Const_Base_ptr _Base_ptr; + typedef const _Rb_tree_node<_Tp>* _Link_type; + + _Rb_tree_const_iterator() + : _M_node() { } + + explicit + _Rb_tree_const_iterator(_Link_type __x) + : _M_node(__x) { } + + _Rb_tree_const_iterator(const iterator& __it) + : _M_node(__it._M_node) { } + + pointer + operator->() const + { return std::__addressof(static_cast<_Link_type> + (_M_node)->_M_value_field); } + + bool + operator==(const _Self& __x) const + { return _M_node == __x._M_node; } + + bool + operator!=(const _Self& __x) const + { return _M_node != __x._M_node; } + + _Base_ptr _M_node; + }; + + template<typename _Key, typename _Val, typename _KeyOfValue, + typename _Compare, typename _Alloc = allocator<_Val> > + class _Rb_tree + { + typedef typename _Alloc::template rebind<_Rb_tree_node<_Val> >::other + _Node_allocator; + + protected: + typedef _Rb_tree_node_base* _Base_ptr; + typedef const _Rb_tree_node_base* _Const_Base_ptr; + + public: + typedef _Key key_type; + typedef _Val value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef _Rb_tree_node<_Val>* _Link_type; + typedef const _Rb_tree_node<_Val>* _Const_Link_type; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Alloc allocator_type; + + const _Node_allocator& + _M_get_Node_allocator() const + { return *static_cast<const _Node_allocator*>(&this->_M_impl); } + + allocator_type + get_allocator() const + { return allocator_type(_M_get_Node_allocator()); } + + protected: + void + _M_put_node(_Link_type __p) + { _M_impl._Node_allocator::deallocate(__p, 1); } + + void + _M_destroy_node(_Link_type __p) + { + get_allocator().destroy(std::__addressof(__p->_M_value_field)); + _M_put_node(__p); + } + + protected: + template<typename _Key_compare, + bool _Is_pod_comparator = __is_pod(_Key_compare)> + struct _Rb_tree_impl : public _Node_allocator + { + _Key_compare _M_key_compare; + _Rb_tree_node_base _M_header; + size_type _M_node_count; + + private: + void + _M_initialize() + { + this->_M_header._M_color = _S_red; + this->_M_header._M_parent = 0; + this->_M_header._M_left = &this->_M_header; + this->_M_header._M_right = &this->_M_header; + } + }; + + _Rb_tree_impl<_Compare> _M_impl; + + protected: + + _Link_type + _M_begin() + { return static_cast<_Link_type>(this->_M_impl._M_header._M_parent); } + + _Link_type + _M_end() + { return static_cast<_Link_type>(&this->_M_impl._M_header); } + + static _Link_type + _S_left(_Base_ptr __x) + { return static_cast<_Link_type>(__x->_M_left); } + + static _Link_type + _S_right(_Base_ptr __x) + { return static_cast<_Link_type>(__x->_M_right); } + + static const_reference + _S_value(_Const_Base_ptr __x) + { return static_cast<_Const_Link_type>(__x)->_M_value_field; } + + static const _Key& + _S_key(_Const_Base_ptr __x) + { return _KeyOfValue()(_S_value(__x)); } + + public: + typedef _Rb_tree_iterator<value_type> iterator; + typedef _Rb_tree_const_iterator<value_type> const_iterator; + + private: + + void + _M_erase(_Link_type __x); + + iterator + _M_lower_bound(_Link_type __x, _Link_type __y, + const _Key& __k); + + const_iterator + _M_lower_bound(_Const_Link_type __x, _Const_Link_type __y, + const _Key& __k) const; + + public: + + ~_Rb_tree() + { _M_erase(_M_begin()); } + + iterator + end() + { return iterator(static_cast<_Link_type>(&this->_M_impl._M_header)); } + + const_iterator + end() const + { + return const_iterator(static_cast<_Const_Link_type> + (&this->_M_impl._M_header)); + } + + public: + iterator + find(const key_type& __k); + }; + + template<typename _Key, typename _Val, typename _KeyOfValue, + typename _Compare, typename _Alloc> + void + _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: + _M_erase(_Link_type __x) + { + + while (__x != 0) + { + _M_erase(_S_right(__x)); + _Link_type __y = _S_left(__x); + _M_destroy_node(__x); + __x = __y; + } + } + + template<typename _Key, typename _Val, typename _KeyOfValue, + typename _Compare, typename _Alloc> + typename _Rb_tree<_Key, _Val, _KeyOfValue, + _Compare, _Alloc>::iterator + _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: + _M_lower_bound(_Link_type __x, _Link_type __y, + const _Key& __k) + { + while (__x != 0) + if (!_M_impl._M_key_compare(_S_key(__x), __k)) + __y = __x, __x = _S_left(__x); + else + __x = _S_right(__x); + return iterator(__y); + } + + template<typename _Key, typename _Val, typename _KeyOfValue, + typename _Compare, typename _Alloc> + typename _Rb_tree<_Key, _Val, _KeyOfValue, + _Compare, _Alloc>::iterator + _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: + find(const _Key& __k) + { + iterator __j = _M_lower_bound(_M_begin(), _M_end(), __k); + return (__j == end() + || _M_impl._M_key_compare(__k, + _S_key(__j._M_node))) ? end() : __j; + } + +} + +namespace std { + template <typename _Key, typename _Tp, typename _Compare = std::less<_Key>, + typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > > + class map + { + public: + typedef _Key key_type; + typedef _Tp mapped_type; + typedef std::pair<const _Key, _Tp> value_type; + typedef _Compare key_compare; + typedef _Alloc allocator_type; + + private: + + typedef typename _Alloc::template rebind<value_type>::other + _Pair_alloc_type; + + typedef _Rb_tree<key_type, value_type, _Select1st<value_type>, + key_compare, _Pair_alloc_type> _Rep_type; + + _Rep_type _M_t; + + public: + + typedef typename _Rep_type::iterator iterator; + typedef typename _Rep_type::const_iterator const_iterator; + + map() + : _M_t() { } + + const_iterator + end() const + { return _M_t.end(); } + + key_compare + key_comp() const + { return _M_t.key_comp(); } + + iterator + find(const key_type& __x) + { return _M_t.find(__x); } + }; +} + +int main () +{ + typedef std::map<int, std::string> Map; + static Map m; + + Map::const_iterator it = m.find(0); + if (it != m.end()) + std::string s = it->second; + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/lto/pr48207-2_0.C b/gcc/testsuite/g++.dg/lto/pr48207-2_0.C new file mode 100644 index 000000000..6801b85a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr48207-2_0.C @@ -0,0 +1,10 @@ +// { dg-lto-do link } +// { dg-lto-options { { -flto -g } } } + +namespace { + typedef struct { + int x; + } Foo; +} + +int main () {} diff --git a/gcc/testsuite/g++.dg/lto/pr48207-3_0.C b/gcc/testsuite/g++.dg/lto/pr48207-3_0.C new file mode 100644 index 000000000..ef02dda84 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr48207-3_0.C @@ -0,0 +1,12 @@ +// { dg-lto-do link } +// { dg-lto-options { { -flto -g } } } + +void bar(void) {} + +void foo(void) +{ + typedef enum { ABC } DEF; + bar(); +} + +int main () {} diff --git a/gcc/testsuite/g++.dg/lto/pr48207_0.C b/gcc/testsuite/g++.dg/lto/pr48207_0.C new file mode 100644 index 000000000..e66cb491b --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr48207_0.C @@ -0,0 +1,13 @@ +// { dg-lto-do link } +// { dg-lto-options { { -flto -g } } } + +void bar(int) {} + +void foo(void) +{ + typedef enum { ABC } DEF; + DEF a; + bar((int)a); +} + +int main() {} diff --git a/gcc/testsuite/g++.dg/opt/20050511-1.C b/gcc/testsuite/g++.dg/opt/20050511-1.C new file mode 100644 index 000000000..a8929030a --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/20050511-1.C @@ -0,0 +1,70 @@ +/* { dg-do run } */ +/* { dg-options "-w" } */ +/* { dg-options "-O3 -w" { target powerpc*-*-* } } */ +#include <stdio.h> +#include <stdlib.h> + +// The VxWorks kernel headers define their own UINT32 +#if defined __vxworks && !defined __RTP__ +#define UINT32 my_UINT32 +#endif + +typedef signed short SINT16 ; +typedef unsigned long UINT32 ; +typedef unsigned int UINT ; + +class A +{ +public: + union + { + SINT16 xy[2]; + UINT32 abXY; + }; + bool operator==(const A& other) const {return abXY == other.abXY;} + bool operator!=(const A& other) const {return abXY != other.abXY;} +}; + +template <int size> struct pArray { unsigned char u08[16*(((size*1)+15)/16)] __attribute__ ((aligned(16))); }; + +struct B +{ + union { + A mvL[2]; + pArray<1> xyz; + }; +} ; + +typedef struct +{ + UINT w; + B b; + +}C; + + +UINT32 bar (const C * sPtr) +{ + UINT w = sPtr->w; + A a; + + a.xy[0] = sPtr->b.mvL[w].xy[0]<<2; + a.xy[1] = sPtr->b.mvL[w].xy[1]<<2; + + if (a.xy[0] != ((SINT16) 0xffff << 2)) + abort (); +} + +int main() +{ + A a; + C c; + a.xy[0] = 0xffff; + a.xy[1] = 0xffff; + c.w=0; + c.b.mvL[0].xy[0] = a.xy[0]; + c.b.mvL[0].xy[1] = a.xy[1]; + + bar (&c); +} + diff --git a/gcc/testsuite/g++.dg/opt/alias1.C b/gcc/testsuite/g++.dg/opt/alias1.C new file mode 100644 index 000000000..4836c5be0 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/alias1.C @@ -0,0 +1,25 @@ +// Test that type punning using an anonymous union works with strict aliasing. +// { dg-do run } +// { dg-options "-O2 -fstrict-aliasing" } + +extern "C" void abort (); + +void f (long i) +{ + union + { + long ui; + float uf[20]; + }; + + ui = i; + if (uf[0] != 42.0) + abort (); +} + +int main () +{ + union U { long i; float f[20]; } u; + u.f[0] = 42.0; + f (u.i); +} diff --git a/gcc/testsuite/g++.dg/opt/alias2.C b/gcc/testsuite/g++.dg/opt/alias2.C new file mode 100644 index 000000000..0b4122471 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/alias2.C @@ -0,0 +1,74 @@ +// { dg-do run } +// { dg-options "-O2" } + +extern "C" int printf (const char*, ...); + +struct _Deque_iterator { + int _M_cur; + int x[2]; + int* _M_node; + + _Deque_iterator() : _M_cur(0), _M_node(0) {} + _Deque_iterator(const _Deque_iterator& __x) + : _M_cur(__x._M_cur), + _M_node(__x._M_node) {} +}; + +class _Deque_base +{ +public: + int yy; + + _Deque_base() + : _M_start() + { _M_initialize_map(); } + ~_Deque_base(); + + void _M_initialize_map(); + _Deque_iterator _M_start; +}; + + +_Deque_base::~_Deque_base() { + printf ("bb %x %x\n", this, *_M_start._M_node); +} + +void +_Deque_base::_M_initialize_map() +{ + yy = 0x123; + printf ("aa %x %x\n", this, yy); + + _M_start._M_node = &yy; + _M_start._M_cur = yy; +} + + +class deque : protected _Deque_base +{ +public: + deque () {} + deque(const deque& __x) {} + ~deque() { + _Deque_iterator i = _M_start; + } +}; + + + +class GeometryAddress { +public: + GeometryAddress(deque addressStack) {} +}; + +void yyy (const GeometryAddress& gb) +{ +} + +deque temp1; + +int main() +{ + yyy (GeometryAddress (temp1)); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/alias3.C b/gcc/testsuite/g++.dg/opt/alias3.C new file mode 100644 index 000000000..dc8accd4f --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/alias3.C @@ -0,0 +1,45 @@ +// { dg-options "-O2" } + +// Contributed by Nathan Sidwell 22 Dec 2003 <nathan@codesourcery.com> +// Origin: rsandifo@redhat.com + +// PR c++/13387. Alias sets were incorrect + +struct C { + C(short *p = 0, int i = 0) : ptr (p), index (i) {} + short operator*() { return ptr[index]; } + short *ptr; + int index; +}; + +C f1 (C) __attribute__ ((noinline)); +C f1 (C x) +{ + return x; +} + +void f2 (short)__attribute__ ((noinline));; +short s; + +void f2 (short s_) +{ + s = s_; +} + +C g (C x)__attribute__ ((noinline)); +C g (C x) +{ + x = f1 (x); + f2 (*x); + return x; +} + +int main () +{ + short p[2] = { 0x1234, 0x5678 }; + C x (p, 1); + + g (x); + + return s != p[1]; +} diff --git a/gcc/testsuite/g++.dg/opt/alias4.C b/gcc/testsuite/g++.dg/opt/alias4.C new file mode 100644 index 000000000..6965b8c73 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/alias4.C @@ -0,0 +1,56 @@ +// PR c++/27768 +// Alias grouping was losing some may_aliases, causing us to think +// the store to w.p was dead. + +// { dg-do run } +// { dg-options "-O2" } + +int N = 1; + +struct VA +{ + int *p, *q, *r; + + VA() : p(), q() {} + VA(const VA&) : p(), q() {} + ~VA() { if (p) --N; } +}; + +inline void foo(VA, VA, VA) {} + +struct VB +{ + VA va; + + VB() {} + + VB(const VB&) + { + va.p = new int(va.q - va.p); + va.r = va.p + (va.q - va.p); + foo(va, va, va); + } +}; + +struct VC : VB { char c; }; +struct V : VC {}; + +struct WA +{ + struct X {}; + X **p, **q, **r; + + WA() : p() {} + ~WA() { if (p) --N; } +}; + +struct W : WA {}; + +int main() +{ + { + V v, u(v); + W w; + } + return N; +} diff --git a/gcc/testsuite/g++.dg/opt/anchor1.C b/gcc/testsuite/g++.dg/opt/anchor1.C new file mode 100644 index 000000000..e24b0a4fe --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/anchor1.C @@ -0,0 +1,59 @@ +// { dg-do run } +// { dg-options "-O2" } + +// The size of the construction vtable for YFont in YCoreFont was not +// updated to reflect its actual size. On targets with section anchor +// support, the vtable for YCoreFont was laid out immediately after +// that, but the compiler thought it was about 40 bytes closer to the +// anchor than it actually was. + +extern "C" void abort (void); + +class refcounted { +public: + int __refcount; + +public: + refcounted(): __refcount(0) {}; + virtual ~refcounted() {} +}; + +class YFont : public virtual refcounted { +public: + virtual ~YFont() {} + + virtual int ascent() const = 0; +}; + +struct XFontStruct { +}; + +class YCoreFont : public YFont { +public: + YCoreFont(char const * name); + virtual ~YCoreFont(); + + virtual int ascent() const { return 2; } + +private: + XFontStruct * fFont; +}; + +YCoreFont::YCoreFont(char const * name) { +} + +YCoreFont::~YCoreFont() { +} + +int foo(YCoreFont *ycf) +{ + return ycf->ascent (); +} + +int main() +{ + YCoreFont ycf(""); + if (foo(&ycf) != 2) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/anonunion1.C b/gcc/testsuite/g++.dg/opt/anonunion1.C new file mode 100644 index 000000000..445ebaa7c --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/anonunion1.C @@ -0,0 +1,25 @@ +// PR c++/5748 +// This testcase ICEd because used flag from the anon union variables +// was not propagated back to the anon union itself, causing addressof +// not to be replaced with stack slot. +// { dg-do compile } +// { dg-options "-O2" } + +struct A { + A (); + ~A (); + int foo (); + int bar (void *x, int y); +}; + +int A::foo() +{ + union { + int a; + int b; + }; + + if (bar (&a, sizeof (int)) != 32) + return 16; + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/array1.C b/gcc/testsuite/g++.dg/opt/array1.C new file mode 100644 index 000000000..c63ed22c8 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/array1.C @@ -0,0 +1,20 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 29 Nov 2004 <nathan@codesourcery.com> + +// PR 18672:ICE gimplifying incomplete array type. +// Origin: Magnus Fromreide <gcc@magfr.user.lysator.liu.se> + +struct A; + +struct D { + static A ary[]; +}; +extern A ary[]; + +void Foo (A const *); + +void Bar () +{ + Foo (D::ary); + Foo (::ary); +} diff --git a/gcc/testsuite/g++.dg/opt/array2.C b/gcc/testsuite/g++.dg/opt/array2.C new file mode 100644 index 000000000..b40b052d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/array2.C @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +struct JArray +{ + int data[1]; +}; +void *copyIntoByteArray (struct JArray *dest, __SIZE_TYPE__ offset) +{ + void *pdest = dest->data + offset; + return pdest; +} diff --git a/gcc/testsuite/g++.dg/opt/asm1.C b/gcc/testsuite/g++.dg/opt/asm1.C new file mode 100644 index 000000000..333533526 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/asm1.C @@ -0,0 +1,9 @@ +// PR c++/6747 +// { dg-do compile } +// { dg-options "-O" } + +void foo() +{ + union { double d; char c[sizeof(double)]; } tmp; + __asm__ ("" : "=m" (tmp.d)); // { dg-bogus "not directly addressable" "double sized union element should be addressible" { xfail xstormy16-*-* } } +} diff --git a/gcc/testsuite/g++.dg/opt/asm2.C b/gcc/testsuite/g++.dg/opt/asm2.C new file mode 100644 index 000000000..4e3244169 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/asm2.C @@ -0,0 +1,11 @@ +/* PR inline-asm/15740 */ +/* { dg-do compile } */ +/* { dg-options "-O" } */ + +void foo(void) +{ + int a, b; + a = 1; + b = a + 1; + asm ("" : : "m" (a)); +} diff --git a/gcc/testsuite/g++.dg/opt/bitfield1.C b/gcc/testsuite/g++.dg/opt/bitfield1.C new file mode 100644 index 000000000..496999613 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/bitfield1.C @@ -0,0 +1,18 @@ +// PR c++/26534 +// { dg-do run } +// { dg-options "-w -O2" } + +struct X +{ + unsigned a:4; +}; + +unsigned i; + +int main() +{ + struct X x = { 63u }; + i = x.a; + if (i != 15) + return 1; +} diff --git a/gcc/testsuite/g++.dg/opt/bool1.C b/gcc/testsuite/g++.dg/opt/bool1.C new file mode 100644 index 000000000..78cdebe32 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/bool1.C @@ -0,0 +1,25 @@ +// PR opt/13869 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort (); + +int test () +{ + bool my_bool = true; + for (int i = 0; i < 10; ++i) + { + if (!my_bool) + ; + else + my_bool = false; + }; + return my_bool; +} + +int main () +{ + if (test ()) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/builtins1.C b/gcc/testsuite/g++.dg/opt/builtins1.C new file mode 100644 index 000000000..8311436b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/builtins1.C @@ -0,0 +1,14 @@ +// PR c++/14791 +// Test if builtins with FILE * arguments work +// { dg-options "-O2 -Wformat" } + +typedef struct _FILE FILE; +FILE *stderr; +extern "C" int printf (__const char *__restrict, ...); +extern "C" int fprintf (FILE *__restrict, __const char *__restrict, ...); + +int main () +{ + printf ("%d\n", 1, 1); // { dg-warning "too many arguments for format" } + fprintf (stderr, "%d\n", 1, 1); // { dg-warning "too many arguments for format" } +} diff --git a/gcc/testsuite/g++.dg/opt/call1.C b/gcc/testsuite/g++.dg/opt/call1.C new file mode 100644 index 000000000..642e02408 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/call1.C @@ -0,0 +1,21 @@ +// { dg-options "-O2" } + +void a (void (*f)()) +{ + f(); +} + +struct RunState +{ + static void runcallback() { } + static void wait() + { + a (runcallback); + } +}; + +int main() +{ + RunState::wait(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/cfg1.C b/gcc/testsuite/g++.dg/opt/cfg1.C new file mode 100644 index 000000000..dbc81fe9b --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/cfg1.C @@ -0,0 +1,36 @@ +// PR optimization/11083 +// Origin: <nick@ilm.com> +// Reduced testcase by Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// The compiler used to keep unreachable basic blocks after dead edges +// had been purged, which fooled the LCM code of the GCSE pass. + +// { dg-do compile } +// { dg-options "-O2 -fnon-call-exceptions" } + +extern void *memmove (void *, const void *, unsigned int) throw (); + +struct S { + int *q; + + S(int *i) : q(i) {} +}; + +struct X { + int *p; + + void foo(S first, S last) { + try { memmove(0, 0, last.q - first.q); } + catch(...) { throw; } + } + + void bar (const X& x); +}; + +void X::bar (const X& x) +{ + const unsigned int xlen = S(x.p).q - S(x.p).q; + + if (xlen > 0) + foo(S(x.p), S(x.p)); +} diff --git a/gcc/testsuite/g++.dg/opt/cfg2.C b/gcc/testsuite/g++.dg/opt/cfg2.C new file mode 100644 index 000000000..229f4bc3a --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/cfg2.C @@ -0,0 +1,38 @@ +// PR optimization/12215 +// Origin: <nick@ilm.com> +// Reduced testcase by Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// This used to fail because the CSE pass destroyed the CFG in presence +// of trapping loads, which led to the deletion of basic blocks. + +// { dg-do compile } +// { dg-options "-O2 -fno-gcse -fnon-call-exceptions" } + + +struct B { + ~B() throw() {} +}; + +struct X { + X(const char*, const B&); + ~X() {} +}; + +bool m(); +void f(int &i, float &arg0); + +void g (const char **argv) { + float val; + int i = 1; + + try { + while ( i < 1 ) + { + X arg(argv[i], B()); + if (m()) + throw(0); + + f(i, val); + } + } catch (...) {} +} diff --git a/gcc/testsuite/g++.dg/opt/cfg3.C b/gcc/testsuite/g++.dg/opt/cfg3.C new file mode 100644 index 000000000..123c2f515 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/cfg3.C @@ -0,0 +1,61 @@ +// PR optimization/11646 +// Origin: <nick@ilm.com> + +// This used to fail because the compiler inadvertently cleared +// the EDGE_ABNORMAL flag on a EDGE_EH edge and didn't delete +// unreachable blocks after CSE. + +// { dg-do compile } +// { dg-options "-O -fgcse -fnon-call-exceptions" } + +struct C +{ + int i; +}; + +struct allocator +{ + ~allocator() throw() {} +}; + +struct _Vector_alloc_base +{ + _Vector_alloc_base(const allocator& __a) {} + allocator _M_data_allocator; + struct C *_M_start, *_M_end_of_storage; + void _M_deallocate(struct C* __p, unsigned int __n) {} +}; + +struct _Vector_base : _Vector_alloc_base +{ + _Vector_base(const allocator& __a) : _Vector_alloc_base(__a) { } + ~_Vector_base() { _M_deallocate(0, _M_end_of_storage - _M_start); } +}; + +struct vector : _Vector_base +{ + vector(const allocator& __a = allocator()) : _Vector_base(__a) {} + struct C& operator[](unsigned int __n) { return *_M_start; } +}; + +struct A +{ + float l() const; + A operator-(const A &) const; + const A& operator=(float) const; +}; + +struct B +{ + float d(); +}; + +float f(const A& a, B& b) +{ + vector vc; + int index = vc[0].i; + A aa; + float d = (aa - a).l(); + if (d > b.d()) aa = 0; + return b.d(); +} diff --git a/gcc/testsuite/g++.dg/opt/cfg4.C b/gcc/testsuite/g++.dg/opt/cfg4.C new file mode 100644 index 000000000..94522ed41 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/cfg4.C @@ -0,0 +1,45 @@ +// PR optimization/13067 +// Origin: <bryner@brianryner.com> + +// This used to fail on the tree-ssa because of "out-of-ssa" +// We might have a valid variable, but not a valid value when trying to find +// useless statements created by out-of-ssa translation. In this case +// val will be set to null, then later dereferenced. Bad. + +// { dg-do compile } +// { dg-options "-Os" } + + + +struct Iterator +{ + Iterator operator++(); +}; + +void GetChar(char* aChar); + +void foo(char aChar) +{ + char quote; + Iterator end; + + while (1) { + if (aChar == '"') + GetChar(&aChar); + + switch (aChar) { + case 'a': + ++end; + if (quote) { + if (quote == aChar) { + quote = 0; + } + } else { + quote = aChar; + } + } + } +} + + + diff --git a/gcc/testsuite/g++.dg/opt/cfg5.C b/gcc/testsuite/g++.dg/opt/cfg5.C new file mode 100644 index 000000000..a4bc8eea9 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/cfg5.C @@ -0,0 +1,40 @@ +/* PR rtl-optimization/34035 */ +/* Origin: Janis Johnson <janis@gcc.gnu.org> */ + +/* { dg-do compile } */ +/* { dg-options "-O2 -fnon-call-exceptions -ffast-math -fno-gcse" } */ + +class One { +public: + One () { e[0] = e[1] = 0.0; } + double e[2]; +}; + +template <class T> +class Two { +public: + Two(); +private: + T *data; + int arraySize; +}; + +template <class T> +Two<T>::Two() { + data = new T[arraySize]; +} + +class Three { +protected: + Two<One> data; +}; + +class Four : public Three { +public: + Four (); + void Foo (int n); +}; + +Four :: Four (){ + Foo (1); +} diff --git a/gcc/testsuite/g++.dg/opt/cleanup1.C b/gcc/testsuite/g++.dg/opt/cleanup1.C new file mode 100644 index 000000000..e7c00dc20 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/cleanup1.C @@ -0,0 +1,171 @@ +// PR middle-end/6247 +// This testcase was miscompiled on IA-32 because a single stack slot +// was used for 2 different variables at the same time. +// The function H::h1 was miscompiled. +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort (void); +extern "C" void exit (int); + +struct A +{ + A () { a = 1; } + void a1 () { a++; } + bool a2 () { return !--a; } + unsigned int a; +}; + +struct B : public A +{ + B () : b (0) { a1 (); } + void b1 (); + const char *b; +}; + +struct C +{ + C (); + C (const C &); + ~C () { if (c->a2 ()) { if (c == c0) c0 = 0; c->b1 (); } } + C &operator= (const C &); + static C c1 (const char *x, int y = -1); + C (int, bool); + void a2 (); + B *c; + static B *c0; +}; + +B *C::c0 = __null; + +template <class T> struct D +{ + D (const T& t) : d (t) {} + D () {} + D<T> *next, *prev; + T d; +}; + +template<class T> struct E +{ + D<T> *e; + E () : e (0) {} + E (D<T> *p) : e (p) {} + E (const E<T>& x) : e (x.e) {} + const T& operator* () const { return e->d; } + T& operator* () { return e->d; } + bool operator== (const E<T>& x) const { return e == x.e; } + bool operator!= (const E<T>& x) const { return e != x.e; } + E<T> operator++ (int) { E<T> x = *this; e = e->next; return x; } +}; + +template <class T> struct F : public A +{ + F () { f = new D<T>; f->next = f->prev = f; f0 = 0; } + ~F () {} + D<T> *f; + unsigned int f0; + + F (const F<T>& x) : A () + { + f = new D<T>; f->next = f->prev = f; f0 = 0; + E<T> b (x.f->next); + E<T> e (x.f); + E<T> i (f); + while (b != e) + f1 (i, *b++); + } + + E<T> f1 (E<T> x, const T& y) + { + D<T> *p = new D<T> (y); + p->next = x.e; + p->prev = x.e->prev; + x.e->prev->next = p; + x.e->prev = p; + f0++; + return p; + } +}; + +template <class T> struct G +{ + E<T> g1 () { g3 (); return E<T> (g->f); } + E<T> g2 (const T& x) { g3 (); return g->f1 (g1 (), x); } + void g3 () { if (g->a > 1) { g->a2 (); g = new F<T> (*g); } } + F<T>* g; +}; + +struct H +{ + virtual ~H () {}; + virtual void h1 (); + struct I + { + I () {} + I (C r, C p) : i1 (r), i2 (p) {} + C i1, i2; + }; + G<I> h; +}; + +void H::h1 () +{ + h.g2 (I (C::c1 ("s1"), C::c1 ("t"))); + h.g2 (I (C::c1 ("s2"), C::c1 ("t"))); + h.g2 (I (C::c1 ("s3"), C::c1 ("t"))); +} + +void B::b1 () +{ +} + +C C::c1 (const char *x, int y) +{ + C z; + + if (y != -1) + abort (); + z.c = new B; + z.c->b = x; + return z; +} + +C::C () : c (__null) +{ +} + +C::C (const C &x) +{ + c = x.c; + c->a1 (); +} + +int main () +{ + H h; + h.h.g = new F<H::I> (); + h.h1 (); + if (h.h.g->f0 != 3) + abort (); + D<H::I> *p; + int i; + for (i = 0, p = h.h.g->f; i < 4; i++, p = p->next) + { + if (i == 0 && (p->d.i1.c != __null || p->d.i2.c != __null)) + abort (); + if (i > 0 + && (p->d.i1.c->b[0] != 's' + || p->d.i1.c->b[1] != '0' + i + || p->d.i1.c->b[2] != '\0' + || __builtin_strcmp (p->d.i2.c->b, "t"))) + abort (); + if (p->prev->next != p) + abort (); + if (p->next->prev != p) + abort (); + if (i == 3 && p->next != h.h.g->f) + abort (); + } + exit (0); +} diff --git a/gcc/testsuite/g++.dg/opt/combine.C b/gcc/testsuite/g++.dg/opt/combine.C new file mode 100644 index 000000000..d01ae78a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/combine.C @@ -0,0 +1,73 @@ +// { dg-do assemble { target fpic } } +// { dg-options "-O2 -fweb -fPIC -fvisibility=hidden" } +// { dg-require-visibility "" } + +class QBasicAtomicInt +{ +public: + volatile int _q_value; + inline operator int () const {return _q_value;} +}; +class QVariant; +class QScriptContext; +class QScriptEngine; +class QScriptValue +{ +public: + QVariant toVariant () const; +}; +class QScriptDebuggerBackendPrivate +{ + static QScriptValue trace (QScriptContext *context); +}; +template <typename T> struct QMetaTypeId { }; +template <typename T> struct QMetaTypeId2 +{ + static inline int qt_metatype_id () + { + return QMetaTypeId<T>::qt_metatype_id () ; + } +}; +template <typename T> inline int qMetaTypeId (T * = 0) +{ + return QMetaTypeId2<T>::qt_metatype_id () ; +} +class QVariant { }; +template<typename T> inline T qvariant_cast (const QVariant &v) +{ + const int vid = qMetaTypeId<T> ((0)) ; +}; +class QScriptContext +{ +public: + QScriptValue callee () const; +}; +class QScriptEngine +{ +public: + static bool convertV2 (const QScriptValue &value , int type , void *ptr) ; +}; +inline bool qscriptvalue_cast_helper (const QScriptValue &value , int type , void *ptr) +{ + return QScriptEngine::convertV2 (value, type, ptr) ; +} +template<typename T> T qscriptvalue_cast (const QScriptValue &value) +{ + T t; + const int id = qMetaTypeId<T> () ; + if ( qscriptvalue_cast_helper (value, id, &t)) + return qvariant_cast<T> (value.toVariant ()) ; +} +template <> struct QMetaTypeId< QScriptDebuggerBackendPrivate* > +{ + static int qt_metatype_id () + { + static QBasicAtomicInt metatype_id = { (0) }; + return metatype_id; + } +}; +QScriptValue QScriptDebuggerBackendPrivate::trace (QScriptContext *context) +{ + QScriptValue data = context->callee () ; + QScriptDebuggerBackendPrivate *self = qscriptvalue_cast<QScriptDebuggerBackendPrivate*> (data) ; +} diff --git a/gcc/testsuite/g++.dg/opt/complex1.C b/gcc/testsuite/g++.dg/opt/complex1.C new file mode 100644 index 000000000..0066c26c8 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/complex1.C @@ -0,0 +1,9 @@ +// PR tree-opt/21994 +// { dg-do compile } +// { dg-options "-O2" } + +_Complex float f(void); +_Complex float g(void) throw() +{ + return f(); +} diff --git a/gcc/testsuite/g++.dg/opt/complex2.C b/gcc/testsuite/g++.dg/opt/complex2.C new file mode 100644 index 000000000..53fc7e98e --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/complex2.C @@ -0,0 +1,24 @@ +// PR 22022 +// { dg-do compile } +// { dg-options "-O2" } + +_Complex float f(); +_Complex float g(); +_Complex float h()throw(); +void i(_Complex float)throw(); + +void j(void) +{ + _Complex float x = h(); + try + { + try + { + x = f(); + }catch (...) + { + x = g(); + } + }catch(...){} + i(x); +} diff --git a/gcc/testsuite/g++.dg/opt/complex3.C b/gcc/testsuite/g++.dg/opt/complex3.C new file mode 100644 index 000000000..9a3fdf3f0 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/complex3.C @@ -0,0 +1,24 @@ +// PR 22022 +// { dg-do compile } +// { dg-options "-O2" } + +_Complex float f(); +_Complex float g(); +_Complex float h()throw(); +void i(float)throw(); + +float j(void) +{ + _Complex float x = h(); + try + { + try + { + x = f(); + }catch (...) + { + x += g(); + } + }catch(...){} + i(__builtin_crealf(x)+__builtin_cimagf(x)); +} diff --git a/gcc/testsuite/g++.dg/opt/complex4.C b/gcc/testsuite/g++.dg/opt/complex4.C new file mode 100644 index 000000000..d6a0be2cf --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/complex4.C @@ -0,0 +1,16 @@ +// PR 24362 +// { dg-do compile } +// { dg-options "-O2" } + +typedef __complex__ double cdouble; +cdouble elt_zero(); +const cdouble *pointer(); + +cdouble trace(void) +{ + cdouble output = elt_zero(); + const cdouble *data = pointer(); + output += data[1]; + return output; +} + diff --git a/gcc/testsuite/g++.dg/opt/complex5.C b/gcc/testsuite/g++.dg/opt/complex5.C new file mode 100644 index 000000000..0da0738b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/complex5.C @@ -0,0 +1,16 @@ +// PR 24365 +// { dg-do compile } +// { dg-options "-O2" } + +typedef __complex__ double cdouble; +inline cdouble to_complex(double r) { + cdouble z; + __real__ z = r; + return z; +} +cdouble elt_zero() { + cdouble a = to_complex(0.0); + a+=1.0; + return a; +} + diff --git a/gcc/testsuite/g++.dg/opt/complex6.C b/gcc/testsuite/g++.dg/opt/complex6.C new file mode 100644 index 000000000..bedb3ed5f --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/complex6.C @@ -0,0 +1,14 @@ +// PR 30168 +// { dg-do compile } +// { dg-options "-O2" } + +struct aaa +{ + aaa(_Complex float __z) ; + _Complex float _M_value; +}; +aaa::aaa(_Complex float __z) +{ + __z*=2.0f; + _M_value = __z; +} diff --git a/gcc/testsuite/g++.dg/opt/compound1.C b/gcc/testsuite/g++.dg/opt/compound1.C new file mode 100644 index 000000000..cf81e6980 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/compound1.C @@ -0,0 +1,11 @@ +// PR c++/33709 +// { dg-do compile } +// { dg-options "-O2" } + +class S { + virtual void foo (); +}; +struct T { + S *s; + void bar (unsigned x) { s = (new S[1]) - x; } +}; diff --git a/gcc/testsuite/g++.dg/opt/cond1.C b/gcc/testsuite/g++.dg/opt/cond1.C new file mode 100644 index 000000000..ae8fa4d45 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/cond1.C @@ -0,0 +1,24 @@ +// { dg-do run } +// { dg-options "-O2" } + +struct D { int x; }; +struct W +{ + W () {} + D & operator * () { return d; } + D d; +}; + +int +foo (int y) +{ + W m; + (*m).x = (y > 1 ? y : 0); + return (*m).x; +} + +int +main () +{ + return (foo (6) != 6); +} diff --git a/gcc/testsuite/g++.dg/opt/conj1.C b/gcc/testsuite/g++.dg/opt/conj1.C new file mode 100644 index 000000000..b578abbdf --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/conj1.C @@ -0,0 +1,18 @@ +// PR target/5740 +// This testcase ICEd on SPARC -m64 because emit_group_load tried +// to move a DFmode register into DImode register directly. +// { dg-do compile } +// { dg-options "-O2" } + +struct C +{ + C (double y, double z) { __real__ x = y; __imag__ x = z; } + double r () const { return __real__ x; } + double i () const { return __imag__ x; } + __complex__ double x; +}; + +C conj (const C& z) +{ + return C (z.r (), -z.i ()); +} diff --git a/gcc/testsuite/g++.dg/opt/conj2.C b/gcc/testsuite/g++.dg/opt/conj2.C new file mode 100644 index 000000000..25e832a02 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/conj2.C @@ -0,0 +1,23 @@ +// PR target/6043 +// This testcase ICEd on IA-64 because emit_group_store +// did not handle loading CONCAT from register group +// { dg-do compile } + +struct C +{ + C (double y, double z) { __real__ x = y; __imag__ x = z; } + double r () const { return __real__ x; } + double i () const { return __imag__ x; } + __complex__ double x; +}; + +inline C conj (const C& x) +{ + return C (x.r (), - x.i ()); +} + +void foo (void) +{ + C x (1.0, 1.0); + conj (x); +} diff --git a/gcc/testsuite/g++.dg/opt/const1.C b/gcc/testsuite/g++.dg/opt/const1.C new file mode 100644 index 000000000..834cfd5e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/const1.C @@ -0,0 +1,129 @@ +// This testcase was miscompiled on IA-64 to read from unitialized memory +// and dereference it. +// { dg-do run } +// { dg-options "-O2" } + +struct A +{ + A () { a = 1; } + void a1 () { a++; } + bool a2 () { return !--a; } + unsigned int a; +}; + +struct B {}; + +template <class T> struct C +{ + C () {} + C (const T& t) : c (t) {} + C<T> *next, *prev; + T c; +}; + +template <class T> struct D +{ + C<T> *d; + D () : d (0) {} + D (C<T> *x) : d (x) {} + D (const D<T>& x) : d (x.d) {} + bool operator!= (const D<T>& x) const { return d != x.d; } + const T& operator* () const { return d->c; } + D<T> operator++ (int) { D<T> t = *this; d = d->next; return t; } +}; + +template <class T> struct E +{ + C<T> *e; + E () : e (0) {} + E (C<T> *p) : e (p) {} + E (const E<T>& x) : e (x.e) {} + E (const D<T>& x) : e (x.e) {} + bool operator!= (const E<T>& x) const { return e != x.e; } + const T& operator* () const { return e->c; } + E<T>& operator++ () { e = e->next; return *this; } +}; + +template <class T> struct F : public A +{ + C<T> *f; + unsigned long f0; + F () { f = new C<T>; f->next = f->prev = f; f0 = 0; } + F (const F<T>& x) : A () + { + f = new C<T>; f->next = f->prev = f; f0 = 0; + D<T> b (x.f->next), e (x.f), i (f); + while (b != e) + f1 (i, *b++); + } + + ~F () + { + C<T> *p = f->next; + while (p != f) + { + C<T> *x = p->next; + delete p; + p = x; + } + delete f; + } + + D<T> f1 (D<T> x, const T& y) + { + C<T> *p = new C<T> (y); + p->next = x.d; + p->prev = x.d->prev; + x.d->prev->next = p; + x.d->prev = p; + f0++; + return p; + } +}; + +template <class T> struct G +{ + F<T> *g; + G () { g = new F<T>; } + G (const G<T>& x) { g = x.g; g->a1 (); } + ~G () {} + G<T>& operator= (const G<T>& x) { x.g->a1 (); g = x.g; return *this; } + D<T> g1 () { g4 (); return D<T> (g->f); } + E<T> g1 () const { return E<T> (g->f); } + E<T> g2 () const { return E<T> (g->f->next); } + D<T> g3 (const T& x) { g4 (); return g->f1 (g1 (), x); } + void g4 () { if (g->a > 1) { g->a2 (); g = new F<T> (*g); } } + + G<T> operator+ (const G<T>& x) const + { + G<T> x2 (*this); + for (E<T> i = x.g2 (); i != x.g1 (); ++i) + x2.g3 (*i); + return x2; + } + + G<T>& operator+= (const G<T>& x) + { + for (E<T> i = x.g2 (); i != x.g1 (); ++i) + g3 (*i); + return *this; + } +}; + +struct H : public G<B> +{ + H () {} + H (const H& x) : G<B> (x) {} + H (const G<B>& x) : G<B> (x) {} +}; + +void foo (); + +int +main () +{ + H a = H () + H (); + a += H (); + H b; + b = H () + H (); +} diff --git a/gcc/testsuite/g++.dg/opt/const2.C b/gcc/testsuite/g++.dg/opt/const2.C new file mode 100644 index 000000000..b4efbbe35 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/const2.C @@ -0,0 +1,42 @@ +// PR optimization/6631 + +// { dg-do run } +// { dg-options "-O" } + +extern "C" void abort (void); + +struct QSize +{ + QSize(); + QSize( int w, int h ); + int wd, ht; + friend inline const QSize operator+( const QSize &, const QSize & ); +}; + +inline QSize::QSize() +{ wd = ht = -1; } + +inline QSize::QSize( int w, int h ) +{ wd = w; ht = h; } + +inline const QSize operator+( const QSize & s1, const QSize & s2 ) +{ return QSize(s1.wd+s2.wd, s1.ht+s2.ht); } + +QSize minimumSize() +{ + return QSize (100, 200); +} + +QSize totalMinimumSize() +{ + QSize s = minimumSize(); + return s + QSize( 0, 0 ); +} + +int main() +{ + QSize s = totalMinimumSize(); + if (s.wd != 100 || s.ht != 200) + abort (); +} + diff --git a/gcc/testsuite/g++.dg/opt/const3.C b/gcc/testsuite/g++.dg/opt/const3.C new file mode 100644 index 000000000..c7c0a1645 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/const3.C @@ -0,0 +1,44 @@ +// PR optimization/12926 +// This failed on SPARC64 because the assignments to the bit-fields +// were wrongly swapped in the constructor. + +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort(void); + +typedef __SIZE_TYPE__ size_t; + +void *my_out; + +struct A +{ + enum Type {P, U, S}; + + int foo1(void *, const char *); + int foo2(int, const Type); + + A (const size_t size, const Type type): mSize(size), mType(type) + { + foo2(foo1(my_out, "type = "), type); + foo2(foo1(my_out, "mType = "), mType); + } + + const size_t mSize : 8*sizeof(size_t) - 3; + Type mType : 2; +}; + +int i; + +int A::foo1(void *ios, const char *str) { } +int A::foo2(int v, const Type t) { i=0; } + +int main() +{ + A testa(2, A::S); + + if (testa.mType != A::S) + abort(); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/const4.C b/gcc/testsuite/g++.dg/opt/const4.C new file mode 100644 index 000000000..883c24b55 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/const4.C @@ -0,0 +1,9 @@ +// PR c++/21454 +// Test whether A is put into .rodata section on platforms +// that have it. +// { dg-do compile } + +const int a[] __attribute__ ((__used__)) = { 0, 1, 2, 3 }; + +// The MMIX port always switches to the .data section at the end of a file. +// { dg-final { scan-assembler-not "\\.data(?!\\.rel\\.ro)" { xfail powerpc*-*-aix* mmix-*-* } } } diff --git a/gcc/testsuite/g++.dg/opt/const5.C b/gcc/testsuite/g++.dg/opt/const5.C new file mode 100644 index 000000000..3785271a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/const5.C @@ -0,0 +1,13 @@ +// We don't have a good way of determining how ".rodata" is spelled on +// all targets, so we limit this test to a few common targets where we +// do know the spelling. +// { dg-do compile { target i?86-*-linux* x86_64-*-linux* } } +// { dg-final { scan-assembler "\\.rodata" } } + +template <typename T> +struct B { + int i; +}; + +// This declaration should be placed in .rodata. +const B<int> const_B __attribute__((used)) = { 3 }; diff --git a/gcc/testsuite/g++.dg/opt/const6.C b/gcc/testsuite/g++.dg/opt/const6.C new file mode 100644 index 000000000..1a5c79bb1 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/const6.C @@ -0,0 +1,14 @@ +// PR target/39179 +// Make sure that we don't optimize away the load from K::k. +// { dg-options "-O2" } +// { dg-final { scan-assembler _ZN1K1kE } } + +struct K { + static const unsigned k; +}; +extern "C" void abort (void); +int main() { + if ( K::k != 1 ) + abort (); + return 1; +} diff --git a/gcc/testsuite/g++.dg/opt/copysign-1.C b/gcc/testsuite/g++.dg/opt/copysign-1.C new file mode 100644 index 000000000..347bec26e --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/copysign-1.C @@ -0,0 +1,10 @@ +// { dg-options "-O2" } +// { dg-do compile } +// PR rtl-opt/27883 +// MIPS used to ICE because local flow update +// was not removing an invalid REG_DEAD. + + +double copysign (double x, double y); +double GetDouble(); +double a = copysign (1.0, GetDouble()); diff --git a/gcc/testsuite/g++.dg/opt/covariant1.C b/gcc/testsuite/g++.dg/opt/covariant1.C new file mode 100644 index 000000000..e57cf4c6b --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/covariant1.C @@ -0,0 +1,47 @@ +// PR c++/20206 +// { dg-do run } +// { dg-options "-O0" } + +void +bar (int x) +{ + asm ("" : : "g" (x)); +} + +struct S { S () {}; virtual ~S () {}; }; +struct T { virtual T *foo (int) {}; }; +struct V : virtual S, virtual T {}; +struct V v; +struct U : public S, public T +{ + bool a; + U () {} + virtual ~U () {} + virtual V *foo (int x) + { + switch (x) + { + case 12: + break; + case 9: + bar (7); + break; + case 10: + bar (12); + break; + case 4: + bar (18); + break; + case 2: + bar (26); + break; + } + return &v; + } +}; +U u; + +int +main () +{ +} diff --git a/gcc/testsuite/g++.dg/opt/crash1.C b/gcc/testsuite/g++.dg/opt/crash1.C new file mode 100644 index 000000000..3526df1dd --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/crash1.C @@ -0,0 +1,14 @@ +// PR opt/13681 +// Here we have an out-of-range array index. We should not abort +// trying to resolve the indirection back to an object. + +struct X { + double values[1]; + double & foo (const unsigned int index) { return values[index]; } +}; + +void foo() { + double d; + X h1; + h1.foo(1) = d; +} diff --git a/gcc/testsuite/g++.dg/opt/crossjump1.C b/gcc/testsuite/g++.dg/opt/crossjump1.C new file mode 100644 index 000000000..01abdc071 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/crossjump1.C @@ -0,0 +1,34 @@ +// PR middle-end/21492 +// { dg-do compile } +// { dg-options "-Os" } +// { dg-options "-Os -fPIC" { target fpic } } + +extern char *bar (const char *, const char *); +extern char *baz (char *, const char *); +extern unsigned int fn (const char *); +static const struct C { int i; } k = { 0}; + +struct A +{ + ~A (); +}; + +char * +foo (char *x, const char *y) +{ + A a; + char *c = x; + + if (bar (y, "foo")) + { + baz (c, "foo"); + c += fn ("foo"); + } + else if (bar (y, "bar")) + { + baz (c, "bar"); + c += fn ("bar"); + } + + return x; +} diff --git a/gcc/testsuite/g++.dg/opt/cse1.C b/gcc/testsuite/g++.dg/opt/cse1.C new file mode 100644 index 000000000..be1ad5a11 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/cse1.C @@ -0,0 +1,12 @@ +// PR optimization/6759 +// This testcase ICEd on SPARC because folded REG_EQUAL +// note was note stored back and fold_rtx left invalid rtx +// in it. +// { dg-do compile } +// { dg-options "-O2" } + +struct A +{ + long long a; + A (unsigned short d) : a (d) {} +} x (65535); diff --git a/gcc/testsuite/g++.dg/opt/cse2.C b/gcc/testsuite/g++.dg/opt/cse2.C new file mode 100644 index 000000000..325169dff --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/cse2.C @@ -0,0 +1,39 @@ +// This testcase caused ICE on IA-32 in simplify_unary_operation +// CSE did not assume SUBREGs changing mode from integral to floating. +// { dg-do run { target i?86-*-* sparc*-*-* x86_64-*-* } } +// { dg-options "-O2" } + +struct A +{ + union + { + float f; + unsigned int w; + } a; + + static inline const A foo (void) + { + return A ((unsigned int) (__extension__ ((union { unsigned l; float d; }) + { l: 0x3f800000 }).d)); + } + inline A (float f) { a.f = f; } + A (); + inline A (unsigned int w) { a.w = w; } +}; + +A::A() +{ + *this = foo (); +} + +A a; + +extern "C" void abort (void); +extern "C" void exit (int); + +int main () +{ + if (a.a.w != 1) + abort (); + exit (0); +} diff --git a/gcc/testsuite/g++.dg/opt/cse3.C b/gcc/testsuite/g++.dg/opt/cse3.C new file mode 100644 index 000000000..a63280716 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/cse3.C @@ -0,0 +1,48 @@ +// This testcase resulted in invalid code generation on x86_64 targets +// due to a bug in fold_rtx. For a "true" value, fold_rtx represented it +// as const_true_rtx in floating-point mode, if the FLOAT_STORE_FLAG_VALUE +// macro is not defined. + +// { dg-do run } +// { dg-options "-O1 -fno-guess-branch-probability -fcse-follow-jumps -fgcse -frerun-cse-after-loop" } + +class StatVal { + + public: + + StatVal(double ev, double va) + : m(ev), + v(va) {} + + StatVal(const StatVal& other) + : m(other.m), + v(other.v) {} + + StatVal& operator*=(const StatVal& other) { + double A = m == 0 ? 1.0 : v / (m * m); + double B = other.m == 0 ? 1.0 : other.v / (other.m * other.m); + m = m * other.m; + v = m * m * (A + B); + return *this; + } + + double m; + double v; +}; + +extern "C" void abort (void); + +const StatVal two_dot_three(2, 0.3); + +int main(int argc, char **argv) { + + StatVal product3(two_dot_three); + + product3 *= two_dot_three; + + if (product3.v > 2.5) + { + abort(); + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/delay-slot-1.C b/gcc/testsuite/g++.dg/opt/delay-slot-1.C new file mode 100644 index 000000000..d435873cc --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/delay-slot-1.C @@ -0,0 +1,111 @@ +/* PR rtl-optimization/23585 */ +/* Testcase by Matti Rintala <matti.rintala@iki.fi> */ + +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +template <class _Ret, class _Tp> +class const_mem_fun_t +{ +public: + explicit + const_mem_fun_t(_Ret (_Tp::*__pf)() const) + : _M_f(__pf) {} + + _Ret + operator()(const _Tp* __p) const + { return (__p->*_M_f)(); } +private: + _Ret (_Tp::*_M_f)() const; +}; + +template <class _Ret, class _Tp> +class const_mem_fun_ref_t +{ +public: + explicit + const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const) + : _M_f(__pf) {} + + _Ret + operator()(const _Tp& __r) const + { return (__r.*_M_f)(); } +private: + _Ret (_Tp::*_M_f)() const; +}; + +template <class _Ret, class _Tp, class _Arg> +class const_mem_fun1_t +{ +public: + explicit + const_mem_fun1_t(_Ret (_Tp::*__pf)(_Arg) const) + : _M_f(__pf) {} + + _Ret + operator()(const _Tp* __p, _Arg __x) const + { return (__p->*_M_f)(__x); } +private: + _Ret (_Tp::*_M_f)(_Arg) const; +}; + + +template <class _Ret, class _Tp, class _Arg> +class const_mem_fun1_ref_t +{ +public: + explicit + const_mem_fun1_ref_t(_Ret (_Tp::*__pf)(_Arg) const) + : _M_f(__pf) {} + + _Ret + operator()(const _Tp& __r, _Arg __x) const + { return (__r.*_M_f)(__x); } +private: + _Ret (_Tp::*_M_f)(_Arg) const; +}; + +template <class _Ret, class _Tp> +inline const_mem_fun_t<_Ret, _Tp> +mem_fun(_Ret (_Tp::*__f)() const) +{ return const_mem_fun_t<_Ret, _Tp>(__f); } + +template <class _Ret, class _Tp> +inline const_mem_fun_ref_t<_Ret, _Tp> +mem_fun_ref(_Ret (_Tp::*__f)() const) +{ return const_mem_fun_ref_t<_Ret, _Tp>(__f); } + +template <class _Ret, class _Tp, class _Arg> +inline const_mem_fun1_t<_Ret, _Tp, _Arg> +mem_fun(_Ret (_Tp::*__f)(_Arg) const) +{ return const_mem_fun1_t<_Ret, _Tp, _Arg>(__f); } + +template <class _Ret, class _Tp, class _Arg> +inline const_mem_fun1_ref_t<_Ret, _Tp, _Arg> +mem_fun_ref(_Ret (_Tp::*__f)(_Arg) const) +{ return const_mem_fun1_ref_t<_Ret, _Tp, _Arg>(__f); } + +class Klasse { +public: + void vf0c() const; + void vf1c(const int&) const; +}; + +int main() +{ + Klasse obj; + const Klasse& objc = obj; + + mem_fun(&Klasse::vf0c)(&objc); + mem_fun(&Klasse::vf1c)(&objc, 1); + + mem_fun_ref(&Klasse::vf0c)(objc); + mem_fun_ref(&Klasse::vf1c)(objc, 1); + return 0; +} + +void Klasse::vf0c() const +{} + +void Klasse::vf1c(const int&) const +{} diff --git a/gcc/testsuite/g++.dg/opt/devirt1.C b/gcc/testsuite/g++.dg/opt/devirt1.C new file mode 100644 index 000000000..0a825c2a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/devirt1.C @@ -0,0 +1,7 @@ +// { dg-do compile } +// { dg-options "-O" } +// { dg-final { scan-assembler "xyzzy" { xfail *-*-* } } } + +struct S { S(); virtual void xyzzy(); }; +inline void foo(S *s) { s->xyzzy(); } +void bar() { S s; foo(&s); } diff --git a/gcc/testsuite/g++.dg/opt/dtor1.C b/gcc/testsuite/g++.dg/opt/dtor1.C new file mode 100644 index 000000000..0352676c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/dtor1.C @@ -0,0 +1,27 @@ +// { dg-do run } +// { dg-options "-O2" } + +int i; + +struct S { + S (); + S (const S&); + ~S (); +}; + +S::S () { ++i; } +S::S (const S&) { ++i; } +S::~S () { --i; } + +inline void f (S) { +} + +int main () { + { + S s; + f (s); + } + + return i; +} + diff --git a/gcc/testsuite/g++.dg/opt/dtor2-aux.cc b/gcc/testsuite/g++.dg/opt/dtor2-aux.cc new file mode 100644 index 000000000..9e87cc817 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/dtor2-aux.cc @@ -0,0 +1,16 @@ +// { dg-do compile } +// { dg-options "" } + +#include "dtor2.h" + +A::A () {} +A::~A () {} + +void B::mb () {} +B::B (int) {} +B::~B () {} + +void C::mc () {} +C::C (int x) : B (x) {} + +D::~D () {} diff --git a/gcc/testsuite/g++.dg/opt/dtor2.C b/gcc/testsuite/g++.dg/opt/dtor2.C new file mode 100644 index 000000000..39b8e6999 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/dtor2.C @@ -0,0 +1,13 @@ +// PR c++/42317 +// { dg-do link } +// { dg-options "-O0" } +// { dg-additional-sources "dtor2-aux.cc" } + +#include "dtor2.h" + +D::D (int x) : C (x) {} + +int +main () +{ +} diff --git a/gcc/testsuite/g++.dg/opt/dtor2.h b/gcc/testsuite/g++.dg/opt/dtor2.h new file mode 100644 index 000000000..a86940001 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/dtor2.h @@ -0,0 +1,29 @@ +struct A +{ + A (); + ~A (); +}; + +struct B +{ + A b; + virtual void mb (); + B (int); + virtual ~B (); +}; + +struct C : public B +{ + virtual void mc (); + C (int); + ~C (); +}; + +inline C::~C () {} + +struct D : public C +{ + A d; + D (int); + ~D (); +}; diff --git a/gcc/testsuite/g++.dg/opt/dtor3.C b/gcc/testsuite/g++.dg/opt/dtor3.C new file mode 100644 index 000000000..2d9309877 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/dtor3.C @@ -0,0 +1,11 @@ +// PR c++/42386 +// { dg-do compile } +// { dg-options "-O2" } +# 1 "A.h" 1 +#pragma interface +struct D { virtual bool d () const; }; +struct E { virtual ~E (); virtual void *e () const = 0; }; +struct A : public D, public E { ~A () {} }; +# 5 "dtor3.C" 1 +struct F : public A { void *f () const; void *e () const; }; +void *F::e () const { return __null; } diff --git a/gcc/testsuite/g++.dg/opt/dtor4-aux.cc b/gcc/testsuite/g++.dg/opt/dtor4-aux.cc new file mode 100644 index 000000000..e3ca43b74 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/dtor4-aux.cc @@ -0,0 +1,6 @@ +// { dg-do compile } +// { dg-options "" } + +#include "dtor4.h" + +S s; diff --git a/gcc/testsuite/g++.dg/opt/dtor4.C b/gcc/testsuite/g++.dg/opt/dtor4.C new file mode 100644 index 000000000..c58fadfa1 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/dtor4.C @@ -0,0 +1,13 @@ +// PR tree-optimization/42625 +// { dg-do run } +// { dg-options "-O1 -fipa-sra" } +// { dg-additional-sources "dtor4-aux.cc" } + +#include "dtor4.h" + +int +main () +{ + S s; + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/dtor4.h b/gcc/testsuite/g++.dg/opt/dtor4.h new file mode 100644 index 000000000..d3b43beab --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/dtor4.h @@ -0,0 +1,8 @@ +#include <cassert> + +struct S +{ + int a, i; + S () : i(1) {} + __attribute__((noinline)) ~S () { assert (i == 1); } +}; diff --git a/gcc/testsuite/g++.dg/opt/eh1.C b/gcc/testsuite/g++.dg/opt/eh1.C new file mode 100644 index 000000000..63a4d2ef3 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/eh1.C @@ -0,0 +1,21 @@ +// PR middle-end/14477 +// { dg-do compile } +// { dg-options "-O2 -fno-default-inline" } + +struct A +{ + A(); +}; + +struct B +{ + B(const A*); +}; + +struct C +{ + B b; + C(int) : b(new A) {} +}; + +C c(0); diff --git a/gcc/testsuite/g++.dg/opt/eh2.C b/gcc/testsuite/g++.dg/opt/eh2.C new file mode 100644 index 000000000..7cb49f00c --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/eh2.C @@ -0,0 +1,34 @@ +// PR 6764 +// { dg-do run } +// { dg-options "-O -fomit-frame-pointer" } + +extern "C" void abort (); + +class test +{ + public: + test * const me; + test () : me(this) { } + ~test () { if (me != this) abort (); } +}; + +void x1 () +{ + test w1; + throw 1; +} + +void x2 () +{ + test w2; + x1 (); +} + +int main (void) +{ + try { + x2 (); + } catch (...) { + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/eh3.C b/gcc/testsuite/g++.dg/opt/eh3.C new file mode 100644 index 000000000..0cd9cac5f --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/eh3.C @@ -0,0 +1,33 @@ +// PR target/18841 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort (); + +int r, i1 = 1, i2 = 2, i3 = 3, i4 = 4, i5 = 5; + +struct S +{ + ~S() { r = i1 + i2 + i3 + i4 + i5; } +}; + +void foo() +{ + S s; + throw 1; +} + +void bar() +{ + try { + foo(); + } catch (...) { + } +} + +int main() +{ + bar(); + if (r != 1 + 2 + 3 + 4 + 5) + abort (); +} diff --git a/gcc/testsuite/g++.dg/opt/eh4.C b/gcc/testsuite/g++.dg/opt/eh4.C new file mode 100644 index 000000000..0a62ee2db --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/eh4.C @@ -0,0 +1,59 @@ +// { dg-do run } +// { dg-options "-O3" } + +// Make sure that the call to terminate within F2 is not eliminated +// by incorrect MUST_NOT_THROW optimization. Note that we expect F1 +// to be inlined into F2 in order to expose this case. + +#include <cstdlib> +#include <exception> + +static volatile int zero = 0; + +// Note that we need F0 to not be marked nothrow, though we don't actually +// want a throw to happen at runtime here. The noinline tag is merely to +// make sure the assembly in F0 is not unnecessarily complex. +static void __attribute__((noinline)) f0() +{ + if (zero != 0) + throw 0; +} + +struct S1 +{ + S1() { } + ~S1() { f0(); } +}; + +static void f1() +{ + S1 s1; + throw 1; +} + +struct S2 +{ + S2() { } + ~S2() { f1(); } +}; + +static void __attribute__((noinline)) f2() +{ + S2 s2; + throw 2; +} + +static void pass() +{ + exit (0); +} + +int main() +{ + std::set_terminate (pass); + try { + f2(); + } catch (...) { + } + abort (); +} diff --git a/gcc/testsuite/g++.dg/opt/eh5.C b/gcc/testsuite/g++.dg/opt/eh5.C new file mode 100644 index 000000000..3557ab2aa --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/eh5.C @@ -0,0 +1,43 @@ +// PR 41377 +// { dg-do compile } +// { dg-options "-O3" } + +struct A +{ + bool foo(int*) const; +} a; + +struct B {}; + +struct B1 : B +{ + bool (A::*pmf)(int*) const; + const A* pa; + + B1() : pmf(&A::foo), pa(&a) {} + bool operator()() const { return (pa->*pmf)(new int); } +}; + +struct B2 : B +{ + B1 b1; + + B2(const B1& _b1) : b1(_b1) {} + bool operator()() const { return b1(); } +}; + +template<int> struct C +{ + void bar(B2 b2) { while (b2()) ; } + C() { bar(B2(B1())); } +}; + +void baz(int i) +{ + switch(i) + { + case 0: new C<0>; + case 1: new C<1>; + case 2: new C<2>; + } +} diff --git a/gcc/testsuite/g++.dg/opt/empty1.C b/gcc/testsuite/g++.dg/opt/empty1.C new file mode 100644 index 000000000..66784fb28 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/empty1.C @@ -0,0 +1,11 @@ +// PR c++/43787 +// Test that we don't try to copy *x. +// { dg-do run } + +class empty_t {}; + +int main() +{ + empty_t* x = 0; + empty_t y = *x; +} diff --git a/gcc/testsuite/g++.dg/opt/empty2.C b/gcc/testsuite/g++.dg/opt/empty2.C new file mode 100644 index 000000000..86caa5ccb --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/empty2.C @@ -0,0 +1,18 @@ +// PR c++/46160 +// { dg-do compile } + +struct S +{ + enum E { A }; +} s; +volatile S t; + +void f (S::E); + +void +g () +{ + volatile S *p = &s; + f (p->A); + f (t.A); +} diff --git a/gcc/testsuite/g++.dg/opt/emptyunion.C b/gcc/testsuite/g++.dg/opt/emptyunion.C new file mode 100644 index 000000000..105faed58 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/emptyunion.C @@ -0,0 +1,13 @@ +// PR optimization/11059 +// This testcase ICEd because clear_by_pieces was called with zero length. +// { dg-do compile } +// { dg-options "-O2" } + +union uni {}; + +int main() { + uni *h; + + h = (uni *)new uni(); +} + diff --git a/gcc/testsuite/g++.dg/opt/enum1.C b/gcc/testsuite/g++.dg/opt/enum1.C new file mode 100644 index 000000000..6416b3f1b --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/enum1.C @@ -0,0 +1,30 @@ +// Verify that we don't confuse precision and mode for enums. +// { dg-do run } +// { dg-options "-O" } + +extern "C" void abort(); + +enum E { + zero = 0, + test = 0xbb +}; + +static bool foo(unsigned char *x) +{ + E e = static_cast<E>(*x); + switch (e) + { + case test: + return true; + default: + return false; + } +} + +int main() +{ + unsigned char dummy = test; + if (! foo(&dummy)) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/enum2.C b/gcc/testsuite/g++.dg/opt/enum2.C new file mode 100644 index 000000000..6300896cf --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/enum2.C @@ -0,0 +1,21 @@ +// PR c++/43680 +// Test that we don't make excessively aggressive assumptions about what +// values an enum variable can have. +// { dg-options "-O2 -fPIC" } +// { dg-do run } + +extern "C" void abort (); + +enum E { A, B, C, D }; + +void +CheckE(const E value) +{ + long v = value; + if (v <= D) + abort (); +} + +int main() { + CheckE(static_cast<E>(5)); +} diff --git a/gcc/testsuite/g++.dg/opt/expect1.C b/gcc/testsuite/g++.dg/opt/expect1.C new file mode 100644 index 000000000..90a871f37 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/expect1.C @@ -0,0 +1,17 @@ +// PR c++/13239 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort (void); + +struct Y { + int i; +}; + +bool foo () { return true; } +Y bar () { Y y = {0}; return y; } + +int main () +{ + __builtin_expect (foo () && (bar ().i) == 0, 0) ? 0 : (abort (), 1); +} diff --git a/gcc/testsuite/g++.dg/opt/expect2.C b/gcc/testsuite/g++.dg/opt/expect2.C new file mode 100644 index 000000000..1bb5d8331 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/expect2.C @@ -0,0 +1,11 @@ +// PR c++/13392 +// { dg-do compile } +// { dg-options "-O0" } + +extern "C" void abort (void); +struct X { ~X () throw() {} }; +bool foo (X s = X ()) { return false; } +void bar () +{ + __builtin_expect (foo () && true, 1) ? 0 : (abort (), 0); +} diff --git a/gcc/testsuite/g++.dg/opt/float1.C b/gcc/testsuite/g++.dg/opt/float1.C new file mode 100644 index 000000000..8f26ed5c8 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/float1.C @@ -0,0 +1,21 @@ +// PR optimization/11637 +// Origin: <nick@ilm.com> + +// This used to fail to assemble on x86 because a decimal +// floating point litteral was emitted, which originated +// from a bogus REG_EQUAL note not removed by the combiner. + +// { dg-do assemble } +// { dg-options "-O2 -fnon-call-exceptions" } + +void f(long int seed); + +void g(float &o) +{ + float a = 0.05f; + float b = 1.0 - a; + float c = 1.0 + a; + + f(0); + o = a; +} diff --git a/gcc/testsuite/g++.dg/opt/fold1.C b/gcc/testsuite/g++.dg/opt/fold1.C new file mode 100644 index 000000000..98f1b5191 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/fold1.C @@ -0,0 +1,17 @@ +// PR middle-end/13696 +// { dg-do compile } +// { dg-options "-O2" } + +extern void x(unsigned long*); + +enum e { red, blue, green }; + +struct s { + unsigned long l; +}; +struct s map[1][256]; + +void +f(int i,e j) { + x(&(map[i][j].l)); +} diff --git a/gcc/testsuite/g++.dg/opt/fold2.C b/gcc/testsuite/g++.dg/opt/fold2.C new file mode 100644 index 000000000..95063d7ab --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/fold2.C @@ -0,0 +1,19 @@ +// PR optimization/14669 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort (void); +extern "C" void exit (int); + +enum ActionType { EE=-1, E0=0, E1, E2 }; + +int main(void) +{ + ActionType t = E0; + + if (E1 <= t && t <= E2) + abort (); + + exit (0); +} + diff --git a/gcc/testsuite/g++.dg/opt/fold3.C b/gcc/testsuite/g++.dg/opt/fold3.C new file mode 100644 index 000000000..87a36b9ad --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/fold3.C @@ -0,0 +1,21 @@ +// PR middle-end/15069 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort (void); + +typedef enum { + FOUR = 4, + FIVE = 5 +} direction_t; + +int main () +{ + direction_t four = FOUR; + int flags = (four & 4L) ? (32L | 128L) : 0; + flags &= 32L; + + if (flags == 0) + abort (); +} + diff --git a/gcc/testsuite/g++.dg/opt/ice1.C b/gcc/testsuite/g++.dg/opt/ice1.C new file mode 100644 index 000000000..701897166 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/ice1.C @@ -0,0 +1,41 @@ +// PR c++/43024 +// { dg-options "-O2" } + +void foo(); + +template<int> struct X +{ + enum { e }; + typedef int Y; +}; + +template<int N = 0> struct A +{ + ~A() { foo(); } + A() { a<0>(0); } + template<int> void a(typename X<!X<N>::e>::Y); + struct B b(); +}; + +struct B +{ + A<> b0, b1, b2, b3; + B operator+ (const B&); +}; + +struct C +{ + A<> c0, c1, c2, c3, c4, c5, c6, c7, c8; +}; + +inline void bar(int i) +{ + A<> a0, a1; + if (i) a0.b() + a0.b() + a0.b() + a0.b(); +} + +void baz() +{ + C c; + bar(0); +} diff --git a/gcc/testsuite/g++.dg/opt/ifcvt1.C b/gcc/testsuite/g++.dg/opt/ifcvt1.C new file mode 100644 index 000000000..8fcbf4619 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/ifcvt1.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-O2 -fnon-call-exceptions" } + +struct S { ~S () throw () {} }; +double bar (); + +int +foo () +{ + S a; + int i = 0; + double c = bar (); + c = c < 0 ? -c : c; + if (c <= 1.e-8) + i += 24; + return i; +} diff --git a/gcc/testsuite/g++.dg/opt/init1.C b/gcc/testsuite/g++.dg/opt/init1.C new file mode 100644 index 000000000..d9a139e72 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/init1.C @@ -0,0 +1,4 @@ +// PR c++/23171 +// { dg-options "-O" } + +int *p = (int*)(int[1]){0}; diff --git a/gcc/testsuite/g++.dg/opt/init2.C b/gcc/testsuite/g++.dg/opt/init2.C new file mode 100644 index 000000000..3c3bc939d --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/init2.C @@ -0,0 +1,6 @@ +// PR middle-end/37414 +// { dg-do compile } +// { dg-options "-O2 -ffast-math" } + +double x = 6.0; +double y = x * x; diff --git a/gcc/testsuite/g++.dg/opt/inline1.C b/gcc/testsuite/g++.dg/opt/inline1.C new file mode 100644 index 000000000..55b931138 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline1.C @@ -0,0 +1,43 @@ +// PR c++/6316 +// This testcase ICEd because when deferred bar()::F::F() was being +// expanded, containing bar() was still deferred and had DECL_EXTERNAL set +// (and DECL_NOT_REALLY_EXTERN too). +// { dg-do compile } +// { dg-options "-O3" } + +struct A { ~A() throw() {} }; +template<typename T, typename U> struct B { U a; B(const T *); }; +typedef B<char, A> C; +struct D { D(); }; +struct E { virtual ~E(); }; + +E *bar (); + +void +foo () +{ + E *a = bar (); +} + +extern char *z []; + +E * +bar () +{ + struct F : public E + { + F () + { + for (int i = 0; i < 2; i++) + C e = z[i]; + } + D x, y; + }; + return new F (); +} + +int +main () +{ + foo (); +} diff --git a/gcc/testsuite/g++.dg/opt/inline10.C b/gcc/testsuite/g++.dg/opt/inline10.C new file mode 100644 index 000000000..086a48128 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline10.C @@ -0,0 +1,20 @@ +// PR c++/25010 +// { dg-options "-O2" } + +#pragma interface + +struct T +{ + T *p; + + void baz () + { + p->baz (); + } +}; + +void foo (T *p) +{ + p->baz (); +} + diff --git a/gcc/testsuite/g++.dg/opt/inline11.C b/gcc/testsuite/g++.dg/opt/inline11.C new file mode 100644 index 000000000..d9758176c --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline11.C @@ -0,0 +1,28 @@ +/* Verify that gnu_inline inlines disregard inlining limits. */ +/* { dg-do link } */ +/* { dg-options "-O2" } */ + +extern int foo (int); +extern int baz (int); + +extern inline __attribute__((gnu_inline)) +int foo (int x) +{ + int i; + if (!__builtin_constant_p (x)) + { +#define B(n) baz (1##n) + baz (2##n) + baz (3##n) \ + + baz (4##n) + baz (5##n) + baz (6##n) +#define C(n) B(1##n) + B(2##n) + B(3##n) + B(4##n) + B(5##n) + B(6##n) +#define D(n) C(1##n) + C(2##n) + C(3##n) + C(4##n) + C(5##n) + C(6##n) + return D(0) + D(1) + D(2) + D(3) + D(4) + + D(5) + D(6) + D(7) + D(8) + D(9); + } + return 0; +} + +int +main (void) +{ + return foo (0); +} diff --git a/gcc/testsuite/g++.dg/opt/inline12.C b/gcc/testsuite/g++.dg/opt/inline12.C new file mode 100644 index 000000000..d9eae306d --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline12.C @@ -0,0 +1,32 @@ +// PR tree-optimization/33458 +// { dg-do compile } +// { dg-options "-O" } + +inline void +foo (int *p, int n) +{ + for (; n > 0; --n, ++p) + *p = 0; +} + +struct A +{ + int x[2]; + A () { foo (x, 2); } +}; + +inline A +getA () +{ + return A (); +} + +struct B +{ + A a; + B (); +}; + +B::B () : a (getA ()) +{ +} diff --git a/gcc/testsuite/g++.dg/opt/inline14.C b/gcc/testsuite/g++.dg/opt/inline14.C new file mode 100644 index 000000000..8d2a5d4bb --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline14.C @@ -0,0 +1,51 @@ +// PR middle-end/34018 +// { dg-do compile } +// { dg-options "-O1" } + +template <typename E, unsigned long N> +struct A +{ + typedef E F; + E elems[N]; + A () {} + E *begin () { return elems; } + const E *begin () const { return elems; } + + explicit A (F const &v0, F const &v1, F const &v2) + { + elems[0] = v0; + elems[1] = v1; + elems[2] = v2; + } +}; + +template <typename E1, typename E2, typename E3> +inline void +bar (const E1 *a1, E2 const &a2, E3 *a3, unsigned long const &sz) +{ + E3 *r = a3 + sz; + for (;a3 != r; a1++, a3++) + *a3 = *a1 - a2; +} + +template<typename E, unsigned long N> +inline A<E, N> +operator- (A<E, N> const& a1, E const& a2) +{ + typedef A<E, N> G; + G a3; + bar (a1.begin (), a2, a3.begin (), N); + return a3; +} + +struct B +{ + B (A<unsigned long, 3> const &m) : n (m - static_cast<unsigned long>(1)) {} + A<unsigned long, 3> n; +}; + +void +foo () +{ + B t (A<unsigned long, 3> (0,0,0)); +} diff --git a/gcc/testsuite/g++.dg/opt/inline15.C b/gcc/testsuite/g++.dg/opt/inline15.C new file mode 100644 index 000000000..5da3a6105 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline15.C @@ -0,0 +1,42 @@ +// PR tree-optimization/40813 +// { dg-do compile } +// { dg-options "-O -fcheck-new" } + +typedef __SIZE_TYPE__ size_t; +typedef void *P; +struct A; +struct B +{ + void *b[5]; + A *foo () { return (A *) & b[0]; } +}; +struct A +{ + void *operator new (size_t x, B &y) { return y.foo (); } +}; +struct C : public A +{ + virtual int bar () { } +}; +struct D : public C +{ + static B baz (unsigned *x) { B b; new (b) D (x); return b; } + D (unsigned *x) { } +}; +struct E +{ + B e; + B fn (unsigned *a) { return D::baz (a); } + E (P b, unsigned *a) : e (fn (a)) { } +}; + +static unsigned * +fn2 () +{ +} + +void +test (P x) +{ + E (x, fn2 ()); +} diff --git a/gcc/testsuite/g++.dg/opt/inline16.C b/gcc/testsuite/g++.dg/opt/inline16.C new file mode 100644 index 000000000..6ee6d76d9 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline16.C @@ -0,0 +1,19 @@ +// PR c++/36959 +// We shouldn't have to emit fromSlotB just because we need shuf_BZZZ. +// { dg-options -O } +// { dg-final { scan-assembler-not "_ZL9fromSlotBv" } } + +static inline int *fromSlotB(void) +{ + static int shuf_BZZZ = 1; + return &shuf_BZZZ; +} + +int *p; + +int main(void) +{ + p = fromSlotB(); + return (*p != 1); +} + diff --git a/gcc/testsuite/g++.dg/opt/inline17.C b/gcc/testsuite/g++.dg/opt/inline17.C new file mode 100644 index 000000000..a42233d57 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline17.C @@ -0,0 +1,80 @@ +// PR tree-optimization/47420 +// Testcase by Yu Simin <silver24k@gmail.com> + +// { dg-do compile } +// { dg-options "-O2" } + +class fooControlBase +{ +public: + fooControlBase() { } + + virtual ~fooControlBase(); +}; + +class fooControl : public fooControlBase +{ +public: + fooControl() { } +}; + +class sfTextEntryBase +{ +public: + sfTextEntryBase() { } + virtual ~sfTextEntryBase(); +}; + +class sfTextEntry : public sfTextEntryBase +{ +public: + sfTextEntry() + { + } +}; + +class sfTextAreaBase +{ +public: + sfTextAreaBase() { } + virtual ~sfTextAreaBase() { } + +protected: +}; + + +class sfTextCtrlBase : public fooControl, + public sfTextAreaBase, + public sfTextEntry +{ +public: + + + + sfTextCtrlBase() { } + virtual ~sfTextCtrlBase() { } +}; + +class sfTextCtrl : public sfTextCtrlBase +{ +public: + sfTextCtrl(void* parent) + { + Create(parent); + } + virtual ~sfTextCtrl(); + + bool Create(void *parent); + + +}; + +sfTextCtrl* CreateTextCtrl() +{ + return new sfTextCtrl(0); +} + +void foo () +{ + new sfTextCtrl(0); +} diff --git a/gcc/testsuite/g++.dg/opt/inline2.C b/gcc/testsuite/g++.dg/opt/inline2.C new file mode 100644 index 000000000..6e6889fc7 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline2.C @@ -0,0 +1,18 @@ +// { dg-do link } +// { dg-options "-O1 -finline-functions" } + +static void g (); + +void f() +{ + void g(); + g(); +} + +void g() +{ +} + +int main () { + f (); +} diff --git a/gcc/testsuite/g++.dg/opt/inline3.C b/gcc/testsuite/g++.dg/opt/inline3.C new file mode 100644 index 000000000..7199de09c --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline3.C @@ -0,0 +1,40 @@ +// PR opt/6793 +// We failed to supress inlining of a varargs function when it's a template. +// { dg-do compile } +// { dg-options "-O3" } + +#include <stdarg.h> + +typedef __SIZE_TYPE__ size_t; + +template < class Type > class VectorNd +{ + size_t size; + Type *data; + public: + + VectorNd (size_t _size, size_t count, ...) + : size (_size) + { + data = new Type[size]; + + va_list ap; + + va_start (ap, count); + + for (size_t i = 0; i < count; i++) + data[i] = va_arg (ap, Type); + + va_end (ap); + } + + ~VectorNd () + { + delete [] data; + } +}; + +int main () +{ + VectorNd <double> vector (3, 3, 1.0, 2.0, 3.0); +} diff --git a/gcc/testsuite/g++.dg/opt/inline4.C b/gcc/testsuite/g++.dg/opt/inline4.C new file mode 100644 index 000000000..2eaad115f --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline4.C @@ -0,0 +1,13 @@ +// { dg-options "-O2 -ftemplate-depth-20000" } + +template <int I> +inline void g() { g<I-1>(); return; } + +template <> +inline void g<0>() { int i; return; } + +void h() { + g<250>(); +} + +// { dg-final { scan-assembler-not "\n_?_Z1gILi\[0-9\]+EEvv\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/opt/inline5.C b/gcc/testsuite/g++.dg/opt/inline5.C new file mode 100644 index 000000000..dd61ee6bc --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline5.C @@ -0,0 +1,20 @@ +// PR c++/12519 + +// { dg-do compile } +// { dg-options "-O" } + +struct A +{ + ~A(); +}; + +inline const A foo() +{ + A a; + return a; +} + +A bar() +{ + return foo(); +} diff --git a/gcc/testsuite/g++.dg/opt/inline6.C b/gcc/testsuite/g++.dg/opt/inline6.C new file mode 100644 index 000000000..b1616c7e7 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline6.C @@ -0,0 +1,14 @@ +// PR c++/13081 +// { dg-options "-O2" } +// { dg-final { scan-assembler-not "\n_?_Z3fooIlET_S0_\[: \t\n\]" } } + +template<typename T> T foo(T); + +template<typename T> inline T foo(T t) +{ + return t; +} + +void bar (long& l) { + l = foo(l); +} diff --git a/gcc/testsuite/g++.dg/opt/inline7.C b/gcc/testsuite/g++.dg/opt/inline7.C new file mode 100644 index 000000000..7a873b01a --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline7.C @@ -0,0 +1,7 @@ +// PR c++/13543 +// { dg-do compile } +// { dg-options "-O3" } + +struct basic_string { basic_string(const basic_string&); }; +basic_string operator+(const basic_string& lhs, char); +void dumpNode(basic_string start) { dumpNode(start + 'a'); } diff --git a/gcc/testsuite/g++.dg/opt/inline8.C b/gcc/testsuite/g++.dg/opt/inline8.C new file mode 100644 index 000000000..b2ca021b0 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline8.C @@ -0,0 +1,5 @@ +// PR c++/15871 +// { dg-options "-O2 -fkeep-inline-functions" } +// { dg-final { scan-assembler "foo" } } + +inline void foo(void) { } diff --git a/gcc/testsuite/g++.dg/opt/inline9.C b/gcc/testsuite/g++.dg/opt/inline9.C new file mode 100644 index 000000000..10bc54ccd --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline9.C @@ -0,0 +1,29 @@ +// PR c++/17972 +// Origin: Michal Ostrowski <mostrows@watson.ibm.com> +// Testcase by Alan Modra <amodra@bigpond.net.au> +// { dg-do run } +// { dg-options "-O" } +// { dg-options "-O -mtune=i686" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } + +struct thread_info +{ + short preempt_count; +} x; + +static inline struct thread_info *cti (void) __attribute__ ((const)); +static inline struct thread_info *cti (void) +{ + return &x; +} + +void fn (void) __attribute__ ((noinline)); +void fn (void) +{ + ++cti()->preempt_count; +} + +int main (void) +{ + fn (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/interface1-a.cc b/gcc/testsuite/g++.dg/opt/interface1-a.cc new file mode 100644 index 000000000..595585257 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/interface1-a.cc @@ -0,0 +1,9 @@ +struct Test { + void f(); +}; + +Test t; + +void g() { + t.f(); +} diff --git a/gcc/testsuite/g++.dg/opt/interface1.C b/gcc/testsuite/g++.dg/opt/interface1.C new file mode 100644 index 000000000..850fe3840 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/interface1.C @@ -0,0 +1,13 @@ +// { dg-do run } +// { dg-options "-O2" } +// { dg-additional-sources "interface1-a.cc" } + +#pragma implementation "interface1.h" + +#include "interface1.h" + +extern void g(); + +int main () { + g(); +} diff --git a/gcc/testsuite/g++.dg/opt/interface1.h b/gcc/testsuite/g++.dg/opt/interface1.h new file mode 100644 index 000000000..125f4b59e --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/interface1.h @@ -0,0 +1,8 @@ +#pragma interface "interface1.h" + +struct Test { + void f(); +}; + +inline void Test::f() { +} diff --git a/gcc/testsuite/g++.dg/opt/interface2.C b/gcc/testsuite/g++.dg/opt/interface2.C new file mode 100644 index 000000000..e75e42589 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/interface2.C @@ -0,0 +1,19 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 2 Jun 2005 <nathan@codesourcery.com> + +// PR 21280 +// Origin: Jens Maurer <jens.maurer@gmx.net> + +#include "interface2.h" + +struct A +{ + A() { } + virtual ~A() { } +}; + +int main() +{ + A a; + C<A> c(a); +} diff --git a/gcc/testsuite/g++.dg/opt/interface2.h b/gcc/testsuite/g++.dg/opt/interface2.h new file mode 100644 index 000000000..dc0590472 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/interface2.h @@ -0,0 +1,11 @@ +#pragma interface + +template<class T> +struct C +{ + explicit C(const T& t) : a(t) { } + virtual ~C() { } + T a; +}; + + diff --git a/gcc/testsuite/g++.dg/opt/life1.C b/gcc/testsuite/g++.dg/opt/life1.C new file mode 100644 index 000000000..f029767b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/life1.C @@ -0,0 +1,18 @@ +// This testcase did not set up the pic register on IA-32 due +// to bug in calculate_global_regs_live EH edge handling. +// { dg-do compile { target i?86-*-linux* x86_64-*-linux* } } +// { dg-require-effective-target ilp32 } +// { dg-require-effective-target fpic } +// { dg-options "-O2 -fPIC" } + +struct A { }; + +void foo (A (*fn)()) +{ + try { + A a = fn (); + } catch (...) { + } +} + +// { dg-final { scan-assembler "GLOBAL_OFFSET_TABLE" } } diff --git a/gcc/testsuite/g++.dg/opt/local1.C b/gcc/testsuite/g++.dg/opt/local1.C new file mode 100644 index 000000000..9cecaee6f --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/local1.C @@ -0,0 +1,20 @@ +// { dg-options "-O" } + +struct Outer { + struct Inner { virtual bool f() = 0; }; + void g(Inner &) const; +}; + +inline void h(const Outer &o) +{ + struct Local : public Outer::Inner { + virtual bool f() {}; + }; + Local l; + o.g(l); +} + +void f(Outer &req) { + h (req); +} + diff --git a/gcc/testsuite/g++.dg/opt/longbranch1.C b/gcc/testsuite/g++.dg/opt/longbranch1.C new file mode 100644 index 000000000..a64a57aea --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/longbranch1.C @@ -0,0 +1,36 @@ +// PR c++/5964 +// This testcase failed to link on sparc -m64 -O0, because instruction +// lengths were incorrectly computed +// { dg-do link } +// { dg-options "-O0" } + +#define makecode for (int i = 1; i < 1000; ++i) i *= 3 +#define muchcode \ + makecode; makecode; makecode; makecode; makecode; makecode; \ + makecode; makecode; makecode; makecode; makecode; makecode; \ + makecode; makecode; makecode; makecode; makecode; makecode; \ + makecode; makecode; makecode; makecode; makecode; makecode + +#define verymuchcode \ + muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \ + muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \ + muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \ + muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \ + muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \ + muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \ + muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \ + muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \ + muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \ + muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \ + muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \ + muchcode; muchcode; muchcode; muchcode; muchcode; muchcode; \ + muchcode; muchcode; muchcode; muchcode; muchcode; muchcode + +int +main (int argc, char **argv) +{ +loop: + verymuchcode; + delete[] argv; + goto loop; +} diff --git a/gcc/testsuite/g++.dg/opt/longbranch2.C b/gcc/testsuite/g++.dg/opt/longbranch2.C new file mode 100644 index 000000000..f2a3a7817 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/longbranch2.C @@ -0,0 +1,63 @@ +// PR target/11689 +// Originator: thor@math.tu-berlin.de + +// { dg-do compile } +// { dg-options "-O3 -funroll-loops -mtune=k6 -fomit-frame-pointer" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } + + +// This used to fail to assemble because of an out-of-range 'loop' instructions. + + +class JKeeper { +public: + unsigned long a0; +}; + +class EBCOTLut : public JKeeper { + unsigned char a1[1<<8]; + unsigned char a2[1<<8]; + unsigned char a3[1<<8]; + long a4[1<<9]; +public: + EBCOTLut(void); +}; + +EBCOTLut::EBCOTLut(void) +{ + unsigned char inter[36]; // intermediate lookup table; + unsigned long i; + for(i=0;i<36;i++) { + inter[i] = 0; + } + for(i=1;i<16;i++) { + a1[i | (1<<7)] = 8<<1; + a1[i | (1<<6)] = 8<<1; + } + for(i=0;i < ((1<<9)-1);i++) { + int ds = (i>>0) & 0x01; // significance of DOWN + int us = (i>>1) & 0x01; // significance of UP + int rs = (i>>2) & 0x01; // significance of RIGHT + int ls = (i>>3) & 0x01; // significance of LEFT + int dn = (i>>5) & 0x01; // sign of DOWN + int un = (i>>6) & 0x01; // sign of UP + int rn = (i>>7) & 0x01; // sign of RIGHT + int ln = (i>>8) & 0x01; // sign of LEFT + int h,v; // h and v as in the VM description + + h = ls*(1-ln*2) + rs*(1-2*rn); + v = us*(1-un*2) + ds*(1-2*dn); + h = (h >= -1)?(h):(-1); + v = (v >= -1)?(v):(-1); + h = (h <= 1)?(h):(1); + v = (v <= 1)?(v):(1); + a2[i] = inter[((h+1)<<3) | (v+1)]; + a3[i] = inter[((h+1)<<3) | (v+1)] & (unsigned char)(~1); + } + for(i=0;i< 1<<9; i++) { + a4[i] = 2*(i-(1<<(9-1)))*(i-(1<<(9-1))) - + ((i< (1<<(9-1)))? + (2*(i-(1<<(9-2)))*(i-(1<<(9-2)))): + (2*(i-(3<<(9-2)))*(i-(3<<(9-2))))); + + } +} diff --git a/gcc/testsuite/g++.dg/opt/loop1.C b/gcc/testsuite/g++.dg/opt/loop1.C new file mode 100644 index 000000000..ad0308e7f --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/loop1.C @@ -0,0 +1,24 @@ +// PR rtl-optimization/16590 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort(); + +struct iterator { + char * p; + int *dummy; +}; + +static iterator pend(char * start) { + iterator p = {start, 0}; + if (p.p == start) p.p = start+5; + --p.p; + return p; +} + +int main() { + char mem[4+1]; + + if(pend(mem).p != mem+4) + abort (); +} diff --git a/gcc/testsuite/g++.dg/opt/loop2.C b/gcc/testsuite/g++.dg/opt/loop2.C new file mode 100644 index 000000000..aee612ab5 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/loop2.C @@ -0,0 +1,24 @@ +// PR middle-end/22484 +// { dg-do compile } +// { dg-options "-O3" } + +struct A { ~A(); }; +typedef bool B; + +bool foo(); + +bool bar(A&) +{ + B b = true; + + for (int i = 0; i < 2 && b; ++i) + b = foo(); + + return b; +} + +void baz() +{ + A a; + if (bar(a)) foo(); +} diff --git a/gcc/testsuite/g++.dg/opt/memcpy1.C b/gcc/testsuite/g++.dg/opt/memcpy1.C new file mode 100644 index 000000000..f29134599 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/memcpy1.C @@ -0,0 +1,79 @@ +// PR target/34403 +// Origin: Martin Michlmayr <tbm@cyrius.com> + +// { dg-do compile } +// { dg-options "-O" } + +typedef unsigned char uint8_t; +typedef uint8_t uint8; +__extension__ typedef __SIZE_TYPE__ size_t; +class csVector2 +{ +public:float x; +}; +class csBox2 +{ +}; +struct iBase +{ +}; +struct iClipper2D:public virtual iBase +{ +}; +template < class Class > class scfImplementation:public virtual iBase +{ +}; +template < class Class, class I1 > class scfImplementation1:public +scfImplementation < Class >, + public I1 +{ +}; +class csClipper:public scfImplementation1 < csClipper, iClipper2D > +{ +}; +class csBoxClipper:public csClipper +{ + csBox2 region; + virtual uint8 Clip (csVector2 * InPolygon, size_t InCount, + csVector2 * OutPolygon, size_t & OutCount); +}; +struct StatusOutputNone +{ +}; +namespace CS +{ + template < typename BoxTest, typename StatusOutput > class BoxClipper + { + BoxTest boxTest; + StatusOutput statOut; + const csBox2 & region; + csVector2 *InP; + size_t InV; + csVector2 *OutP; + size_t OutV; + public: BoxClipper (const BoxTest & boxTest, const StatusOutput & statOut, + const csBox2 & region, csVector2 * InP, size_t InV, + csVector2 * OutP):boxTest (boxTest), statOut (statOut), + region (region), InP (InP), InV (InV), OutP (OutP), OutV (-1) + { + } + uint8 Clip () + { + __builtin_memcpy (this->OutP, InP, OutV * sizeof (csVector2)); + } + }; +} +struct BoxTestAll +{ +}; +uint8 +csBoxClipper::Clip (csVector2 * InPolygon, size_t InCount, + csVector2 * OutPolygon, size_t & OutCount) +{ + BoxTestAll b; + StatusOutputNone n; + CS::BoxClipper < BoxTestAll, StatusOutputNone > boxClip (b, n, region, + InPolygon, InCount, + OutPolygon); + uint8 Clipped = boxClip.Clip (); +} diff --git a/gcc/testsuite/g++.dg/opt/mmx1.C b/gcc/testsuite/g++.dg/opt/mmx1.C new file mode 100644 index 000000000..7af0d0145 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/mmx1.C @@ -0,0 +1,65 @@ +// PR optimization/4994 +// This testcase ICEd because movsi was not supporting direct +// mmx -> mmx register moves. +// { dg-do compile } +// { dg-options "-O2" } +// { dg-options "-fno-exceptions -O2 -mmmx -fPIC" { target { { i?86-*-* x86_64-*-* } && { ilp32 && fpic } } } } + +struct A { + unsigned a0; + bool a1 () { return !--a0; } + void a2 (); +}; + +struct B +{ + B (); + B (const B &); + ~B(); + B &operator= (const B &); + B b0 (unsigned long x, int y = 0, int z = 10) const; + +private: + A *b1; + static A *b2; +}; + +inline B::~B() +{ + if (b1->a1 () && b1 == b2) + b1->a2(); +} + +struct C +{ + C *c0; +}; + +struct D +{ + C *d0; + D (); + D (const D &c0) {} + D &operator++ () { + C *x = d0; C *y = x->c0; + while (x == y->c0) + x = y; + d0 = x; + return *this; + } +}; + +B foo (const char *x, const B &y); + +void bar (void) +{ + B *y = 0; + B z; + for (unsigned long l = 0; l < 2147483647L * 2UL + 1; l++) + { + z = y->b0 (l); + *y = foo ("data", z); + } + D d; + ++d; +} diff --git a/gcc/testsuite/g++.dg/opt/mmx2.C b/gcc/testsuite/g++.dg/opt/mmx2.C new file mode 100644 index 000000000..8ee6cd469 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/mmx2.C @@ -0,0 +1,24 @@ +// { dg-do link { target i?86-*-* x86_64-*-* } } +// { dg-options "-O2 -mmmx" } +// { dg-prune-output "mangled name" } + +#include <mmintrin.h> + +static union u { __m64 m; long long l; } u; +extern "C" void abort (void); + +__attribute__((noinline)) +void bar (__m64 x) +{ + u.m = x; +} + +int +main () +{ + bar (_mm_set_pi32 (0x000000FF,0xFFFF00FF)); + _mm_empty (); + if (u.l != 0xffffff00ffLL) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/new1.C b/gcc/testsuite/g++.dg/opt/new1.C new file mode 100644 index 000000000..dbcc0f851 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/new1.C @@ -0,0 +1,71 @@ +// PR c++/39367 +// { dg-options "-O" } + +class QScriptEnginePrivate; +class QScriptClassInfo; +namespace QScript { + enum Type { InvalidType }; +}; +class QScriptValueImpl { +public: + inline QScriptValueImpl(); + QScript::Type m_type; +}; +namespace QScript { + namespace Ecma { + class Core { + public: + inline QScriptEnginePrivate *engine() const { } + inline QScriptClassInfo *classInfo() const { } + QScriptValueImpl publicPrototype; + }; + class Boolean: public Core { + void newBoolean(QScriptValueImpl *result, bool value = false); + }; + } + template <typename T> class Buffer { + public: + inline void reserve(int num); + inline void resize(int s); + T *m_data; + int m_capacity; + int m_size; + }; +} +template <typename T> void QScript::Buffer<T>::resize(int s) { + if (m_capacity < s) + reserve (s << 1); +} +template <typename T> void QScript::Buffer<T>::reserve(int x) { + T *new_data = new T[m_capacity]; + for (int i=0; i<m_size; ++i) + new_data[i] = m_data[i]; +} +class QScriptObject { +public: + inline void reset(); + QScript::Buffer<QScriptValueImpl> m_values; +}; +class QScriptEnginePrivate { +public: + inline QScriptObject *allocObject() { return 0; } + inline void newObject(QScriptValueImpl *o, const QScriptValueImpl &proto, + QScriptClassInfo *oc = 0); +}; +inline void QScriptEnginePrivate::newObject(QScriptValueImpl *o, + const QScriptValueImpl &proto, + QScriptClassInfo *oc) +{ + QScriptObject *od = allocObject(); + od->reset(); +} +inline QScriptValueImpl::QScriptValueImpl() : m_type(QScript::InvalidType) { } +inline void QScriptObject::reset() { m_values.resize(0); } +namespace QScript { + namespace Ecma { + void Boolean::newBoolean(QScriptValueImpl *result, bool value) + { + engine()->newObject(result, publicPrototype, classInfo()); + } + } +} diff --git a/gcc/testsuite/g++.dg/opt/noreturn-1.C b/gcc/testsuite/g++.dg/opt/noreturn-1.C new file mode 100644 index 000000000..9b2fc0cf1 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/noreturn-1.C @@ -0,0 +1,87 @@ +// PR optimization/12965 +// Origin: <qboosh@pld-linux.org> +// Reduced testcase: Falk Hueffner <falk@debian.org> + +// This ICEd on Alpha because the reload pass emitted save/restore +// insns around a no-return call. + +// { dg-do compile } +// { dg-options "-O2" } + +template <typename _Alloc> class allocator; +template <class _CharT> struct char_traits; +template <typename _CharT, + typename _Traits = char_traits<_CharT>, + typename _Alloc = allocator<_CharT> > +class basic_string; +typedef basic_string<char> string; + +static inline int __exchange_and_add(volatile int * __mem, int __val) { + int __result; + asm("" : "=&r"(__result)); + return __result; +} + +template<typename _Tp> struct allocator { + allocator() throw() { } + allocator(const allocator &) throw() {} +}; + +template<typename _CharT, typename _Traits, typename _Alloc> +struct basic_string { + typedef _Alloc allocator_type; + struct _Rep { + int _M_references; + void _M_dispose(const _Alloc & __a) { + if (__exchange_and_add(&_M_references, -1) <= 0) + _M_destroy(__a); + } void _M_destroy(const _Alloc &) throw(); + }; + struct _Alloc_hider : _Alloc { + _CharT *_M_p; + }; + mutable _Alloc_hider _M_dataplus; + _CharT *_M_data() const { return _M_dataplus._M_p; } + _Rep *_M_rep() const { + return &((reinterpret_cast<_Rep *>(_M_data()))[-1]); + } + basic_string(); + basic_string(const _CharT * __s, const _Alloc & __a = _Alloc()); + ~basic_string() { + _M_rep()->_M_dispose(this->get_allocator()); + } + allocator_type get_allocator() const { return _M_dataplus; } +}; + +struct Egeneric { + void stack(const string & passage, const string & message = "") { } +}; + +struct infinint { + void detruit() throw(Egeneric); + template<class T> void infinint_from(T a) throw(Egeneric); + infinint(long a = 0) throw(Egeneric) { + try { + infinint_from(a); + } catch(Egeneric& e) { + e.stack("infinint::infinint", "long"); + } + } + ~infinint() throw(Egeneric) { + try { + detruit(); + } catch(Egeneric& e) { } + } +}; + +struct inode { + string x; + infinint a, c; + infinint ea_offset; + inode(); +}; + +inode::inode() +{ + ea_offset = 0; +} diff --git a/gcc/testsuite/g++.dg/opt/nothrow1.C b/gcc/testsuite/g++.dg/opt/nothrow1.C new file mode 100644 index 000000000..c1a80822b --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nothrow1.C @@ -0,0 +1,25 @@ +// Test that the nothrow optimization works properly. +// { dg-do compile } +// { dg-options "-O -fdump-tree-optimized" } + +extern void blah() throw(); + +int i, j, k; + +int main() +{ + try + { + ++i; + blah(); + ++j; + } + catch (...) + { + return -42; + } +} + +// The catch block should be optimized away. +// { dg-final { scan-tree-dump-times "-42" 0 "optimized" } } +// { dg-final { cleanup-tree-dump "optimized" } } diff --git a/gcc/testsuite/g++.dg/opt/nrv1.C b/gcc/testsuite/g++.dg/opt/nrv1.C new file mode 100644 index 000000000..cba162522 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv1.C @@ -0,0 +1,28 @@ +// Test for the named return value optimization. +// { dg-do run } +// { dg-options -fno-inline } + +int c; +int d; + +struct A +{ + A() { ++c; } + A(const A&) { ++c; }; + ~A() { ++d; } +}; + +inline A f () +{ + A a; + return a; +} + +int main () +{ + { + A a = f (); + } + + return !(c == 1 && c == d); +} diff --git a/gcc/testsuite/g++.dg/opt/nrv10.C b/gcc/testsuite/g++.dg/opt/nrv10.C new file mode 100644 index 000000000..d4cb92c33 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv10.C @@ -0,0 +1,48 @@ +// PR c++/25979 +// Bug: we were eliding too many temporaries, so that a1 was used +// as both 'a' and 'x' in the second operator+. +// { dg-do run } + +struct A +{ + A() : data1_(0), data2_(0) {} + A(int i, int j) : data1_(i), data2_(j) {} + A operator+(int); + friend A operator+(int, const A&); + ~A() {} +//private: + int data1_; + int data2_; +}; + +extern bool x; + +extern "C" void abort (); + +int main() +{ + A a1(1,2); + a1 = (x ? a1 + 3 : 3 + a1); + if (a1.data1_ != 3 || a1.data2_ != 2) + abort (); +} + +bool x = false; + +A +A::operator+(int i) +{ + A a; + a = *this; + a.data2_ = i; + return a; +} + +A +operator+(int i, const A& x) +{ + A a; + a = x; + a.data1_ = i; + return a; +} diff --git a/gcc/testsuite/g++.dg/opt/nrv11.C b/gcc/testsuite/g++.dg/opt/nrv11.C new file mode 100644 index 000000000..2b72f790b --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv11.C @@ -0,0 +1,58 @@ +// PR middle-end/25977 +// Bug: We were assuming that the return slot of the current function is +// always safe to use as the return slot for another call, because its +// address cannot escape. But its address can escape if we perform the +// named return value optimization. + +// { dg-do run } + +struct A +{ + A( int left, int top, int width, int height ) + : x1(left), y1(top), x2(left+width-1), y2(top+height-1) {} + + //A(const A& o) : x1(o.x1), y1(o.y1), x2(o.x2), y2(o.y2) {} + //A& operator=(const A& o ) { x1=o.x1; y1=o.y1; x2=o.x2; y2=o.y2; return *this; } + + A operator&(const A &r) const + { + A tmp(0, 0, -1, -1); + tmp.x1 = ((r.x1) < (x1) ? (x1) : (r.x1)); + tmp.x2 = ((x2) < (r.x2) ? (x2) : (r.x2)); + tmp.y1 = ((r.y1) < (y1) ? (y1) : (r.y1)); + tmp.y2 = ((y2) < (r.y2) ? (y2) : (r.y2)); + return tmp; + } + + int x1; + int y1; + int x2; + int y2; +}; + +bool operator==( const A &r1, const A &r2 ) +{ + return r1.x1==r2.x1 && r1.x2==r2.x2 && r1.y1==r2.y1 && r1.y2==r2.y2; +} + +static A test() +{ + A all = A( 0, 0, 1024, 768); + A a = all; + A r = all; + a = a & r; + return a; +} + +extern "C" void abort(void); + +int main( int argc, char ** argv ) +{ + A all = A( 0, 0, 1024, 768); + A a = test(); + + if ( ! ( a == all)) + abort(); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/nrv12.C b/gcc/testsuite/g++.dg/opt/nrv12.C new file mode 100644 index 000000000..944dddd7b --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv12.C @@ -0,0 +1,25 @@ +/* Verify that gimple-level NRV is occurring even for RESULT_DECLs. *./ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-O -fdump-tree-optimized" } */ +/* { dg-require-effective-target ilp32 } */ + +struct P +{ + long long l; + int a; + unsigned int b; + P(long long x) : l(x) {} +}; + +P foo (P); +P bar (P); + +P foo (P x) +{ + P y = P (-1LL); + y = bar (x); + return y; +} + +/* { dg-final { scan-tree-dump-times "return slot optimization" 1 "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/opt/nrv13.C b/gcc/testsuite/g++.dg/opt/nrv13.C new file mode 100644 index 000000000..bb49a3a6e --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv13.C @@ -0,0 +1,42 @@ +// PR tree-optimization/32353 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort (); + +struct A +{ + int f; + A (int x) : f (x) {} +}; + +A +foo (const A &x, const A &y) +{ + A r (0); + r = x.f == -111 ? y : (y.f == -111 || x.f > y.f) ? x : y; + A s (0); + r = r.f == -111 ? s : (r.f > s.f) ? r : s; + return r; +} + +int +main () +{ + if (foo (A (0), A (1)).f != 1) + abort (); + if (foo (A (1), A (9)).f != 9) + abort (); + if (foo (A (9), A (1)).f != 9) + abort (); + if (foo (A (-4), A (-5)).f != 0) + abort (); + if (foo (A (-111), A (-111)).f != 0) + abort (); + if (foo (A (2), A (-111)).f != 2) + abort (); + if (foo (A (-111), A (6)).f != 6) + abort (); + if (foo (A (-111), A (-4)).f != 0) + abort (); +} diff --git a/gcc/testsuite/g++.dg/opt/nrv14.C b/gcc/testsuite/g++.dg/opt/nrv14.C new file mode 100644 index 000000000..22526d6b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv14.C @@ -0,0 +1,39 @@ +// PR c++/32992 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort (void); + +struct A +{ + long int a1; + long int a2; + long int a3; +}; + +struct B +{ + long int f[3]; + operator A () + { + union + { + long int t[3]; + A a; + }; + for (int i = 0; i < 3; i++) + t[i] = f[i]; + return a; + } +}; + +int +main () +{ + B b = { {1, 3, 5} }; + A a = b; + + if (a.a1 != b.f[0] || a.a2 != b.f[1] || a.a3 != b.f[2]) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/nrv15.C b/gcc/testsuite/g++.dg/opt/nrv15.C new file mode 100644 index 000000000..23511b284 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv15.C @@ -0,0 +1,97 @@ +// PR debug/39086 +// { dg-options "-g -O -fno-tree-sra" } + +struct A { int v; }; + +A ax; + +struct B +{ + static A f1 () { return ax; } + static bool f2 (); + static A f3 (); +}; + +struct C +{ + A f4 () + { + A x; + if (__builtin_expect (this->f6 () < this->f12 (), true)) + x = B::f1 (); + else + x = this->f7 (); + return x; + } + A f5 () + { + A y; + if (this->f6 () < this->f12 ()) + y = B::f1 (); + else + y = this->f7 (); + return y; + } + void *f6 () const; + void *f12 () const; + virtual A f7 (); +}; + +C *dx; + +struct D +{ + C *f8 () const; +}; + +class E : virtual public D +{ + void f11 (); + void f9 (); + void f10 (); +}; + +struct G +{ + explicit G (); + operator bool () const; +}; + +void +E::f11 (void) +{ + A d = B::f3 (); + d = this->f8 ()->f4 (); +} + +void +E::f9 () +{ + G c; + if (c) + { + const A e = B::f3 (); + C * f = this->f8 (); + A d = f->f5 (); + if (B::f2 ()) + ; + else if (B::f2 ()) + f->f4 (); + } +} + +void +E::f10 () +{ + G c; + if (c) + { + const A e = B::f3 (); + C * f = this->f8 (); + A d = f->f5 (); + if (B::f2 ()) + ; + else if (B::f2 ()) + f->f4 (); + } +} diff --git a/gcc/testsuite/g++.dg/opt/nrv16.C b/gcc/testsuite/g++.dg/opt/nrv16.C new file mode 100644 index 000000000..7b24d4a4e --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv16.C @@ -0,0 +1,16 @@ +// PR c++/44808 +// { dg-do compile } + +struct S +{ + void *a, *b; + int c; +}; + +S +foo () +{ + S x; + S y = x; + return x; +} diff --git a/gcc/testsuite/g++.dg/opt/nrv17.C b/gcc/testsuite/g++.dg/opt/nrv17.C new file mode 100644 index 000000000..6248bca03 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv17.C @@ -0,0 +1,32 @@ +// { dg-do run } + +#include <cstdlib> +#include <complex> + +void __attribute__((noinline)) +h(std::complex<double> x) +{ + if (x.real() != 2.0) + std::abort (); +} + +void __attribute__((noinline)) +g(std::complex<double> x) +{ + if (x.real() != 0.5) + std::abort (); +} + +void __attribute__((noinline)) +f(std::complex<double> x) +{ + h (x); + x = 1.0 / x; + g (x); +} + +int main() +{ + f(2.0); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/nrv2.C b/gcc/testsuite/g++.dg/opt/nrv2.C new file mode 100644 index 000000000..4ffc07587 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv2.C @@ -0,0 +1,28 @@ +// Test for the named return value optimization, this time with inlining. +// { dg-do run } +// { dg-options -O2 } + +int c; +int d; + +struct A +{ + A() { ++c; } + A(const A&) { ++c; }; + ~A() { ++d; } +}; + +inline A f () +{ + A a; + return a; +} + +int main () +{ + { + A a = f (); + } + + return !(c == 1 && c == d); +} diff --git a/gcc/testsuite/g++.dg/opt/nrv3.C b/gcc/testsuite/g++.dg/opt/nrv3.C new file mode 100644 index 000000000..2ec597744 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv3.C @@ -0,0 +1,24 @@ +// PR optimization/6189 +// Bug: we forgot about foo's nrv after writing it out. +// { dg-options -O3 } +// { dg-do run } + +struct A +{ + int i; +}; + + +A foo () +{ + A a; + a.i = 42; + return a; +} + + +int main() +{ + A b = foo(); + return b.i != 42; +} diff --git a/gcc/testsuite/g++.dg/opt/nrv4.C b/gcc/testsuite/g++.dg/opt/nrv4.C new file mode 100644 index 000000000..531647d67 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv4.C @@ -0,0 +1,23 @@ +// PR optimization/7145 +// Bug: The NRV optimization caused us to lose the initializer for 'ret'. +// { dg-options -O } +// { dg-do run } + +struct GdkColor { + long pixel; + short red; + short green; + short blue; +}; + +inline GdkColor mkcolor() { + GdkColor ret={0,1,2,3}; + return ret; +} + +int +main() +{ + GdkColor col=mkcolor(); + return (col.pixel != 0 || col.red != 1 || col.green != 2 || col.blue != 3); +} diff --git a/gcc/testsuite/g++.dg/opt/nrv5.C b/gcc/testsuite/g++.dg/opt/nrv5.C new file mode 100644 index 000000000..7c3c0591f --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv5.C @@ -0,0 +1,57 @@ +// PR c++/7279 +// Test for the named return value optimization with inlining. +// Contributed by Jakub Jelinek <jakub@redhat.com>. +// { dg-do run } +// { dg-options -O2 } + +enum E { E0, E1, E2, E3 }; + +struct S +{ + E s0 : 2; + bool s1 : 1, s2 : 1, s3 : 1, s4 : 1, s5 : 1, s6 : 1; + S (); + void foo (E x); +}; + +S::S() : s1 (true), s2 (false), s0 (E1), s3 (true), s4 (false), + s5 (true), s6 (false) {} +void S::foo (E x) { this->s0 = x; } + +inline S foo () +{ + S s; + s.foo (E0); + return s; +} + +inline S bar () +{ + S s; + s.foo (E2); + return s; +} + +void check (S &s, bool isfoo); + +void test (bool isfoo) +{ + S a = isfoo ? foo () : bar (); + check (a, isfoo); +} + +extern "C" void abort (); + +void check (S &s, bool isfoo) +{ + if (! s.s1 || s.s2 || ! s.s3 || s.s4 || ! s.s5 || s.s6) + abort (); + if (s.s0 != (isfoo ? E0 : E2)) + abort (); +} + +int main () +{ + test (true); + test (false); +} diff --git a/gcc/testsuite/g++.dg/opt/nrv6.C b/gcc/testsuite/g++.dg/opt/nrv6.C new file mode 100644 index 000000000..57ff12e41 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv6.C @@ -0,0 +1,26 @@ +// PR c++/9993 +// Bug: We were failing to destroy b. + +// { dg-do run } + +int c, d; + +struct Object { + Object() { ++c; } + Object(const Object&) { ++c; } + ~Object() { ++d; } +}; + +Object function() { + int i = 0; + do { + Object b; + if (i++ == 2) + return b; + } while (1); +} + +int main() { + function(); + return c != d; +} diff --git a/gcc/testsuite/g++.dg/opt/nrv7.C b/gcc/testsuite/g++.dg/opt/nrv7.C new file mode 100644 index 000000000..c5034ecc0 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv7.C @@ -0,0 +1,13 @@ +// PR c++/15461 + +struct A { + int i; +}; + +inline A foo () { + int j = 1; + A a = { j }; + return a; +} + +A tv = foo(); diff --git a/gcc/testsuite/g++.dg/opt/nrv8.C b/gcc/testsuite/g++.dg/opt/nrv8.C new file mode 100644 index 000000000..19999a188 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv8.C @@ -0,0 +1,31 @@ +// PR optimization/19531 +// forbids NRV on volatile return value. +// { dg-options -O2 } +// { dg-do run } + +extern "C" { void abort(); } + +struct A +{ + int d; + + A () { d = 123; } + A (const A & o) { d = o.d; } + A (volatile const A & o) { d = o.d + 2; } +}; + +A bar() +{ + volatile A l; + return l; +} + +main() +{ + A a = bar (); + + if (a.d != 125) + abort(); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/nrv9.C b/gcc/testsuite/g++.dg/opt/nrv9.C new file mode 100644 index 000000000..462506867 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/nrv9.C @@ -0,0 +1,28 @@ +// PR c++/19317 +// If we do both NRV and caller-side return slot opt for ga = f() +// constructing la sets ga.i to 0 too soon. + +extern "C" void abort(); + +struct A +{ + int i; + int pad[32]; // force return in memory + A(): i(0) {} + A(int ia): i(ia) {} +}; + +A ga(42); + +A f() +{ + A la; + if (ga.i != 42) + abort(); + return la; +} + +int main() +{ + ga = f (); +} diff --git a/gcc/testsuite/g++.dg/opt/operator1.C b/gcc/testsuite/g++.dg/opt/operator1.C new file mode 100644 index 000000000..9f286b9f9 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/operator1.C @@ -0,0 +1,10 @@ +// Tests whether g++ can handle large number of operators +// { dg-do compile } + +#define OP0(n) struct I##n { int i; }; operator I##n (); +#define OP1(n) OP0(n) +#define OP2(n) OP1(n##0) OP1(n##1) OP1(n##2) OP1(n##3) OP1(n##4) +#define OP3(n) OP2(n##0) OP2(n##1) OP2(n##2) OP2(n##3) OP2(n##4) +struct S { + OP3(0) OP3(1) OP3(2) OP3(3) OP3(4) OP3(5) +}; diff --git a/gcc/testsuite/g++.dg/opt/placeholder1.C b/gcc/testsuite/g++.dg/opt/placeholder1.C new file mode 100644 index 000000000..a1c984263 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/placeholder1.C @@ -0,0 +1,10 @@ +// PR rtl-optimization/15159 +// { dg-options "-O2" } +struct S { S (); }; +struct P { P (S *); }; +void foo (const P &); +void bar () +{ + P p = new S; + foo (p); +} diff --git a/gcc/testsuite/g++.dg/opt/pmf1.C b/gcc/testsuite/g++.dg/opt/pmf1.C new file mode 100644 index 000000000..428e7530b --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pmf1.C @@ -0,0 +1,76 @@ +// PR c++/37016 +// { dg-do run } +// { dg-options "-O2 -Wall" } + +/* + Basic design concept is that WorldObject implements remote method call + functionality using the "curiously recurring template pattern" to enable + forwarding calls from the generic base class that implements the transport + layer to the derived class. + + The specific failure was in forwarding calls to items in a container. + This is emulated here by wrapping a single item. + + In the main program there are two forms of the call. In the last + (uncommented) form the member function pointer is for clarity + assigned to a variable (itemfunptr) before making the call. + With 4.3.0 and 4.3.1 this code compiles incorrectly with -O1 or greater + to produce this warning + + reproduce.cc: In function ‘int main()’: + reproduce.cc:26: warning: ‘itemfunptr.void (Container::*)(void +(Item::*)(int), int)::__pfn’ is used uninitialized in this function + reproduce.cc:47: note: ‘itemfunptr.void (Container::*)(void (Item::*)(int), +int)::__pfn’ was declared here + + and the resulting executable segvs. It works correctly with -O0. + + With 4.2.3 and earlier it works correctly with optimization. + + In the first (commented out) form of the call in the main program + we directly refer to desired member function. This compiles + and executes correctly with all tested versions. +*/ + +extern "C" int printf (const char *, ...); + +template <class Derived> +struct WorldObject { + template <typename memfunT, typename arg1T, typename arg2T> + void forward(memfunT memfun, arg1T arg1, arg2T arg2) { + Derived* obj = static_cast<Derived*>(this); + (obj->*memfun)(arg1, arg2); + } +}; + +struct Item { + void fred(int a) { + printf ("a=%d\n", a); + } +}; + +struct Container : public WorldObject<Container> { + Item item; + template <typename itemfunT, typename arg1T> + void itemfun(itemfunT itemfun, int a) { + (item.*itemfun)(a); + } +}; + +int main() { + typedef void (Item::*itemfun)(int); + + Container t; + + // This call compiles and executes correctly with all versions tested + //t.forward(&Container::itemfun<itemfun,int>, &Item::fred, 1); + + // This call compiles with a warning and segvs on execution if using + // -O1 or greater with 4.3.*. 4.2.* is correct. + void (Container::*itemfunptr)(itemfun, int) = +&Container::itemfun<itemfun,int>; + t.forward(itemfunptr, &Item::fred, 1); + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/opt/pr13066-1.C b/gcc/testsuite/g++.dg/opt/pr13066-1.C new file mode 100644 index 000000000..67f853456 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr13066-1.C @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +class nsIURI; + +struct nsCOMPtr +{ + operator nsIURI*() const + { + return mRawPtr; + } + + nsIURI *mRawPtr; +}; + +void func() +{ + nsCOMPtr u1; + if (!u1 == !u1) + return; +} + diff --git a/gcc/testsuite/g++.dg/opt/pr14029.C b/gcc/testsuite/g++.dg/opt/pr14029.C new file mode 100644 index 000000000..1673edfd6 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr14029.C @@ -0,0 +1,41 @@ +// { dg-do run } +// { dg-options "-O2" } +// We used to mis-compile this testcase as we did not know that +// &a+offsetof(b,a) was the same as &a.b + +struct Iterator { + int * ptr; + + Iterator(int * i) : ptr(i) { } + void operator++() { ++ptr; } + int *const & base() const { return ptr; } +}; + + +Iterator find_7(Iterator first, Iterator last) +{ + int trip_count = (last.base() - first.base()) >> 1; + + for ( ; trip_count > 0 ; --trip_count) { + if (*first.ptr == 7) return first; + ++first; + + if (*first.ptr == 7) return first; + ++first; + } + + switch(last.base() - first.base()) { + case 1: + if (*first.ptr == 7) return first; + ++first; + case 0: + default: + return last; + } +} + +int main() { + int as[5] = {4,4,4,4,7}; + return (find_7(Iterator(&as[0]), Iterator(&as[5])).ptr == &as[5]); +}; + diff --git a/gcc/testsuite/g++.dg/opt/pr14888.C b/gcc/testsuite/g++.dg/opt/pr14888.C new file mode 100644 index 000000000..e5c56aaab --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr14888.C @@ -0,0 +1,22 @@ +// PR target/14888 +// This used to ICE because the truncdfsf2 isn't completely eliminated + +// { dg-do compile } +// { dg-options "-O2 -ffast-math" } + +class xcomplex +{ +public: + float re, im; + + xcomplex &operator*= (const float &fact) + { re*=fact; im*=fact; return *this; } +}; + +void foo (xcomplex &almT, xcomplex &almG) +{ + double gb; + almT*=gb; + almG*=gb*42; +} + diff --git a/gcc/testsuite/g++.dg/opt/pr15054-2.C b/gcc/testsuite/g++.dg/opt/pr15054-2.C new file mode 100644 index 000000000..156e945d0 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr15054-2.C @@ -0,0 +1,39 @@ +// PR middle-end/15054 + +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort (void); + +void +__attribute__((noinline)) +check (long x, long y) +{ + if (x != y) + abort (); +} + +struct A +{ + A() : a(2) { check (a, 2); } + ~A() { check (a, 2); } +private: + long a; +}; + +class B { + long b; + B& operator =(const B& ); +public: + B (long p) : b(p) { check (b, 6); } + B (const B& p) : b(p.b) { check (b, 6); } + ~B () { check (b, 6); A obj; check (b, 6); } + B foo() { return B(*this); } +}; + +int main () +{ + B o(6); + o.foo().foo(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/pr15054.C b/gcc/testsuite/g++.dg/opt/pr15054.C new file mode 100644 index 000000000..cfc48cf24 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr15054.C @@ -0,0 +1,36 @@ +// PR middle-end/15054 +// This used to abort due to overlapping stack temporaries. + +// { dg-do run } +// { dg-options "-O" } + +extern "C" void abort (void); + +struct pointer +{ + void* ptr; + + pointer(void* x = 0) : ptr(x) {} + pointer(const pointer& x) : ptr(x.ptr) {} +}; + +struct element +{ + int canary; + + element() : canary(123) { } + ~element() { pointer(); if (canary != 123) abort (); } +}; + +inline pointer +insert(const element& x) +{ + return pointer(new element(x)); +} + +int +main (void) +{ + insert(element()); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/pr15551.C b/gcc/testsuite/g++.dg/opt/pr15551.C new file mode 100644 index 000000000..dc3ddc446 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr15551.C @@ -0,0 +1,26 @@ +// PR target/15551 +// This used to crash on pentium4-pc-cygwin due to an alloca problem. +// Testcase submitted by Hans Horn to mingw bug tracker +// +// { dg-do run } +// { dg-options "-O3" } + +#include <cstring> +#include <fstream> +#include <cstdio> +using namespace std; + +ostream* logfile; + +int main () { + + logfile = new ofstream("bar", ios::out); + + char expList[20000]; + strcpy(expList, "foo"); + + delete logfile; + remove ("bar"); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/pr16372-1.C b/gcc/testsuite/g++.dg/opt/pr16372-1.C new file mode 100644 index 000000000..b797e4ad2 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr16372-1.C @@ -0,0 +1,17 @@ +// PR tree-optimization/16372 +// { dg-do run } +// { dg-options "-O1" } + +extern "C" void abort(); + +enum number {ZERO, ONE, TWO, THREE, FOUR, FIVE}; + +int main() { + number n = FIVE; + + if((n == ONE) || (n == TWO) || (n == THREE)) { + abort (); + } + return 0; +} + diff --git a/gcc/testsuite/g++.dg/opt/pr16693-1.C b/gcc/testsuite/g++.dg/opt/pr16693-1.C new file mode 100644 index 000000000..6b716116d --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr16693-1.C @@ -0,0 +1,25 @@ +// PR middle-end/16693 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort(); + +unsigned short ret6666(int) { + return 0x66; +} + +typedef enum { + a = 0x0, b = 0x1, c = 0x2, d = 0x3, e = 0x4, f = 0x5, + g = 0x6, h = 0x7, i = 0x8, j = 0x9, k = 0xa, l = 0xb, + m = 0xc, n = 0xd, o = 0xe, p = 0xf +} Test_Enum; + +int main(void) { + unsigned char r1; + r1 = static_cast<Test_Enum>(0xf & ret6666(44)); + + if(r1 != 0x6) + abort(); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/opt/pr16693-2.C b/gcc/testsuite/g++.dg/opt/pr16693-2.C new file mode 100644 index 000000000..cb60df642 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr16693-2.C @@ -0,0 +1,21 @@ +// PR middle-end/16693 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort(); + +char foo() +{ + return 0x10; +} + +enum E { e = 0x0f }; + +int main() +{ + char c = (char)(E)(e & foo()); + if (c != 0) + abort(); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/opt/pr17411-1.C b/gcc/testsuite/g++.dg/opt/pr17411-1.C new file mode 100644 index 000000000..62b57a5a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17411-1.C @@ -0,0 +1,21 @@ +// PR middle-end/17411 +// { dg-do compile } +// { dg-options "-O2" } + +struct CalibData { + float mean_pedestal; +}; + +struct pair +{ + CalibData second; + pair(const CalibData& __b) : second(__b) { } +}; + +void insert(const pair& __x); + +void foo() +{ + insert(pair(CalibData())); +} + diff --git a/gcc/testsuite/g++.dg/opt/pr17624.C b/gcc/testsuite/g++.dg/opt/pr17624.C new file mode 100644 index 000000000..07fbf14da --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17624.C @@ -0,0 +1,23 @@ +// { dg-do compile } +// { dg-options "-O2" } + +extern void foo (void); +int c; +void foo (int n) +{ + int j = 0; + try + { + for(;;) + { + foo (); + if (j ++ == n) + break; + foo (); + } + } + catch (...) + { + c = j; + } +} diff --git a/gcc/testsuite/g++.dg/opt/pr17697-1.C b/gcc/testsuite/g++.dg/opt/pr17697-1.C new file mode 100644 index 000000000..50a75b845 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17697-1.C @@ -0,0 +1,32 @@ +// PR tree-optimization/17697 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" +{ + extern int strcmp (const char *s, const char *t) throw () + __attribute__ ((pure)); +} + +namespace A +{ + extern int strcmp (const char *s, const char *t); +} + +inline int +A::strcmp (const char *s, const char *t) +{ + return ::strcmp (s, t); +} + +int +foo (const char *x) throw () +{ + return A::strcmp ("", x); +} + +int +main () +{ + return foo ("") != 0 || foo ("a") == 0; +} diff --git a/gcc/testsuite/g++.dg/opt/pr17697-2.C b/gcc/testsuite/g++.dg/opt/pr17697-2.C new file mode 100644 index 000000000..4a746be3d --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17697-2.C @@ -0,0 +1,32 @@ +// PR tree-optimization/17697 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" +{ + extern int strcmp (const char *s, const char *t) throw () + __attribute__ ((pure)); +} + +namespace A +{ + extern int strcmp (const char *s, const char *t) throw (); +} + +inline int +A::strcmp (const char *s, const char *t) throw () +{ + return ::strcmp (s, t); +} + +int +foo (const char *x) throw () +{ + return A::strcmp ("", x); +} + +int +main () +{ + return foo ("") != 0 || foo ("a") == 0; +} diff --git a/gcc/testsuite/g++.dg/opt/pr17697-3.C b/gcc/testsuite/g++.dg/opt/pr17697-3.C new file mode 100644 index 000000000..630441c25 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17697-3.C @@ -0,0 +1,28 @@ +// PR tree-optimization/17697 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" int strcmp (const char *s, const char *t); + +namespace A +{ + extern int strcmp (const char *s, const char *t); +} + +inline int +A::strcmp (const char *s, const char *t) +{ + return ::strcmp (s, t); +} + +int +foo (const char *x) +{ + return A::strcmp ("", x); +} + +int +main () +{ + return foo ("") != 0 || foo ("a") == 0; +} diff --git a/gcc/testsuite/g++.dg/opt/pr17724-1.C b/gcc/testsuite/g++.dg/opt/pr17724-1.C new file mode 100644 index 000000000..79de663b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17724-1.C @@ -0,0 +1,23 @@ +// PR tree-optimization/17724 +// { dg-do compile } +// { dg-options "-O2" } + +namespace N { char *strcpy (char *, const char *); } +extern "C" char *strcpy (char *, const char *) throw (); +inline char *N::strcpy (char *s, const char *t) { return ::strcpy (s, t); } + +struct S { ~S (); }; +int foo (); + +int +main () +{ + S s; + int a; + char b[64]; + N::strcpy (b, "ABCDEFGHIJKLM"); + while ((a = foo ()) != -1) + if (a) + return -1; + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/pr17724-2.C b/gcc/testsuite/g++.dg/opt/pr17724-2.C new file mode 100644 index 000000000..c9c7f2a40 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17724-2.C @@ -0,0 +1,23 @@ +// PR tree-optimization/17724 +// { dg-do compile } +// { dg-options "-O2" } + +namespace N { char *strcpy (char *, const char *); } +extern "C" char *strcpy (char *, const char *); +inline char *N::strcpy (char *s, const char *t) { return ::strcpy (s, t); } + +struct S { ~S (); }; +int foo (); + +int +main () +{ + S s; + int a; + char b[64]; + N::strcpy (b, "ABCDEFGHIJKLM"); + while ((a = foo ()) != -1) + if (a) + return -1; + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/pr17724-3.C b/gcc/testsuite/g++.dg/opt/pr17724-3.C new file mode 100644 index 000000000..212ab4770 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17724-3.C @@ -0,0 +1,24 @@ +// PR tree-optimization/17724 +// { dg-do compile } +// { dg-options "-O2" } + +extern "C" char *strcpy (char* d, const char* s) throw (); + +class A { public: A (); ~A (); }; + +inline char * B (char *s, const char *t) +{ return ::strcpy (s, t); } + +class C { int D (void); int E; }; + +int C::D (void) +{ + A a; + try + { + char z[22]; + if (this->E) B (z, ""); + return 0; + } + catch (int &f) { return -1; } +} diff --git a/gcc/testsuite/g++.dg/opt/pr17724-4.C b/gcc/testsuite/g++.dg/opt/pr17724-4.C new file mode 100644 index 000000000..7828a25e7 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17724-4.C @@ -0,0 +1,24 @@ +// PR tree-optimization/17724 +// { dg-do compile } +// { dg-options "-O2" } + +extern "C" char *strcpy (char* d, const char* s); + +class A { public: A (); ~A (); }; + +inline char * B (char *s, const char *t) +{ return ::strcpy (s, t); } + +class C { int D (void); int E; }; + +int C::D (void) +{ + A a; + try + { + char z[22]; + if (this->E) B (z, ""); + return 0; + } + catch (int &f) { return -1; } +} diff --git a/gcc/testsuite/g++.dg/opt/pr17724-5.C b/gcc/testsuite/g++.dg/opt/pr17724-5.C new file mode 100644 index 000000000..5ce303856 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17724-5.C @@ -0,0 +1,24 @@ +// PR tree-optimization/17724 +// { dg-do compile } +// { dg-options "-O2" } + +extern char *strcpy (char* d, const char* s) throw (); + +class A { public: A (); ~A (); }; + +inline char * B (char *s, const char *t) +{ return ::strcpy (s, t); } + +class C { int D (void); int E; }; + +int C::D (void) +{ + A a; + try + { + char z[22]; + if (this->E) B (z, ""); + return 0; + } + catch (int &f) { return -1; } +} diff --git a/gcc/testsuite/g++.dg/opt/pr17724-6.C b/gcc/testsuite/g++.dg/opt/pr17724-6.C new file mode 100644 index 000000000..f95c4d0ef --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17724-6.C @@ -0,0 +1,24 @@ +// PR tree-optimization/17724 +// { dg-do compile } +// { dg-options "-O2" } + +extern char *strcpy (char* d, const char* s); + +class A { public: A (); ~A (); }; + +inline char * B (char *s, const char *t) +{ return ::strcpy (s, t); } + +class C { int D (void); int E; }; + +int C::D (void) +{ + A a; + try + { + char z[22]; + if (this->E) B (z, ""); + return 0; + } + catch (int &f) { return -1; } +} diff --git a/gcc/testsuite/g++.dg/opt/pr17902.C b/gcc/testsuite/g++.dg/opt/pr17902.C new file mode 100644 index 000000000..fc5b6541f --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr17902.C @@ -0,0 +1,26 @@ +/* { dg-options "-O3" } */ +/* { dg-do compile } */ + +void foo(); +struct A { ~A(){ foo(); } }; +struct B { A a; }; +void bar() +{ + A a; + bool b = false; + int i, j; + + + for (j=0; j<i; j++) + { + if (i) b=true; + if (j && i) foo(); + if (j && i) i++; + } + + + for (j=0; j<i; j++) + if ( !j || (j==1 && b && i) ) + B x; +} + diff --git a/gcc/testsuite/g++.dg/opt/pr18084-1.C b/gcc/testsuite/g++.dg/opt/pr18084-1.C new file mode 100644 index 000000000..bf62a7b70 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr18084-1.C @@ -0,0 +1,32 @@ +// { dg-do run } +// { dg-options "-O3" } + +extern "C" void abort (void); + +struct X { + bool init; + void foo() { if (!init) init = true; } + void bar() { foo(); } + +}; + +typedef unsigned long long int uint64_t; +uint64_t mask1, mask2; + +uint64_t calc() { + return mask1 & mask2; +} + +int main() +{ + mask1 = 0x00000000FFFFFFFFull; + mask2 = 0x000000000000FFFFull; + uint64_t value = calc(); + + X().bar(); + + if(value != calc()) + abort (); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/opt/pr18683-1.C b/gcc/testsuite/g++.dg/opt/pr18683-1.C new file mode 100644 index 000000000..847a4d3c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr18683-1.C @@ -0,0 +1,29 @@ +// PR middle-end/18683 +// { dg-do compile } +// { dg-options "-O0" } + +template<typename _CharT> +struct basic_ostream +{ + basic_ostream& operator<<(int __n); +}; + +extern basic_ostream<char> cout; + +template<int> struct linear_congruential +{ + template<class CharT> + friend basic_ostream<CharT>& + operator<<(basic_ostream<CharT>& os, + const linear_congruential& lcg) + { + return os << 1; + } +}; + +void instantiate_all() +{ + linear_congruential<0> lcf; + cout << lcf; +} + diff --git a/gcc/testsuite/g++.dg/opt/pr18968.C b/gcc/testsuite/g++.dg/opt/pr18968.C new file mode 100644 index 000000000..cce73b579 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr18968.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// { dg-options "-O1" } +struct X +{ + int i; +}; +struct Y : virtual X {}; +struct Z : Y {}; +struct A +{ + Z* p; + A(); +}; +A::A() : p(0) +{ + ((X*)(Y*)p)->i++; +} + diff --git a/gcc/testsuite/g++.dg/opt/pr19108.C b/gcc/testsuite/g++.dg/opt/pr19108.C new file mode 100644 index 000000000..206a2bc38 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr19108.C @@ -0,0 +1,19 @@ +// PR tree-optimization/19108 +// This used to abort due to not handing RANGE_EXPR in SRA. + +// { dg-do compile } +// { dg-options "-O" } + +struct A +{ + int i[6]; + A () : i() {} +}; + +struct B +{ + A a; + B(const A& x) : a(x) {} +}; + +B b=A(); diff --git a/gcc/testsuite/g++.dg/opt/pr19317-1.C b/gcc/testsuite/g++.dg/opt/pr19317-1.C new file mode 100644 index 000000000..ffb646a90 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr19317-1.C @@ -0,0 +1,39 @@ +// PR c++/19317 +// { dg-options "-O2" } +// { dg-do run } +// Origin: Dirk Mueller <mueller@kde.org> + +extern "C" void abort (void); + +struct A +{ + A () { d = e = 0; f = -1; } + A (int x) : d (0), e (0), f (x) { } + A b (const A &r) const; + int d; + int e; + int f; +}; + +A +A::b (const A & r) const +{ + A t; + t.f = f < r.f ? f : r.f; + return t; +} + +int +main () +{ + A a (100); + a = a.b (A (10)); + if (a.f != 10) + abort (); + + A c (10); + A d (100); + c = d.b (c); + if (c.f != 10) + abort (); +} diff --git a/gcc/testsuite/g++.dg/opt/pr19317-2.C b/gcc/testsuite/g++.dg/opt/pr19317-2.C new file mode 100644 index 000000000..70c642b21 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr19317-2.C @@ -0,0 +1,32 @@ +// PR c++/19317 +// { dg-options "-O2" } +// { dg-do run } + +extern "C" void abort (void); + +struct A +{ + A () { d = e = 0; f = -1; } + A (int x) : d (0), e (0), f (x) { } + A b () const; + int d; + int e; + int f; +}; + +A +A::b () const +{ + A t; + t.f = 10 + this->f; + return t; +} + +int +main () +{ + A a (100); + a = a.b (); + if (a.f != 110) + abort (); +} diff --git a/gcc/testsuite/g++.dg/opt/pr19317-3.C b/gcc/testsuite/g++.dg/opt/pr19317-3.C new file mode 100644 index 000000000..b2b2bb0e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr19317-3.C @@ -0,0 +1,37 @@ +// PR c++/19317 +// { dg-options "-O2" } +// { dg-do run } + +extern "C" void abort (void); + +struct A { int c; int d; int e; int f; }; + +A +foo (const A *x, const A *r) +{ + A t; + t.c = -1; + t.c += x->c < r->c ? x->c : r->c; + t.d = 0; + t.e = 0; + t.f = 0; + return t; +} + +int +main () +{ + A a; + a.c = 10; + a.d = 0; + a.e = 0; + a.f = 0; + A b; + b.c = 100; + b.d = 0; + b.e = 0; + b.f = 0; + a = foo (&b, &a); + if (a.c != 9) + abort (); +} diff --git a/gcc/testsuite/g++.dg/opt/pr19650.C b/gcc/testsuite/g++.dg/opt/pr19650.C new file mode 100644 index 000000000..1f495cb7d --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr19650.C @@ -0,0 +1,71 @@ +// { dg-options "-O1 -w -fpermissive" } +// { dg-do run } +// Tests the fold bug described in PR 19650. +#include <stdio.h> +#include <stdlib.h> +#define test(a) ((a) ? 1 : 0) + +typedef int (*arg_cmp_func)(); + +class Item_func +{ +public: + enum Functype { UNKNOWN_FUNC, EQ_FUNC, EQUAL_FUNC }; + virtual enum Functype functype() const { return UNKNOWN_FUNC; } +}; + +class Item_bool_func2 : public Item_func +{ +public: + virtual enum Functype functype() const { return EQUAL_FUNC; } +}; + +class Arg_comparator +{ +public: + Item_bool_func2 *owner; + arg_cmp_func func; + static arg_cmp_func comparator_matrix[4][2]; + + int Arg_comparator::set_compare_func(Item_bool_func2 *item, int type) + { + owner = item; + + /****************** problematic line is here ************************/ + + func = comparator_matrix[type][test(owner->functype() == Item_func::EQUAL_FUNC)]; + return 0; + } +}; + +int compare_string() { return 0; } +int compare_e_string() { return 0; } +int compare_real() { return 0; } +int compare_e_real() { return 0; } +int compare_int_signed() { return 0; } +int compare_e_int() { return 0; } +int compare_row() { return 0; } +int compare_e_row() { return 0; } + +arg_cmp_func Arg_comparator::comparator_matrix[4][2] = + {{&compare_string, &compare_e_string}, + {&compare_real, &compare_e_real}, + {&compare_int_signed, &compare_e_int}, + {&compare_row, &compare_e_row}}; + +void myfunc (const char*p, arg_cmp_func f1, arg_cmp_func f2) __attribute__((noinline)); +void myfunc (const char*p, arg_cmp_func f1, arg_cmp_func f2) +{ + if (f1!=f2) + abort (); +} + +int main() +{ + Arg_comparator cmp; + Item_bool_func2 equal_func; + + cmp.set_compare_func(&equal_func, 0); + myfunc("cmp.func is %p (expected %p)\n", cmp.func, &compare_e_string); +} + diff --git a/gcc/testsuite/g++.dg/opt/pr19768.C b/gcc/testsuite/g++.dg/opt/pr19768.C new file mode 100644 index 000000000..376ca9938 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr19768.C @@ -0,0 +1,29 @@ +// PR tree-opt/19768 +// tree DSE was removing one store to LL.currentLevel +// but forgot that since the vop was in an abnormal PHI +// that we have to update the SSA_NAME which we propagate +// into the abnormal PHI + +// { dg-do compile } +// { dg-options "-O" } + +struct LeveLogger +{ + int currentLevel; +}; +extern LeveLogger LL; +struct gg +{ + ~gg ( void ) + { LL.currentLevel = 1; } +}; +void f(void); +void g ( void ) +{ + gg sll; + { + gg sll; + f(); + } + f(); +} diff --git a/gcc/testsuite/g++.dg/opt/pr20931.C b/gcc/testsuite/g++.dg/opt/pr20931.C new file mode 100644 index 000000000..01518c06d --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr20931.C @@ -0,0 +1,13 @@ +// PR middle-end +// This testcase ICEd because fold checking saw a type change which +// is allowed as TYPE_CONTAINS_PLACEHOLDER_INTERNAL could change. +// { dg-do compile } +// { dg-options "-O2" } + +int +__finite (double __x) throw () +{ + return (__extension__ + (((((union { double __d; int __i[2]; }) {__d: __x}).__i[1] + | 0x800fffffu) + 1) >> 31)); +} diff --git a/gcc/testsuite/g++.dg/opt/pr20991.C b/gcc/testsuite/g++.dg/opt/pr20991.C new file mode 100644 index 000000000..32b3d05c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr20991.C @@ -0,0 +1,34 @@ +// PR middle-end/20991 +// { dg-options "-O2" } +// { dg-do compile } + +struct S +{ + virtual inline int foo () const; + virtual inline bool bar () const; + virtual int baz (int) const; +}; + +inline int S::foo () const +{ + return 1; +} + +inline bool S::bar () const +{ + return foo () == 0; +} + +void A () +{ + S s; + if (s.bar ()) + s.foo (); +} + +void B () +{ + S s; + if (s.bar ()) + s.foo (); +} diff --git a/gcc/testsuite/g++.dg/opt/pr20995-1.C b/gcc/testsuite/g++.dg/opt/pr20995-1.C new file mode 100644 index 000000000..aa9689639 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr20995-1.C @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +template<int N> void foo() +{ + double d = (N ? 0.0 : 0) + 1; +} + diff --git a/gcc/testsuite/g++.dg/opt/pr22167.C b/gcc/testsuite/g++.dg/opt/pr22167.C new file mode 100644 index 000000000..07af74462 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr22167.C @@ -0,0 +1,32 @@ +// Derived from PR22167, which failed on some RISC targets. The call to +// foo() has two successors, one normal and one exceptional, and both +// successors use &a[0] and x. Expressions involving &a[0] can be hoisted +// before the call but those involving x cannot. +// { dg-options "-Os" } +// { dg-do run } + +int a[4]; + +struct S { + S() : x (0) {} + ~S() { a[0] = x; } + int x; +}; + +void +foo (int *x) +{ + if (*x == 1) + throw 1; + *x = 1; +} + +int +main() +{ + S s; + foo (&s.x); + if (a[0] == s.x) + a[0]++; + return a[0]; +} diff --git a/gcc/testsuite/g++.dg/opt/pr23056.C b/gcc/testsuite/g++.dg/opt/pr23056.C new file mode 100644 index 000000000..b9689ec50 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr23056.C @@ -0,0 +1,9 @@ +// PR c++/23056 +// { dg-do compile } + +template <bool T> struct S { virtual ~S(); }; +void foo () +{ + static_cast<bool>("Foo"); +} +S<true> a; diff --git a/gcc/testsuite/g++.dg/opt/pr23299.C b/gcc/testsuite/g++.dg/opt/pr23299.C new file mode 100644 index 000000000..94a414aa5 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr23299.C @@ -0,0 +1,63 @@ +// PR rtl-optimization/23299 +// { dg-do run } +// { dg-options "-Os" } + +extern "C" void abort (); + +struct A +{ + virtual int a () {} +}; +struct B : public A +{ + virtual int b () {} +}; +struct C : public A +{ + virtual int c () {} +}; +struct D +{ + D () { d = 64; } + ~D (); + int d; +}; + +int x; +D::~D () +{ + x |= 1; + if (d != 64) + abort (); +} + +struct E : public B, public C +{ + E () {} + virtual int c (); + ~E (); + D dv; +}; + +E::~E () +{ + int r = c (); +} + +int +E::c () +{ + if (x > 10) + throw 1; + x |= 2; +} + +int +main (void) +{ + { + E e; + } + if (x != 3) + abort (); +} diff --git a/gcc/testsuite/g++.dg/opt/pr23454-2.C b/gcc/testsuite/g++.dg/opt/pr23454-2.C new file mode 100644 index 000000000..bd5e9e99b --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr23454-2.C @@ -0,0 +1,106 @@ +/* PR rtl-optimization/23454 */ +/* Submitted by Matthias Klose <doko@debian.org> */ + +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +typedef unsigned long long int ulonglong; +typedef long long int longlong; +typedef unsigned int uint32; +typedef unsigned int uint; +typedef unsigned long int ulong; + +class Item { +public: + bool null_value; + virtual longlong val_int()=0; +}; + +typedef struct st_tree_element { + struct st_tree_element *left,*right; + uint32 count; +} TREE_ELEMENT; + +typedef struct st_tree { + uint offset_to_key,elements_in_tree,size_of_element,memory_limit,allocated; + void *custom_arg; + bool with_delete; + uint flag; +} TREE; + +class field_info +{ +public: + ulong treemem, tree_elements, empty, nulls, min_length, max_length; + uint room_in_tree; + bool found; + TREE tree; + Item *item; +}; + +class field_ulonglong: public field_info +{ + ulonglong min_arg, max_arg; + ulonglong sum, sum_sqr; + void add(); +}; + +extern char *longlong10_to_str(longlong val,char *dst,int radix); +extern void delete_tree(TREE*); +extern TREE_ELEMENT *tree_insert(TREE *tree,void *custom_arg); + +static int compare_ulonglong(const ulonglong *s, const ulonglong *t) +{ + return ((*s < *t) ? -1 : *s > *t ? 1 : 0); +} + +void field_ulonglong::add() +{ + char buff[(255*3 +1)]; + longlong num = item->val_int(); + uint length = (uint) (longlong10_to_str(num, buff, 10) - buff); + TREE_ELEMENT *element; + + if (item->null_value) + { + nulls++; + return; + } + if (num == 0) + empty++; + + if (room_in_tree) + { + if (!(element = tree_insert(&tree, tree.custom_arg))) + { + room_in_tree = 0; + delete_tree(&tree); + } + else if (element->count == 1) + { + room_in_tree = 0; + delete_tree(&tree); + } + } + + if (!found) + { + found = 1; + min_arg = max_arg = sum = num; + sum_sqr = num * num; + min_length = max_length = length; + } + else if (num != 0) + { + sum += num; + sum_sqr += num * num; + if (length < min_length) + min_length = length; + if (length > max_length) + max_length = length; + if (compare_ulonglong((ulonglong*) &num, &min_arg) < 0) + min_arg = num; + if (compare_ulonglong((ulonglong*) &num, &max_arg) > 0) + max_arg = num; + } +} diff --git a/gcc/testsuite/g++.dg/opt/pr23454.C b/gcc/testsuite/g++.dg/opt/pr23454.C new file mode 100644 index 000000000..ab82b1f9b --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr23454.C @@ -0,0 +1,41 @@ +/* PR rtl-optimization/23454 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +void foo (); +int a, b; +char c; +long long d, e; + +static inline int +bar (const long long s, const long long t) +{ + return ((s < t) ? -1 : s > t ? 1 : 0); +} + +int fn (); +int f; + +void +baz (int x) +{ + long long g = fn (); + if (f) + { + b++; + return; + } + if (g == 0) + a++; + if (x) + foo (); + if (!c) + c = 1; + else if (g != 0) + { + if (bar (g, d) < 0) + d = g; + if (bar (g, e) > 0) + e = g; + } +} diff --git a/gcc/testsuite/g++.dg/opt/pr23478.C b/gcc/testsuite/g++.dg/opt/pr23478.C new file mode 100644 index 000000000..da1371d25 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr23478.C @@ -0,0 +1,211 @@ +// PR rtl-optimization/23478 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort (); +bool tthrow; +struct C3 { int i; }; +class C14 {}; +struct C7 +{ + virtual ~C7 (); +}; + +C7::~C7 () +{ + asm volatile ("" : : : "memory"); +} +class C2 : public C7 {}; + +template <class X> class C13 +{ + bool ma; + X *mb; +public: + explicit C13 (X *p = 0) throw () : ma (p != 0), mb (p) {} + ~C13 (); +}; + +template <class X> +C13<X>::~C13 () +{ + asm volatile ("" : : "r" (ma), "r" (mb) : "memory"); +} + +struct C1 +{ + C1 (const C3 &, const C3 &, const C3 &, const C3 *&); +}; + +C1::C1 (const C3 &, const C3 &, const C3 &, const C3 *&) +{ + if (!tthrow) + throw 24; +} + +struct C8 +{ + struct C15 {}; + typedef C15 *C9; + virtual void f1 (C2 &, long *, void *, C3 &, void *, bool) = 0; + virtual C13<C14> f3 () const = 0; + virtual ~C8 () {} +}; + +bool +xx14 () +{ + bool b = false; + if (tthrow) + throw 6; + asm volatile ("" : : "r" (&b) : "memory"); + return b; +} + +bool +xx2 () +{ + bool b = false; + if (tthrow) + throw 6; + asm volatile ("" : : "r" (&b) : "memory"); + return b; +} + +C13<C7> +xx9 () +{ + return C13<C7>(); +} + +C2 & +xx10 () +{ + static C2 c2; + return c2; +} + +C3 & +xx12 () +{ + static C3 c3 = { 1 }; + return c3; +} + +const C3 & +xx5 () +{ + static const C3 c3 = { 2 }; + return c3; +} + +const C3 *& +xx4 () +{ + static const C3 *p; + if (tthrow) + throw 6; + return p; +} + +long ll13; + +long +xx13 () +{ + long ret; + asm volatile ("" : "=r" (ret) : "r" (ll13)); + return ret; +} + +void +xx15 (C3 &x, C13<C1> &y) +{ + asm volatile ("" : : "r" (&x), "r" (&y) : "memory"); +} + +long +xx16 (const void *x) +{ + long ret; + asm volatile ("" : "=r" (ret) : "0" (1), "r" (x) : "memory"); + return ret; +} + +void +xx1 (C13<C14> x) +{ + asm volatile ("" : : "r" (&x) : "memory"); + if (tthrow) + throw 6; +} + +void +xx3 (const C7 *x) +{ + if (x) + abort (); +} + +void +xx7 () +{ + asm volatile ("" : : : "memory"); +} + +struct C5 +{ + C13<C7> f2 (C3 &v1, const void *v2, C8 *v6); + C7 *m2[2]; + long m1[2]; +}; + +C13<C7> +C5::f2 (C3 &v1, const void *v2, C8 *v6) +{ + C13<C7> v13 = xx9 (); + C2 &v9 = xx10 (); + for (long i = 1; i < 2; i++) + xx3 (m2[i]); + const C3 &ld = xx5 (); + xx7 (); + if (xx2 ()) + throw ""; + xx4 (); + C3 &si = xx12 (); + for (long i = 0; i < xx16 (v2); ++i) + { + C13<C1> sk (new C1 (xx5 (), ld, xx5 (), xx4 ())); + xx15 (si, sk); + } + long v4 = xx13 (); + for (long i = v4 - 1; i >= 0; --i) + m1[i] = i; + bool v8 = xx2 (); + for (long i = 0; i < 2 && !xx14 (); i++) + { + v6[i].f1 (v9, 0, __null, v1, __null, v8); + if (v8) + xx1 (v6[i].f3 ()); + } + return v13; +} + +int +main (void) +{ + C5 c5 = { { __null, __null }, { 0, 0 } }; + bool seen = false; + try + { + c5.f2 (xx12 (), __null, __null); + } + catch (int n) + { + if (n != 24) + abort (); + seen = true; + } + if (!seen) + abort (); +} diff --git a/gcc/testsuite/g++.dg/opt/pr23714.C b/gcc/testsuite/g++.dg/opt/pr23714.C new file mode 100644 index 000000000..bf1b4ac5c --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr23714.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// { dg-options "-O2 -fnon-call-exceptions" } + +void run (void) { + float stack[1]; + float *sp = stack; + try + { + float value2 = ((float) *(--sp)); + float value1 = ((float) *(--sp)); + *(sp++) = (value1 - value2); + } + catch (int *ex) + { + } +} diff --git a/gcc/testsuite/g++.dg/opt/pr24665.C b/gcc/testsuite/g++.dg/opt/pr24665.C new file mode 100644 index 000000000..646642c49 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr24665.C @@ -0,0 +1,29 @@ +// { dg-do compile } +// { dg-options "-O2" } + +typedef unsigned long T; +typedef volatile T* const hwreg_t; +struct RegisterLayout +{ + T intmask; +}; +struct Controller_t +{ + Controller_t(); + inline void + disableInterrupt() + { + *mpMaskRegister = 0; + }; + static hwreg_t mpMaskRegister; +}; + +extern char SimulatedRegisters[]; + +hwreg_t Controller_t::mpMaskRegister + = &(reinterpret_cast<volatile RegisterLayout*>(SimulatedRegisters))->intmask; + +Controller_t::Controller_t() +{ + disableInterrupt(); +} diff --git a/gcc/testsuite/g++.dg/opt/pr24780.C b/gcc/testsuite/g++.dg/opt/pr24780.C new file mode 100644 index 000000000..7baad386b --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr24780.C @@ -0,0 +1,14 @@ +// PR c++/24780 +// { dg-do compile } + +template<typename S=int> +struct Move { + Move(); + static Move<S> const MOVES[2][2]; +}; +template<typename S> + Move<S> const Move<S>::MOVES[2][2]={}; +typedef Move<int> const MoveClass; +void moves(int x, int y) { + &MoveClass::MOVES[x][y]; +} diff --git a/gcc/testsuite/g++.dg/opt/pr25005.C b/gcc/testsuite/g++.dg/opt/pr25005.C new file mode 100644 index 000000000..f62f8a2bc --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr25005.C @@ -0,0 +1,34 @@ +// PR target/25005 +// { dg-options "-O2 -funroll-loops" } +// { dg-do compile } + +inline void *operator new (__SIZE_TYPE__, void *__p) throw() { return __p; } + +struct M { ~M() { } }; + +struct P +{ + P () { v[0] = 0; v[1] = 0; v[2] = 0; } + P (const P &x) { for (int i = 0; i < 3; ++i) v[i] = x.v[i]; } + double v[3]; +}; + +struct V : public M +{ + V (const P *x, const P *y) + { + P *b = this->a = ::new P[2]; + for (; x != y; ++x, ++b) + ::new (b) P(*x); + } + P *a; +}; + +void bar (const V &); + +void +foo () +{ + const P d[2] = { P(), P() }; + bar (V (&d[0], &d[2])); +} diff --git a/gcc/testsuite/g++.dg/opt/pr25857.C b/gcc/testsuite/g++.dg/opt/pr25857.C new file mode 100644 index 000000000..4e6858fe1 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr25857.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +int foo(); +int i; + +struct A +{ + ~A() { if (this != (A*)(&i)) foo(); } +}; + +struct B +{ + A a1, a2, a3, a4; + ~B() { foo(); } +}; + +B b; diff --git a/gcc/testsuite/g++.dg/opt/pr26179.C b/gcc/testsuite/g++.dg/opt/pr26179.C new file mode 100644 index 000000000..32cd7a00e --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr26179.C @@ -0,0 +1,22 @@ +/* The problem here is that Load PRE on the tree level + forgot to handle RETURN_DECL which causes us to ICE. */ + +// { dg-do compile } +// { dg-options "-O2" } + +struct a +{ + int i; +}; +void h(struct a&); +void l(void); + +struct a g(void) +{ + struct a fl; + h(fl); + if (fl.i) + l(); + fl.i+=2; + return fl; +} diff --git a/gcc/testsuite/g++.dg/opt/pr27826.C b/gcc/testsuite/g++.dg/opt/pr27826.C new file mode 100644 index 000000000..5e40f1746 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr27826.C @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +struct Geometry +{ + int type:16; +}; +struct Geometry get() {}; +int f() +{ + struct Geometry test; + return get().type == test.type; +} + diff --git a/gcc/testsuite/g++.dg/opt/pr28116.C b/gcc/testsuite/g++.dg/opt/pr28116.C new file mode 100644 index 000000000..a85917c8f --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr28116.C @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +struct QDateTime +{ + QDateTime addSecs( int secs ) const; + int t; +}; +QDateTime gridToDate(long x) +{ + QDateTime date; + date = date.addSecs(1); + return date; +} +void whatsOnAt(long x, long y) +{ + gridToDate(x); +} + diff --git a/gcc/testsuite/g++.dg/opt/pr30590.C b/gcc/testsuite/g++.dg/opt/pr30590.C new file mode 100644 index 000000000..42ae046db --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr30590.C @@ -0,0 +1,40 @@ +/* { dg-do run } */ +/* { dg-options "-O" } */ +struct test +{ + int type; + char buffer[4242]; /* should trigger pass-by-reference */ +}; + +int flag = 0; + +struct test +reset (void) +{ + struct test retval; + retval.type = 1; + return retval; +} + +struct test +test (void) +{ + struct test result; + result.type = 0; + + for (int i = 0; i < 2; ++i) + { + struct test candidate = reset (); + if (flag) + result = candidate; + } + + return result; +} + +int +main (void) +{ + struct test result = test (); + return result.type; +} diff --git a/gcc/testsuite/g++.dg/opt/pr30965.C b/gcc/testsuite/g++.dg/opt/pr30965.C new file mode 100644 index 000000000..91bb55c05 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr30965.C @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-tree-optimized" } */ + +#include <tr1/functional> +#include <algorithm> + +extern void assign( long* variable, long v ) +{ + std::transform( variable, variable + 1, variable, + std::tr1::bind( std::plus< long >(), 0L, v ) ); +} +extern void assign( long& variable, long v ) +{ + std::transform( &variable, &variable + 1, &variable, + std::tr1::bind( std::plus< long >(), 0L, v ) ); +} + +/* { dg-final { scan-tree-dump-times ";; Function" 2 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "variable_..D. = v_..D." 2 "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/opt/pr32383.C b/gcc/testsuite/g++.dg/opt/pr32383.C new file mode 100644 index 000000000..af4161888 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr32383.C @@ -0,0 +1,20 @@ +// Testcase by Volker Reichelt <reichelt@gcc.gnu.org> + +// { dg-do compile } +// { dg-options "-O -ffast-math" } + +struct A +{ + ~A(); +}; + +double& foo(); + +inline void bar (double d) { foo() /= d; } + +void baz() +{ + A a; + bar(2); +} + diff --git a/gcc/testsuite/g++.dg/opt/pr34036.C b/gcc/testsuite/g++.dg/opt/pr34036.C new file mode 100644 index 000000000..ecf6cf745 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr34036.C @@ -0,0 +1,32 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fnon-call-exceptions -ffast-math -fsignaling-nans" } */ +/* { dg-warning "-fassociative-math disabled" "" { target *-*-* } 1 } */ + +template <class T> +class ggStaticArray { +public: + ~ggStaticArray(); +}; + +template <class T> +class ggGrid { +public: + ggGrid() : grid() { } + ggStaticArray<T> grid; +}; + +class mrGrid { +public: + mrGrid(void); +protected: + ggGrid<int*> grid; + double multiplier; +}; + +mrGrid::mrGrid(void) +{ + double xMeasure, yMeasure, zMeasure; + double cellDimension; + + cellDimension = multiplier * (xMeasure * yMeasure * zMeasure); +} diff --git a/gcc/testsuite/g++.dg/opt/pr36185.C b/gcc/testsuite/g++.dg/opt/pr36185.C new file mode 100644 index 000000000..2ffa52f8e --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr36185.C @@ -0,0 +1,24 @@ +// PR rtl-optimization/36185 +// { dg-do run } +// { dg-options "-O2 -fgcse-sm" } + +struct Base { + virtual ~Base() {} + virtual void f() = 0; +}; +struct Derived : Base { + Derived(); + virtual void f() {} +}; +struct Foo { + Foo(Base&); +}; +Derived::Derived() { + Foo foo(*this); +} +Foo::Foo(Base& base) { + base.f(); +} +int main() { + Derived d; +} diff --git a/gcc/testsuite/g++.dg/opt/pr36187.C b/gcc/testsuite/g++.dg/opt/pr36187.C new file mode 100644 index 000000000..91166940d --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr36187.C @@ -0,0 +1,45 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +extern "C" void abort (void); +enum SbxDataType { SbxINTEGER, SbxDECIMAL, SbxBYREF = 0x4000 }; +struct SbxValues { + union { + float nSingle; + float* pSingle; + }; + SbxDataType eType; +}; +static bool ImpPutDoubleFoo( SbxValues* p) +{ + bool bRet = false; + SbxValues aTmp; + int count = 0; +start: + switch( p->eType ) { + case SbxINTEGER: + if (count++ > 0) + abort (); + aTmp.pSingle = &p->nSingle; goto direct; + case SbxBYREF | SbxDECIMAL: + bRet = false; + break; + direct: + aTmp.eType = SbxDataType( p->eType | SbxBYREF ); + p = &aTmp; goto start; + case SbxBYREF | SbxINTEGER: + break; + default: + bRet =true; + } + return bRet; +} + +int main( int argc, char** argv ) +{ + SbxValues aTmp; + aTmp.eType = SbxINTEGER; + if ( ImpPutDoubleFoo( &aTmp ) ) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/pr36449.C b/gcc/testsuite/g++.dg/opt/pr36449.C new file mode 100644 index 000000000..f66598040 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr36449.C @@ -0,0 +1,70 @@ +// PR middle-end/36449 +// { dg-do run } +// { dg-options "-O3" } + +extern "C" void exit (int); +extern "C" void abort (); + +struct R +{ + short a; + short b; +}; + +struct S +{ + R e; + long f; + long g; +}; + +struct T +{ + short c; + short d; +}; + +struct U +{ + long h[0x1ffffff + 1]; + T i; +}; + +U *j; + +void __attribute__((noinline)) +bar () +{ + exit (0); +} + +void __attribute__((noinline)) +foo () +{ + S s; + + s.e.a = 36; + s.e.b = 38; + if (s.e.a == j->i.c && s.e.b == j->i.d) + bar (); +} + +int +main () +{ + try + { + j = new U; + } + catch (...) + { + return 0; + } + j->i.c = 36; + j->i.d = 38; + j->h[0] = 1; + j->h[1] = 2; + j->h[2] = 3; + foo (); + abort (); +} diff --git a/gcc/testsuite/g++.dg/opt/pr39607.C b/gcc/testsuite/g++.dg/opt/pr39607.C new file mode 100644 index 000000000..c39260dc5 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr39607.C @@ -0,0 +1,65 @@ +// PR rtl-optimization/39607 +// { dg-do compile } +// { dg-options "-O2" } + +void abcErrorMessage(int error); +enum AbcSurfType { + SURF_U, + SURF_V +}; +class AbcVec2d +{ +public: + double x; + double y; +}; +class AbcIval1d +{ +protected: + double m_dMin; + double m_dMax; +public: + AbcIval1d(); + AbcIval1d(double dMin, double dMax); + double GetMax() const { return m_dMax; } + double GetMin() const { return m_dMin; } +}; +inline AbcIval1d::AbcIval1d(double dMin, double dMax) +{ + if (dMin > dMax) { + abcErrorMessage(1); + } + else { + m_dMin = dMin; + m_dMax = dMax; + } +} +class AbcIval2d +{ +protected: + AbcVec2d m_vMin; + AbcVec2d m_vMax; +public: + AbcVec2d GetMax() const { return m_vMax; } + AbcVec2d GetMin() const { return m_vMin; } +}; +class AbcCone +{ +protected: + int m_uv; +public: + AbcIval2d GetNaturalUVDomain() const; + AbcIval1d GetLinearParamIval(AbcSurfType * pSurfParam) const; +}; +AbcIval1d AbcCone::GetLinearParamIval(AbcSurfType * pSurfParam) const +{ + AbcIval1d sIval; + AbcIval2d sUVDomain = GetNaturalUVDomain(); + if (m_uv) { + sIval = AbcIval1d(sUVDomain.GetMin().x,sUVDomain.GetMax().x); + } + else { + sIval = AbcIval1d(sUVDomain.GetMin().y,sUVDomain.GetMax().y); + } + return sIval; +} diff --git a/gcc/testsuite/g++.dg/opt/pr40496.C b/gcc/testsuite/g++.dg/opt/pr40496.C new file mode 100644 index 000000000..961f067af --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr40496.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// { dg-options "-O2 -fprefetch-loop-arrays -msse2" { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target sse2 { target i?86-*-* x86_64-*-* } } + +struct DOMStringHandle +{ + unsigned int fLength; + int fRefCount; +}; +static void *freeListPtr; +void foo(DOMStringHandle *dsg) +{ + int i; + for (i = 1; i < 1023; i++) + { + *(void **) &dsg[i] = freeListPtr; + freeListPtr = &dsg[i]; + } +} diff --git a/gcc/testsuite/g++.dg/opt/pr42508.C b/gcc/testsuite/g++.dg/opt/pr42508.C new file mode 100644 index 000000000..68dd4c693 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr42508.C @@ -0,0 +1,33 @@ +// PR tree-optimization/42508 +// { dg-do run } +// { dg-options "-O1 -fipa-sra" } + +extern "C" void abort (); + +int v[10], vidx; + +struct A +{ + A *prev; + int i; + ~A() + { + v[vidx++] = i; + delete prev; + } +}; + +int +main () +{ + A *a1 = new A (); + A *a2 = new A (); + a1->prev = 0; + a1->i = 1; + a2->prev = a1; + a2->i = 2; + delete a2; + if (vidx != 2 || v[0] != 2 || v[1] != 1) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/pr43655.C b/gcc/testsuite/g++.dg/opt/pr43655.C new file mode 100644 index 000000000..f7e370b9e --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr43655.C @@ -0,0 +1,34 @@ +// PR tree-optimization/43655 +// { dg-do run } +// { dg-options "-O0 -ftree-ter" } + +extern "C" void abort (); + +struct C +{ + C (int i) : val(i) { } + C (const C& c) : val(c.val) { } + ~C (void) { val = 999; } + C& operator = (const C& c) { val = c.val; return *this; } + C& inc (int i) { val += i; return *this; } + int val; +}; + +C +f () +{ + return C (3); +} + +C +f (int i) +{ + return f ().inc (i); +} + +int +main () +{ + if (f (2).val != 5) + abort (); +} diff --git a/gcc/testsuite/g++.dg/opt/pr44919.C b/gcc/testsuite/g++.dg/opt/pr44919.C new file mode 100644 index 000000000..e90851be3 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr44919.C @@ -0,0 +1,253 @@ +// { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } +// { dg-options "-O3 -fselective-scheduling2" } + +namespace std { + +typedef long unsigned int size_t; + +template<typename _Tp> class new_allocator { public: typedef size_t size_type; typedef _Tp* pointer; }; +template<typename _Tp> class allocator: public new_allocator<_Tp> { public: typedef size_t size_type; template<typename _Tp1> struct rebind { typedef allocator<_Tp1> other; }; }; + +class back_insert_iterator { }; +template<typename _Container> back_insert_iterator back_inserter(_Container& __x) { }; + +class vector { }; + +struct _List_node_base { }; +struct _List_node : public _List_node_base { }; +template<typename _Tp> struct _List_iterator { typedef _List_iterator<_Tp> _Self; typedef _Tp& reference; explicit _List_iterator(_List_node_base* __x) : _M_node(__x) { } reference operator*() const { } _Self& operator++() { } bool operator!=(const _Self& __x) const { return _M_node != __x._M_node; } _List_node_base* _M_node; }; +template<typename _Tp, typename _Alloc> class _List_base { protected: typedef typename _Alloc::template rebind<_List_node >::other _Node_alloc_type; struct _List_impl : public _Node_alloc_type { _List_node_base _M_node; }; _List_impl _M_impl; }; +template<typename _Tp, typename _Alloc = std::allocator<_Tp> > class list : protected _List_base<_Tp, _Alloc> { public: typedef _Tp value_type; typedef _List_iterator<_Tp> iterator; iterator begin() { } iterator end() { return iterator(&this->_M_impl._M_node); } }; + +namespace tr1 { template<typename _Tp, size_t _Nm> struct array { typedef _Tp value_type; typedef const value_type& const_reference; typedef const value_type* const_iterator; typedef size_t size_type; value_type _M_instance[_Nm ? _Nm : 1]; const_iterator begin() const { return const_iterator(&_M_instance[0]); } const_reference operator[](size_type __n) const { return _M_instance[__n]; } }; } +} + +namespace X { + +class Object { }; +struct Has_qrt { }; +template <typename F> struct qrt_or_not { typedef const typename F::result_type & type; }; +template <typename Functor, typename P1 = void> struct Qualified_result_of : qrt_or_not<Functor> { }; + +using std::tr1::array; + +template <class R_> class Point_2 : public R_::Kernel_base::Point_2 { +public: + typedef typename R_::Kernel_base::Point_2 RPoint_2; + typedef RPoint_2 Rep; + const Rep& rep() const { } +}; + +template <class R_> class Vector_2 : public R_::Kernel_base::Vector_2 { +public: + typedef typename R_::Kernel_base::Vector_2 RVector_2; + typedef RVector_2 Rep; + const Rep& rep() const { return *this; } + typedef R_ R; + typename Qualified_result_of<typename R::Compute_x_2,Vector_2>::type x() const { return R().compute_x_2_object()(*this); } + typename Qualified_result_of<typename R::Compute_y_2,Vector_2>::type y() const { return R().compute_y_2_object()(*this); } + typename Qualified_result_of<typename R::Compute_y_2,Vector_2>::type cartesian(int i) const { return (i==0) ? x() : y(); } + typename Qualified_result_of<typename R::Compute_hx_2,Vector_2>::type hx() const { return R().compute_hx_2_object()(*this); } + typename Qualified_result_of<typename R::Compute_hy_2,Vector_2>::type hy() const { return R().compute_hy_2_object()(*this); } + typename Qualified_result_of<typename R::Compute_hw_2,Vector_2>::type hw() const { return R().compute_hw_2_object()(*this); } + typename Qualified_result_of<typename R::Compute_hx_2,Vector_2>::type homogeneous(int i) const { return (i==0) ? hx() : (i==1)? hy() : hw(); } +}; + +template <class R_> class Segment_2 : public R_::Kernel_base::Segment_2 { }; +template <class R_> class Iso_rectangle_2 : public R_::Kernel_base::Iso_rectangle_2 { }; + +template <typename T, int i > const T& constant() { static const T t(i); return t; } +template <class T, class Alloc = std::allocator<T > > class Handle_for { struct RefCounted { T t; }; typedef typename Alloc::template rebind<RefCounted>::other Allocator; typedef typename Allocator::pointer pointer; pointer ptr_; public: typedef T element_type; const T * Ptr() const { return &(ptr_->t); } }; +template <class T, class Allocator> const T& get(const Handle_for<T, Allocator> &h) { return *(h.Ptr()); } + +template <class R_> class PointC2 { +public: + typedef typename R_::Vector_2 Vector_2; Vector_2 base; + typedef typename Vector_2::Cartesian_const_iterator Cartesian_const_iterator; Cartesian_const_iterator cartesian_begin() const { return base.cartesian_begin(); } +}; + +template <class R_> class VectorC2 { +public: + typedef typename R_::FT FT; + typedef array<FT, 2> Rep; + typedef typename R_::template Handle<Rep>::type Base; + Base base; + typedef typename Rep::const_iterator Cartesian_const_iterator; + const FT & x() const { return X::get(base)[0]; } + const FT & y() const { return X::get(base)[1]; } + const FT & hx() const { return x(); } + const FT & hy() const { return y(); } + const FT & hw() const { return constant<FT, 1>(); } + Cartesian_const_iterator cartesian_begin() const { return X::get(base).begin(); } +}; + +template <class R_> class SegmentC2 { }; +template <class R_> class Iso_rectangleC2 { }; + +namespace internal { + template <class K> class Segment_2_Iso_rectangle_2_pair { + public: + enum Intersection_results { NO_INTERSECTION }; + Segment_2_Iso_rectangle_2_pair(typename K::Segment_2 const *seg, typename K::Iso_rectangle_2 const *rect) ; + Intersection_results intersection_type() const; + mutable Intersection_results _result; + typename K::Point_2 _ref_point; + typename K::Vector_2 _dir; + typename K::Point_2 _isomin; + typename K::Point_2 _isomax; + mutable typename K::FT _min, _max; + }; + template <class K> Object intersection( const typename K::Segment_2 &seg, const typename K::Iso_rectangle_2 &iso, const K&) { + typedef Segment_2_Iso_rectangle_2_pair<K> is_t; is_t ispair(&seg, &iso); switch (ispair.intersection_type()) { } + } + template <class K> typename Segment_2_Iso_rectangle_2_pair<K>::Intersection_results Segment_2_Iso_rectangle_2_pair<K>::intersection_type() const { + typedef typename K::RT RT; + typedef typename K::FT FT; + typename K::Construct_cartesian_const_iterator_2 construct_cccit; + typename K::Cartesian_const_iterator_2 ref_point_it = construct_cccit(_ref_point); + typename K::Cartesian_const_iterator_2 end = construct_cccit(_ref_point, 0); + typename K::Cartesian_const_iterator_2 isomin_it = construct_cccit(_isomin); + typename K::Cartesian_const_iterator_2 isomax_it = construct_cccit(_isomax); + for (unsigned int i=0; ref_point_it != end; ++i, ++ref_point_it, ++isomin_it, ++isomax_it) { + if (_dir.homogeneous(i) == RT(0)) { + if ( *(ref_point_it) <*(isomin_it) ) { + _result = NO_INTERSECTION; + } + if ( *(ref_point_it) > *(isomax_it)) { + _result = NO_INTERSECTION; + } + } else { + FT newmin, newmax; + if (_dir.homogeneous(i) > RT(0)) { + newmin = ( *(isomin_it) - (*ref_point_it)) / _dir.cartesian(i); + newmax = ( *(isomax_it) - (*ref_point_it)) / _dir.cartesian(i); + } else { + newmin = ( (*isomax_it) - (*ref_point_it)) / _dir.cartesian(i); + newmax = ( (*isomin_it) - (*ref_point_it)) / _dir.cartesian(i); + } + if (newmin > _min) _min = newmin; + if (newmax <_max) _max = newmax; + if (_max <_min) { return _result; } + } + } + } +} + +template <class K> Object intersection(const Segment_2<K> &seg, const Iso_rectangle_2<K> &iso) { typedef typename K::Intersect_2 Intersect; return Intersect()(seg, iso); } + +namespace CommonKernelFunctors { + template <typename K> class Construct_cartesian_const_iterator_2 { + typedef typename K::Point_2 Point_2; + typedef typename K::Cartesian_const_iterator_2 Cartesian_const_iterator_2; +public: + typedef Cartesian_const_iterator_2 result_type; + Cartesian_const_iterator_2 operator()( const Point_2& p) const { return p.rep().cartesian_begin(); } + Cartesian_const_iterator_2 operator()( const Point_2& p, int) const { } + }; + template <typename K> class Intersect_2 { + typedef typename K::Object_2 Object_2; + public: + typedef Object_2 result_type; + template <class T1, class T2> Object_2 operator()(const T1& t1, const T2& t2) const { return internal::intersection(t1, t2, K()); } + }; +} + +namespace CartesianKernelFunctors { + using namespace CommonKernelFunctors; + template <typename K> class Compute_x_2 : Has_qrt { + typedef typename K::FT FT; + typedef typename K::Vector_2 Vector_2; + public: + typedef FT result_type; + const result_type & operator()(const Vector_2& v) const { return v.rep().x(); } + }; + template <typename K> class Compute_y_2 : Has_qrt { + typedef typename K::FT FT; + typedef typename K::Vector_2 Vector_2; + public: + typedef FT result_type; + const result_type & operator()(const Vector_2& v) const { return v.rep().y(); } + }; + template <typename K> class Compute_hx_2 : public Has_qrt { + typedef typename K::FT FT; + typedef typename K::Vector_2 Vector_2; + public: + typedef FT result_type; + const result_type & operator()(const Vector_2& v) const { return v.rep().hx(); } + }; + template <typename K> class Compute_hy_2 : public Has_qrt { + typedef typename K::FT FT; + typedef typename K::Vector_2 Vector_2; + public: + typedef FT result_type; + const result_type & operator()(const Vector_2& v) const { return v.rep().hy(); } + }; + template <typename K> class Compute_hw_2 : public Has_qrt { + typedef typename K::FT FT; + typedef typename K::Vector_2 Vector_2; + public: + typedef FT result_type; + const result_type & operator()(const Vector_2& v) const { return v.rep().hw(); } + }; +} + +template <typename K_, typename FT_> struct Cartesian_base { + typedef K_ Kernel; + typedef X::Object Object_2; + typedef PointC2<Kernel> Point_2; + typedef VectorC2<Kernel> Vector_2; + typedef SegmentC2<Kernel> Segment_2; + typedef Iso_rectangleC2<Kernel> Iso_rectangle_2; + typedef typename array<FT_, 2>::const_iterator Cartesian_const_iterator_2; +}; + +template <typename K_base, typename Kernel_ > struct Type_equality_wrapper : public K_base { + typedef K_base Kernel_base; + typedef X::Point_2<Kernel_> Point_2; + typedef X::Vector_2<Kernel_> Vector_2; + typedef X::Segment_2<Kernel_> Segment_2; + typedef X::Iso_rectangle_2<Kernel_> Iso_rectangle_2; +}; + +template <typename FT_, typename Kernel_ > struct Cartesian_base_ref_count : public Cartesian_base<Kernel_, FT_ > { + typedef FT_ RT; + typedef FT_ FT; + template <typename T > struct Handle { typedef Handle_for<T> type; }; + typedef Kernel_ K; + typedef CartesianKernelFunctors::Compute_x_2<K> Compute_x_2; + Compute_x_2 compute_x_2_object() const { } + typedef CartesianKernelFunctors::Compute_y_2<K> Compute_y_2; + Compute_y_2 compute_y_2_object() const { } + typedef CartesianKernelFunctors::Compute_hx_2<K> Compute_hx_2; + Compute_hx_2 compute_hx_2_object() const { } + typedef CartesianKernelFunctors::Compute_hy_2<K> Compute_hy_2; + Compute_hy_2 compute_hy_2_object() const { } + typedef CartesianKernelFunctors::Compute_hw_2<K> Compute_hw_2; + Compute_hw_2 compute_hw_2_object() const { } + typedef CartesianKernelFunctors::Construct_cartesian_const_iterator_2<K> Construct_cartesian_const_iterator_2; + typedef CartesianKernelFunctors::Intersect_2<K> Intersect_2; +}; + +template <typename FT_ > struct Cartesian : public Type_equality_wrapper<Cartesian_base_ref_count<FT_, Cartesian<FT_> >, Cartesian<FT_> > { }; + +template <class Kernel> class Ipelet_base { +public: + typedef typename X::Point_2<Kernel> Point_2; + typedef typename Kernel::Segment_2 Segment_2; + typedef typename Kernel::Iso_rectangle_2 Iso_rectangle_2; + + Iso_rectangle_2 read_active_objects () const { } + struct Voronoi_from_tri{ std::list<Segment_2> seg_list; }; + + template <class T,class output_iterator> bool cast_into_seg(const T& obj,const Iso_rectangle_2& bbox,output_iterator out_it) const{ X::intersection(obj,bbox); } + template<class iterator,class output_iterator> void cast_into_seg(const iterator first,const iterator end, const Iso_rectangle_2& bbox, output_iterator out_it) const { for (iterator it=first; it!=end; ++it) cast_into_seg(*it,bbox,out_it); } + void draw_dual_(Voronoi_from_tri& v_recup,const Iso_rectangle_2& bbox) const { std::vector seg_cont; cast_into_seg(v_recup.seg_list.begin(),v_recup.seg_list.end(),bbox,std::back_inserter(seg_cont)); } + void draw_dual_in_ipe(const Iso_rectangle_2& bbox) const { Voronoi_from_tri v_recup; draw_dual_(v_recup,bbox); } +}; + +typedef X::Cartesian<double> Kernel; + +class diagrammeIpelet : public X::Ipelet_base<Kernel> { void protected_run(); }; +void diagrammeIpelet::protected_run() { Iso_rectangle_2 bbox = read_active_objects( ); draw_dual_in_ipe(bbox); } + +} diff --git a/gcc/testsuite/g++.dg/opt/pr45316.C b/gcc/testsuite/g++.dg/opt/pr45316.C new file mode 100644 index 000000000..74ad30ead --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr45316.C @@ -0,0 +1,28 @@ +// { dg-do compile } +// { dg-options "-O1 -ftree-pre -fnon-call-exceptions" } + +struct A +{ + int i; +}; + +struct B : A +{ + int i[6]; + B (int = 0) : A () + { + m (); + } + int m (); +}; + +struct C : B +{ +}; + +void +foo () +{ + new C (); +} + diff --git a/gcc/testsuite/g++.dg/opt/pr45412.C b/gcc/testsuite/g++.dg/opt/pr45412.C new file mode 100644 index 000000000..e374f52b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr45412.C @@ -0,0 +1,26 @@ +// { dg-do compile } +// { dg-options "-O2 -fipa-cp-clone -ftracer" } + +int foo (int *); +void bar (); + +struct S +{ + virtual int vm (); + ~S (); +}; + +int +S::vm () +{ + int state; + switch (foo (&state)) + { + case 0: + bar (); + case 1: + delete this; + } + return state; +} + diff --git a/gcc/testsuite/g++.dg/opt/pr46640.C b/gcc/testsuite/g++.dg/opt/pr46640.C new file mode 100644 index 000000000..0892c9ac8 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr46640.C @@ -0,0 +1,44 @@ +// { dg-do compile { target x86_64-*-* } } +// { dg-options "-fschedule-insns2 -fsel-sched-pipelining -fselective-scheduling2 -fno-exceptions -O" } + +struct QBasicAtomicInt +{ + int i, j; + bool deref () + { + asm volatile ("":"=m" (i), "=qm" (j)); + } +}; + +struct Data +{ + QBasicAtomicInt ref; + void *data; +}; + +struct QByteArray +{ + Data * d; + ~QByteArray () + { + d->ref.deref (); + } +}; + +int indexOf (unsigned); +int stat (void *, int *); +QByteArray encodeName (); + +bool makeDir (unsigned len) +{ + unsigned i = 0; + while (len) + { + int st; + int pos = indexOf (i); + QByteArray baseEncoded = encodeName (); + if (stat (baseEncoded.d->data, &st) && stat (baseEncoded.d, &st)) + return false; + i = pos; + } +} diff --git a/gcc/testsuite/g++.dg/opt/pr46649.C b/gcc/testsuite/g++.dg/opt/pr46649.C new file mode 100644 index 000000000..1428e8bdd --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr46649.C @@ -0,0 +1,9 @@ +// { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } +// { dg-options "-fschedule-insns -fselective-scheduling" } + +void foo () +{ + for (;;) + for (;;({break;})) + ; +} diff --git a/gcc/testsuite/g++.dg/opt/pr46864.C b/gcc/testsuite/g++.dg/opt/pr46864.C new file mode 100644 index 000000000..0f7b7d2f5 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr46864.C @@ -0,0 +1,26 @@ +// PR tree-optimization/46864 +// { dg-do compile } +// { dg-options "-O -fnon-call-exceptions" } + +int baz (); + +struct S +{ + int k; + bool bar () throw () + { + int m = baz (); + for (int i = 0; i < m; i++) + k = i; + return m; + } +}; + +extern S *s; + +void +foo () +{ + while (baz () && s->bar ()) + ; +} diff --git a/gcc/testsuite/g++.dg/opt/pr47036.C b/gcc/testsuite/g++.dg/opt/pr47036.C new file mode 100644 index 000000000..d6d5adc6a --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr47036.C @@ -0,0 +1,10 @@ +// { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } +// { dg-options "-fschedule-insns -fselective-scheduling -fno-dce" } + + +void foo () +{ + for (;;) + for (;;({break;})); +} + diff --git a/gcc/testsuite/g++.dg/opt/pr47280.C b/gcc/testsuite/g++.dg/opt/pr47280.C new file mode 100644 index 000000000..01ca48439 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr47280.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// { dg-options "-O -fnon-call-exceptions -ftrapv" } + +void bar (int n, char *p) +{ + try + { + n++; + for (int i = 0; i < n - 1; i++) + p[i]; + } + catch (...) + {} +} + diff --git a/gcc/testsuite/g++.dg/opt/pr47355.C b/gcc/testsuite/g++.dg/opt/pr47355.C new file mode 100644 index 000000000..4fdbd9f59 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr47355.C @@ -0,0 +1,39 @@ +// PR tree-optimization/47355 +// { dg-do compile } +// { dg-options "-O -fipa-cp -fipa-cp-clone" } + +struct T +{ + T (); + void *p; + ~T (); +}; + +void foo (T *i); + +T *bar (); +void baz (T *); + +struct V +{ + long q; + T *r; + ~V () + { + while (q) + { + foo (r); + ++r; + --q; + } + baz (r); + } +}; + +void +foo () +{ + V v; + T t; + v.r = bar (); +} diff --git a/gcc/testsuite/g++.dg/opt/pr47366.C b/gcc/testsuite/g++.dg/opt/pr47366.C new file mode 100644 index 000000000..e133edfbf --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr47366.C @@ -0,0 +1,22 @@ +// PR rtl-optimization/47366 +// { dg-do compile } +// { dg-options "-O -fnon-call-exceptions -fno-tree-ccp -fno-tree-forwprop" } + +struct A +{ + int i; + virtual ~A (); +}; + +struct B : virtual A +{}; + +struct C : B +{ + void bar () {} +}; + +void foo () +{ + C ().bar (); +} diff --git a/gcc/testsuite/g++.dg/opt/pr47615.C b/gcc/testsuite/g++.dg/opt/pr47615.C new file mode 100644 index 000000000..bbbcbe1e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr47615.C @@ -0,0 +1,711 @@ +// { dg-do compile } +// { dg-options "-O -fstrict-aliasing -ftree-pre -fno-tree-fre -fno-tree-sra" } + +typedef __SIZE_TYPE__ size_t; +namespace std +{ + template < class _T1, class > struct pair + { + _T1 first; + }; +} +namespace __gnu_cxx +{ + template < typename _Tp > class new_allocator + { + public: + typedef size_t size_type; + typedef _Tp * pointer; + typedef _Tp const_pointer; + typedef _Tp & reference; + typedef const _Tp & const_reference; + template < typename _Tp1 > struct rebind + { + typedef new_allocator < _Tp1 > other; + }; + }; +} +namespace std +{ +template < typename _Tp > class allocator: + public __gnu_cxx::new_allocator < _Tp > + {}; + template < typename, typename, typename > struct binary_function; + template < typename _Tp > struct less:binary_function < _Tp, _Tp, bool > + {}; +} +namespace __gnu_cxx +{ + namespace typelist + { + struct null_type; + template < typename Root > struct node + { + typedef Root root; + }; + template < typename, typename > struct chain; + namespace detail + { + template < typename, int >struct chain_at_index_; + template + < + typename + Hd, typename Tl > struct chain_at_index_ <chain < Hd, Tl >, 0 > + { + typedef Hd type; + }; + template + < + typename + Hd, typename Tl, int i > struct chain_at_index_ <chain < Hd, Tl >, i > + { + typedef typename chain_at_index_ < Tl, i - 1 >::type type; + }; + } + template < typename Typelist, int i > struct at_index + { + typedef typename Typelist::root root_type; + typedef detail::chain_at_index_ < root_type, i > index_type; + typedef typename index_type::type type; + }; + template < typename T1, typename T2 > struct create2 + { + typedef node < chain < T1, chain < T2, null_type > > >type; + }; + } +} +namespace std +{ + namespace tr1 + { + template < typename _Tp, _Tp __v > struct integral_constant + { + static const _Tp value = __v; + }; + typedef integral_constant < bool, false > false_type; + template < typename, typename > struct is_same:false_type + {}; + } +} +using std::tr1::is_same; +namespace __gnu_pbds +{ + struct null_mapped_type; + struct rb_tree_tag; + namespace detail + { + template < typename, typename, typename > struct basic_tree_policy_base; + template + < + typename + Const_Node_Iterator, + typename + Allocator + > + struct + basic_tree_policy_base + <Const_Node_Iterator, Const_Node_Iterator, Allocator > + {}; + } + template + < typename, typename, typename, typename > struct null_tree_node_update; +template < typename Const_Node_Iterator, typename Node_Iterator, typename, typename Allocator > class tree_order_statistics_node_update: + detail::basic_tree_policy_base + < Const_Node_Iterator, Node_Iterator, Allocator > + { + public: + typedef Allocator allocator_type; + typedef typename allocator_type::size_type size_type; + typedef size_type metadata_type; + typedef Const_Node_Iterator const_node_iterator; + typedef Node_Iterator node_iterator; + typedef + typename + allocator_type::template + rebind < metadata_type >::other::reference metadata_reference; + void operator () (node_iterator, const_node_iterator) const; + }; + template + < + typename + Const_Node_Iterator, + class + Node_Iterator, + class + Cmp_Fn, + class + Allocator + > + inline + void + tree_order_statistics_node_update + < + Const_Node_Iterator, + Node_Iterator, + Cmp_Fn, + Allocator + >::operator + () (node_iterator node_it, const_node_iterator end_nd_it) const + { + node_iterator l_child_it; + size_type + l_rank = (l_child_it == end_nd_it) ? : l_child_it.get_metadata (); + node_iterator r_child_it = node_it.get_r_child (); + size_type + r_rank = (r_child_it == end_nd_it) ? : r_child_it.get_metadata (); + const_cast + < metadata_reference > (node_it.get_metadata ()) = l_rank + r_rank; + } + namespace + { + template < typename, typename, typename, bool > struct value_type_base; + template + < + typename + Key, + typename + Allocator + > struct value_type_base <Key, null_mapped_type, Allocator, false > + { + typedef Key value_type; + typedef + typename + Allocator::template rebind < value_type >::other value_type_allocator; + typedef typename value_type_allocator::pointer pointer; + typedef typename value_type_allocator::const_pointer const_pointer; + typedef typename value_type_allocator::reference reference; + typedef typename value_type_allocator::const_reference const_reference; + }; + template + < + typename + Key, + typename + Mapped, typename Alloc, bool Store_Extra > struct vt_base_selector + { + typedef value_type_base < Key, Mapped, Alloc, Store_Extra > type; + }; + template + < + typename + Key, + typename + Mapped, + typename + Alloc, + bool + Store_Extra + > + struct + types_traits:vt_base_selector < Key, Mapped, Alloc, Store_Extra >::type + {}; + template < typename, class, class > struct dumconst_node_iterator; + template + < + typename + Key, + typename + Mapped, + class, + class + Node_And_It_Traits, class Allocator > class bin_search_tree_no_data_ + { + protected: + typedef + typename + Allocator::template + rebind + < typename Node_And_It_Traits::node >::other::pointer node_pointer; + typedef + typename + types_traits + < Key, Mapped, Allocator, false >::const_reference const_reference; + typedef typename Node_And_It_Traits::point_iterator point_iterator; + typedef typename Node_And_It_Traits::node_update node_update; + void rotate_right (node_pointer); + template + < + typename + Node_Update_ > void apply_update (node_pointer, Node_Update_ *); + }; + template + < + typename + Key, + typename + Mapped, + class + Cmp_Fn, + class + Node_And_It_Traits, + class + Allocator + > + void + bin_search_tree_no_data_ + < + Key, + Mapped, + Cmp_Fn, Node_And_It_Traits, Allocator >::rotate_right (node_pointer p_x) + { + node_pointer p_y = p_x->m_p_parent; + p_y->m_p_right = p_x; + apply_update (p_x, this); + apply_update (p_x->m_p_parent, (node_update *) this); + } + template + < + typename + Key, + typename + Mapped, + class + Cmp_Fn, + class + Node_And_It_Traits, + class + Allocator + > + template + < + typename + Node_Update_ + > + void + bin_search_tree_no_data_ + < + Key, + Mapped, + Cmp_Fn, + Node_And_It_Traits, + Allocator >::apply_update (node_pointer p_nd, Node_Update_ *) + { + node_update ()((p_nd), ((0))); + } + } + namespace detail + { + template < typename Key, typename Mapped, typename Cmp_Fn, typename Node_And_It_Traits, typename Allocator > class rb_tree_no_data_: + bin_search_tree_no_data_ + < Key, Mapped, Cmp_Fn, Node_And_It_Traits, Allocator > + { + typedef + bin_search_tree_no_data_ + < Key, Mapped, Cmp_Fn, Node_And_It_Traits, Allocator > base_type; + typedef typename base_type::node_pointer node_pointer; + public: + typedef typename base_type::const_reference const_reference; + typedef typename base_type::point_iterator point_iterator; + std::pair < point_iterator, bool > insert (const_reference); + void insert_fixup (node_pointer); + }; + template + < + typename + Key, + typename + Mapped, + typename + Cmp_Fn, + typename + Node_And_It_Traits, + typename + Allocator + > + std::pair + < + typename + rb_tree_no_data_ + < + Key, + Mapped, + Cmp_Fn, + Node_And_It_Traits, + Allocator + >::point_iterator, + bool + > + rb_tree_no_data_ + < + Key, + Mapped, + Cmp_Fn, Node_And_It_Traits, Allocator >::insert (const_reference) + { + std::pair < point_iterator, bool > ins_pair; +{ + insert_fixup (ins_pair.first.m_p_nd); + } + } + template + < + typename + Key, + typename + Mapped, + typename + Cmp_Fn, + typename + Node_And_It_Traits, + typename + Allocator + > + void + rb_tree_no_data_ + < + Key, + Mapped, + Cmp_Fn, + Node_And_It_Traits, Allocator >::insert_fixup (node_pointer p_nd) + { +{ +{ +{ + rotate_right (p_nd); + } + } + } + } + template + < + typename, + typename, typename, typename, typename > struct container_base_dispatch; + template + < + typename + Key, + typename + Policy_Tl, + typename + Alloc + > + struct + container_base_dispatch + <Key, null_mapped_type, rb_tree_tag, Policy_Tl, Alloc > + { + typedef __gnu_cxx::typelist::at_index < Policy_Tl, 0 > at0; + typedef typename at0::type at0t; + typedef __gnu_cxx::typelist::at_index < Policy_Tl, 1 > at1; + typedef typename at1::type at1t; + typedef + rb_tree_no_data_ < Key, null_mapped_type, at0t, at1t, Alloc > type; + }; + template + < + typename + Node_Pointer, + typename, + typename, + typename, + typename, typename, bool, class > class bin_search_tree_const_it_ + { + public: + Node_Pointer m_p_nd; + }; + template + < + typename + Node, + class + Const_Iterator, + class Iterator, class Allocator > class bin_search_tree_const_node_it_ + { + typedef + typename + Allocator::template rebind < Node >::other::pointer node_pointer; + public: + typedef typename Node::metadata_type metadata_type; + typedef + typename + Allocator::template + rebind + < metadata_type >::other::const_reference const_metadata_reference; + bin_search_tree_const_node_it_ (node_pointer p_nd): + m_p_nd ((p_nd)) + {} + const_metadata_reference get_metadata () + { + return (m_p_nd->get_metadata ()); + } + bin_search_tree_const_node_it_ () + {} + bin_search_tree_const_node_it_ + < Node, Const_Iterator, Iterator, Allocator > get_r_child () + { + return ((m_p_nd->m_p_right)); + } + bool operator == (bin_search_tree_const_node_it_) + {} + node_pointer m_p_nd; + }; + template + < + typename, + typename, + class, + template + < + typename, + class, + class, class > class, class, class > struct bin_search_tree_traits; + template + < + typename + Key, + class + Cmp_Fn, + template + < + typename, + class, + class, + class + > + class + Node_Update, + class + Node, + class + Allocator + > + struct + bin_search_tree_traits + <Key, null_mapped_type, Cmp_Fn, Node_Update, Node, Allocator > + { + typedef + types_traits < Key, null_mapped_type, Allocator, false > type_traits; + typedef Node node; + typedef + bin_search_tree_const_it_ + < + typename + Allocator::template + rebind + < + node + >::other::pointer, + typename + type_traits::value_type, + typename + type_traits::pointer, + typename + type_traits::const_pointer, + typename + type_traits::reference, + typename + type_traits::const_reference, true, Allocator > const_point_iterator; + typedef const_point_iterator point_iterator; + typedef + bin_search_tree_const_node_it_ + < + Node, + const_point_iterator, point_iterator, Allocator > const_node_iterator; + typedef const_node_iterator node_iterator; + typedef + Node_Update + < const_node_iterator, node_iterator, Cmp_Fn, Allocator > node_update; + }; + template < typename Node_Update, bool > struct tree_metadata_helper + { + typedef typename Node_Update::metadata_type type; + }; + template + < + typename + Key, + typename + Data, + class + Cmp_Fn, + template + < + typename, + class, + class, + class + > + class Node_Update, class Allocator > struct tree_node_metadata_selector + { + typedef + dumconst_node_iterator < Key, Data, Allocator > dumconst_node_it; + enum + { + null_update = is_same < Node_Update < dumconst_node_it, + dumconst_node_it, + Cmp_Fn, + Allocator >, + null_tree_node_update < dumconst_node_it, + dumconst_node_it, + Cmp_Fn, + Allocator > >::value + }; + typedef + typename + tree_metadata_helper + < + Node_Update + < + dumconst_node_it, + dumconst_node_it, Cmp_Fn, Allocator >, null_update >::type type; + }; + template + < + typename, + typename, + class, + template + < + typename, + class, class, class > class, class, class > struct tree_traits; + template < typename Value_Type, class Metadata, class Allocator > struct rb_tree_node_ + { + typedef Metadata metadata_type; + typedef + typename + Allocator::template + rebind + < + rb_tree_node_ + < Value_Type, Metadata, Allocator > >::other::pointer node_pointer; + typedef + typename + Allocator::template + rebind < metadata_type >::other::reference metadata_reference; + metadata_reference get_metadata () + { + return m_metadata; + } + node_pointer m_p_right; + node_pointer m_p_parent; + metadata_type m_metadata; + }; + template + < + typename + Key, + typename + Mapped, + typename + Cmp_Fn, + template + < + typename, + class, + class, + class + > + class + Node_Update, + typename + Allocator + > + struct + tree_traits + <Key, + Mapped, + Cmp_Fn, + Node_Update, + rb_tree_tag, + Allocator + >:bin_search_tree_traits + < + Key, + Mapped, + Cmp_Fn, + Node_Update, + rb_tree_node_ + < + typename + types_traits + < + Key, + Mapped, + Allocator, + false + >::value_type, + typename + tree_node_metadata_selector + < + Key, + Mapped, Cmp_Fn, Node_Update, Allocator >::type, Allocator >, Allocator > + {}; + } +template < typename Key, typename Mapped, typename Tag, typename Policy_Tl, typename Allocator > class container_base: + public + detail::container_base_dispatch + < Key, Mapped, Tag, Policy_Tl, Allocator >::type + {}; +template < typename Key, typename Mapped, typename Tag, typename, typename Policy_Tl, typename Allocator > class basic_tree: + public + container_base < Key, Mapped, Tag, Policy_Tl, Allocator > + {}; + template + < + typename + Key, + typename + Mapped, + typename + Cmp_Fn + = + std::less + < + Key + >, + typename + Tag + = + rb_tree_tag, + template + < + typename, + typename, + typename, + typename + > + class + Node_Update + = + null_tree_node_update, + typename + Allocator + = + std::allocator + < + char + > >class + tree:public + basic_tree + < + Key, + Mapped, + Tag, + detail::tree_traits + < + Key, + Mapped, + Cmp_Fn, + Node_Update, + Tag, + Allocator + >, + typename + __gnu_cxx::typelist::create2 + < + Cmp_Fn, + detail::tree_traits + < Key, Mapped, Cmp_Fn, Node_Update, Tag, Allocator > >::type, Allocator > + {}; +} +using namespace std; +using namespace __gnu_pbds; +typedef + tree + < + int, + null_mapped_type, + less < int >, rb_tree_tag, tree_order_statistics_node_update > set_t; +main () +{ + set_t s; + s.insert (12); +} diff --git a/gcc/testsuite/g++.dg/opt/pr47632.C b/gcc/testsuite/g++.dg/opt/pr47632.C new file mode 100644 index 000000000..4b0572a61 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr47632.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// { dg-options "-O -fnon-call-exceptions -ftrapv" } + +template < typename > struct S +{ + int n; + void bar () + { + int *i = new int[n]; + } +}; + +void +foo (S < char >*s) +{ + s->bar (); +} + diff --git a/gcc/testsuite/g++.dg/opt/pr47639.c b/gcc/testsuite/g++.dg/opt/pr47639.c new file mode 100644 index 000000000..6ee8bb7de --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr47639.c @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-fnon-call-exceptions" } + +typedef int __attribute__ ((vector_size (8))) vec; + +vec foo (vec v1, vec v2) +{ + try + { + return v1 / v2; + } + catch (...) + { + throw; + } +} + diff --git a/gcc/testsuite/g++.dg/opt/pr48273.C b/gcc/testsuite/g++.dg/opt/pr48273.C new file mode 100644 index 000000000..4c5108bdd --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr48273.C @@ -0,0 +1,10 @@ +// { dg-do compile { target x86_64-*-* } } +// { dg-options "-fschedule-insns2 -fsel-sched-pipelining -fselective-scheduling2 -funroll-all-loops -march=core2" } + +void bar (); + +void foo () +{ + for (;;) + bar (); +} diff --git a/gcc/testsuite/g++.dg/opt/pr48549.C b/gcc/testsuite/g++.dg/opt/pr48549.C new file mode 100644 index 000000000..30799ee93 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr48549.C @@ -0,0 +1,63 @@ +// PR rtl-optimization/48549 +// { dg-do compile } +// { dg-options "-fcompare-debug -O2" } + +void +foo (void *from, void *to) +{ + long offset = reinterpret_cast <long>(to) - reinterpret_cast <long>(from); + if (offset != static_cast <int>(offset)) + *(int *) 0xC0DE = 0; + reinterpret_cast <int *>(from)[1] = offset; +} +struct A +{ + A () : a () {} + A (void *x) : a (x) {} + void *bar () { return a; } + void *a; +}; +struct C; +struct D; +struct E : public A +{ + C m1 (int); + D m2 (); + E () {} + E (A x) : A (x) {} +}; +struct C : public E +{ + C () {} + C (void *x) : E (x) {} +}; +struct D : public E +{ + D (void *x) : E (x) {} +}; +C +E::m1 (int x) +{ + return (reinterpret_cast <char *>(bar ()) + x); +} +D +E::m2 () +{ + return reinterpret_cast <char *>(bar ()); +} +struct B +{ + E a; + unsigned b : 16; + unsigned c : 1; +}; +void +baz (B *x) +{ + for (unsigned i = 0; i < 64; i++) + { + D d = x[i].a.m2 (); + C c = x[i].a.m1 (x[i].c); + foo (d.bar (), c.bar ()); + } +} diff --git a/gcc/testsuite/g++.dg/opt/pr48967.C b/gcc/testsuite/g++.dg/opt/pr48967.C new file mode 100644 index 000000000..db2ea5474 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr48967.C @@ -0,0 +1,98 @@ +// PR debug/48967 +// { dg-do compile } +// { dg-options "-g -O2" } + +template <typename> struct A; +template <typename T> struct A <T *> +{ + typedef T ref; +}; +template <typename T, typename> struct B +{ + typedef A <T> t; + typedef typename t::ref ref; + ref operator * () { return ref (); } +}; +template <typename T> struct I +{ + typedef T *cp; + template <typename T1> struct J + { + typedef I <T1> other; + }; +}; +template <typename T> struct S : public I <T> +{ +}; +template <typename T, typename _A> struct E +{ + typedef typename _A::template J <T>::other at; +}; +template <typename T, typename _A = S <T> > struct D +{ + typedef E <T, _A> _Base; + typedef typename _Base::at at; + typedef typename at::cp cp; + typedef B <cp, D> H; +}; +template <class T> struct F +{ + T *operator -> () { return __null; } +}; +template <typename T> long +lfloor (T x) +{ + return static_cast <long>(x) - (x && x != static_cast <long>(x)); +} +template <typename T> long +lround (T x) +{ + return lfloor (x - 0.5) + 1; +} +class M; +template <typename> class P; +typedef P <M> Q; +template <typename> struct P +{ + float x (); +}; +struct CV +{ + Q c; +}; +struct C +{ + void foo (const CV &) const; + class O; + typedef D <F <O> > R; + R n; +}; +struct S3 +{ + S3 (int, int); +}; +struct S2 +{ + S3 sx, sy; + S2 (int x = 0, int y = 0, int s = 0, int t = 0) : sx (x, y), sy (s, t) {} +}; +template <typename> struct N +{ + int bar (); +}; +struct C::O +{ + N <float> o; + void foo (CV r, int) + { + Q c = r.c; + float t = 0.5 * (o.bar ()); + S2 (lround (c.x ()), t); + } +}; +void +C::foo (const CV &w) const +{ + R::H m; + (*m)->foo (w, 8); +} diff --git a/gcc/testsuite/g++.dg/opt/pr49264.C b/gcc/testsuite/g++.dg/opt/pr49264.C new file mode 100644 index 000000000..dc23740f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr49264.C @@ -0,0 +1,19 @@ +// PR c++/49264 +// { dg-do compile } +// { dg-options "-O2" } + +struct B { }; +struct A { char a[sizeof (B) + 1]; } a; + +static inline void +foo (const B &b) +{ + __builtin_memcpy (&a, &b, sizeof (b)); +} + +void +bar () +{ + B c; + foo (c); +} diff --git a/gcc/testsuite/g++.dg/opt/pr6713.C b/gcc/testsuite/g++.dg/opt/pr6713.C new file mode 100644 index 000000000..d89fef81b --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr6713.C @@ -0,0 +1,117 @@ +// PR optimization/6713 +// This testcase segfaulted on x86 because a dangling REG_EQUAL note +// resulted in incorrect substitutions later. +// { dg-do run } +// { dg-options "-O2" } + +template<typename _CharT> class basic_iterator +{ + public: + basic_iterator(_CharT* _p) : _M_current(_p) {} + basic_iterator& operator++() { ++_M_current; return *this; } + _CharT& operator*() const { return *_M_current; } + bool operator!=(basic_iterator &_rhs) { return _M_current != _rhs._M_current; } + + private: + _CharT* _M_current; +}; + +template<typename _CharT> class basic_string +{ + public: + typedef unsigned int size_type; + typedef basic_iterator<_CharT> iterator; + + private: + struct _Rep + { + size_type _M_length; + size_type _M_capacity; + int _M_references; + + bool _M_is_leaked() const { return _M_references < 0; } + bool _M_is_shared() const { return _M_references > 0; } + void _M_set_leaked() { _M_references = -1; } + void _M_set_sharable() { _M_references = 0; } + }; + + struct _Rep _M_rep; + + struct _Alloc_hider + { + _CharT _raw[16]; + _CharT* _M_p; + }; + + mutable _Alloc_hider _M_dataplus; + + _CharT* _M_data() const { return _M_dataplus._M_p; } + + void _M_leak() { if (!_M_rep._M_is_leaked()) _M_leak_hard(); } + + static int count; + + static void _M_leak_hard(); + + public: + explicit basic_string(const _CharT* __s); + + iterator begin() { _M_leak(); return iterator(_M_data()); } + + iterator end() { _M_leak(); return iterator(_M_data() + this->size()); } + + size_type size() const { return _M_rep._M_length; } +}; + +template<typename _CharT> basic_string<_CharT>:: +basic_string(const _CharT* __s) +{ + int i; + + for (i=0; i<15; i++) { + if (!__s[i]) + break; + + _M_dataplus._raw[i] = __s[i]; + } + + _M_dataplus._raw[i] = 0; + _M_dataplus._M_p = _M_dataplus._raw; + + _M_rep._M_length = i; + _M_rep._M_capacity = i; + _M_rep._M_references = 1; +} + +template<typename _CharT> int basic_string<_CharT>::count = 0; + +template<typename _CharT> void basic_string<_CharT>:: +_M_leak_hard() +{ + count++; +} + +typedef basic_string<char> string; + +template int basic_string<char>::count; + +int isspa(int ch) +{ + return 0; +} + +void foo(string& str) +{ + string::iterator it = str.begin(); + string::iterator stop = str.end(); + + for (; it != stop; ++it) + if (isspa(*it)) + break; +} + +int main() +{ + string str("test"); + foo(str); +} diff --git a/gcc/testsuite/g++.dg/opt/pr7503-1.C b/gcc/testsuite/g++.dg/opt/pr7503-1.C new file mode 100644 index 000000000..d366a6180 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr7503-1.C @@ -0,0 +1,148 @@ +// PR c++/7503 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort(); + +void test1a() +{ + int A = 4; + int B = 4; + + (A > B ? A : B) = 1; + if (A != 4 || B != 1) + abort (); +} + +void test1b() +{ + int A = 3; + int B = 5; + + (A > B ? A : B) = 1; + if (A != 3 || B != 1) + abort (); +} + +void test1c() +{ + int A = 5; + int B = 3; + + (A > B ? A : B) = 1; + if (A != 1 || B != 3) + abort (); +} + +void test2a() +{ + int A = 4; + int B = 4; + + (A >= B ? A : B) = 1; + if (A != 1 || B != 4) + abort (); +} + +void test2b() +{ + int A = 3; + int B = 5; + + (A >= B ? A : B) = 1; + if (A != 3 || B != 1) + abort (); +} + +void test2c() +{ + int A = 5; + int B = 3; + + (A >= B ? A : B) = 1; + if (A != 1 || B != 3) + abort (); +} + +void test3a() +{ + int A = 4; + int B = 4; + + (A < B ? A : B) = 1; + if (A != 4 || B != 1) + abort (); +} + +void test3b() +{ + int A = 3; + int B = 5; + + (A < B ? A : B) = 1; + if (A != 1 || B != 5) + abort (); +} + +void test3c() +{ + int A = 5; + int B = 3; + + (A < B ? A : B) = 1; + if (A != 5 || B != 1) + abort (); +} + +void test4a() +{ + int A = 4; + int B = 4; + + (A <= B ? A : B) = 1; + if (A != 1 || B != 4) + abort (); +} + +void test4b() +{ + int A = 3; + int B = 5; + + (A <= B ? A : B) = 1; + if (A != 1 || B != 5) + abort (); +} + +void test4c() +{ + int A = 5; + int B = 3; + + (A <= B ? A : B) = 1; + if (A != 5 || B != 1) + abort (); +} + + +int main() +{ + test1a(); + test1b(); + test1c(); + + test2a(); + test2b(); + test2c(); + + test3a(); + test3b(); + test3c(); + + test4a(); + test4b(); + test4c(); + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/opt/preinc1.C b/gcc/testsuite/g++.dg/opt/preinc1.C new file mode 100644 index 000000000..89a0116b0 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/preinc1.C @@ -0,0 +1,59 @@ +// PR optimization/6086 +// { dg-do run } +// { dg-options "-O" } + +extern "C" void abort (void); + +struct A +{ + A (int x, int y); + int a, b; + int foo () { return a; } + int bar () { return b; } +}; + +struct B +{ + virtual ~B (); + virtual A baz () const; +}; + +struct C +{ + A foo () const; + B *c; +}; + +A C::foo () const +{ + int x, y; + x = c->baz ().foo (); + y = c->baz ().bar (); + return A (x, y); +} + +A B::baz () const +{ + return A (4, 8); +} + +A::A (int x, int y) +{ + a = x; + b = y; +} + +B::~B () +{ +} + +int +main () +{ + C the_c; + B the_b; + the_c.c = &the_b; + if (the_c.foo().a != 4) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/ptrintsum1.C b/gcc/testsuite/g++.dg/opt/ptrintsum1.C new file mode 100644 index 000000000..a6a3c9727 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/ptrintsum1.C @@ -0,0 +1,29 @@ +// PR c++/4401 +// This testcase was miscompiled on 64-bit platforms, resulting to +// operating on a[0x100000000] instead of a[0]. +// { dg-do run } +// { dg-options "-O2" } + +char *a; +char b[] = "AAAA"; + +extern "C" void abort (void); +extern "C" void exit (int); + +void foo (void) +{ + unsigned int i, j; + + i = 2; + j = 3; + a[i + 1 - j] += i; +} + +int main (void) +{ + a = b; + foo (); + if (b[0] != 'A' + 2) + abort (); + exit (0); +} diff --git a/gcc/testsuite/g++.dg/opt/ptrmem1.C b/gcc/testsuite/g++.dg/opt/ptrmem1.C new file mode 100644 index 000000000..0a02a53a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/ptrmem1.C @@ -0,0 +1,12 @@ +// { dg-options "-O2" } + +class QWidget +{ + public: void repaint( bool erase = 1 ); +}; +void f (void) +{ + typedef void (QWidget::*A)(bool); + A b = &QWidget::repaint; +} + diff --git a/gcc/testsuite/g++.dg/opt/ptrmem2.C b/gcc/testsuite/g++.dg/opt/ptrmem2.C new file mode 100644 index 000000000..19c43f7cd --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/ptrmem2.C @@ -0,0 +1,12 @@ +typedef unsigned int Mword; +struct Thread +{ + Mword sys_ipc_log(); + void hook_ipc_vector(); + unsigned (Thread::*syscall_table)(); +}; + +void Thread::hook_ipc_vector() +{ + syscall_table = &Thread::sys_ipc_log; +} diff --git a/gcc/testsuite/g++.dg/opt/ptrmem3.C b/gcc/testsuite/g++.dg/opt/ptrmem3.C new file mode 100644 index 000000000..552a92c9c --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/ptrmem3.C @@ -0,0 +1,23 @@ +// { dg-options "-O1" } + +#include <stdio.h> +struct A { + A(int arg) : ia(arg) {} + int x,y,z,ia; + int mf(int arg) { return arg + ia; } +}; +int func(int A::*pdm, int (A::*pmf)(int)) // 2. regular function +{ + A oa(2); + return ((&oa)->*pdm) + (oa.*pmf)(2); +} +int main() +{ + int val; + + int A::*pda = &A::ia; + int (A::*pmfa)(int) = &A::mf; + val = func( pda, pmfa ); + if(val != 6) + printf("val=%d, expect 6 \n", val); +} diff --git a/gcc/testsuite/g++.dg/opt/ptrmem4.C b/gcc/testsuite/g++.dg/opt/ptrmem4.C new file mode 100644 index 000000000..ad39a371b --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/ptrmem4.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// { dg-options "-O3" } + +struct X { void foo (); }; + +template <typename> +inline void spawn (void (X::*fun_ptr)()) {} + +void bar () { + void (X::*const comp)() = &X::foo; + spawn<int> (comp); +} diff --git a/gcc/testsuite/g++.dg/opt/ptrmem5.C b/gcc/testsuite/g++.dg/opt/ptrmem5.C new file mode 100644 index 000000000..639ad2831 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/ptrmem5.C @@ -0,0 +1,19 @@ +// PR tree-opt/18904 +// { dg-do compile } +// { dg-options "-O3" } + +struct Data; +struct Wrapper { + Data* D; +}; +struct Data { + int X; + void init(Wrapper&); +}; +void Data::init( Wrapper &w ) { + int Data::* res = &Data::X; + w.D = this; + for( int i = 0; i < 4; i++ ) + (w.D->*res) = 0; +} + diff --git a/gcc/testsuite/g++.dg/opt/ptrmem6.C b/gcc/testsuite/g++.dg/opt/ptrmem6.C new file mode 100644 index 000000000..891c4ff17 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/ptrmem6.C @@ -0,0 +1,28 @@ +// PR tree-opt/18040 +// { dg-do compile } +// { dg-options "-O3" } + +int PyObject_IsTrue(); +struct object_base +{ + void ptr() const; + void ptr1() const; +}; +struct object : public object_base +{ + typedef void (object::*bool_type)() const; + inline operator bool_type() const + { return PyObject_IsTrue() + ? &object_base::ptr : &object::ptr1; } +}; +void f(); +void g (void) +{ + for (unsigned n = 0; n < 100; ++n) + { + object kv; + if (kv) + f(); + } +} + diff --git a/gcc/testsuite/g++.dg/opt/range-test-1.C b/gcc/testsuite/g++.dg/opt/range-test-1.C new file mode 100644 index 000000000..cc5ba6694 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/range-test-1.C @@ -0,0 +1,216 @@ +// Test fold-const.c (fold_range_test) optimizations. +// { dg-do run } */ +// { dg-options "-O2" } */ + +#ifndef __RANGE_TEST_HDR_INCL +#define __RANGE_TEST_HDR_INCL +/* Protect against fix-header weakness */ +#include <stdlib.h> +#include <stdio.h> +#include <limits.h> +#endif + +#if (INT_MAX == 2147483647) && (INT_MIN == -2147483648) \ + && (SCHAR_MIN == -128) && (SCHAR_MAX == 127) \ + && (UCHAR_MIN == 0) && (UCHAR_MAX == 255) + +#ifndef T + +enum integers +{ + int_smallest = INT_MIN, + int_2ndsmallest = INT_MIN + 1, + int_3rdsmallest = INT_MIN + 2, + int_minus2 = -2, + int_minus1 = -1, + int_zero = 0, + int_one = 1, + int_two = 2, + int_3rdlargest = INT_MAX - 2, + int_2ndlargest = INT_MAX - 1, + int_largest = INT_MAX +}; + +enum smallenum +{ + smalle_minus4 = -4, + smalle_minus3 = -3, + smalle_minus2 = -2, + smalle_minus1 = -1, + smalle_zero = 0, + smalle_one = 1, + smalle_two = 2, + smalle_three = 3 +}; + +enum enum2 +{ + enum2_two = 2, + enum2_three = 3, + enum2_four = 4, + enum2_five = 5 +}; + +enum enum3 +{ + enum3_zero, + enum3_one, + enum3_two, + enum3_three, + enum3_four, + enum3_five, + enum3_six, + enum3_seven +}; + +int var; +void +check () +{ + ++var; +} + +#define T(IDX, TYPE, TEST, YESARR, NOARR) \ +void __attribute__((noinline)) \ +test##IDX (TYPE x) \ +{ \ + if (TEST) \ + check (); \ +} +#include "range-test-1.C" +#undef T + +int +main () +{ + int i, fails = 0; + +#define C , +#define T(IDX, TYPE, TEST, YESARR, NOARR) \ + { \ + static TYPE yesarr##IDX [] = YESARR; \ + static TYPE noarr##IDX [] = NOARR; \ + for (i = 0; i < (int) (sizeof (yesarr##IDX) / sizeof (TYPE)); ++i) \ + { \ + var = 0; \ + test##IDX (yesarr##IDX [i]); \ + if (var != 1) \ + printf ("test" #IDX " failed for yesarr [%u]\n", i), ++fails; \ + } \ + var = 0; \ + for (i = 0; i < (int) (sizeof (noarr##IDX) / sizeof (TYPE)); ++i) \ + { \ + test##IDX (noarr##IDX [i]); \ + if (var != 0) \ + printf ("test" #IDX " failed for noarr [%u]\n", i), ++fails; \ + } \ + } +#include "range-test-1.C" +#undef T + + if (fails) + abort (); + + exit (0); +} + +#else + +/* Use `C' instead of `,' below to separate array entries. */ + +/* These ought to be all optimized into single comparison. */ +T(1, unsigned int, x == 0 || x == 1, + { 0 C 1 }, { -1U C 2 C 12 C 35 C 0x7fffffff C 0x80000000 }) +T(2, unsigned int, x == 0 || x == -1U || x == -2U, + { 0 C -1U C -2U }, { -3U C -6U C 1 C 2 C 12 C 35 C 0x7fffffff C 0x80000000 }) +T(3, unsigned int, x == 0 || x == 1 || x == 2, + { 0 C 1 C 2 }, { -3U C -6U C -1U C -2U C 12 C 35 C 0x7fffffff C 0x80000000 }) +T(4, unsigned int, x == 3 || x == 4 || x == 5 || x == 6, + { 3 C 4 C 5 C 6 }, { -3U C 0 C 1 C 2 C 7 C 8 C 12 C 0x7fffffff C 0x80000000 }) +T(5, unsigned int, x == -3U || x == -4U || x == -5U || x == -6U, + { -3U C -4U C -5U C -6U }, { -7U C -8U C -2U C -1U C 1 C 2 C 0x7fffffff C 0x80000000 }) +T(6, unsigned int, x == -3U || x == -4U || x == -5U, + { -3U C -4U C -5U }, { -6U C -7U C -8U C -2U C -1U C 1 C 2 C 0x7fffffff C 0x80000000 }) +T(7, char *, x == (char *) -3UL || x == (char *) -4UL || x == (char *) -5UL, + { (char *) -3UL C (char *) -4UL C (char *) -5UL }, + { (char *) -6UL C (char *) -20UL C (char *) -2UL C (char *) -1UL C (char *) 0 + C (char *) 1UL C (char *) 35UL C (char *) 0x7fffffffUL C (char *) 0x80000000UL }) +T(8, unsigned long, x == -2UL || x == -1UL || x == 0, + { 0 C -1UL C -2UL }, { -3UL C -6UL C 1 C 2 C 12 C 35 C 0x7fffffff C 0x80000000 }) +T(9, unsigned long, x >= -4UL || x <= 8, + { -4UL C -3UL C -2UL C -1UL C 0 C 1 C 2 C 3 C 4 C 5 C 6 C 7 C 8 }, + { -7UL C -5UL C 9 C 10 C 61 C 127 C 0x7fffffff C 0x80000000 }) +T(10, signed char, x == 0 || x == -1 || x == -2 || x == -3, + { 0 C -1 C -2 C -3 }, { -4 C -5 C 1 C 2 C 3 C 35 C -24 }) +T(11, int, x == 0 || x == 1, + { 0 C 1 }, { -1 C 2 C 12 C 35 C INT_MAX C INT_MIN }) +T(12, int, x == 0 || x == -1 || x == -2, + { 0 C -1 C -2 }, { -3 C -6 C 1 C 2 C 12 C 35 C INT_MAX C INT_MIN }) +T(13, int, x == 0 || x == 1 || x == 2, + { 0 C 1 C 2 }, { -3 C -6 C -1 C -2 C 12 C 35 C INT_MAX C INT_MIN }) +T(14, int, x == 3 || x == 4 || x == 5 || x == 6, + { 3 C 4 C 5 C 6 }, { -3 C 0 C 1 C 2 C 7 C 8 C 12 C INT_MAX C INT_MIN }) +T(15, int, x == -3 || x == -4 || x == -5 || x == -6, + { -3 C -4 C -5 C -6 }, { -7 C -8 C -2 C -1 C 1 C 2 C INT_MAX C INT_MIN }) +T(16, int, x == -3 || x == -4 || x == -5, + { -3 C -4 C -5 }, { -6 C -7 C -8 C -2 C -1 C 1 C 2 C INT_MAX C INT_MIN }) +T(17, unsigned int, (x >= -8U && x <= -3U) || x == -2U || x == -1U || x == 0 || x == 1 || x == 2, + { -8U C -7U C -6U C -5U C -4U C -3U C -2U C -1U C 0 C 1 C 2 }, + { -9U C -10U C 3 C 4 C 12 C -54U C INT_MAX C INT_MIN }) +T(18, int, (x >= -8 && x <= -3) || x == -2 || x == -1 || x == 0 || x == 1 || x == 2, + { -8 C -7 C -6 C -5 C -4 C -3 C -2 C -1 C 0 C 1 C 2 }, + { -9 C -10 C 3 C 4 C 12 C -54 C INT_MAX C INT_MIN }) +T(19, unsigned long, x <= 16 || (x >= 18 && x <= -1UL), + { -3UL C -6UL C -1UL C 0 C 1 C 2 C 12 C 15 C 16 C 18 C 19 C 35 C 0x7fffffff + C 0x80000000 }, { 17 }) +T(20, char *, x == (char *) -1UL || x == 0, + { (char *) -1UL C 0 }, { (char *) -6UL C (char *) -20UL C (char *) -2UL + C (char *) 1UL C (char *) 35UL C (char *) 0x7fffffffUL C (char *) 0x80000000UL }) +T(21, integers, x == int_zero || x == int_one, + { int_zero C int_one }, { int_minus1 C int_two C int_largest C int_smallest }) +T(22, int, x == INT_MIN || x == INT_MAX, + { INT_MIN C INT_MAX }, + { -1 C 0 C 1 C INT_MAX - 1 C INT_MAX - 2 C INT_MIN + 1 C INT_MIN + 2 }) +T(23, int, x == INT_MIN + 1 || x == INT_MIN + 2 || x == INT_MIN || x == INT_MAX, + { INT_MIN + 1 C INT_MIN + 2 C INT_MIN C INT_MAX }, + { -1 C 0 C 1 C INT_MAX - 1 C INT_MAX - 2 C INT_MIN + 3 C INT_MIN + 4 }) +T(24, signed char, x == SCHAR_MIN || x == SCHAR_MAX, + { SCHAR_MIN C SCHAR_MAX }, + { -1 C 0 C 1 C SCHAR_MAX - 1 C SCHAR_MAX - 2 C SCHAR_MIN + 1 C SCHAR_MIN + 2 }) +T(25, integers, x == int_smallest || x == int_largest, + { int_smallest C int_largest }, { int_minus1 C int_zero C int_one + C int_2ndsmallest C int_2ndlargest C int_3rdsmallest C int_3rdlargest }) + +/* These should be optimized into unconditional jumps. */ +T(o1, unsigned long, x <= 16 || (x >= 17 && x <= -1UL), + { -3UL C -6UL C -1UL C 0 C 1 C 2 C 12 C 15 C 16 C 17 C 18 C 19 C 35 C 0x7fffffff + C 0x80000000 }, { }) +T(o2, unsigned long, x <= -3UL || (x == -2UL || x == -1UL), + { -3UL C -6UL C -1UL C 0 C 1 C 2 C 12 C 15 C 16 C 17 C 18 C 19 C 35 C 0x7fffffff + C 0x80000000 }, { }) + +/* These should be eventually optimized into a single comparison. */ +T(td1, unsigned char, x == 0 || x == 4 || x == 1 || x == 5 || x == 2 || x == 6 || x == 3, + { 0 C 1 C 2 C 3 C 4 C 5 C 6 }, { 7 C 8 C 127 C 128 C 254 C 255 }) + +/* These should not be optimized into a single comparison. */ +T(n1, smallenum, x == smalle_minus4 || x == smalle_three, + { smalle_minus4 C smalle_three }, { smalle_minus3 C smalle_minus2 C smalle_minus1 + C smalle_zero C smalle_one C smalle_two }) +T(n2, enum2, x == enum2_two || x == enum2_five, + { enum2_two C enum2_five }, { enum2_three C enum2_four }) +T(n3, enum3, x == enum3_zero || x == enum3_seven, + { enum3_zero C enum3_seven }, { enum3_one C enum3_two C enum3_three C enum3_four + C enum3_five C enum3_six }) + +#endif + +#else + +int +main (void) +{ + return 0; +} + +#endif diff --git a/gcc/testsuite/g++.dg/opt/range-test-2.C b/gcc/testsuite/g++.dg/opt/range-test-2.C new file mode 100644 index 000000000..05690bfd0 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/range-test-2.C @@ -0,0 +1,96 @@ +// Test fold-const.c (fold_range_test) optimizations. +// { dg-do run } */ +// { dg-options "-O2" } */ + +#include <stdlib.h> +#include <stdio.h> +#include <limits.h> + +#if (INT_MAX == 2147483647) && (INT_MIN == -2147483648) \ + && (SCHAR_MIN == -128) && (SCHAR_MAX == 127) \ + && (UCHAR_MIN == 0) && (UCHAR_MAX == 255) + +#ifndef T + +enum enum3 +{ + enum3_zero, + enum3_one, + enum3_two, + enum3_three, + enum3_four, + enum3_five, + enum3_six, + enum3_seven +}; + +int var; +void +check () +{ + ++var; +} + +#define T(IDX, TYPE, TEST, YESARR, NOARR) \ +void __attribute__((noinline)) \ +test##IDX (TYPE x) \ +{ \ + if (TEST) \ + check (); \ +} +#include "range-test-2.C" +#undef T + +int +main () +{ + int i, fails = 0; + +#define C , +#define T(IDX, TYPE, TEST, YESARR, NOARR) \ + { \ + static TYPE yesarr##IDX [] = YESARR; \ + static TYPE noarr##IDX [] = NOARR; \ + for (i = 0; i < (int) (sizeof (yesarr##IDX) / sizeof (TYPE)); ++i) \ + { \ + var = 0; \ + test##IDX (yesarr##IDX [i]); \ + if (var != 1) \ + printf ("test" #IDX " failed for yesarr [%u]\n", i), ++fails; \ + } \ + var = 0; \ + for (i = 0; i < (int) (sizeof (noarr##IDX) / sizeof (TYPE)); ++i) \ + { \ + test##IDX (noarr##IDX [i]); \ + if (var != 0) \ + printf ("test" #IDX " failed for noarr [%u]\n", i), ++fails; \ + } \ + } +#include "range-test-2.C" +#undef T + + if (fails) + abort (); + + exit (0); +} + +#else + +/* Use `C' instead of `,' below to separate array entries. */ + +T(26, enum3, x == enum3_one || x == enum3_two || x == enum3_three, + { enum3_one C enum3_two C enum3_three }, { enum3_zero C enum3_four + C enum3_five C enum3_six C enum3_seven }) + +#endif + +#else + +int +main (void) +{ + return 0; +} + +#endif diff --git a/gcc/testsuite/g++.dg/opt/reg-stack.C b/gcc/testsuite/g++.dg/opt/reg-stack.C new file mode 100644 index 000000000..76d3cee1b --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/reg-stack.C @@ -0,0 +1,47 @@ +// PR target/6087 +// The code that moves around insns emitted by reg-stack to cope with +// exception edges lost the REG_DEAD note indicating a pop. Which +// eventually fills up the register stack resulting in Z == NaN. + +// { dg-do run } +// { dg-options "-O" } + +extern "C" void abort (); + +struct Base +{ + virtual ~Base() {} +}; + +struct Foo : public Base +{ + Foo (); +}; + +double x = 3; +double y = 4; + +double bar () +{ + double z = x*x+y*y; + if (z != 25.0) + throw 1; + return z; +} + +Foo::Foo () +{ + bar (); +} + +int main () +{ + try { + int i; + for (i = 0; i < 10; ++i) + new Foo; + } catch (...) { + abort (); + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/reg-stack2.C b/gcc/testsuite/g++.dg/opt/reg-stack2.C new file mode 100644 index 000000000..08cd590b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/reg-stack2.C @@ -0,0 +1,34 @@ +// PR target/9786 +// Origin: <nick@ilm.com> + +// This used to fail on x86 because the reg-stack pass deleted +// an insn that could seemingly trap (but actually doesn't) +// without updating the CFG. + +// { dg-do compile } +// { dg-options "-O2 -fnon-call-exceptions" } + +struct D1 { + float l; + D1 GS() const {D1 d;float f=.299*l;d.l=f;return d;} + static D1 G() {return D1();} +}; + +struct D2 { + D1 g; + D2(const D1& gi) : g(gi) {} + D2 GS() const {return D2(g.GS());} +}; + +class A { + public: + virtual ~A() {} +}; + +class B : public A { + public: + B(const D2& mi); + D2 fm; +}; + +B::B(const D2 &mi) : fm(mi.GS()) {} diff --git a/gcc/testsuite/g++.dg/opt/reg-stack3.C b/gcc/testsuite/g++.dg/opt/reg-stack3.C new file mode 100644 index 000000000..48dcb335b --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/reg-stack3.C @@ -0,0 +1,21 @@ +// PR target/12712 +// Origin: Markus Schoder <gccbug@gammarayburst.de> + +// This used to segfault on x86 because the reg-stack pass +// created an unreachable basic block by purging an outgoing +// edge, and was not prepared to handle it. + +// { dg-do compile } + +struct A +{ + ~A(); + float f(float x); + float g() const {return 0;} +}; + +void h() +{ + A a, b; + a.f(b.g() + 1); +} diff --git a/gcc/testsuite/g++.dg/opt/reg-stack4.C b/gcc/testsuite/g++.dg/opt/reg-stack4.C new file mode 100644 index 000000000..b1b743416 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/reg-stack4.C @@ -0,0 +1,29 @@ +// PR target/12900 +// Origin: <snyder@fnal.gov> + +// This used to fail on x86 because the reg-stack pass +// deleted a valid edge. + +// { dg-do compile } +// { dg-options "-mtune=i586 -O2" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } + +struct array { + double data; + virtual ~array(); +}; + +double glob; +double ext1(double); +int nmuons; + +void track_match() +{ + array vecdca; + if (glob < 10) return; + double p = glob*5; + double phi = vecdca.data; + ext1 (vecdca.data-glob); + ext1 (phi*2); + if (1 < p) + ++nmuons; +} diff --git a/gcc/testsuite/g++.dg/opt/reload1.C b/gcc/testsuite/g++.dg/opt/reload1.C new file mode 100644 index 000000000..0d8fb894e --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/reload1.C @@ -0,0 +1,43 @@ +// PR 7944 +// { dg-do compile } +// { dg-options -O2 } + +struct B +{ + B & operator << (short s) + { + int j; + if (j) + return operator << (s); + else + return operator << (s); + } +}; + +struct A +{ + int i; + static void bar (); + static int quux () + { + bar (); + return 0; + } + + A ():i (quux ()) + { + } + ~A () + { + } +}; + +void +foo () +{ + short s[4] = { 0, 0, 0, 1 }; + A a[2] = { A (), A () }; + + B b; + b << s[0] << s[2]; +} diff --git a/gcc/testsuite/g++.dg/opt/reload2.C b/gcc/testsuite/g++.dg/opt/reload2.C new file mode 100644 index 000000000..1af8aea65 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/reload2.C @@ -0,0 +1,42 @@ +// PR 10352 +// { dg-do compile } +// { dg-options -O2 } + +extern double fabs(double x); + +typedef struct { float x, y; } S; +typedef struct _T T; + +extern void fT( T *p ); +extern T *h(); +extern S g( ); + +static +int f(void) +{ + T *t=0; + int c=0; + S s; + + const S exp_s = {0.,0.}; + + if(!(t = h())) + { + c++; + } + + if(!c) + { + s = g(); + if( (fabs( (s.x) - (exp_s.x) ) > 1 ) + || (fabs( (s.y) - (exp_s.y) ) > 1 ) ) + { + c++; + } + } + + if(t) + fT(t); + + return c; +} diff --git a/gcc/testsuite/g++.dg/opt/reload3.C b/gcc/testsuite/g++.dg/opt/reload3.C new file mode 100644 index 000000000..12f3e66f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/reload3.C @@ -0,0 +1,39 @@ +// PR target/38287 +// { dg-do run } +// { dg-options "-O2 -mcpu=v8 -fPIC" { target { { sparc*-*-* } && { ilp32 && fpic } } } } + +#include <cstdlib> + +class QTime +{ +public: + explicit QTime(int ms = 0) : ds(ms) {} + static QTime currentTime() { return QTime(); } + QTime addMSecs(int ms) const; + int msecs() const { return ds; } +private: + unsigned ds; +}; + +static const unsigned MSECS_PER_DAY = 86400000; + +QTime QTime::addMSecs(int ms) const +{ + QTime t; + if ( ms < 0 ) { + // % not well-defined for -ve, but / is. + int negdays = (MSECS_PER_DAY-ms) / MSECS_PER_DAY; + t.ds = ((int)ds + ms + negdays*MSECS_PER_DAY) + % MSECS_PER_DAY; + } else { + t.ds = ((int)ds + ms) % MSECS_PER_DAY; + } + return t; +} + +int main() +{ + if (QTime(1).addMSecs(1).msecs() != 2) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/return-slot1.C b/gcc/testsuite/g++.dg/opt/return-slot1.C new file mode 100644 index 000000000..fcc6cea5a --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/return-slot1.C @@ -0,0 +1,14 @@ +// { dg-do compile } +// { dg-options "-O2" } + +struct A +{ + A(); + virtual A foo() const; +}; + +void bar() +{ + const A& a=A(); + a.foo(); +} diff --git a/gcc/testsuite/g++.dg/opt/rtti1.C b/gcc/testsuite/g++.dg/opt/rtti1.C new file mode 100644 index 000000000..32daaefa6 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/rtti1.C @@ -0,0 +1,20 @@ +// Test that typeid sees through references even when optimizing. +// { dg-do run } +// { dg-options "-O2" } + +#include <typeinfo> + +struct A +{ + virtual ~A() { } +}; + +class B : public A { }; + +int main () +{ + B b; + A &aref = b; + + return typeid (aref) != typeid (b); +} diff --git a/gcc/testsuite/g++.dg/opt/rtti2.C b/gcc/testsuite/g++.dg/opt/rtti2.C new file mode 100644 index 000000000..ebbe3cdfd --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/rtti2.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-O2" } +// We used to ICE in compare_values as the types for a comparison +// were not the same kind of types. + +struct class1 +{ + virtual ~class1 (); +}; +struct class2 : class1 { }; + +void f(class1 * oo) +{ + class2 * oj = dynamic_cast <class2 *>(oo) ; + if (oj) + delete oo; +} diff --git a/gcc/testsuite/g++.dg/opt/stack1.C b/gcc/testsuite/g++.dg/opt/stack1.C new file mode 100644 index 000000000..7fac18dac --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/stack1.C @@ -0,0 +1,135 @@ +// PR optimization/11198 +// Origin: Joerg Walter <jhr.walter@t-online.de> +// Reduced testcase by: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// The compiler used to allocate the same stack slot for two aggregates, +// overlooking that assignments to members given the same address on the +// stack may not alias and thus may be reordered by the scheduling passes. + +// { dg-do run } +// { dg-options "-O2 -frename-registers" } + + +double zero_; + +inline const int& +min(const int& a, const int& b) { + if (b < a) return b; return a; +} + +struct barrier { barrier () {} }; + +template <typename=void> struct unbounded_array { + inline unbounded_array (): data_ (new double [9]) {} + inline double& operator [] (int i) { return data_ [i]; } + double* data_; +}; + +inline int element (int i, int j) { + return i + j; +} + +template <typename=void> +struct matrix { + inline matrix () : size2_ (3) {} + + inline unbounded_array<> &data () { return data_; } + + inline double& el (int i, int j) { + int dead1 = j; + int dead2 = 1 + i - j; + if (j < size2_ && i-j < 2) + return data () [element (j,i-j+1)]; + barrier (); + return zero_; + } + + struct iterator2; + + inline iterator2 find () { + return iterator2 (*this); + } + + struct iterator1 { + inline iterator1 (matrix *m): + dead1 (m), i (0) {} + void *dead1; + int i; + int dead2; + }; + + const int size2_; + unbounded_array<> data_; +}; + + +template<typename=void> +struct adaptor { + adaptor (matrix<> &m) : m(&m), upper_ (1) {} + + int size1 () const; + int size2 () const { return 3; } + int lower () const { return 1; } + int upper () const { return upper_; } + matrix<> &data () { return *m; } + + double& el (int i, int j) { + int dead1, dead2; + if (j < size2 () && i-j < 1) + return data ().el (i, j); + + barrier (); + return zero_; + } + + struct a_iterator2; + + struct a_iterator1 { + a_iterator1 (adaptor &a, const matrix<>::iterator1 &it1): + a (&a), dead1 (it1) {} + + a_iterator2 begin () const { + return a_iterator2(*a); + } + adaptor *a; + matrix<>::iterator1 dead1; + }; + + struct a_iterator2 { + a_iterator2 (adaptor &a) : a (&a) {} + + double& f () const { + int i = 0; + int l = a->upper () + i; + int q = a->size2 (); + if (0 < q && + l < a->lower () + 1 + a->upper ()) + return a->m->el(0,0); + + return a->el (i, 0); + } + + adaptor *a; + }; + + matrix<> *m; + int upper_; +}; + +void matrix_swap (adaptor<> &bam1, adaptor<> &bam2) +{ + adaptor<>::a_iterator1 it1 (bam1,matrix<>::iterator1(bam1.m)), + it2 (bam2,matrix<>::iterator1(bam2.m)); + int dead; + double x = it1.begin().f(); + it2.begin().f() = x; +} + +int main () +{ + matrix<> m1,m2; + adaptor<> bam1 (m1), bam2 (m2); + matrix_swap (bam1, bam2); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/static1.C b/gcc/testsuite/g++.dg/opt/static1.C new file mode 100644 index 000000000..05429e18b --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/static1.C @@ -0,0 +1,20 @@ +// PR c++/6073 +// This testcase ICEd because finish_struct_bits changed +// A's and const A's TYPE_MODE from QI to BLK, but did +// not change a's DECL_MODE because its mode was not +// TYPE_MAIN_VARIANT. + +struct A +{ + static const A a; + ~A (); +}; + +void bar (A x); +void foo (); + +void +foo () +{ + bar (A::a); +} diff --git a/gcc/testsuite/g++.dg/opt/static2.C b/gcc/testsuite/g++.dg/opt/static2.C new file mode 100644 index 000000000..e2ecd13c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/static2.C @@ -0,0 +1,13 @@ +// Origin: reichelt@igpm.rwth-aachen.de +// PR 5571 +// { dg-options "-O2" } + +template <class T> struct A {}; + +struct B +{ + static A<int> a; + void f() { a; } +}; + +A<int> B::a = A<int>(); diff --git a/gcc/testsuite/g++.dg/opt/static3.C b/gcc/testsuite/g++.dg/opt/static3.C new file mode 100644 index 000000000..4f8f7a9ba --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/static3.C @@ -0,0 +1,36 @@ +// { dg-do link } +// { dg-options "-O2" } + +class Foo { +public: + // No out-of-class definition is provided for these class members. + // That's technically a violation of the standard, but no diagnostic + // is required, and, as a QOI issue, we should optimize away all + // references. + static const int erf = 0; + static const int foo = 1; +}; + +int one() +{ + return Foo::foo; +} + +int two() +{ + return Foo::foo + Foo::erf; +} + +int three(int x) +{ + return x ? Foo::erf : Foo::foo; +} + +int i; + +int main () +{ + one (); + two (); + three (i); +} diff --git a/gcc/testsuite/g++.dg/opt/static4.C b/gcc/testsuite/g++.dg/opt/static4.C new file mode 100644 index 000000000..87e11b027 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/static4.C @@ -0,0 +1,15 @@ +// PR 13898 +// Make sure the two X variables get assigned unique assembler names +// if they are promoted to static storage. + +// { dg-do compile } + +int g(int i) { + if (i<1) { + const int x[3] = { 1,2,3 }; + return x[i]; + } else { + const int x[3] = { 4,5,6 }; + return x[i]; + } +} diff --git a/gcc/testsuite/g++.dg/opt/static5.C b/gcc/testsuite/g++.dg/opt/static5.C new file mode 100644 index 000000000..1daca6d71 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/static5.C @@ -0,0 +1,29 @@ +// PR c++/31809 +// { dg-do run } +// { dg-options "-O2" } + +struct S +{ + unsigned v; + static inline S f (unsigned a); +}; + +inline S +S::f (unsigned a) +{ + static S t = { a }; + return t; +} + +const static S s = S::f (26); + +extern "C" void abort (void); + +int +main () +{ + S t = s; + if (t.v != 26) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/static6.C b/gcc/testsuite/g++.dg/opt/static6.C new file mode 100644 index 000000000..00e76fb73 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/static6.C @@ -0,0 +1,35 @@ +// PR c++/31806 +// { dg-do run } +// { dg-options "-O2 -fno-inline -fno-threadsafe-statics" } + +extern "C" void abort(void); + +struct A +{ + void *d; +}; + +static const A& staticA() +{ + static A s_static; + return s_static; +} + +void assert_failed() +{ + abort(); +} + +A testMethod() +{ + static const A& s = staticA( ); + if (&s == 0) + assert_failed(); + return s; +} + +int main() +{ + testMethod(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/strength-reduce.C b/gcc/testsuite/g++.dg/opt/strength-reduce.C new file mode 100644 index 000000000..3fee937f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/strength-reduce.C @@ -0,0 +1,51 @@ +// This testcase was miscompiled on s390x, because strength-reduction +// did not see biv in C::foo as used after loop, but it was used +// in a REG_EQUAL note. +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort (void); + +struct C +{ + int foo (char ch, int offset = __INT_MAX__) const; + int bar (int offset, char c) const; + const char *a; +}; + +int C::bar (int offset, char c) const +{ + char ch = a[offset]; + if (ch < c) + return -1; + if (ch > c) + return 1; + return 0; +} + +int C::foo (char ch, int offset) const +{ + int len = __builtin_strlen (a); + if (len == 0) + return __INT_MAX__; + if (offset >= len) + offset = len - 1; + + while (bar (offset, ch) != 0) + { + if (offset == 0) + return __INT_MAX__; + offset--; + } + + return offset; +} + +int main (void) +{ + C c; + c.a = "/some/dir/file.ext"; + if (c.foo ('/') != 9) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/switch1.C b/gcc/testsuite/g++.dg/opt/switch1.C new file mode 100644 index 000000000..c21630d75 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/switch1.C @@ -0,0 +1,23 @@ +// { dg-options "-O1" } + +template <typename T> +int f(T t) { + switch (t) { + case 1: + return 5; + case 2: + return 6; + case 3: + return -4; + case 4: + return 8; + case 5: + return 12; + case 6: + return 13; + default: + return -27; + } +} + +template int f(int); diff --git a/gcc/testsuite/g++.dg/opt/switch2.C b/gcc/testsuite/g++.dg/opt/switch2.C new file mode 100644 index 000000000..f7374cb74 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/switch2.C @@ -0,0 +1,23 @@ +// { dg-do compile } +// { dg-options "-O2 -w" } + +extern int foo (int); + +void +bar (void) +{ + char tmp = foo (0); + switch (tmp) + { + case 1: foo (1); break; + case 2: foo (2); break; + case 3: foo (3); break; + case 4: foo (4); break; + case 5: foo (5); break; + case 6: foo (6); break; + case 7: foo (7); break; + case 255: foo (8); break; + default: break; + } +} + diff --git a/gcc/testsuite/g++.dg/opt/switch3.C b/gcc/testsuite/g++.dg/opt/switch3.C new file mode 100644 index 000000000..643cac323 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/switch3.C @@ -0,0 +1,16 @@ +// PR c++/20023 +// { dg-do compile } +// { dg-options "-O2" } + +void f (void); +typedef __SIZE_TYPE__ size_t; +void g (void *a) +{ + size_t b = (size_t) a; + switch (b) + { + case 1: + f (); + break; + } +} diff --git a/gcc/testsuite/g++.dg/opt/switch4.C b/gcc/testsuite/g++.dg/opt/switch4.C new file mode 100644 index 000000000..1542f310c --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/switch4.C @@ -0,0 +1,31 @@ +// { dg-do compile } +// { dg-options "-fshort-enums -w" } + +// PR c++/20008 + +// We failed to compile this because CFG cleanup left the switch +// statement intact, whereas expand_case expected at least one +// in-range case to remain. + +typedef enum _SECStatus { + SECWouldBlock = -2, + SECFailure = -1, + SECSuccess = 0 +} SECStatus; + +typedef enum { + SEC_ERROR_BAD_SIGNATURE = (-0x2000) + 10 +} SECErrorCodes; + +void g(void); +void f(SECStatus status) +{ + switch( status ) + { + case SEC_ERROR_BAD_SIGNATURE : + // This case can be optimized away in C++ (but apparently not in + // C), because the enum type is defined with a narrow range. + g(); + break ; + } +} diff --git a/gcc/testsuite/g++.dg/opt/temp1.C b/gcc/testsuite/g++.dg/opt/temp1.C new file mode 100644 index 000000000..dc13f5162 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/temp1.C @@ -0,0 +1,50 @@ +// PR c++/16405 +// { dg-options "-O2" } +// { dg-do run } + +// There should be exactly one temporary generated for the code in "f" +// below when optimizing -- for the result of "b + c". We have no +// easy way of checking that directly, so we count the number of calls +// to "memcpy", which is used on (some?) targets to copy temporaries. +// If there is more than two calls (one for coping "*this" to "t", and +// one for copying the temporary to "a"), then there are too many +// temporaries. + +int i; + +extern "C" +void *memcpy (void *dest, const void *src, __SIZE_TYPE__ n) +{ + char *d = (char *) dest; + const char *s = (const char *) src; + while (n--) + d[n] = s[n]; + ++i; + return dest; +} + +struct T { +#ifdef __SPU__ + /* SPU returns aggregates up to 1172 bytes in registers. */ + int a[300]; +#else + int a[128]; +#endif + T &operator+=(T const &v) __attribute__((noinline)); + T operator+(T const &v) const { T t = *this; t += v; return t; } +}; + +T &T::operator+=(T const &v) { + return *this; +} + +T a, b, c; + +void f() { a = b + c; } + +int main () { + i = 0; + f(); + if (i > 2) + return 1; +} diff --git a/gcc/testsuite/g++.dg/opt/temp2.C b/gcc/testsuite/g++.dg/opt/temp2.C new file mode 100644 index 000000000..35520a242 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/temp2.C @@ -0,0 +1,62 @@ +// { dg-do run } + +// Copyright (C) 2006 Free Software Foundation, Inc. + +// Originally from PR 16681, found also in init/array15.C +// This variant of the testcase verifies that we do not create +// a temporary on the stack, which is PR 27620. + +int i; + +extern "C" +void *memcpy (void *dest, const void *src, __SIZE_TYPE__ n) +{ + char *d = (char *) dest; + const char *s = (const char *) src; + while (n--) + d[n] = s[n]; + ++i; + return dest; +} + +struct foo { + unsigned char buffer[41112]; + foo() ; + bool check () const; +}; + +foo::foo () + : buffer() +{} + +bool foo::check () const +{ + for (unsigned ix = sizeof (buffer); ix--;) + if (buffer[ix]) + return false; + return true; +} + +void *operator new (__SIZE_TYPE__ size, void *p) +{ + return p; +} + +char heap[50000]; + +int main () +{ + for (unsigned ix = sizeof (heap); ix--;) + heap[ix] = ix; + + i = 0; + foo *f = new (heap) foo (); + + if (i != 0) + return 1; + if (!f->check ()) + return 1; + return 0; +} + + diff --git a/gcc/testsuite/g++.dg/opt/template1.C b/gcc/testsuite/g++.dg/opt/template1.C new file mode 100644 index 000000000..f25434693 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/template1.C @@ -0,0 +1,19 @@ +// { dg-options "-O2" } +// { dg-final { scan-assembler-not "\n_?_ZN1AILi0EE4foo1Ev\[: \t\n\]" } } + +template <int> +struct A { + void foo1 () throw (); + void foo2 (); + + void UNRELATED (); +}; + +template <> void A<0>::UNRELATED (); + +template <int dim> inline void A<dim>::foo1 () throw () {} +template <int dim> inline void A<dim>::foo2 () {} + +void bar (A<0> &a) { + a.foo1 (); +} diff --git a/gcc/testsuite/g++.dg/opt/thunk1.C b/gcc/testsuite/g++.dg/opt/thunk1.C new file mode 100644 index 000000000..566c0f2fc --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/thunk1.C @@ -0,0 +1,42 @@ +// PR 6788 +// Test that the thunk adjusts the this pointer properly. +// { dg-do run } + +extern "C" void abort (); + +struct A +{ + virtual void foo() = 0; + char large[33*1024]; +}; + +struct B +{ + virtual void foo() = 0; +}; + +struct C : public A, public B +{ + virtual void foo(); +}; + +static C *match; + +void C::foo() +{ + if (this != match) + abort (); +} + +void bar(B *x) +{ + x->foo(); +} + +int main() +{ + C obj; + match = &obj; + bar(&obj); + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/thunk2.C b/gcc/testsuite/g++.dg/opt/thunk2.C new file mode 100644 index 000000000..52fcd74bc --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/thunk2.C @@ -0,0 +1,44 @@ +// PR c++/20206 +// { dg-do run } +// { dg-options "-O0" } + +void +bar (int x) +{ + asm ("" : : "g" (x)); +} + +struct S { S () {}; virtual ~S () {}; }; +struct T { virtual void foo (int) = 0; }; +struct U : public S, public T +{ + bool a; + U () {} + virtual ~U () {} + virtual void foo (int x) + { + switch (x) + { + case 12: + break; + case 9: + bar (7); + break; + case 10: + bar (12); + break; + case 4: + bar (18); + break; + case 2: + bar (26); + break; + } + } +}; +U u; + +int +main () +{ +} diff --git a/gcc/testsuite/g++.dg/opt/thunk3-1.C b/gcc/testsuite/g++.dg/opt/thunk3-1.C new file mode 100644 index 000000000..c540b0fa2 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/thunk3-1.C @@ -0,0 +1,6 @@ +// { dg-do compile } +// { dg-options "-O1" } +struct Foo { }; +struct Bar { virtual ~Bar(); }; +struct Baz: public virtual Bar { virtual void Func (Foo); }; +void unused() { Baz().Func(Foo()); } diff --git a/gcc/testsuite/g++.dg/opt/thunk3.C b/gcc/testsuite/g++.dg/opt/thunk3.C new file mode 100644 index 000000000..bfd68744a --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/thunk3.C @@ -0,0 +1,48 @@ +// PR c++/39106 +// { dg-do compile } +// { dg-options "-O2" } + +extern "C" void abort (); + +struct A +{ + A (bool x = true); +}; +class B +{ + virtual bool bar (A &, int) const =0; +}; +class C : virtual public B +{ +}; +struct D : virtual public B +{ + bool bar (A &, int) const; +}; +template <int N> +struct E : public D +{ + bool bar (A &x, int y) const + { + return baz().bar (x, y); + } + const D & baz () const; +}; +extern template class E<0>; + +void +foo () +{ + try + { + A a; + abort (); + } catch (...) + { + } + A b; + E<0> c; + c.bar (b, 3); + E<0> d; + d.bar (b, 3); +} diff --git a/gcc/testsuite/g++.dg/opt/thunk4.C b/gcc/testsuite/g++.dg/opt/thunk4.C new file mode 100644 index 000000000..7dd5ea433 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/thunk4.C @@ -0,0 +1,63 @@ +// { dg-do compile } +// { dg-options "-O1" } +namespace std __attribute__ ((__visibility__ ("default"))) +{ + template < class _CharT > struct char_traits; +} +namespace std __attribute__ ((__visibility__ ("default"))) +{ + template < typename _CharT, typename _Traits = + char_traits < _CharT > >class basic_iostream; +} + +extern "C++" +{ + namespace std + { + class exception + { + public:exception () throw () + { + } + }; + } +} +namespace std __attribute__ ((__visibility__ ("default"))) +{ + class ios_base + { + public:class failure:public exception + { + }; + virtual ~ ios_base (); + }; +template < typename _CharT, typename _Traits > class basic_ios:public + ios_base + { + }; +template < typename _CharT, typename _Traits > class basic_ostream:virtual public basic_ios < _CharT, + _Traits + > + { + }; +} +namespace std __attribute__ ((__visibility__ ("default"))) +{ +template < typename _CharT, typename _Traits > class basic_istream:virtual public basic_ios < _CharT, + _Traits + > + { + }; +template < typename _CharT, typename _Traits > class basic_iostream:public basic_istream < _CharT, _Traits >, public basic_ostream < _CharT, + _Traits + > + { + }; + class strstream:public basic_iostream < char > + { + virtual ~ strstream (); + }; + strstream::~strstream () + { + } +} diff --git a/gcc/testsuite/g++.dg/opt/tmp1.C b/gcc/testsuite/g++.dg/opt/tmp1.C new file mode 100644 index 000000000..21665335e --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/tmp1.C @@ -0,0 +1,48 @@ +// { dg-do run } + + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Jul 2003 <nathan@codesourcery.com> + +// compound exprs were causing additional temporaries. + +extern "C" int printf (char const *, ...); +extern "C" void abort (); + + +static unsigned order[] = +{ + 1, 2, 502, 102, 101, + 0 +}; + +static unsigned point; + +static void Check (unsigned t, unsigned i, void const *ptr, char const *name) +{ + printf ("%d %d %p %s\n", t, i, ptr, name); + + if (order[point++] != i + t) + abort (); + +} + +template <int I> struct A +{ + A () { Check (0, I, this, __PRETTY_FUNCTION__); } + ~A () { Check (100, I, this, __PRETTY_FUNCTION__); } + A (A const &) { Check (200, I, this, __PRETTY_FUNCTION__); } + A &operator= (A const &) { Check (300, I, this, __PRETTY_FUNCTION__); } + void Foo () const { Check (400, I, this, __PRETTY_FUNCTION__); } +}; + +template <int I> void Foo (A<I> a) +{ + Check (500, I, &a, __PRETTY_FUNCTION__); +} + +int main () +{ + Foo ((A<1> (), A<2> ())); + Check (0, 0, 0, "end"); +} diff --git a/gcc/testsuite/g++.dg/opt/unroll1.C b/gcc/testsuite/g++.dg/opt/unroll1.C new file mode 100644 index 000000000..fd07f889a --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/unroll1.C @@ -0,0 +1,420 @@ +// PR optimization/12340 +// Origin: Richard Guenther <richard.guenther@uni-tuebingen.de> +// Testcase by Eric Botcazou <ebotcazou@libertysurf.fr> + +// This used to segfault on x86 because the loop optimizer wrongly +// interpreted a double assignment to a biv as a double increment, +// which subsequently fooled the unroller. + +// { dg-do run } +// { dg-options "-O2 -fno-exceptions -funroll-loops" } + +typedef __SIZE_TYPE__ size_t; + +inline void* operator new(size_t, void* __p) throw() { return __p; } +inline void operator delete (void*, void*) throw() { }; + +class Loc; +class Interval; + +template<class DT> +class DomainBase +{ +public: + typedef typename DT::Domain_t Domain_t; + typedef typename DT::Storage_t Storage_t; + + Domain_t &unwrap() { return *static_cast<Domain_t *>(this); } + + const Domain_t &unwrap() const { + return *static_cast<Domain_t *>(const_cast<DomainBase<DT> *>(this)); + } + +protected: + Storage_t domain_m; +}; + +template<class DT> +class Domain : public DomainBase<DT> +{ + typedef DomainBase<DT> Base_t; + +public: + typedef typename DT::Size_t Size_t; + typedef typename DT::Element_t Element_t; + typedef typename Base_t::Domain_t Domain_t; + typedef typename Base_t::Storage_t Storage_t; + + Domain_t &operator[](int) { return this->unwrap(); } + + const Domain_t &operator[](int) const { return this->unwrap(); } + + template<class T> + void setDomain(const T &newdom) { + DT::setDomain(this->domain_m, newdom); + } + + Element_t first() const { return DT::first(this->domain_m); } + + Size_t length() const { return DT::length(this->domain_m); } + + Size_t size() const { return length(); } +}; + +template<class T> +struct DomainTraits; + +template<> +struct DomainTraits<Interval> +{ + typedef int Size_t; + typedef int Element_t; + typedef Interval Domain_t; + typedef Interval OneDomain_t; + typedef Loc AskDomain_t; + typedef int Storage_t[2]; + enum { dimensions = 1 }; + enum { wildcard = false }; + + static int first(const Storage_t &d) { return d[0]; } + + static int length(const Storage_t &d) { return d[1]; } + + static OneDomain_t &getDomain(Domain_t &d, int) { return d; } + + static const OneDomain_t &getDomain(const Domain_t &d, int) { return d; } + + template<class T> + static void setDomain(Storage_t &dom, const T &newdom) { + dom[0] = newdom.first(); + dom[1] = newdom.length(); + } + + template<class T1, class T2> + static void setDomain(Storage_t &dom, const T1 &begval, const T2 &endval) { + dom[0] = begval; + dom[1] = (endval - begval + 1); + } + +}; + +class Interval : public Domain<DomainTraits<Interval> > +{ +public: + Interval(const Interval &a) : Domain<DomainTraits<Interval> >() { + for (int i=0; i < DomainTraits<Interval>::dimensions; ++i) + DomainTraits<Interval>::getDomain(*this, i).setDomain( + DomainTraits<Interval>::getDomain(a, i)); + } + + Interval(int a) : Domain<DomainTraits<Interval> >() + { + DomainTraits<Interval>::setDomain(domain_m, 0, a - 1); + } +}; + +template<> +struct DomainTraits<Loc> +{ + typedef int Size_t; + typedef int Element_t; + typedef Loc Domain_t; + typedef Loc AskDomain_t; + typedef Loc MultResult_t; + typedef int Storage_t; + + static int first(int d) { return d; } + + template<class T> + static void setDomain(int &dom, const T &newdom) { + dom = DomainTraits<T>::getFirst(newdom); + } +}; + +template<> +struct DomainTraits<int> + { + enum { dimensions = 1 }; + enum { wildcard = false }; + + static int getPointDomain(int d, int) { return d; } + + static int getFirst(const int &d) { return d; } +}; + +class Loc : public Domain<DomainTraits<Loc> > +{ +public: + explicit Loc(const int &a) : Domain<DomainTraits<Loc> >() { + for (int i=0; i < 1; ++i) + (*this)[i].setDomain(DomainTraits<int>::getPointDomain(a, 0)); + } +}; + +struct ElementProperties +{ + enum { hasTrivialDefaultConstructor = false }; + enum { hasTrivialDestructor = false }; + + static void construct(double* addr) + { + new (addr) double(); + } + + static void construct(double* addr, const double& model) + { + new (addr) double(model); + } + + static void destruct(double *addr) {} +}; + +class RefCounted +{ +public: + RefCounted() : count_m(0) {} + + void addReference() { ++count_m; } + bool removeRefAndCheckGarbage() + { + return (--count_m == 0); + } + +private: + int count_m; +}; + +class RefBlockController : public RefCounted +{ +public: + explicit RefBlockController(unsigned int size) + : pBegin_m(0), pEnd_m(0), pEndOfStorage_m(0), dealloc_m(false) + { + reallocateStorage(size, false); + + if (!ElementProperties::hasTrivialDefaultConstructor) + { + for (double * pt = begin(); pt != end(); ++pt) + ElementProperties::construct(pt); + } + } + + ~RefBlockController() + { + deleteStorage(); + } + + double *begin() const + { + return pBegin_m; + } + + double *end() const + { + return pEnd_m; + } + + bool isMine() const + { + return dealloc_m; + } + +private: + void deleteStorage() + { + if (isMine() && pBegin_m != 0) + { + if (!ElementProperties::hasTrivialDestructor) + for (double *pt = begin(); pt != end(); ++pt) + ElementProperties::destruct(pt); + + char *tmp = reinterpret_cast<char *>(pBegin_m); + delete [] tmp; + } + } + + void reallocateStorage(unsigned int newsize, bool copyold = false) + { + double *pBeginNew = 0; + double *pEndNew = 0; + double *pEndOfStorageNew = 0; + + if (newsize > 0) + { + int nsize = newsize * sizeof(double); + char *tmp = new char[nsize]; + pBeginNew = reinterpret_cast<double *>(tmp); + pEndNew = pBeginNew + newsize; + pEndOfStorageNew = pBeginNew + (nsize / sizeof(double)); + + if (copyold) + { + double * pOld = begin(); + double * pNew = pBeginNew; + while (pOld != end() && pNew != pEndNew) + ElementProperties::construct(pNew++,*pOld++); + } + } + + deleteStorage(); + + pBegin_m = pBeginNew; + pEnd_m = pEndNew; + pEndOfStorage_m = pEndOfStorageNew; + dealloc_m = true; + } + + double *pBegin_m; + double *pEnd_m; + double *pEndOfStorage_m; + bool dealloc_m; +}; + +class DataBlockController : public RefBlockController +{ +public: + explicit + DataBlockController(unsigned int size) + : RefBlockController(size), dataObjectPtr_m(new char), owned_m(true) {} + + ~DataBlockController() + { + if (owned_m) delete dataObjectPtr_m; + } + +private: + mutable char *dataObjectPtr_m; + bool owned_m; +}; + +class RefCountedPtr +{ +public: + RefCountedPtr(DataBlockController * const pT) : ptr_m(pT) + { if (isValid()) ptr_m->addReference(); } + + ~RefCountedPtr() { invalidate(); } + + DataBlockController* operator->() const { return ptr_m; } + void invalidate(); + bool isValid() const { return ptr_m != 0; } + +private: + friend class RefCountedBlockPtr; + DataBlockController * ptr_m; +}; + +inline void RefCountedPtr::invalidate() +{ + if ( isValid() && ptr_m->removeRefAndCheckGarbage() ) + delete ptr_m; + ptr_m = 0; +} + +class RefCountedBlockPtr +{ +public: + explicit RefCountedBlockPtr(unsigned int size) + : offset_m(0), + blockControllerPtr_m(new DataBlockController(size)) {} + + int offset() const + { + return offset_m; + } + + double *beginPointer() const + { + return blockControllerPtr_m->begin(); + } + + double *currentPointer() const + { + return beginPointer() + offset(); + } + +protected: + int offset_m; + RefCountedPtr blockControllerPtr_m; +}; + +class DataBlockPtr : public RefCountedBlockPtr +{ +public: + explicit DataBlockPtr(unsigned int size) : RefCountedBlockPtr(size) {} +}; + +class Node +{ +public: + Node(const Interval &owned, const Interval &allocated) + : domain_m(owned), allocated_m(allocated) {} + + const Interval &allocated() const { return allocated_m; } + +private: + Interval domain_m; + Interval allocated_m; +}; + +class DomainLayout +{ +public: + explicit DomainLayout(const Interval &dom) : node_m(0, dom) {} + + const Interval &domain() const + { + return node_m.allocated(); + } + +private: + Node node_m; +}; + +class BrickBase +{ +public: + explicit BrickBase(const Interval &domain); + + int offset(const Loc &dom) const { return off_m + dom[0].first(); } + +protected: + DomainLayout layout_m; + int firsts_m; + int off_m; +}; + +BrickBase::BrickBase(const Interval &dom) + : layout_m(dom) +{ + firsts_m = layout_m.domain()[0].first(); + off_m = -firsts_m; +} + +class Engine : public BrickBase +{ +public: + explicit Engine(const Interval &dom) + : BrickBase(dom), dataBlock_m(dom.size()), data_m(dataBlock_m.currentPointer()) {} + + double& operator()(const Loc &loc) const + { + return data_m[this->offset(loc)]; + } + +private: + DataBlockPtr dataBlock_m; + double *data_m; +}; + + +int main() +{ + Interval I(10); + Engine A(I); + + for (int i = 0; i < 10; i++) + A(Loc(i)) = 2.0 + i - i*i; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/opt/unroll2.C b/gcc/testsuite/g++.dg/opt/unroll2.C new file mode 100644 index 000000000..82a1e7f56 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/unroll2.C @@ -0,0 +1,27 @@ +// PR tree-opt/28937 +// Complete unroll forgot to update the statement usage +// which meant we ICEd in add_virtual_operand. + +// { dg-do compile } +// { dg-options "-O2" } + + +class SHA256 +{ + unsigned m_digest; + unsigned long long m_count; + unsigned char _buffer[64]; + static void Transform (unsigned * data); + void WriteByteBlock (unsigned t); +}; +void SHA256::WriteByteBlock (unsigned t) +{ + unsigned data32[16]; + Transform (data32); + unsigned long long lenInBits = m_count; + if (t != (64 - 8)) + return; + for (int i = 0; i < 2; i++) + _buffer[t++] = (unsigned char)lenInBits; +} + diff --git a/gcc/testsuite/g++.dg/opt/vrp2.C b/gcc/testsuite/g++.dg/opt/vrp2.C new file mode 100644 index 000000000..b2066ae2e --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/vrp2.C @@ -0,0 +1,20 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +/* VRP was miscompiling the following as it thought &a->b was a dereference + and therfore a was non-null. + Reduced from Mozilla by Serge Belyshev <belyshev@depni.sinp.msu.ru>. */ + +extern "C" void abort (void); +struct T { int i; } t; +struct A : T { int j; } *p = __null; + +int main (void) +{ + if (p == &t) + return 0; + if (p) + abort (); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/opt/vt1.C b/gcc/testsuite/g++.dg/opt/vt1.C new file mode 100644 index 000000000..ba871fba2 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/vt1.C @@ -0,0 +1,13 @@ +// Test whether vtable for S is not put into read-only section. +// { dg-do compile { target fpic } } +// { dg-options "-O2 -fpic -fno-rtti" } +// { dg-skip-if "requires unsupported run-time relocation" { spu-*-* } { "*" } { "" } } +// { dg-skip-if "No Windows PIC" { *-*-mingw* *-*-cygwin } { "*" } { "" } } +// Origin: Jakub Jelinek <jakub@redhat.com> + +struct S +{ + virtual void vm (void) {}; +} x; + +// { dg-final { scan-assembler-not "section\[^\n\r\]*_ZTV1S\[^\n\r\]*\"\[^w\"\n\r\]*\"" } } diff --git a/gcc/testsuite/g++.dg/other/PR23205.C b/gcc/testsuite/g++.dg/other/PR23205.C new file mode 100644 index 000000000..273535444 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/PR23205.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-skip-if "No stabs" { mmix-*-* *-*-aix* *-*-netware* alpha*-*-* hppa*64*-*-* ia64-*-* *-*-vxworks } { "*" } { "" } } */ +/* { dg-options "-gstabs+ -fno-eliminate-unused-debug-types" } */ + +const int foobar = 4; +int foo () +{ + return foobar + 1; +} + +int main() +{ + int i; + i = foo(); + return i; +} + +/* { dg-final { scan-assembler ".stabs.*foobar:(c=i|S)" } } */ diff --git a/gcc/testsuite/g++.dg/other/abstract1.C b/gcc/testsuite/g++.dg/other/abstract1.C new file mode 100644 index 000000000..8406f8a25 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/abstract1.C @@ -0,0 +1,59 @@ +// { dg-do compile } +// Contributed by <giovannibajo at gcc dot gnu dot org>, +// <pavel_vozenilek at hotmail dot com>, +// <bangerth at dealii dot org> +// c++/9256: Make sure that a pointer to an array of abstract elements +// cannot be created, not even during template substitution (DR337). + +struct Abstract { virtual void f() = 0; }; // { dg-message "note" } +struct Complete { void f(); }; + + +/* + * TEST 1 + * Arrays of abstract elements cannot be declared. + */ + +Abstract a0[2]; // { dg-error "" } +Abstract (*a1)[2]; // { dg-error "" } +Abstract (**a2)[2]; // { dg-error "" } +Abstract (***a3)[2]; // { dg-error "" } +Abstract *a4; +Abstract *a5[2]; +Abstract (*a6[2])[2]; // { dg-error "" } +Abstract **a7[2]; +Abstract *(*a8[2])[2]; +Abstract (**a9[2])[2]; // { dg-error "" } + +/* + * TEST 2 + * If a pointer to an array of abstract elements is created during template + * instantiation, an error should occur. + */ + +template <class T> struct K { + T (*a)[2]; // { dg-error "abstract class type" } +}; + +template struct K<Abstract>; // { dg-message "instantiated" } + + + +/* + * TEST 3 + * Deducing an array of abstract elements during type deduction is a silent + * failure (rejects overload). + */ + +template <bool> struct StaticAssert; +template <> struct StaticAssert<true> {}; + +typedef char Yes; +typedef struct { char x[2]; } No; + +template<typename U> No is_abstract(U (*k)[1]); +template<typename U> Yes is_abstract(...); + +StaticAssert<sizeof(is_abstract<Abstract>(0)) == sizeof(Yes)> b1; +StaticAssert<sizeof(is_abstract<Complete>(0)) == sizeof(No)> b2; +StaticAssert<sizeof(is_abstract<int>(0)) == sizeof(No)> b3; diff --git a/gcc/testsuite/g++.dg/other/abstract2.C b/gcc/testsuite/g++.dg/other/abstract2.C new file mode 100644 index 000000000..b79493285 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/abstract2.C @@ -0,0 +1,58 @@ +// { dg-do compile } +// Contributed by Gabriel Dos Reis <gdr at integrable-solutions dot net> +// PR c++/2204: Check for parameters of abstract type in function declarations. + +namespace N1 { + struct X; + + struct Y1 { + void g(X parm1); // { dg-error "abstract" } + void g(X parm2[2]); // { dg-error "abstract" } + void g(X (*parm3)[2]); // { dg-error "abstract" } + }; + + + template <int N> + struct Y2 { + void g(X parm4); // { dg-error "abstract" } + void g(X parm5[2]); // { dg-error "abstract" } + void g(X (*parm6)[2]); // { dg-error "abstract" } + }; + + struct X { // { dg-message "note" } + virtual void xfunc(void) = 0; // { dg-message "note" } + }; +} + +namespace N2 { + struct X1 { // { dg-message "note" } + virtual void xfunc(void) = 0; // { dg-message "note" } + void g(X1 parm7); // { dg-error "abstract" } + void g(X1 parm8[2]); // { dg-error "abstract" } + void g(X1 (*parm9)[2]); // { dg-error "abstract" } + }; + + template <int N> + struct X2 { // { dg-message "note" } + virtual void xfunc(void) = 0; // { dg-message "note" } + void g(X2 parm10); // { dg-error "abstract" } + void g(X2 parm11[2]); // { dg-error "abstract" } + void g(X2 (*parm12)[2]); // { dg-error "abstract" } + }; +} + +namespace N3 { + struct X { // { dg-message "note" "" } + virtual void xfunc(void) = 0; // { dg-message "note" } + }; + void g(X parm13); // { dg-error "abstract" } + void g(X parm14[2]); // { dg-error "abstract" } + void g(X (*parm15)[2]); // { dg-error "abstract" } + + template <int N> + void g(X parm16); // { dg-error "abstract" } + template <int N> + void g(X parm17[2]); // { dg-error "abstract" } + template <int N> + void g(X (*parm18)[2]); // { dg-error "abstract" } +} diff --git a/gcc/testsuite/g++.dg/other/access1.C b/gcc/testsuite/g++.dg/other/access1.C new file mode 100644 index 000000000..ee3239b93 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/access1.C @@ -0,0 +1,26 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 12 Mar 2002 <nathan@codesourcery.com> + +// PR c++/5659. Failed to notice default accessed changed + +class Foo; +struct Foo +{ + static int m; +}; + +class Outer { + private: + class Inner; + Inner *i; + public: + void pub(); +}; + +struct Outer::Inner { + Inner(int i); +}; + +void Outer::pub() { i = new Inner(Foo::m); } diff --git a/gcc/testsuite/g++.dg/other/access2.C b/gcc/testsuite/g++.dg/other/access2.C new file mode 100644 index 000000000..c7dd77a04 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/access2.C @@ -0,0 +1,35 @@ +// { dg-do compile } +// Origin: Dirk Mueller <dmuell@gmx.net> + +// PR c++/2739 +// Access to base class private static member. + +class Base { +private: + static int fooprivate; +protected: + static int fooprotected; +public: + static int foopublic; +}; + +class Derived : public Base { +public: + void test(); +}; + +int Base::fooprivate=42; // { dg-error "private" } +int Base::fooprotected=42; +int Base::foopublic=42; + +void Derived::test() { + if ( fooprivate ); // { dg-error "context" } + if ( fooprotected ); + if ( foopublic ); +} + +int main() +{ + Derived d; + d.test(); +} diff --git a/gcc/testsuite/g++.dg/other/access3.C b/gcc/testsuite/g++.dg/other/access3.C new file mode 100644 index 000000000..2c21c1e5f --- /dev/null +++ b/gcc/testsuite/g++.dg/other/access3.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options "-fno-access-control" } + +// PR c++/20022 + +// Make sure -fno-access-control doesn't crash, and actually grants at +// least some access. + +class B { + enum A {}; +}; + +B::A r; diff --git a/gcc/testsuite/g++.dg/other/anon-struct.C b/gcc/testsuite/g++.dg/other/anon-struct.C new file mode 100644 index 000000000..a23e8094e --- /dev/null +++ b/gcc/testsuite/g++.dg/other/anon-struct.C @@ -0,0 +1,9 @@ +// Contributed by Gabriel Dos Reis <gdr@codesourcery.com> +// { dg-do compile } + +namespace N { } + +namespace M +{ + typedef struct { } N; +} diff --git a/gcc/testsuite/g++.dg/other/anon-union.C b/gcc/testsuite/g++.dg/other/anon-union.C new file mode 100644 index 000000000..51598bf3a --- /dev/null +++ b/gcc/testsuite/g++.dg/other/anon-union.C @@ -0,0 +1,22 @@ +// { dg-do compile } +// { dg-options -O2 } + +int foo (); +double bar (void) +{ + union + { + char a[8]; + double b; + }; + + a[0] = foo (); + a[1] = foo (); + a[2] = foo (); + a[3] = foo (); + a[4] = foo (); + a[5] = foo (); + a[6] = foo (); + a[7] = foo (); + return b; +} diff --git a/gcc/testsuite/g++.dg/other/anon2.C b/gcc/testsuite/g++.dg/other/anon2.C new file mode 100644 index 000000000..98d8c2065 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/anon2.C @@ -0,0 +1,22 @@ +// Test that we can have an unnamed struct inside an anonymous union. + +struct A +{ + union + { + struct { int i; } foo; + }; +}; + +static union +{ + struct { int i; } foo; +}; + +int main () +{ + union + { + struct { int i; } bar; + }; +} diff --git a/gcc/testsuite/g++.dg/other/anon3.C b/gcc/testsuite/g++.dg/other/anon3.C new file mode 100644 index 000000000..87116eb89 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/anon3.C @@ -0,0 +1,7 @@ +// pr c++/15049 +// Origin: Matt Austern <austern@apple.com> +// Test that we can declare a global variable whose type is anonymous. + +// { dg-do compile } + +enum { a = 3 } x; // { dg-warning "anonymous type" } diff --git a/gcc/testsuite/g++.dg/other/anon4.C b/gcc/testsuite/g++.dg/other/anon4.C new file mode 100644 index 000000000..571f4ae65 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/anon4.C @@ -0,0 +1,8 @@ +// PR c++/27951 +// { dg-do compile } + +void foo() +{ + int i; // { dg-error "previously" } + union { int i; }; // { dg-error "redeclaration" } +} diff --git a/gcc/testsuite/g++.dg/other/anon5.C b/gcc/testsuite/g++.dg/other/anon5.C new file mode 100644 index 000000000..e8ebe0cc2 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/anon5.C @@ -0,0 +1,23 @@ +// PR c++/34094 +// { dg-do link { target { ! { *-*-darwin* *-*-hpux* *-*-solaris2.* alpha*-dec-osf* mips-sgi-irix* } } } } +// { dg-options "-g" } + +namespace { + struct c + { + static const bool t = 0; + }; +} + +const bool &f() +{ + return c::t; // { dg-message "undefined" "undefined" { target *-*-* } 0 } + // Some targets report the error for the previous line, others + // don't give line number inforamtion for it, so use line 0. +} + +int main(void) +{ + return 0; +} + diff --git a/gcc/testsuite/g++.dg/other/arm-neon-1.C b/gcc/testsuite/g++.dg/other/arm-neon-1.C new file mode 100644 index 000000000..33cc04b69 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/arm-neon-1.C @@ -0,0 +1,18 @@ +/* Basic smoke test for arm_neon.h */ + +/* { dg-do assemble } */ +/* { dg-require-effective-target arm_neon_ok } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" + +float a[4]; + +void test(void) +{ + float32x2x2_t v; + float32x2_t res; + v = vld2_f32(a); + res = vadd_f32(v.val[0], v.val[1]); + vst1_f32(a, res); +} diff --git a/gcc/testsuite/g++.dg/other/array1.C b/gcc/testsuite/g++.dg/other/array1.C new file mode 100644 index 000000000..aff960e57 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/array1.C @@ -0,0 +1,10 @@ +// Test typeid of multidimensional array with no bounds. +// { dg-do compile } + +#include <typeinfo> + +int main() +{ + const char *s = typeid(double[][]).name(); // { dg-error "bounds|confused" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/array2.C b/gcc/testsuite/g++.dg/other/array2.C new file mode 100644 index 000000000..b091d96be --- /dev/null +++ b/gcc/testsuite/g++.dg/other/array2.C @@ -0,0 +1,6 @@ +// PR c++/25263 +// { dg-do compile } + +int x[1/0]; // { dg-warning "division by zero" } + // { dg-error "constant" "constant" { target *-*-* } 4 } + diff --git a/gcc/testsuite/g++.dg/other/array3.C b/gcc/testsuite/g++.dg/other/array3.C new file mode 100644 index 000000000..ce3641e8c --- /dev/null +++ b/gcc/testsuite/g++.dg/other/array3.C @@ -0,0 +1,14 @@ +// PR C++/28906: new on an array causes incomplete arrays to +// become complete with the wrong size. + +// the bounds of xvalue_store was being set to include want +// which was incorrect. + +// { dg-do compile } + +extern unsigned char xvalue_store[]; +bool reserve (int want) +{ + new unsigned char[want]; +} +unsigned char xvalue_store[257]; diff --git a/gcc/testsuite/g++.dg/other/array4.C b/gcc/testsuite/g++.dg/other/array4.C new file mode 100644 index 000000000..97ccc986d --- /dev/null +++ b/gcc/testsuite/g++.dg/other/array4.C @@ -0,0 +1,19 @@ +// PR C++/28906: new on an array causes incomplete arrays to +// become complete with the wrong size. +// The sizeof machineMain should be 5 and not 100. +// { dg-do run } + + +extern char machineMain[]; +void sort (long len) +{ + new char[100]; +} +char machineMain[] = "main"; +int main(void) +{ + if (sizeof(machineMain)!=sizeof("main")) + __builtin_abort(); +} + + diff --git a/gcc/testsuite/g++.dg/other/array5.C b/gcc/testsuite/g++.dg/other/array5.C new file mode 100644 index 000000000..df551e380 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/array5.C @@ -0,0 +1,9 @@ +// Check to make sure changing from an incomplete +// array type to a complete one does not change other +// incomplete array type's bounds. +// { dg-do compile } + +extern unsigned char xvalue_store[]; +extern unsigned char xvalue_store1[]; +unsigned char xvalue_store[7]; +unsigned char xvalue_store1[9]; diff --git a/gcc/testsuite/g++.dg/other/array6.C b/gcc/testsuite/g++.dg/other/array6.C new file mode 100644 index 000000000..cd02401f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/array6.C @@ -0,0 +1,11 @@ +// PR c++/43036 + +typedef char T6[2][8]; +const T6* p1; +typedef char T[8]; +typedef T T2[2]; +typedef T T3[2]; +typedef char T5[2][8]; +const T2* p2; +const T5* p3; +const T3* p4; diff --git a/gcc/testsuite/g++.dg/other/assign1.C b/gcc/testsuite/g++.dg/other/assign1.C new file mode 100644 index 000000000..1983680dd --- /dev/null +++ b/gcc/testsuite/g++.dg/other/assign1.C @@ -0,0 +1,7 @@ +// PR c++/27716 +// { dg-do compile } + +int foo() +{ + return i ""= i; // { dg-error "not declared|string constant" } +} diff --git a/gcc/testsuite/g++.dg/other/big-struct.C b/gcc/testsuite/g++.dg/other/big-struct.C new file mode 100644 index 000000000..dcf230dd6 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/big-struct.C @@ -0,0 +1,11 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target ilp32 } + +struct A +{ +}; + +struct B : public A +{ + char b[0x20000000]; +} e; diff --git a/gcc/testsuite/g++.dg/other/bitfield1.C b/gcc/testsuite/g++.dg/other/bitfield1.C new file mode 100644 index 000000000..896490fba --- /dev/null +++ b/gcc/testsuite/g++.dg/other/bitfield1.C @@ -0,0 +1,9 @@ +// { dg-options "-w" } + +union u1 { + char m1 : 16; +} x; + +int main () { + x.m1 = 256; +} diff --git a/gcc/testsuite/g++.dg/other/bitfield2.C b/gcc/testsuite/g++.dg/other/bitfield2.C new file mode 100644 index 000000000..cd9a837dc --- /dev/null +++ b/gcc/testsuite/g++.dg/other/bitfield2.C @@ -0,0 +1,9 @@ +// PR c++/28052 +// { dg-do compile } + +struct A +{ + double d : 2; // { dg-error "non-integral" } + A() {} + ~A() {} +}; diff --git a/gcc/testsuite/g++.dg/other/bitfield3.C b/gcc/testsuite/g++.dg/other/bitfield3.C new file mode 100644 index 000000000..befd7f817 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/bitfield3.C @@ -0,0 +1,19 @@ +// PR c++/33841 +// { dg-do compile } + +template<int> struct A +{ + // multiple errors below: missing semicolon, no anonymous structs, etc. + struct {} : 2; // { dg-error "" } +}; + +template<int> struct B +{ + int a; + // multiple errors below: missing semicolon, no anonymous structs, etc. + struct {} : 2; // { dg-error "" } + int b; +}; + +struct C : A<0> {}; +struct D : B<0> {}; diff --git a/gcc/testsuite/g++.dg/other/bitfield4.C b/gcc/testsuite/g++.dg/other/bitfield4.C new file mode 100644 index 000000000..d140f82cb --- /dev/null +++ b/gcc/testsuite/g++.dg/other/bitfield4.C @@ -0,0 +1,10 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/42217 +// { dg-do compile } + +struct A +{ + int : 0; +}; +A a = A(); + diff --git a/gcc/testsuite/g++.dg/other/builtin-unreachable-1.C b/gcc/testsuite/g++.dg/other/builtin-unreachable-1.C new file mode 100644 index 000000000..f6a557703 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/builtin-unreachable-1.C @@ -0,0 +1,11 @@ +// PR c++/40445 +// Check that a function containing only __builtin_unreachable() +// doesn't ICE. + +// { dg-do compile } +// { dg-options "-O0" } +const char * +f (void) +{ + __builtin_unreachable (); +} diff --git a/gcc/testsuite/g++.dg/other/builtin1.C b/gcc/testsuite/g++.dg/other/builtin1.C new file mode 100644 index 000000000..886658199 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/builtin1.C @@ -0,0 +1,6 @@ +/* { dg-do compile } */ + +void foo() +{ + __builtin_isless (foo, 0); /* { dg-error "non-floating-point arguments" } */ +} diff --git a/gcc/testsuite/g++.dg/other/canon-31724.C b/gcc/testsuite/g++.dg/other/canon-31724.C new file mode 100644 index 000000000..1a39f78a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/canon-31724.C @@ -0,0 +1,8 @@ +struct ac {ac();}; +ac spline_rep1(void) +{ + typedef ac at[2]; + ac * b = new ac[2]; + at *a = (at*)b; + return (*a)[0]; +} diff --git a/gcc/testsuite/g++.dg/other/canon-33194.C b/gcc/testsuite/g++.dg/other/canon-33194.C new file mode 100644 index 000000000..496aafe2c --- /dev/null +++ b/gcc/testsuite/g++.dg/other/canon-33194.C @@ -0,0 +1,21 @@ +// PR c++/33194 +void c_translate_location ( + void (*fail) ( + const char *fmt, ...) + __attribute__ ((noreturn, + format (printf, 1, 2))) + ); + + +struct dwflpp +{ + static void loc2c_error (const char *fmt, ...) + { + } + + void + translate_location() + { + return c_translate_location (&loc2c_error); + } +}; diff --git a/gcc/testsuite/g++.dg/other/canon-37342.C b/gcc/testsuite/g++.dg/other/canon-37342.C new file mode 100644 index 000000000..dd96e40eb --- /dev/null +++ b/gcc/testsuite/g++.dg/other/canon-37342.C @@ -0,0 +1,8 @@ +class Asm; +template<typename _CharT> class basic_ostream; +typedef basic_ostream<char> ostream; +class Options { + typedef void (Asm::* emitfunc_t) (ostream &); + emitfunc_t getemit () const { return emitfunc; } + emitfunc_t emitfunc; +}; diff --git a/gcc/testsuite/g++.dg/other/classkey1.C b/gcc/testsuite/g++.dg/other/classkey1.C new file mode 100644 index 000000000..80ab6756c --- /dev/null +++ b/gcc/testsuite/g++.dg/other/classkey1.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 28 Feb 2002 <nathan@codesourcery.com> + +// PR 775. Some mismatches which were broken. + +template <class T> struct A {}; +union A<int> a; // { dg-error "'union' tag" "" } + +template <> union A<float> {}; // { dg-error "'union' tag" "" } + +struct B {}; +union B b; // { dg-error "'union' tag" "" } + +union C {}; +class C c; // { dg-error "'class' tag" "" } diff --git a/gcc/testsuite/g++.dg/other/complex1.C b/gcc/testsuite/g++.dg/other/complex1.C new file mode 100644 index 000000000..5c0351428 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/complex1.C @@ -0,0 +1,28 @@ +// PR middle-end/18882 +// Origin: Petr Mikulik <mikulik@physics.muni.cz> +// Testcase by Wolfgang Bangerth <bangerth@dealii.com> + +// { dg-do run } +// { dg-options "" } + +extern "C" void abort (); + +struct C { + __complex__ long double c; +}; + +void foo() +{ + C x = {2+2i}; + + int n = 1; + C y = (n==1) ? x : (C){3+3i}; + if (__imag__ y.c != 2) + abort (); +} + +int main(void) +{ + foo (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/component1.C b/gcc/testsuite/g++.dg/other/component1.C new file mode 100644 index 000000000..601e019ae --- /dev/null +++ b/gcc/testsuite/g++.dg/other/component1.C @@ -0,0 +1,29 @@ +// { dg-do compile } + +// Copyright (C) 2001, 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 28 Dec 2001 <nathan@codesourcery.com> + +// PR 5123. ICE + +struct C { + template<class T> void f(T); + void g (); + void g (int); +}; + +void Foo () { + C c; + + (c.g) (); + (c.f) (1); + + (c.f<int>) (2); + + c.g; // { dg-error "statement cannot resolve" "" } + c.f; // { dg-error "statement cannot resolve" "" } + c.f<int>; // { dg-error "statement cannot resolve" "" } + + c.g == 1; // { dg-error "invalid" "" } + c.f == 1; // { dg-error "invalid" "" } + c.f<int> == 1; // { dg-error "invalid" "" } +} diff --git a/gcc/testsuite/g++.dg/other/const1.C b/gcc/testsuite/g++.dg/other/const1.C new file mode 100644 index 000000000..f01013837 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/const1.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Dec 2001 <nathan@nathan@codesourcery.com> + +// PR 335. Missed diagnostic + +struct Foo +{ + unsigned i; + void Modify(unsigned j) const; +}; + +void Foo::Modify(unsigned j) const +{ + Foo::i = j; // { dg-error "assignment of member" "" } +} diff --git a/gcc/testsuite/g++.dg/other/const2.C b/gcc/testsuite/g++.dg/other/const2.C new file mode 100644 index 000000000..86dde1e45 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/const2.C @@ -0,0 +1,22 @@ +// PR c++/3331: just because 'this' is readonly and bars[0].b is readonly +// doesn't mean that the result of the member reference is readonly. + +struct foo +{ + int a; + + struct bar + { int foo::* b ;}; + + static const bar bars[]; + + void bad () + { + this->*(bars[0].b) = 42; // { dg-bogus "read-only" "" } + } +}; + +const foo::bar foo::bars[] = { { &foo::a } }; + +int main () +{ } diff --git a/gcc/testsuite/g++.dg/other/const3.C b/gcc/testsuite/g++.dg/other/const3.C new file mode 100644 index 000000000..d47133b45 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/const3.C @@ -0,0 +1,23 @@ +// PR middle-end/44101 +// { dg-do compile } + +extern bool equal (int[], int[], const int[]); +extern bool equal (wchar_t[], wchar_t[], const wchar_t[]); + +void foo(void) +{ + const int A1[] = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3}; + const int N1 = sizeof(A1) / sizeof(int); + int i1[N1]; + + if (equal(i1, i1 + N1, A1)) + return; + + const wchar_t A3[] = {L'\3', L'\3', L'\3', L'\3', L'\3', + L'\3', L'\3', L'\3', L'\3', L'\3'}; + const int N3 = sizeof(A3) / sizeof(wchar_t); + wchar_t i3[N3]; + + if (equal(i3, i3 + N3, A3)) + return; +} diff --git a/gcc/testsuite/g++.dg/other/constref1.C b/gcc/testsuite/g++.dg/other/constref1.C new file mode 100644 index 000000000..900a07de3 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/constref1.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Matt Austern 12 Sep 2002 <austern@apple.com> + +// Make sure that we can pass a cast-expression as an argument that's +// passed by const reference. + +void bar (const long&) +{ } + +void foo (int x) +{ + bar ((long) x); +} + diff --git a/gcc/testsuite/g++.dg/other/constref2.C b/gcc/testsuite/g++.dg/other/constref2.C new file mode 100644 index 000000000..5c82e2dbb --- /dev/null +++ b/gcc/testsuite/g++.dg/other/constref2.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Matt Austern 12 Sep 2002 <austern@apple.com> + +// Make sure that we can pass a cast-expression as an argument that's +// passed to a function template by const reference. + +template <class T> +void bar (const T&) +{ } + +void foo (int x) +{ + bar ((long) x); +} diff --git a/gcc/testsuite/g++.dg/other/conversion1.C b/gcc/testsuite/g++.dg/other/conversion1.C new file mode 100644 index 000000000..6573ef15b --- /dev/null +++ b/gcc/testsuite/g++.dg/other/conversion1.C @@ -0,0 +1,17 @@ +// PR C++/2213 +// Origin: philippeb@corel.com +// Copyright (C), 2002 Free Software Foundation +// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net> + +// { dg-do compile } + +class QObject +{ +}; + +int main() +{ + long long m; + + (void (QObject::*)()) m; // { dg-error "invalid cast" "" } +} diff --git a/gcc/testsuite/g++.dg/other/copy1.C b/gcc/testsuite/g++.dg/other/copy1.C new file mode 100644 index 000000000..d02b08fce --- /dev/null +++ b/gcc/testsuite/g++.dg/other/copy1.C @@ -0,0 +1,83 @@ +// { dg-do run } + +// Copyright (C) 2000 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Nov 2001 <nathan@nathan@codesourcery.com> + +// PR 87 + +int assign = 0; +int ctor = 0; +int assignC = 0; + +struct A { + int i; + + template<class T> + void operator=(const T&) const + { + assign = 1; + } + + A () : i (0) {} + + template <typename T> A (const T &) + { + ctor = 1; + } +}; + +struct B : A +{ +}; + +struct C +{ + int i; + + C (int i_) :i (i_) {} + + template <int I> + void operator= (const C &) + { + assignC = 1; + } +}; + + +int main() +{ + const A a; + A b; + B c; + + b = a; + if (assign) + return 5; + + b.i = 100; + c.i = 200; + + a = b; + + if (!assign) + return 1; + if (a.i) + return 2; + + A e (b); + if (ctor) + return 3; + + A d (c); + if (!ctor) + return 4; + + C c0 (0); + C c1 (1); + + c0 = c1; + if (assignC) + return 5; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/copy2.C b/gcc/testsuite/g++.dg/other/copy2.C new file mode 100644 index 000000000..335cab8d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/copy2.C @@ -0,0 +1,32 @@ +// { dg-do run } + +// Test that A's copy assignment method is called when B's instance +// member array of A is assigned. + +// Contributed by Brian Gaeke, public domain. +int status = 1; + +class A +{ +public: + int i; + A &operator =(const A &i) + { + status = 0; + } +}; + +class B +{ +public: + A arr[10]; +}; + +int main (int argc, char **argv) +{ + B b; + b.arr[0].i = 15; + B a; + a = b; // trigger copy assignment + return status; +} diff --git a/gcc/testsuite/g++.dg/other/crash-1.C b/gcc/testsuite/g++.dg/other/crash-1.C new file mode 100644 index 000000000..e9a2d79f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/crash-1.C @@ -0,0 +1,3 @@ + +void f() { return 0; } // { dg-error "return-statement" } + diff --git a/gcc/testsuite/g++.dg/other/crash-10.C b/gcc/testsuite/g++.dg/other/crash-10.C new file mode 100644 index 000000000..6dcd79149 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/crash-10.C @@ -0,0 +1,24 @@ +// Origin: PR c++/43327 +// { dg-do compile } + +template <typename _T> +struct A +{ + template <int _N, int _M> struct B; + + template <int _N> + struct B<_N, _T::m> + { + static void f(); + }; +}; + +struct C +{ + static const int m = 4; +}; + +void m() +{ + A<C>::B<1, 4>::f(); +} diff --git a/gcc/testsuite/g++.dg/other/crash-11.C b/gcc/testsuite/g++.dg/other/crash-11.C new file mode 100644 index 000000000..29ee231be --- /dev/null +++ b/gcc/testsuite/g++.dg/other/crash-11.C @@ -0,0 +1,27 @@ +// Origin: PR c++/43327 +// { dg-do compile } + +template <typename _T> +struct A +{ + template <int _N, int _M> struct B; + + template <int _N> + struct B<_N, _T::m> + { + static void f(); + }; +}; + +struct C +{ + static int m; +}; + +void m() +{ + A<C>::B<1, 4>::f(); // { dg-error "incomplete type|not a valid" } +} + +int C::m = 4; + diff --git a/gcc/testsuite/g++.dg/other/crash-12.C b/gcc/testsuite/g++.dg/other/crash-12.C new file mode 100644 index 000000000..6612ff216 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/crash-12.C @@ -0,0 +1,25 @@ +// Origin: PR c++/43953 + +template<typename T, + typename U, + typename T::type V> class bad; + +// partial specialization +// for T = U +template<typename T, typename T::type V> +class bad<T, T, V> +{ +public: + static void foo() {} +}; + +struct dummy +{ + typedef int type; +}; + +int main() +{ + bad<dummy, dummy, 0>::foo(); +} + diff --git a/gcc/testsuite/g++.dg/other/crash-2.C b/gcc/testsuite/g++.dg/other/crash-2.C new file mode 100644 index 000000000..961a18a23 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/crash-2.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options "-finline -finline-functions" } +// Contributed by Hans Buchmann <hans dot buchmann at fhso dot ch> +// PR c++/14033: ICE while inlining a function with incomplete parameter + +struct A; // { dg-error "forward declaration" } +void foo(A a) {} // { dg-error "incomplete" } +struct A {}; + +void bar(void) +{ + foo(A()); +} diff --git a/gcc/testsuite/g++.dg/other/crash-3.C b/gcc/testsuite/g++.dg/other/crash-3.C new file mode 100644 index 000000000..d13821dee --- /dev/null +++ b/gcc/testsuite/g++.dg/other/crash-3.C @@ -0,0 +1,31 @@ +// { dg-do compile } +// { dg-options "-g" } +// Contributed by: <schmid at snake dot iap dot physik dot tu-darmstadt dot de> +// and Niall Douglas <s_gccbugzilla at nedprod dot com> +// PR c++/14246: ice in write_template_arg_literal while mangling boolean +// expressions. + +namespace N1 { + + template <typename T> + struct A { + enum { Yes = (sizeof(T) == 1) }; + }; + + template<bool T> + struct B { + void foo(void); + }; + + template struct B< !A<int>::Yes >; + +} + + +namespace N2 { + + template<bool> struct A {}; + A<!false> a; + +} + diff --git a/gcc/testsuite/g++.dg/other/crash-4.C b/gcc/testsuite/g++.dg/other/crash-4.C new file mode 100644 index 000000000..a77fe05d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/crash-4.C @@ -0,0 +1,26 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 14 Jun 2005 <nathan@codesourcery.com> + +// PR 20678: ICE on error message +// Origin: Andrew Pinski pinskia@gcc.gnu.org + +// NOTE: This test assumes packed structure layout differs from unpacked +// structure layout. This isn't true, e.g., with the default +// arm-none-elf options. +// { dg-options "-mstructure-size-boundary=8" { target arm*-*-* } } + +struct a +{ + int m; + a(const a&); +}; +struct b // { dg-error "cannot bind packed field" "" { target { ! default_packed } } } +{ + char c; + a aa __attribute__((packed)); // { dg-warning "attribute ignored" "" { target default_packed } } +}; +struct c +{ + b bb; + c(const b& __a): bb(__a) {} // { dg-message "synthesized" "" { target { ! default_packed } } } +}; diff --git a/gcc/testsuite/g++.dg/other/crash-5.C b/gcc/testsuite/g++.dg/other/crash-5.C new file mode 100644 index 000000000..25a70b7df --- /dev/null +++ b/gcc/testsuite/g++.dg/other/crash-5.C @@ -0,0 +1,16 @@ +// Origin: PR c++/42758 +// { dg-do compile } + +template<class T> struct less {}; + +template<class T, typename U = less<T> > struct set {}; + +struct int_less_than {}; + +void assert_fail (const char*); + +int f(const set<int, int_less_than>&) +{ + assert_fail (__PRETTY_FUNCTION__); + +} diff --git a/gcc/testsuite/g++.dg/other/crash-6.C b/gcc/testsuite/g++.dg/other/crash-6.C new file mode 100644 index 000000000..2220675dc --- /dev/null +++ b/gcc/testsuite/g++.dg/other/crash-6.C @@ -0,0 +1,34 @@ +// Origin: PR c++/42634 +// { dg-options "-g -std=c++0x" } +// { dg-do compile } + +template<typename T> T declval(); + +template<typename T, typename... Args> struct is_constructible { + template<typename T1, typename... Args1> static decltype(T1(declval<Args1>()...), char()) test(); + static const bool value = sizeof(test<T, Args...>()) == 1; +}; +template<bool> struct enable_if { + typedef void type; +}; +template<class T1, class T2> struct pair { + template<class U2, + class = typename enable_if<is_constructible<T2,U2&&>::value>::type + > + pair(const T1&, U2&&) { } +}; +struct string { + string() : p(0) {} + char* p; +}; + +struct Foo { + string s; + int i; +}; + +void f() +{ + pair<int, Foo>(1, Foo()); +} + diff --git a/gcc/testsuite/g++.dg/other/crash-7.C b/gcc/testsuite/g++.dg/other/crash-7.C new file mode 100644 index 000000000..d5bc892c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/crash-7.C @@ -0,0 +1,19 @@ +// Origin: PR c++/42336 +// { dg-options "-std=c++0x -O2 -g" } +// { dg-do compile } + +struct X { + void func() {} +}; + +template<typename T, void (X::*P)() = &T::func> +void b(T) {} + +int main() { + b(X()); /* line 9 */ + X().func(); + + return 0; +} + + diff --git a/gcc/testsuite/g++.dg/other/crash-8.C b/gcc/testsuite/g++.dg/other/crash-8.C new file mode 100644 index 000000000..c260431d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/crash-8.C @@ -0,0 +1,109 @@ +// Origin: PR c++/42797 +// { dg-options "-g -O2 -std=c++0x" } + +template<typename _Tp, _Tp __v> struct integral_constant { + static const _Tp value = __v; +}; + +template<typename _Tp> _Tp declval(); + +template<typename _Tp, typename... _Args> +class __is_constructible_helper { +}; + +template<typename _Tp, typename _Arg> +class __is_constructible_helper<_Tp, _Arg> { + + template<typename _Tp1, typename _Arg1> + static decltype(static_cast<_Tp1>(declval<_Arg1>()), char()) __test(int); +public: + static const bool __value = sizeof(__test<_Tp, _Arg>(0)) == 1; +}; + +template<typename _Tp, typename... _Args> +struct is_constructible : public integral_constant<bool,__is_constructible_helper<_Tp, _Args...>::__value> { }; + +template<bool, typename _Tp = void> +struct enable_if { }; + +template<typename _Tp> +struct enable_if<true, _Tp> { + typedef _Tp type; +}; + +template<class _T1, class _T2> struct pair { + _T1 first; + _T2 second; + + template<class _U2, class = typename enable_if<is_constructible<_T2, _U2&&>::value>::type> + pair(const _T1& __x, _U2&& __y) : first(__x), + second(__y) { } +}; + +namespace __gnu_cxx { +template<typename _Tp> +class new_allocator { +public: + new_allocator() throw() { } + new_allocator(const new_allocator&) throw() { } +}; +} + +template<typename _Tp> +class allocator: public __gnu_cxx::new_allocator<_Tp> { +public: + + template<typename _Tp1> + struct rebind { + typedef allocator<_Tp1> other; + }; +}; + + +template<typename _Tp, typename _Alloc> struct _Vector_base { + typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type; + + struct _Vector_impl : public _Tp_alloc_type { + _Vector_impl() + { } + }; +public: + + _Vector_impl _M_impl; +}; + +template<typename _Tp, typename _Alloc = allocator<_Tp> > +class vector : protected _Vector_base<_Tp, _Alloc> { + typedef _Alloc allocator_type; +public: + vector() { } + explicit vector(int, const allocator_type& __a = allocator_type()) + { + } +}; + + +template <typename _Key, typename _Tp> +class map { + typedef _Key key_type; + typedef _Tp mapped_type; + typedef pair<const _Key, _Tp> value_type; +public: + + void insert(const value_type& __x) + { + } + + mapped_type& operator[](const key_type& __k) { + insert(value_type(__k, mapped_type())); + } + +}; + +struct Foo { + Foo() {} template<typename Tp> Foo(Tp *p) {} }; +void foo() { + map <int, vector<Foo>> the_map; + the_map[1] = vector<Foo>(); +} + diff --git a/gcc/testsuite/g++.dg/other/crash-9.C b/gcc/testsuite/g++.dg/other/crash-9.C new file mode 100644 index 000000000..0953fcbc4 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/crash-9.C @@ -0,0 +1,15 @@ +// Origin: PR c++/42915 +// { dg-do compile } + +template <typename T> +class A +{ + template <typename U> + class B + { + B foo(); + }; +}; +template <typename T> template <typename U> +A<T>::B<U> A<T>::B<U>::foo() {} + diff --git a/gcc/testsuite/g++.dg/other/ctor1.C b/gcc/testsuite/g++.dg/other/ctor1.C new file mode 100644 index 000000000..65449f4c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ctor1.C @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +// PR C++/30303 +// This used to ICE because we did not return NULL +// in grokfndecl when an error happened. + +class A +{ + int i; +}; + +A::A() { A(); } /* { dg-error "definition of implicitly-declared" } */ diff --git a/gcc/testsuite/g++.dg/other/ctor2.C b/gcc/testsuite/g++.dg/other/ctor2.C new file mode 100644 index 000000000..65bd85902 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ctor2.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +// PR C++/30303 +// This used to ICE because we did not return NULL +// in grokfndecl when an error happened. + + +class A +{ + int i; +}; + +void foo() +{ + A(); +} + +A::A() {} /* { dg-error "definition of implicitly-declared" } */ diff --git a/gcc/testsuite/g++.dg/other/cv_func.C b/gcc/testsuite/g++.dg/other/cv_func.C new file mode 100644 index 000000000..941cb8d53 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/cv_func.C @@ -0,0 +1,30 @@ +// { dg-do compile } + +typedef int FIC(int) const; +typedef int FI(int); + +FIC f; // { dg-error "qualified" } +struct S { + FIC f; // OK + + const FI g; + + int h(int) const; + +}; +FIC S::*pm = &S::f; +const FI S::*pm2 = &S::f; // { dg-error "cannot convert" } +const FIC S::*pm3 = &S::f; + +int S::f(int) const +{ + return 17; +} + + +int foo(float) const // { dg-error "qualifier" } +{ + return 0; +} + +int bar(float) volatile; // { dg-error "qualifier" } diff --git a/gcc/testsuite/g++.dg/other/cv_func2.C b/gcc/testsuite/g++.dg/other/cv_func2.C new file mode 100644 index 000000000..ffd249fc8 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/cv_func2.C @@ -0,0 +1,18 @@ +typedef int ptr1() const; // no error + +void foo () +{ + typedef int ptr2() const; // no error +} + +class C +{ + typedef int ptr3() const; // error + + void bar () + { + typedef int ptr4() const; // no error + } +}; + +void wibble () const { } // { dg-error "non-member function" } diff --git a/gcc/testsuite/g++.dg/other/cxa-atexit1.C b/gcc/testsuite/g++.dg/other/cxa-atexit1.C new file mode 100644 index 000000000..a51f33401 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/cxa-atexit1.C @@ -0,0 +1,26 @@ +// { dg-do compile } +// { dg-options "-O2 -fuse-cxa-atexit" } + +# 1 "cxa-atexit1.C" +struct A +{ + struct B + { + B (); + ~B (); + }; +}; +static A::B b; +# 1 "cxa-atexit1.h" 1 +#pragma interface +template <class T> struct C +{ + ~C (void); +}; +struct D : public C<bool> +{ + D (void) : C<bool> () { } +}; +# 55 "cxa-atexit1.C" 2 + +// { dg-final { scan-assembler-not ".gnu.linkonce.t.__tcf_" } } diff --git a/gcc/testsuite/g++.dg/other/darwin-cfstring1.C b/gcc/testsuite/g++.dg/other/darwin-cfstring1.C new file mode 100644 index 000000000..b30ba9bef --- /dev/null +++ b/gcc/testsuite/g++.dg/other/darwin-cfstring1.C @@ -0,0 +1,25 @@ +/* Test whether the __builtin__CFStringMakeConstantString + "function" fails gracefully when handed a non-constant + argument. This will only work on MacOS X 10.1.2 and later. */ +/* Developed by Ziemowit Laski <zlaski@apple.com>. */ + +/* { dg-do compile { target *-*-darwin* } } */ +/* { dg-options "-mconstant-cfstrings" } */ + +#include <CoreFoundation/CFString.h> + +#ifdef __CONSTANT_CFSTRINGS__ +#undef CFSTR +#define CFSTR(STR) ((CFStringRef) __builtin___CFStringMakeConstantString (STR)) +#endif + +extern int cond; +extern const char *func(void); + +int main(void) { + CFStringRef s1 = CFSTR("Str1"); + CFStringRef s2 = CFSTR(cond? "Str2": "Str3"); /* { dg-error "CFString literal expression is not a string constant" } */ + CFStringRef s3 = CFSTR(func()); /* { dg-error "CFString literal expression is not a string constant" } */ + + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/darwin-minversion-1.C b/gcc/testsuite/g++.dg/other/darwin-minversion-1.C new file mode 100644 index 000000000..cbf5ff1d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/darwin-minversion-1.C @@ -0,0 +1,10 @@ +/* Test for -mmacosx-version-min default on powerpc-darwin. */ +/* { dg-do compile { target powerpc-*-darwin* } } */ + +int main(void) +{ +#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1030 + fail me; +#endif + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/datasec1.C b/gcc/testsuite/g++.dg/other/datasec1.C new file mode 100644 index 000000000..c6b2ae981 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/datasec1.C @@ -0,0 +1,11 @@ +// PR target/33168 +// { dg-do compile } +// { dg-require-effective-target named_sections } +// { dg-options "-O2 -fdata-sections" } + +extern const int& foo; +namespace +{ + const int bar = 16; +} +const int &foo = bar; diff --git a/gcc/testsuite/g++.dg/other/default1.C b/gcc/testsuite/g++.dg/other/default1.C new file mode 100644 index 000000000..a6d968185 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/default1.C @@ -0,0 +1,22 @@ +// PR c++/24103 +// ICE in simple_cst_equal +// Origin: Alexander Stepanov <astepanov@softminecorp.com> +// { dg-do compile } +// { dg-options "" } + +struct S +{ + int i; +}; + +struct A +{ + A(S = (S){0}); +}; + +struct B +{ + B(S = (S){0}); +}; + +B::B(S) {} diff --git a/gcc/testsuite/g++.dg/other/default2.C b/gcc/testsuite/g++.dg/other/default2.C new file mode 100644 index 000000000..51534b887 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/default2.C @@ -0,0 +1,9 @@ +// PR c++/16829 +// { dg-do compile } + +template<typename T> void foo(T, int = 0, int) {} // { dg-error "default" } + +void bar() +{ + foo(0); +} diff --git a/gcc/testsuite/g++.dg/other/default3.C b/gcc/testsuite/g++.dg/other/default3.C new file mode 100644 index 000000000..42c1fe489 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/default3.C @@ -0,0 +1,109 @@ +// PR c++/16829 +// { dg-do compile } + +void f1(int = 0, int); // { dg-error "default" } + +void f2(int = 0, int) {} // { dg-error "default" } + +void f3(int, int); +void f3(int = 0, int); // { dg-error "default" } + +void f4(int, int); +void f4(int = 0, int) {} // { dg-error "default" } + +void f5(); +void f5(int = 0, int); // { dg-error "default" } + +void f6(); +void f6(int = 0, int) {} // { dg-error "default" } + +template<typename> void g1(int = 0, int); // { dg-error "default" } + +template<typename> void g2(int = 0, int) {} // { dg-error "default" } + +template<typename> void g3(int, int); +template<typename> void g3(int = 0, int); // { dg-error "default" } + +template<typename> void g4(int, int); +template<typename> void g4(int = 0, int) {} // { dg-error "default" "" { xfail *-*-* } } + +template<typename> void g5(); +template<typename> void g5(int = 0, int); // { dg-error "default" } + +template<typename> void g6(); +template<typename> void g6(int = 0, int) {} // { dg-error "default" } + +template<typename T> void g7(T, T) {} +template<typename T> void g7(T* = 0, T*) {} // { dg-error "default" } + + +struct A +{ + void F1(int = 0, int); // { dg-error "default" } + + void F2(int = 0, int) {} // { dg-error "default" } + + void F3(int, int); + + void F4(); + void F4(int = 0, int); // { dg-error "default" } + + void F5(); + void F5(int = 0, int) {} // { dg-error "default" } + + template<typename> void G1(int = 0, int); // { dg-error "default" } + + template<typename> void G2(int = 0, int) {} // { dg-error "default" } + + template<typename> void G3(int, int); + + template<typename> void G4(); + template<typename> void G4(int = 0, int); // { dg-error "default" } + + template<typename> void G5(); + template<typename> void G5(int = 0, int) {} // { dg-error "default" } + + template<typename T> void G6(T, T) {} + template<typename T> void G6(T* = 0, T*) {} // { dg-error "default" } +}; + +void A::F3(int = 0, int) {} // { dg-error "default" } + +template<typename> void A::G3(int = 0, int) {} // { dg-error "default" } + + +template<typename> struct B +{ + void F1(int = 0, int); // { dg-error "default" } + + void F2(int = 0, int) {} // { dg-error "default" } + + void F3(int, int); + + void F4(); + void F4(int = 0, int); // { dg-error "default" } + + void F5(); + void F5(int = 0, int) {} // { dg-error "default" } + + template<typename> void G1(int = 0, int); // { dg-error "default" } + + template<typename> void G2(int = 0, int) {} // { dg-error "default" } + + template<typename> void G3(int, int); + + template<typename> void G4(); + template<typename> void G4(int = 0, int); // { dg-error "default" } + + template<typename> void G5(); + template<typename> void G5(int = 0, int) {} // { dg-error "default" } + + template<typename T> void G6(T, T) {} + template<typename T> void G6(T* = 0, T*) {} // { dg-error "default" } +}; + +template<typename T> +void B<T>::F3(int = 0, int) {} // { dg-error "default" } + +template<typename T> template<typename> +void B<T>::G3(int = 0, int) {} // { dg-error "default" } diff --git a/gcc/testsuite/g++.dg/other/default4.C b/gcc/testsuite/g++.dg/other/default4.C new file mode 100644 index 000000000..599480984 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/default4.C @@ -0,0 +1,29 @@ +// PR c++/15759 +// Origin: Lars Rune Nøstdal <larsnostdal@gmail.com> +// Testcase: Volker Reichelt <reichelt@igpm.rwth-aachen.de> + +// { dg-do run } + +extern "C" void abort(); + +int n = 0; + +int f() { return ++n; } + +int(&foo1)() = f; +int(*foo2)() = &f; +int(*foo3)() = f; + +int bar1(int i = foo1()) { return i; } +int bar2(int i = foo2()) { return i; } +int bar3(int i = foo3()) { return i; } +int bar4(int i = f()) { return i; } + +int main() +{ + if (bar1() != 1) abort(); + if (bar2() != 2) abort(); + if (bar3() != 3) abort(); + if (bar4() != 4) abort(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/default5.C b/gcc/testsuite/g++.dg/other/default5.C new file mode 100644 index 000000000..d5bae344c --- /dev/null +++ b/gcc/testsuite/g++.dg/other/default5.C @@ -0,0 +1,47 @@ +// PR c++/28274 +// { dg-do compile } + +void f1(int, int, int, int, int = 0); +void f1(int, int, int, int = 0, int); +void f1(int, int, int = 0, int, int); +void f1(int = 0, int, int, int, int); // { dg-error "default" } + +void f2(int, int, int, int, int = 0) {} +void f2(int, int, int, int = 0, int); +void f2(int, int, int = 0, int, int); +void f2(int = 0, int, int, int, int); // { dg-error "default" } + +void f3(int, int, int, int, int = 0); +void f3(int, int, int, int = 0, int) {} +void f3(int, int, int = 0, int, int); +void f3(int = 0, int, int, int, int); // { dg-error "default" } + +void f4(int, int, int, int, int = 0); +void f4(int, int, int, int = 0, int); +void f4(int, int, int = 0, int, int) {} +void f4(int = 0, int, int, int, int); // { dg-error "default" } + +void f5(int, int, int, int, int = 0); +void f5(int, int, int, int = 0, int); +void f5(int, int, int = 0, int, int); +void f5(int = 0, int, int, int, int) {} // { dg-error "default" } + + +struct A +{ + void F1(int, int, int = 0); + void F2(int, int, int = 0); +}; + +void A::F1(int, int = 0, int) {} +void A::F2(int = 0, int, int) {} // { dg-error "default" } + + +template<int> struct B +{ + void F1(int, int, int = 0); + void F2(int, int, int = 0); +}; + +template<int N> void B<N>::F1(int, int = 0, int) {} +template<int N> void B<N>::F2(int = 0, int, int) {} // { dg-error "default" } diff --git a/gcc/testsuite/g++.dg/other/default6.C b/gcc/testsuite/g++.dg/other/default6.C new file mode 100644 index 000000000..2641801b1 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/default6.C @@ -0,0 +1,18 @@ +// PR c++/30108 + +class BaseRobot { + typedef void (BaseRobot::*PseudoState)(void); + typedef PseudoState STATE; + STATE initial (); + int ready (); + STATE stpOtherTask (); + STATE commonEventProcessing (STATE pIdleTarget=(STATE)&BaseRobot::ready); +}; +BaseRobot::STATE BaseRobot::initial () +{ + return commonEventProcessing (); +} +BaseRobot::STATE BaseRobot::stpOtherTask () +{ + return commonEventProcessing (); +} diff --git a/gcc/testsuite/g++.dg/other/default7.C b/gcc/testsuite/g++.dg/other/default7.C new file mode 100644 index 000000000..ec523bf89 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/default7.C @@ -0,0 +1,20 @@ +/* { dg-do assemble } */ +/* { dg-options "-O1" }*/ +// This was PR C++/31165 +// We used to copy the whole decl when we just wantted to +// unshare some expressions for the default argument. +class string { + char *ptr; + int len; + int sz; +}; +class cset { } _cset_init; +string an_empty_string; +void f(string& = an_empty_string); +void +h (void ) +{ +f(); +} + + diff --git a/gcc/testsuite/g++.dg/other/do1.C b/gcc/testsuite/g++.dg/other/do1.C new file mode 100644 index 000000000..720358568 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/do1.C @@ -0,0 +1,13 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 16 Sep 2002 <nathan@codesourcery.com> + +// PR 7640. ICE. + +void init () +{ + do { } while (0) + obj = 0; // { dg-error "expected|not declared" "" } + +} diff --git a/gcc/testsuite/g++.dg/other/dtor1.C b/gcc/testsuite/g++.dg/other/dtor1.C new file mode 100644 index 000000000..90ca38007 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/dtor1.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +// PR C++/30303 +// This used to ICE because we did not return NULL +// in grokfndecl when an error happened. + +struct Ifoo +{ +virtual ~Ifoo(){} +}; +struct foo : Ifoo +{ + foo(){}; +}; +foo::~foo() // { dg-error "definition of implicitly-declared" } +{ +delete this; +} diff --git a/gcc/testsuite/g++.dg/other/dtor2.C b/gcc/testsuite/g++.dg/other/dtor2.C new file mode 100644 index 000000000..fb673d808 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/dtor2.C @@ -0,0 +1,7 @@ +/* PR c++/35317 */ +/* { dg-do compile } */ + +struct A +{ + void operator delete[] (void*, ...); +}; diff --git a/gcc/testsuite/g++.dg/other/ellipsis1.C b/gcc/testsuite/g++.dg/other/ellipsis1.C new file mode 100644 index 000000000..d2501ca85 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ellipsis1.C @@ -0,0 +1,12 @@ +// PR c++/26291 +// { dg-do compile } + +struct A +{ + A& operator= (A,...); // { dg-error "variable number of arguments" } + A operator+ (...); // { dg-error "variable number of arguments" } + operator int(...); // { dg-error "variable number of arguments" } + int operator() (...); +}; + +A operator- (A,...); // { dg-error "variable number of arguments" } diff --git a/gcc/testsuite/g++.dg/other/enum1.C b/gcc/testsuite/g++.dg/other/enum1.C new file mode 100644 index 000000000..aa5c976ac --- /dev/null +++ b/gcc/testsuite/g++.dg/other/enum1.C @@ -0,0 +1,19 @@ +// PR c++/6037 +// This testcase ICEd because start_enum expected pushtag to insert +// the tag always into current binding level. + +struct A +{ + ~A () { } +}; + +struct B +{ + void foo () + { + switch (0) { default: ; } + A a; + enum C { }; + (void) a; + } +}; diff --git a/gcc/testsuite/g++.dg/other/enum2.C b/gcc/testsuite/g++.dg/other/enum2.C new file mode 100644 index 000000000..3a28f2532 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/enum2.C @@ -0,0 +1,3 @@ +// PR c++/51248 + +enum E { e = sizeof(const E*) }; diff --git a/gcc/testsuite/g++.dg/other/error1.C b/gcc/testsuite/g++.dg/other/error1.C new file mode 100644 index 000000000..927efef8b --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error1.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Copyright (C) 2001, 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 18 Dec 2001 <nathan@nathan@codesourcery.com> + +// PR 90, stupid error message `(this + 160)' + +class foo { + public: + int fudge[40]; + int bar [40]; + inline int access(int i) { + return bar(i); // { dg-error "cannot be used as a function" "" } + } +}; diff --git a/gcc/testsuite/g++.dg/other/error10.C b/gcc/testsuite/g++.dg/other/error10.C new file mode 100644 index 000000000..26f7ca53f --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error10.C @@ -0,0 +1,15 @@ +// PR c++/21930 +// Test case by Volker Reichelt +// { dg-do compile } + +template<int> struct A {}; + +template<int N> +void foo(const A<N> &a) +{ -A<N>(a); } // { dg-error "\\(\\* & a\\)" "" } + +void bar() +{ + foo(A<0>()); // { dg-message "instantiated from here" "" } +} + diff --git a/gcc/testsuite/g++.dg/other/error11.C b/gcc/testsuite/g++.dg/other/error11.C new file mode 100644 index 000000000..d8a641c2b --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error11.C @@ -0,0 +1,17 @@ +/* { dg-options "-O1" } */ +struct A +{ + ERROR; /* { dg-error "ERROR" } */ + ~A(); +}; + +struct B +{ + virtual ~B(); +}; + +struct C : B, A {}; + +struct D : C {}; + +D d; diff --git a/gcc/testsuite/g++.dg/other/error12.C b/gcc/testsuite/g++.dg/other/error12.C new file mode 100644 index 000000000..253561e8f --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error12.C @@ -0,0 +1,9 @@ +//PR c++/28292 + +extern "Java" +{ + struct A + { + void foo(void; // { dg-error "before|incomplete type|invalid use" } + }; +} diff --git a/gcc/testsuite/g++.dg/other/error13.C b/gcc/testsuite/g++.dg/other/error13.C new file mode 100644 index 000000000..4ee935ad6 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error13.C @@ -0,0 +1,12 @@ +//PR c++/28258 + +struct A // { dg-message "note" } +{ + A(void x); // { dg-error "invalid use|incomplete type|candidates" } + // { dg-message "" "match candidate text" { target *-*-* } 5 } +}; + +struct B : A {}; // { dg-error "no matching function for call|deleted" } +// { dg-message "candidate" "candidate note" { target *-*-* } 9 } + +B b; // { dg-message "synthesized method|deleted" } diff --git a/gcc/testsuite/g++.dg/other/error14.C b/gcc/testsuite/g++.dg/other/error14.C new file mode 100644 index 000000000..b3c930188 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error14.C @@ -0,0 +1,7 @@ +//PR c++/26269 + +void foo() +{ + i; // { dg-error "not declared in this scope" } + int i; +} diff --git a/gcc/testsuite/g++.dg/other/error15.C b/gcc/testsuite/g++.dg/other/error15.C new file mode 100644 index 000000000..360185232 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error15.C @@ -0,0 +1,56 @@ +// Test that duplicate function parameters are found in declarations. + +extern void g0 (int a, int b); +extern void g1 (int a, float b); + +extern void f0 (int a, // { dg-error "previous" } + int a); // { dg-error "redefinition" } +extern void f1 (int a, // { dg-error "previous" } + float a); // { dg-error "conflicting" } +extern void f3 (int a, int b, int c, // { dg-error "previous" } + int a); // { dg-error "redefinition" } +extern void f4 (int a, int b, int c, // { dg-error "previous" } + int a, // { dg-error "redefinition" } + int a); // { dg-error "redefinition" } +extern void f5 (int a, int b, int c, int d, int e, int f, int g, int h, // { dg-error "previous" } + int a, // { dg-error "redefinition" } + int i, int j, int k, int l, int m, int n, int o, int p, + int q, int r, int s, int t, int u, int v, int w, int x, int y, + int z); + +extern void f6 (int a, int, int, int, int, int, int, int, int, int, int, // { dg-error "previous" } + int a, // { dg-error "redefinition" } + int, int, int, int, int, int, int, int, int, int, int, + float, float, float, float, float, float, float, float, + int); + +extern void f7 (void (*a)(int), // { dg-error "previous" } + void (*a)(int)); // { dg-error "redefinition" } +extern void f8 (float (*a)(int), // { dg-error "previous" } + int (*a)(float)); // { dg-error "conflicting" } + +extern void f9 (int a, // { dg-error "previous" } + int a, // { dg-error "redefinition" } + int a); // { dg-error "redefinition" } + +extern void f10 (int a, // { dg-error "previous" } + int b, // { dg-error "previous" } + int c, // { dg-error "previous" } + int c, // { dg-error "redefinition" } + int b, // { dg-error "redefinition" } + int a); // { dg-error "redefinition" } + +class C1 { + public: + void C1_g0 (int a, int b); + void C1_f0 (int a, // { dg-error "previous" } + int a); // { dg-error "redefinition" } +}; + +template <class T> +class C2 { + public: + void C2_g0 (T a, T b); + void C2_f0 (T a, // { dg-error "previous" } + T a); // { dg-error "redefinition" } +}; diff --git a/gcc/testsuite/g++.dg/other/error16.C b/gcc/testsuite/g++.dg/other/error16.C new file mode 100644 index 000000000..1e3464714 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error16.C @@ -0,0 +1,14 @@ +// PR c++/17763 + +template <typename U> struct Outer { + struct Inner {}; + Inner foo(); +}; + +typedef int X; +typedef Outer<X> XOuter; + +int main() { + Outer<int> ab; + ab.foo() == 1; // { dg-error "ab.Outer" } +} diff --git a/gcc/testsuite/g++.dg/other/error17.C b/gcc/testsuite/g++.dg/other/error17.C new file mode 100644 index 000000000..18769ef6b --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error17.C @@ -0,0 +1,13 @@ +// PR c++/32870 + +struct Foo { + struct Bar; +}; + +namespace N { + struct Foo::Bar { }; // { dg-error "in namespace 'N'" } +} + +struct Baz { + struct Foo::Bar { }; // { dg-error "in 'struct Baz'" } +}; diff --git a/gcc/testsuite/g++.dg/other/error18.C b/gcc/testsuite/g++.dg/other/error18.C new file mode 100644 index 000000000..9e4d21cfd --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error18.C @@ -0,0 +1,11 @@ +// PR c++/33208 + +struct A +{ + bool b; +}; + +void f(A a) +{ + a.b--; // { dg-error "Boolean expression" } +} diff --git a/gcc/testsuite/g++.dg/other/error19.C b/gcc/testsuite/g++.dg/other/error19.C new file mode 100644 index 000000000..9389dc170 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error19.C @@ -0,0 +1,7 @@ +// PR c++/33495 + +void foo() +{ + if (({while(true);})) // { dg-error "forbids|<statement>" } + ; +} diff --git a/gcc/testsuite/g++.dg/other/error2.C b/gcc/testsuite/g++.dg/other/error2.C new file mode 100644 index 000000000..36089e4b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error2.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Dec 2001 <nathan@nathan@codesourcery.com> + +// PR 196. Misleading diagnostic + +namespace N +{ + class B { friend void operator>>(int, class B); }; + class N { friend void operator>>(int,class N); }; +} +void N::operator>>(int, N::B) // { dg-error "N::N::B|N::operator>>" } +{ } diff --git a/gcc/testsuite/g++.dg/other/error20.C b/gcc/testsuite/g++.dg/other/error20.C new file mode 100644 index 000000000..f3b17aa19 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error20.C @@ -0,0 +1,13 @@ +// PR c++/34275 +// { dg-do compile } + +struct A // { dg-message "operator=|no known conversion" } +{ + virtual A foo (); +}; + +void bar (A& a) +{ + a.foo () = 0; // { dg-error "A::foo\\(\\) = 0" } + // { dg-message "candidate" "candidate note" { target *-*-* } 11 } +} diff --git a/gcc/testsuite/g++.dg/other/error21.C b/gcc/testsuite/g++.dg/other/error21.C new file mode 100644 index 000000000..e4d14eab6 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error21.C @@ -0,0 +1,8 @@ +// PR c++/34273 + +struct A {}; + +struct B : A +{ + B() : A()... {} // { dg-error "cannot expand" } +}; diff --git a/gcc/testsuite/g++.dg/other/error22.C b/gcc/testsuite/g++.dg/other/error22.C new file mode 100644 index 000000000..225dcae82 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error22.C @@ -0,0 +1,9 @@ +// PR c++/34394 +// { dg-do compile } + +extern "C" double fabs (double); + +void foo (double x) +{ + fabs (x) (); // { dg-error "__builtin_abs" } +} diff --git a/gcc/testsuite/g++.dg/other/error23.C b/gcc/testsuite/g++.dg/other/error23.C new file mode 100644 index 000000000..959fe4075 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error23.C @@ -0,0 +1,5 @@ +// PR c++/34918 +// { dg-do compile } + +int v __attribute ((vector_size (8))); +bool b = !(v - v); // { dg-error "could not convert .\\(__vector.2. int\\)\\{0, 0\\}. from .__vector.2. int. to .bool.|in argument to unary" } diff --git a/gcc/testsuite/g++.dg/other/error24.C b/gcc/testsuite/g++.dg/other/error24.C new file mode 100644 index 000000000..54343c502 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error24.C @@ -0,0 +1,13 @@ +// PR c++/34965 +// { dg-do compile } +// { dg-options "-O" } + +int foo (int); + +void +bar (int i, int j, double k) +{ + foo (i && j) (); // { dg-error "\\(\\(?i != 0\\)? \\&\\& \\(?j != 0\\)?\\)" } + foo (!i || !j) (); // { dg-error "\\(\\(?i == 0\\)? \\|\\| \\(?j == 0\\)?\\)" } + foo (!i == !j) (); // { dg-error "\\(\\(?i != 0\\)? \\^ \\(?j == 0\\)?\\)" } +} diff --git a/gcc/testsuite/g++.dg/other/error25.C b/gcc/testsuite/g++.dg/other/error25.C new file mode 100644 index 000000000..b5b665a2e --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error25.C @@ -0,0 +1,5 @@ +// PR c++/35338 +// { dg-options "" } + +int i = 0r; // { dg-error "not supported" } +bool b = !0r; // { dg-error "not supported" } diff --git a/gcc/testsuite/g++.dg/other/error26.C b/gcc/testsuite/g++.dg/other/error26.C new file mode 100644 index 000000000..fb2c8b727 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error26.C @@ -0,0 +1,6 @@ +// PR c++/35333 + +void foo(__complex__ double x) +{ + __builtin_conj(x)(); // { dg-error "~x" } +} diff --git a/gcc/testsuite/g++.dg/other/error27.C b/gcc/testsuite/g++.dg/other/error27.C new file mode 100644 index 000000000..de9742857 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error27.C @@ -0,0 +1,13 @@ +// PR c++/35332 +// { dg-do compile } +// { dg-options "-fno-finite-math-only" { target sh*-*-* } } + +void foo (double x, double y) +{ + __builtin_isgreater(x, y)(); // { dg-error "__builtin_\[^\n\]*cannot be used as a function" } + __builtin_isless(x, y)(); // { dg-error "__builtin_\[^\n\]*cannot be used as a function" } + __builtin_isgreaterequal(x, y)(); // { dg-error "__builtin_\[^\n\]*cannot be used as a function" } + __builtin_islessequal(x, y)(); // { dg-error "__builtin_\[^\n\]*cannot be used as a function" } + __builtin_isunordered(x, y)(); // { dg-error "__builtin_\[^\n\]*cannot be used as a function" } + __builtin_islessgreater(x, y)(); // { dg-error "__builtin_\[^\n\]*cannot be used as a function" } +} diff --git a/gcc/testsuite/g++.dg/other/error28.C b/gcc/testsuite/g++.dg/other/error28.C new file mode 100644 index 000000000..5ac15b7de --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error28.C @@ -0,0 +1,8 @@ +// PR c++/35987 +// { dg-do compile } + +void +foo (char *p) +{ + if (++p = true); // { dg-error "cannot convert" } +} diff --git a/gcc/testsuite/g++.dg/other/error29.C b/gcc/testsuite/g++.dg/other/error29.C new file mode 100644 index 000000000..a46405875 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error29.C @@ -0,0 +1,21 @@ +// PR c++/35334 +// { dg-do compile } +// { dg-bogus "not supported by" "" { target *-*-* } 0 } + +__complex__ unsigned int i; +int j; +char k; +__complex__ double l; +double m; +float n; + +void +foo () +{ + ((__complex__ int)i)(); // { dg-error "cannot be used as a function" } + ((__complex__ int)j)(); // { dg-error "cannot be used as a function" } + ((__complex__ int)k)(); // { dg-error "cannot be used as a function" } + ((__complex__ long double)l)(); // { dg-error "cannot be used as a function" } + ((__complex__ long double)m)(); // { dg-error "cannot be used as a function" } + ((__complex__ long double)n)(); // { dg-error "cannot be used as a function" } +} diff --git a/gcc/testsuite/g++.dg/other/error3.C b/gcc/testsuite/g++.dg/other/error3.C new file mode 100644 index 000000000..bd5d70109 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error3.C @@ -0,0 +1,5 @@ +// Test for proper error message formatting; the throw() should go inside +// the parens, as below. + +void (*g() throw())(); // { dg-error "g\\(\\) throw" "" } +void (*g())(); // { dg-error "" "" } diff --git a/gcc/testsuite/g++.dg/other/error30.C b/gcc/testsuite/g++.dg/other/error30.C new file mode 100644 index 000000000..2df0e6407 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error30.C @@ -0,0 +1,14 @@ +// PR c++/35336 +// { dg-do compile } +// { dg-bogus "not supported by" "" { target *-*-* } 0 } + +struct A +{ + int i : 2; +}; + +void foo (bool b) +{ + A a; + (a.i || b) (); // { dg-error "cannot be used as" } +} diff --git a/gcc/testsuite/g++.dg/other/error31.C b/gcc/testsuite/g++.dg/other/error31.C new file mode 100644 index 000000000..95c9d7374 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error31.C @@ -0,0 +1,14 @@ +// PR c++/35335 +// { dg-do compile } +// { dg-options "" } +// { dg-bogus "not supported by" "" { target *-*-* } 0 } + +struct A {}; // { dg-message "operator=|no known conversion" } + +void +foo () +{ + A a; + a = ({ { 1; } }); // { dg-error "no match for" } + // { dg-message "candidate" "candidate note" { target *-*-* } 12 } +} diff --git a/gcc/testsuite/g++.dg/other/error32.C b/gcc/testsuite/g++.dg/other/error32.C new file mode 100644 index 000000000..56d3b7aec --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error32.C @@ -0,0 +1,8 @@ +// PR c++/33492 +// { dg-options "" } + +void foo() +{ + if (throw 0) // { dg-error "could not convert .\\<throw-expression\\>. from .void. to .bool." } + ; +} diff --git a/gcc/testsuite/g++.dg/other/error33.C b/gcc/testsuite/g++.dg/other/error33.C new file mode 100644 index 000000000..48fca70d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error33.C @@ -0,0 +1,11 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/42218 +// { dg-do compile } + +template<int> struct A +{ + template<int> struct B; +}; + +int i = A<0>::B<0>::X::Y; // { dg-error "'A<0>::B<0>::X' has not been declared" } + diff --git a/gcc/testsuite/g++.dg/other/error34.C b/gcc/testsuite/g++.dg/other/error34.C new file mode 100644 index 000000000..10a782d38 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error34.C @@ -0,0 +1,6 @@ +// PR c++/46538 +// { dg-do compile } +// { dg-options "" } + +S () : str(__PRETTY_FUNCTION__) {} // { dg-error "forbids declaration" } +// { dg-error "only constructors" "" { target *-*-* } 5 } diff --git a/gcc/testsuite/g++.dg/other/error4.C b/gcc/testsuite/g++.dg/other/error4.C new file mode 100644 index 000000000..bd740d92a --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error4.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 21 Mar 2003 <nathan@codesourcery.com> + +// PR 9898. Confusing error message + +struct Wrapper {}; + +void Foo(int const &); // { dg-error "in passing" "" } + +void Baz () +{ + Foo (Wrapper ()); // { dg-error "Wrapper" "" } +} diff --git a/gcc/testsuite/g++.dg/other/error5.C b/gcc/testsuite/g++.dg/other/error5.C new file mode 100644 index 000000000..c7a142fb5 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error5.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// Origin: Wolfgang Bangerth <bangerth@ices.utexas.edu> +// PR c++/11106: Error message gives partially mangled operator name + +template <typename T> struct S { + struct I {}; +}; + +template <typename T> struct S2 : S<T> { + using S<T>::operator typename S<T>::I*; // { dg-error "operator S\\<int\\>" "" } +}; + +template struct S2<int>; // { dg-message "instantiated" "" } diff --git a/gcc/testsuite/g++.dg/other/error6.C b/gcc/testsuite/g++.dg/other/error6.C new file mode 100644 index 000000000..21180d765 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error6.C @@ -0,0 +1,20 @@ +// { dg-do compile } +// Make sure we emit a decent error message when trying to mangle an +// expression not supported by the C++ ABI due to a defect. +// Update: Better to make it supported, I think... + +template <int N> +struct A {}; + +struct B +{ + static int foo(void); +}; + +template <class T> +A<sizeof(T::foo())> func(void); + +int main() +{ + func<B>(); +} diff --git a/gcc/testsuite/g++.dg/other/error7.C b/gcc/testsuite/g++.dg/other/error7.C new file mode 100644 index 000000000..9845b4172 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error7.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// Origin: <andrewp at andypo dot net> +// c++/8046: ICE on illegal code involving destructor being treated as bit-not +// expression + +class A; +namespace N {} + +void foo(void) +{ + N::~A(); // { dg-error "not a class-name" } +} diff --git a/gcc/testsuite/g++.dg/other/error8.C b/gcc/testsuite/g++.dg/other/error8.C new file mode 100644 index 000000000..9246c2afa --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error8.C @@ -0,0 +1,22 @@ +// { dg-do compile } +// Contributed by: Michael Elizabeth Chastain +// <mec dot gnu at mindspring dot com> +// PR c++/13927: Wrong error message for redeclartion of type from union + +void foo(void) +{ + union { int alpha; int beta; }; // { dg-error "previous declaration" } + double alpha; // { dg-error "conflicting declaration" } +} + +// This checks both the templated version, and the position of the diagnostic +// (which is currently wrong). +template <int> +void tfoo(void) +{ + union { + int alpha; // { dg-error "" "" { xfail *-*-* } } + int beta; + }; // { dg-bogus "" "misplaced position of the declaration" { xfail *-*-* } } + double alpha; // { dg-error "" "" } +} diff --git a/gcc/testsuite/g++.dg/other/error9.C b/gcc/testsuite/g++.dg/other/error9.C new file mode 100644 index 000000000..65a9c58ce --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error9.C @@ -0,0 +1,20 @@ +// { dg-options -Wall } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 27 Sept 2004 <nathan@codesourcery.com> + +// Origin: v.haisman@sh.cvut.cz +// Bug 17681: bad diagnostic text. + +struct A +{ }; + +struct B +{ }; + +struct C : public B, public A +{ + C () // { dg-warning "when initialized" "" } + : A(), B() // { dg-warning "base .\[AB\]." "" } + { } +}; diff --git a/gcc/testsuite/g++.dg/other/field1.C b/gcc/testsuite/g++.dg/other/field1.C new file mode 100644 index 000000000..61a9df695 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/field1.C @@ -0,0 +1,25 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 9 Jul 2003 <nathan@codesourcery.com> + +// PR c++ 9483. accepted fields with same name as class + +struct test +{ + char test; // { dg-error "with same name as class" "" } + test(); +}; + +template <typename T> struct X +{ + char X; // { dg-error "with same name as class" "" } + X (); +}; + +template <> struct X<int> { + char X; // { dg-error "with same name as class" "" } + X(); +}; + +X<float> i; // { dg-message "instantiated from" "" } diff --git a/gcc/testsuite/g++.dg/other/first-global.C b/gcc/testsuite/g++.dg/other/first-global.C new file mode 100644 index 000000000..d58bc7164 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/first-global.C @@ -0,0 +1,6 @@ +/* { dg-do compile } */ +/* { dg-add-options bind_pic_locally } */ +/* { dg-final { scan-assembler "_GLOBAL__(I|sub_I)(_|_65535_0_)foobar" } } */ + +struct foo { foo (); }; +foo foobar; diff --git a/gcc/testsuite/g++.dg/other/fold1.C b/gcc/testsuite/g++.dg/other/fold1.C new file mode 100644 index 000000000..23d34546e --- /dev/null +++ b/gcc/testsuite/g++.dg/other/fold1.C @@ -0,0 +1,8 @@ +// PR middle-end/27384 +// { dg-do compile } + +struct A +{ + static const int i = i; // { dg-error "not declared" } + int x[i]; // { dg-error "constant-expression" } +}; diff --git a/gcc/testsuite/g++.dg/other/friend1.C b/gcc/testsuite/g++.dg/other/friend1.C new file mode 100644 index 000000000..3193180ca --- /dev/null +++ b/gcc/testsuite/g++.dg/other/friend1.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 10 Oct 2001 <nathan@codesourcery.com> + +// Bug 4476. We tangled up inline friends and pure virtuals during +// class definition. + +struct A { + friend void f () { } + void g (A a) { } +}; diff --git a/gcc/testsuite/g++.dg/other/friend2.C b/gcc/testsuite/g++.dg/other/friend2.C new file mode 100644 index 000000000..ce5d2b741 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/friend2.C @@ -0,0 +1,23 @@ +// { dg-do run } +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> + +// PR c++/12370 +// Wrong code because of the friend declaration + +template <typename T> struct A +{ + T x; + A(T t) : x(t) {} + friend A<int> foo (const A<unsigned>&); +}; + +A<int> foo (const A<unsigned>& a) +{ + A<int> res(a.x); + return res; +} + +int main() +{ + return foo(A<unsigned>(0)).x; +} diff --git a/gcc/testsuite/g++.dg/other/friend3.C b/gcc/testsuite/g++.dg/other/friend3.C new file mode 100644 index 000000000..ce872e555 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/friend3.C @@ -0,0 +1,13 @@ +// PR c++/22293 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } + +struct A +{ + friend ~A(); // { dg-error "qualified name" } +}; + +struct B +{ + friend ~A(); // { dg-error "qualified name" } +}; diff --git a/gcc/testsuite/g++.dg/other/friend4.C b/gcc/testsuite/g++.dg/other/friend4.C new file mode 100644 index 000000000..537643df9 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/friend4.C @@ -0,0 +1,8 @@ +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// Misleading diagnostic + +struct A +{ + friend void A::foo(); // { dg-error "implicitly friends" } + friend A::~A(); // { dg-error "implicitly friends" } +}; diff --git a/gcc/testsuite/g++.dg/other/friend5.C b/gcc/testsuite/g++.dg/other/friend5.C new file mode 100644 index 000000000..b0ec201fb --- /dev/null +++ b/gcc/testsuite/g++.dg/other/friend5.C @@ -0,0 +1,9 @@ +/* PR c++/32111 */ +/* This used to ICE. */ + +/* { dg-do compile } */ + +struct A +{ + friend A::~A() {} /* { dg-error "implicitly friends of their class" } */ +}; diff --git a/gcc/testsuite/g++.dg/other/gc1.C b/gcc/testsuite/g++.dg/other/gc1.C new file mode 100644 index 000000000..3c7a16998 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/gc1.C @@ -0,0 +1,49 @@ +// This test failed with GGC_ALWAYS_COLLECT because not all unparsed +// inline methods were registered with GC. +// { dg-do compile } + +const char *foo () +{ + struct A + { + const char *a1 () + { + return "a1"; + } + const char *a2 () + { + struct B + { + const char *b1 () + { + return "b1"; + } + const char *b2 () + { + struct C + { + const char *c1 () + { + return "c1"; + } + const char *c2 () + { + return "c2"; + } + }; + return "b2"; + } + const char *b3 () + { + return "b3"; + } + }; + return "a2"; + } + const char *a3 () + { + return "a3"; + } + }; + return "foo"; +} diff --git a/gcc/testsuite/g++.dg/other/gc2.C b/gcc/testsuite/g++.dg/other/gc2.C new file mode 100644 index 000000000..142229475 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/gc2.C @@ -0,0 +1,38 @@ +// PR c++/12316 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> + +// { dg-do compile } +// { dg-options "--param ggc-min-expand=0 --param ggc-min-heapsize=0" } + +inline void FOO() {} + +template<typename> struct A +{ + A() {} + ~A() throw() {} +}; + +template<typename> struct B +{ + static void foo(); + static void bar() { foo(); } +}; + +struct C {}; + +template<typename> struct D : C +{ + D() {} + ~D() { B<void>::bar(); } +}; + +template<typename> struct E : D<void> +{ + static void baz() {} + E(A<void>) { baz(); } +}; + +void BAR() +{ + new E<void>(A<void>()); +} diff --git a/gcc/testsuite/g++.dg/other/gc3.C b/gcc/testsuite/g++.dg/other/gc3.C new file mode 100644 index 000000000..500d109e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/gc3.C @@ -0,0 +1,8 @@ +// PR c++/21687 +// { dg-options "--param ggc-min-expand=0 --param ggc-min-heapsize=0" } + +template <class Union> +void perform_test_trivial() { + struct check_union { void perform_test_trivial() {} }; +} + diff --git a/gcc/testsuite/g++.dg/other/gc4.C b/gcc/testsuite/g++.dg/other/gc4.C new file mode 100644 index 000000000..50c16b366 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/gc4.C @@ -0,0 +1,14 @@ +// PR c++/41120 +// { dg-options "--param ggc-min-heapsize=0 --param ggc-min-expand=0" } + +struct A +{ + A(); +}; + +struct B +{ + A a; +}; + +B b; diff --git a/gcc/testsuite/g++.dg/other/i386-1.C b/gcc/testsuite/g++.dg/other/i386-1.C new file mode 100644 index 000000000..ec572ec94 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/i386-1.C @@ -0,0 +1,28 @@ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-msse2" } */ +/* { dg-require-effective-target sse2_runtime } */ + +#include <xmmintrin.h> + +static void +sse2_test (void) +{ + float a = 1.0f; + float b = 2.0f; + float c = 3.0f; + float r; + + __m128 v = _mm_set_ps(a, b, c, 0); + + v = (__m128)_mm_srli_si128((__m128i)v, 4); + _mm_store_ss(&r, v); + if (r != 3.0f) + abort (); +} + +int +main () +{ + sse2_test (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/i386-2.C b/gcc/testsuite/g++.dg/other/i386-2.C new file mode 100644 index 000000000..1a445f1b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/i386-2.C @@ -0,0 +1,11 @@ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-O -pedantic-errors -march=k8 -msse4a -m3dnow -mavx -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mbmi -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c" } */ + +/* Test that {,x,e,p,t,s,w,a,b,i}mmintrin.h, mm3dnow.h, fma4intrin.h, + xopintrin.h, abmintrin.h, bmiintrin.h, tbmintrin.h, lwpintrin.h, + popcntintrin.h and mm_malloc.h.h are usable with -O -pedantic-errors. */ + +#include <x86intrin.h> + +int dummy; + diff --git a/gcc/testsuite/g++.dg/other/i386-3.C b/gcc/testsuite/g++.dg/other/i386-3.C new file mode 100644 index 000000000..66eec1422 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/i386-3.C @@ -0,0 +1,9 @@ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-O -fkeep-inline-functions -march=k8 -msse4a -m3dnow -mavx -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mbmi -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c" } */ + +/* Test that {,x,e,p,t,s,w,a,b,i}mmintrin.h, mm3dnow.h, fma4intrin.h, + xopintrin.h, abmintrin.h, bmiintrin.h, tbmintrin.h, lwpintrin.h, + popcntintrin.h and mm_malloc.h are usable with + -O -fkeep-inline-functions. */ + +#include <x86intrin.h> diff --git a/gcc/testsuite/g++.dg/other/i386-4.C b/gcc/testsuite/g++.dg/other/i386-4.C new file mode 100644 index 000000000..858a3a74e --- /dev/null +++ b/gcc/testsuite/g++.dg/other/i386-4.C @@ -0,0 +1,30 @@ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-O1 -msse2" } */ +/* { dg-require-effective-target sse2 } */ + +#include <xmmintrin.h> + +void ConvertFloatSSE (void *inBuff, void *outBuff, int len) +{ + unsigned char *inByteBuffer = reinterpret_cast < unsigned char *>(inBuff); + float *outFloatBuffer = reinterpret_cast < float *>(outBuff); + + for (int i = 0; i < len / 4; i++) + { + __m128i register1 = + _mm_set_epi8 (*inByteBuffer, *(inByteBuffer + 1), + *(inByteBuffer + 2), 0, + *(inByteBuffer + 3), *(inByteBuffer + 4), + *(inByteBuffer + 5), 0, + *(inByteBuffer + 6), *(inByteBuffer + 7), + *(inByteBuffer + 8), 0, + *(inByteBuffer + 9), *(inByteBuffer + 10), + *(inByteBuffer + 11), 0); + __m128i register2 = _mm_srai_epi32 (register1, 8); + __m128 register3 = _mm_cvtepi32_ps (register2); + + _mm_store_ps (outFloatBuffer, register3); + outFloatBuffer += 4; + inByteBuffer += 12; + } +} diff --git a/gcc/testsuite/g++.dg/other/i386-7.C b/gcc/testsuite/g++.dg/other/i386-7.C new file mode 100644 index 000000000..e2ad51e52 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/i386-7.C @@ -0,0 +1,8 @@ +/* Test that x86intrin.h is usable with -O -pedantic-errors. */ +/* We were using SSE4.2 builtins without the extension available. */ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-O -pedantic-errors" } */ + +#include <x86intrin.h> + +int dummy; diff --git a/gcc/testsuite/g++.dg/other/i386-8.C b/gcc/testsuite/g++.dg/other/i386-8.C new file mode 100644 index 000000000..7de75c73c --- /dev/null +++ b/gcc/testsuite/g++.dg/other/i386-8.C @@ -0,0 +1,23 @@ +// PR rtl-optimization/45400 +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-options "-O2 -msse2" } +// { dg-options "-O2 -msse2 -fpic" { target fpic } } +// { dg-require-effective-target sse2 } + +#include <xmmintrin.h> + +static inline unsigned short +bar (unsigned short x) +{ + return ((x << 8) | (x >> 8)); +} + +unsigned int +foo (float *x, short *y) +{ + __m128 a = _mm_set_ps1 (32767.5f); + __m128 b = _mm_mul_ps (_mm_load_ps (x), a); + __m64 c = _mm_cvtps_pi16 (b); + __builtin_memcpy (y, &c, sizeof (short) * 4); + y[0] = bar (y[0]); +} diff --git a/gcc/testsuite/g++.dg/other/i386-9.C b/gcc/testsuite/g++.dg/other/i386-9.C new file mode 100644 index 000000000..796405791 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/i386-9.C @@ -0,0 +1,12 @@ +// PR target/48142 +// Testcase by Zdenek Sojka <zsojka@seznam.cz> + +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-options "-Os -mpreferred-stack-boundary=5 -fstack-check -fno-omit-frame-pointer" } + +int main() +{ + try { throw 0; } + catch (...) {} + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/incomplete1.C b/gcc/testsuite/g++.dg/other/incomplete1.C new file mode 100644 index 000000000..cb7970fad --- /dev/null +++ b/gcc/testsuite/g++.dg/other/incomplete1.C @@ -0,0 +1,7 @@ +// PR c++/23089 +// Origin: Flash Sheridan <flash@pobox.com> +// ICE on incomplete type +// { dg-do compile } +// { dg-options "-O" } + +void foo(struct A) {} // { dg-error "incomplete type|forward declaration" } diff --git a/gcc/testsuite/g++.dg/other/incomplete2.C b/gcc/testsuite/g++.dg/other/incomplete2.C new file mode 100644 index 000000000..127bf588e --- /dev/null +++ b/gcc/testsuite/g++.dg/other/incomplete2.C @@ -0,0 +1,14 @@ +// PR c++/19963 +// { dg-do compile } + +struct A; + +struct B +{ + A a : 1; // { dg-error "incomplete" } +}; + +struct S +{ + S : 1; // { dg-error "incomplete" } +}; diff --git a/gcc/testsuite/g++.dg/other/incomplete3.C b/gcc/testsuite/g++.dg/other/incomplete3.C new file mode 100644 index 000000000..14de98eb6 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/incomplete3.C @@ -0,0 +1,9 @@ +//PR c++/28054 + +struct A; + +struct B +{ + friend A : 2; // { dg-error "incomplete type" } +}; + diff --git a/gcc/testsuite/g++.dg/other/increment1.C b/gcc/testsuite/g++.dg/other/increment1.C new file mode 100644 index 000000000..506157ef2 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/increment1.C @@ -0,0 +1,19 @@ +// PR c++/37561 +// { dg-do compile } +// { dg-options "-Wno-int-to-pointer-cast" } + +__PTRDIFF_TYPE__ p; +char q; + +void +foo () +{ + ((char *) p)++; // { dg-error "lvalue" } + ((char *) q)++; // { dg-error "lvalue" } + ((char *) p)--; // { dg-error "lvalue" } + ((char *) q)--; // { dg-error "lvalue" } + ++(char *) p; // { dg-error "lvalue" } + ++(char *) q; // { dg-error "lvalue" } + --(char *) p; // { dg-error "lvalue" } + --(char *) q; // { dg-error "lvalue" } +} diff --git a/gcc/testsuite/g++.dg/other/infloop-1.C b/gcc/testsuite/g++.dg/other/infloop-1.C new file mode 100644 index 000000000..6c851c7e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/infloop-1.C @@ -0,0 +1,16 @@ +// PR 18300: This sends old compilers into an infinite loop on x86_64 +// Testcase and patch contributed by Zak Kipling <zak@transversal.com> + +struct base1 { }; +struct base2 { }; +struct base3 { }; + +struct derived : base1, base2, base3 { }; + +void foo(derived); + +int main() +{ + foo(derived()); +} + diff --git a/gcc/testsuite/g++.dg/other/init1.C b/gcc/testsuite/g++.dg/other/init1.C new file mode 100644 index 000000000..7fc7db66a --- /dev/null +++ b/gcc/testsuite/g++.dg/other/init1.C @@ -0,0 +1,28 @@ +// { dg-do compile } + +// Copyright (C) 2001, 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 13 Nov 2001 <nathan@codesourcery.com> + +// Bug 3154 + +class A {}; + +struct B : A +{ + typedef A Parent; + + B () : Parent () {} +}; + +class T +{ + typedef int Foo; + T () : Foo () {} // { dg-error "T::Foo' is not" "" } +}; + +struct S : B +{ + int Parent; + + S () :Parent (1) {} +}; diff --git a/gcc/testsuite/g++.dg/other/init2.C b/gcc/testsuite/g++.dg/other/init2.C new file mode 100644 index 000000000..0b85aa67d --- /dev/null +++ b/gcc/testsuite/g++.dg/other/init2.C @@ -0,0 +1,49 @@ +// { dg-do run } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 20 Dec 2001 <nathan@nathan@codesourcery.com> + +// PR 160. Wrong code emitted for some reference initializers. + +void Foo () +{ +} + +int fail; + +class C +{ + public: + int m; + int &r; + + C () ; +}; + +C::C () + : m (1), r ((Foo (), m)) +{ + m = 10; + + if (r != m) + fail = 1; + else if (&m != &r) + fail = 2; +} +int main () +{ + int m (1); + int &r ((Foo (),m)); + + m = 10; + if (r != m) + fail = 3; + else if (&r != &m) + fail = 4; + + if (!fail) + { + C c; + } + return fail; +} diff --git a/gcc/testsuite/g++.dg/other/java1.C b/gcc/testsuite/g++.dg/other/java1.C new file mode 100644 index 000000000..38b5e0c30 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/java1.C @@ -0,0 +1,22 @@ +// { dg-options "-w -ansi -pedantic" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 23 Oct 2003 <nathan@codesourcery.com> + +extern "Java" { + class One + { + ~One (); // { dg-error "cannot have a destructor" "" } + One (); + }; + + class Two {}; + + class Three : One {}; // { dg-error "cannot have an implicit" "" } + + class Four : Two {}; + + class Five : Two, Four {}; // { dg-error "cannot have multiple bases" "" } + + class Six : virtual Two {}; // { dg-error "cannot have virtual base" "" } +} diff --git a/gcc/testsuite/g++.dg/other/java2.C b/gcc/testsuite/g++.dg/other/java2.C new file mode 100644 index 000000000..8ba4d5a72 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/java2.C @@ -0,0 +1,11 @@ +// PR c++/??? +// { dg-do compile } + +extern "Java" +{ + struct A {}; +} + +typedef void* jclass; + +A* p = new A; // { dg-error "class\\$" } diff --git a/gcc/testsuite/g++.dg/other/label1.C b/gcc/testsuite/g++.dg/other/label1.C new file mode 100644 index 000000000..74572dc7d --- /dev/null +++ b/gcc/testsuite/g++.dg/other/label1.C @@ -0,0 +1,7 @@ +//PR c++/27820 + +void foo() +{ + L: L: ; // { dg-error "duplicate label" } +} + diff --git a/gcc/testsuite/g++.dg/other/large-size-array.C b/gcc/testsuite/g++.dg/other/large-size-array.C new file mode 100644 index 000000000..9614fb125 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/large-size-array.C @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +#include <limits.h> + +#ifdef _WIN64 +#define DIM ULLONG_MAX>>1 +#else +#ifdef __LP64__ +#define DIM UINT_MAX>>1 +#else +#define DIM USHRT_MAX>>1 +#endif +#endif + +int +sub (int *a) +{ + return a[0]; +} + +int +main (void) +{ + int a[DIM][DIM]; /* { dg-error "size of array 'a' is too large" } */ + return sub (&a[0][0]); /* { dg-error "declared" } */ +} + + diff --git a/gcc/testsuite/g++.dg/other/linkage1.C b/gcc/testsuite/g++.dg/other/linkage1.C new file mode 100644 index 000000000..c2676bac1 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/linkage1.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 9 Dec 2001 <nathan@nathan@codesourcery.com> + +// PR 51 +// This example snippet is from the ISO C++ standard, sect 7.5 para 4: + +extern "C" typedef void FUNC_c(); + +class C { + public: + static FUNC_c* q; +}; diff --git a/gcc/testsuite/g++.dg/other/macro-1.C b/gcc/testsuite/g++.dg/other/macro-1.C new file mode 100644 index 000000000..e1d9d34cd --- /dev/null +++ b/gcc/testsuite/g++.dg/other/macro-1.C @@ -0,0 +1,3 @@ +/* { dg-do compile } */ + +short array[3] __attribute__ ((aligned (__BIGGEST_ALIGNMENT__))); diff --git a/gcc/testsuite/g++.dg/other/main1.C b/gcc/testsuite/g++.dg/other/main1.C new file mode 100644 index 000000000..ba945741e --- /dev/null +++ b/gcc/testsuite/g++.dg/other/main1.C @@ -0,0 +1,4 @@ +// PR c++/30021 +// { dg-do compile } + +int main(void,char**); // { dg-error "incomplete type|invalid use" } diff --git a/gcc/testsuite/g++.dg/other/mmintrin.C b/gcc/testsuite/g++.dg/other/mmintrin.C new file mode 100644 index 000000000..8315f93d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/mmintrin.C @@ -0,0 +1,5 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-options "-msse" } +// { dg-require-effective-target sse } + +#include <xmmintrin.h> diff --git a/gcc/testsuite/g++.dg/other/mult-stor1.C b/gcc/testsuite/g++.dg/other/mult-stor1.C new file mode 100644 index 000000000..1eaec4f14 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/mult-stor1.C @@ -0,0 +1,8 @@ +// PR c++/20646 +// Origin: Dan Rosen <dan.rosen@gmail.com> +// { dg-do compile } + +struct A +{ + extern static int i; // { dg-error "conflicting specifiers" } +}; diff --git a/gcc/testsuite/g++.dg/other/nested-extern-1.C b/gcc/testsuite/g++.dg/other/nested-extern-1.C new file mode 100644 index 000000000..6533a2ade --- /dev/null +++ b/gcc/testsuite/g++.dg/other/nested-extern-1.C @@ -0,0 +1,17 @@ +/* { dg-do run } */ +// { dg-additional-sources "nested-extern.cc" } +/* PR 31775 */ +extern "C" void abort(); +extern int *p; +int main() +{ + extern int i; + i = 1; + *p = 2; + if (i == 2) + abort (); + return 0; +} + +static int i; +int *p = &i; diff --git a/gcc/testsuite/g++.dg/other/nested-extern-2.C b/gcc/testsuite/g++.dg/other/nested-extern-2.C new file mode 100644 index 000000000..58f53e083 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/nested-extern-2.C @@ -0,0 +1,18 @@ +/* { dg-do run } */ +// { dg-additional-sources "nested-extern.cc" } +/* PR 31775 */ +extern "C" void abort(); +static int i; +int *p = &i; +int main() +{ + int i; + { + extern int i; + i = 1; + *p = 2; + if (i == 2) + abort (); + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/nested-extern.cc b/gcc/testsuite/g++.dg/other/nested-extern.cc new file mode 100644 index 000000000..048f715b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/nested-extern.cc @@ -0,0 +1 @@ +int i; diff --git a/gcc/testsuite/g++.dg/other/new-size-type.C b/gcc/testsuite/g++.dg/other/new-size-type.C new file mode 100644 index 000000000..04933fd4a --- /dev/null +++ b/gcc/testsuite/g++.dg/other/new-size-type.C @@ -0,0 +1,10 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/36741 + +#include <stddef.h> +const char* +foo() +{ + return new char[~static_cast<size_t>(0)];// { dg-bogus "large" } +} + diff --git a/gcc/testsuite/g++.dg/other/new1.C b/gcc/testsuite/g++.dg/other/new1.C new file mode 100644 index 000000000..71383706e --- /dev/null +++ b/gcc/testsuite/g++.dg/other/new1.C @@ -0,0 +1,14 @@ +// PR c++/28267 +// { dg-do compile } + +struct A +{ + A(); + void* operator new(__SIZE_TYPE__, int = X); // { dg-error "not declared" } + void operator delete(void*, int); +}; + +void foo() +{ + new A; // { dg-error "default argument" } +} diff --git a/gcc/testsuite/g++.dg/other/nontype-1.C b/gcc/testsuite/g++.dg/other/nontype-1.C new file mode 100644 index 000000000..11bbfb829 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/nontype-1.C @@ -0,0 +1,7 @@ +template <class Op> +bool asfun(Op f, + Op::first_argument_type a, // { dg-error "not a type" } + Op::second_argument_type b) // { dg-error "not a type" } +{ + return Op(a, b); +} diff --git a/gcc/testsuite/g++.dg/other/ns1.C b/gcc/testsuite/g++.dg/other/ns1.C new file mode 100644 index 000000000..cb77780dc --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ns1.C @@ -0,0 +1,13 @@ +// PR c++/14821 + +namespace A { + namespace B {} +} + +namespace A { + namespace Alias = ::A::B; +} + +namespace A { + namespace Alias = ::A::B; +} diff --git a/gcc/testsuite/g++.dg/other/offsetof1.C b/gcc/testsuite/g++.dg/other/offsetof1.C new file mode 100644 index 000000000..78738892a --- /dev/null +++ b/gcc/testsuite/g++.dg/other/offsetof1.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 14 Aug 2002 <nathan@codesourcery.com> + +// PR c++ 7598, offsetof broke +// PR c++ 11072, DR 273's solution is broken + +#include <cstddef> + +struct F +{ + char i; + char j; +}; + +static int ary[offsetof(F, j)]; diff --git a/gcc/testsuite/g++.dg/other/offsetof2.C b/gcc/testsuite/g++.dg/other/offsetof2.C new file mode 100644 index 000000000..3ab63981d --- /dev/null +++ b/gcc/testsuite/g++.dg/other/offsetof2.C @@ -0,0 +1,47 @@ +// { dg-do run } +// { dg-options -Wold-style-cast } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 22 Apr 2003 <nathan@codesourcery.com> + +// DR273 POD can have an operator&, offsetof is still required to work + +#include <stddef.h> + +struct POD1 +{ + int m; + + void *operator& () const {return 0;} // yes, still a pod! +}; + +struct POD2 +{ + int m; +}; + +void *operator& (POD2 const &) {return 0;} // ouch! + +struct POD3 +{ + int prefix; + + POD1 m; +}; + +struct POD4 +{ + int prefix; + + POD1 m; +}; + +int main () +{ + if (offsetof (POD3, m) != sizeof (int)) + return 1; + if (offsetof (POD4, m) != sizeof (int)) + return 2; + return 0; +} + diff --git a/gcc/testsuite/g++.dg/other/offsetof3.C b/gcc/testsuite/g++.dg/other/offsetof3.C new file mode 100644 index 000000000..5946c812c --- /dev/null +++ b/gcc/testsuite/g++.dg/other/offsetof3.C @@ -0,0 +1,17 @@ +/* Verify that offsetof warns if given a non-standard-layout class */ +/* Copyright (C) 2003 Free Software Foundation, Inc. */ +/* Contributed by Matt Austern <austern@apple.com> 15 May 2003 */ +/* { dg-do compile } */ + +struct X +{ + int x, y; +protected: + int z; +}; + +typedef X* pX; +typedef __SIZE_TYPE__ size_t; + +size_t yoff = size_t(&(pX(0)->y)); /* { dg-warning "invalid access" "" } */ +/* { dg-warning "macro was used incorrectly" "macro" { target *-*-* } 16 } */ diff --git a/gcc/testsuite/g++.dg/other/offsetof4.C b/gcc/testsuite/g++.dg/other/offsetof4.C new file mode 100644 index 000000000..ab2282e25 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/offsetof4.C @@ -0,0 +1,16 @@ +/* Verify that -Wno-invalid-offsetof disables warning */ +/* Copyright (C) 2003 Free Software Foundation, Inc. */ +/* Contributed by Matt Austern <austern@apple.com> 15 May 2003 */ +/* { dg-do compile } */ +/* { dg-options "-Wno-invalid-offsetof" } */ + +struct X +{ + X() : x(3), y(4) { } + int x, y; +}; + +typedef X* pX; +typedef __SIZE_TYPE__ size_t; + +size_t yoff = size_t(&(pX(0)->y)); diff --git a/gcc/testsuite/g++.dg/other/offsetof5.C b/gcc/testsuite/g++.dg/other/offsetof5.C new file mode 100644 index 000000000..3c4843380 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/offsetof5.C @@ -0,0 +1,22 @@ +// PR c++/35741 +// { dg-do compile } + +#include <stddef.h> + +struct A +{ + char c; + int &i; +}; + +int j = offsetof (A, i); // { dg-warning "invalid access|offsetof" } + +template <typename T> +struct S +{ + T h; + T &i; + static const int j = offsetof (S, i); // { dg-warning "invalid access|offsetof" } +}; + +int k = S<int>::j; // { dg-message "instantiated from here" } diff --git a/gcc/testsuite/g++.dg/other/offsetof6.C b/gcc/testsuite/g++.dg/other/offsetof6.C new file mode 100644 index 000000000..b77d1b99a --- /dev/null +++ b/gcc/testsuite/g++.dg/other/offsetof6.C @@ -0,0 +1,26 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/38699 +// { dg-do compile } + +template<class T> +struct A +{ + const T *p; +}; + +struct B +{ + A<int> a; +}; + +template class A<char>; + +void +f0 () +{ + __builtin_offsetof(A<char>, p); // OK + __builtin_offsetof(A<char>, p[1]); // { dg-error "non constant address" } + __builtin_offsetof(B, a.p); // OK + __builtin_offsetof(B, a.p[1]); // { dg-error "non constant address" } +} + diff --git a/gcc/testsuite/g++.dg/other/offsetof7.C b/gcc/testsuite/g++.dg/other/offsetof7.C new file mode 100644 index 000000000..0ce2ee02a --- /dev/null +++ b/gcc/testsuite/g++.dg/other/offsetof7.C @@ -0,0 +1,17 @@ +// PR c++/50608 +// Testcase by <dberger@oubliette.org> +// { dg-do compile } + +struct A { + int offset; +}; + +struct B: public A { +}; + +struct C { + A a; + B b; +}; + +int fails = __builtin_offsetof (C, b.offset); diff --git a/gcc/testsuite/g++.dg/other/opaque-1.C b/gcc/testsuite/g++.dg/other/opaque-1.C new file mode 100644 index 000000000..5cdaeafe3 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/opaque-1.C @@ -0,0 +1,31 @@ +/* { dg-do run } */ +/* { dg-options "-mcpu=8540 -mspe -mabi=spe -mfloat-gprs=single" } */ +/* { dg-skip-if "not an SPE target" { ! powerpc_spe_nocache } { "*" } { "" } } */ + +#define __vector __attribute__((vector_size(8))) +typedef float __vector __ev64_fs__; + +__ev64_fs__ f; +__ev64_opaque__ o; + +int here = 0; + +void bar (__ev64_opaque__ x) +{ + here = 0; +} + +void bar (__ev64_fs__ x) +{ + here = 888; +} + +int main () +{ + f = o; + o = f; + bar (f); + if (here != 888) + return 1; + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/opaque-2.C b/gcc/testsuite/g++.dg/other/opaque-2.C new file mode 100644 index 000000000..3bb4af2c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/opaque-2.C @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-mcpu=8540 -mspe -mabi=spe -mfloat-gprs=single" } */ +/* { dg-skip-if "not an SPE target" { ! powerpc_spe_nocache } { "*" } { "" } } */ + +#define __vector __attribute__((vector_size(8))) +typedef float __vector __ev64_fs__; + +__ev64_fs__ f; +__ev64_opaque__ o; + +extern void bar (__ev64_opaque__); + +int main () +{ + f = o; + o = f; + bar (f); + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/opaque-3.C b/gcc/testsuite/g++.dg/other/opaque-3.C new file mode 100644 index 000000000..5ece652c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/opaque-3.C @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-mcpu=8540 -mspe -mabi=spe -mfloat-gprs=single" } */ +/* { dg-skip-if "not an SPE target" { ! powerpc_spe_nocache } { "*" } { "" } } */ + +__ev64_opaque__ o; +#define v __attribute__((vector_size(8))) +v unsigned int *p; + +void m() +{ + o = __builtin_spe_evldd(p, 5); +} diff --git a/gcc/testsuite/g++.dg/other/operator1.C b/gcc/testsuite/g++.dg/other/operator1.C new file mode 100644 index 000000000..86841c999 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/operator1.C @@ -0,0 +1,9 @@ +// PR c++/27547 +// { dg-do compile } + +int operator=(int); // { dg-error "member function" } + +void foo() +{ + operator=(0); // { dg-error "not defined" } +} diff --git a/gcc/testsuite/g++.dg/other/operator2.C b/gcc/testsuite/g++.dg/other/operator2.C new file mode 100644 index 000000000..4b952bf11 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/operator2.C @@ -0,0 +1,10 @@ +// PR c++/28852 +// { do-do compile } + +struct A +{ + operator int&(int); // { dg-error "void" } +}; + +A a; +int& i = a; // { dg-error "initialization" } diff --git a/gcc/testsuite/g++.dg/other/packed1.C b/gcc/testsuite/g++.dg/other/packed1.C new file mode 100644 index 000000000..ac586c6c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/packed1.C @@ -0,0 +1,29 @@ +// { dg-do run { xfail sh-*-* lm32-*-* } } + +// NMS:2003-04-21 this fails on strict aligned architectures again, +// the patch was reverted because it broke something more important. + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 8 Aug 2002 <nathan@codesourcery.com> + +// WRS SPR 63496, lost packed attribute when accessing a packed +// field. This matters on aligned architectures like sh + +struct thing { int m; }; + +struct pod + { + char a; + thing m __attribute__ ((packed)); // { dg-warning "attribute ignored" "" { target default_packed } } + }; + +int main () +{ + thing t; + pod p; + + p.m = t; /* runtime bus error here */ + + return 0; + +} diff --git a/gcc/testsuite/g++.dg/other/pr20366.C b/gcc/testsuite/g++.dg/other/pr20366.C new file mode 100644 index 000000000..36a689ebf --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr20366.C @@ -0,0 +1,80 @@ +// Test fix for PR20366 +// +// { dg-do compile { target *-*-aix* } } +// { dg-options "-D_LARGE_FILES" } +// +// cstdio includes stdio.h and undefs most of the functions declared +// therein, unfortunately this means that #define fopen fopen64 goes +// away. This tests the fix, and ensures that with -D_LARGE_FILES +// fopen et. al. are indeed aliased to the large file equivalents. +// +// There are many other #define foo foo64 in the AIX headers, but +// these all work out fine as they are not undefined in libstdc++. +// This list is probably incomplete: +// +// Symbol Return type Large file declaration. +// +// aio.h (different for different AIX versions) +// ===== +// aio_read int aio_read64(int, struct aiocb64 *); +// aio_write int aio_write64(int, struct aiocb64 *); +// lio_listio int lio_listio64(int, struct liocb64 *[], int, void *); +// aio_cancel int aio_cancel64(int, struct aiocb64 *); +// aio_suspend int aio_suspend64(int, struct aiocb64 *[]); +// +// stdio.h +// ======= +// fgetpos int fgetpos64(FILE *, fpos64_t *); +// fopen FILE *fopen64(const char *, const char *); +// freopen FILE *freopen64(const char *, const char *, FILE *); +// fseeko int fseeko64(FILE *, off64_t, int); +// fsetpos int fsetpos64(FILE *, const fpos64_t *); +// ftello off64_t ftello64(FILE *); +// +// unistd.h +// ======== +// fclear off64_t fclear64(int, off64_t); +// fsync_range int fsync_range64(int, int, off64_t, off64_t); +// ftruncate int ftruncate64(int, off64_t); +// truncate int truncate64(const char *, off64_t); +// lseek off64_t lseek64(int, off64_t, int); +// pread ssize_t pread64(int, void *, size_t, off64_t); +// pwrite ssize_t pwrite64(int, const void *, size_t, off64_t); +// +// fcntl.h +// ======= +// open int open64(const char *, int, ...); +// creat int creat64(const char *, mode_t); +// +// sys/stat.h +// ========== +// stat int stat64(const char *, struct stat64 *); +// fstat int fstat64(int, struct stat64 *); +// lstat int lstat64(const char *, struct stat64 *); +// +// stdlib.h +// ======== +// mkstemp int mkstemp64(char *); +// +// ftw.h +// ===== +// ftw int ftw64(const char *, int (*)(const char *,const struct stat64 *, int), int); +// nftw int nftw64(const char *, int (*)(const char *, const struct stat64 *, int, struct FTW*), int, int); +// +// It seems unlikely that any of these will be used (and #undef'ed) by +// libstdc++ in the future, if they are then this test and its +// associated patch to fixincludes will have to be revisited. + +#include <cstdio> + +extern "C" { +int fgetpos(FILE *, fpos64_t *); +FILE *fopen(const char *, const char *); +FILE *freopen(const char *, const char *, FILE *); +int fseeko(FILE *, off64_t, int); +int fsetpos(FILE *, const fpos64_t *); +off64_t ftello(FILE *); +} +int main() { + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/pr22003.C b/gcc/testsuite/g++.dg/other/pr22003.C new file mode 100644 index 000000000..222ccac7b --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr22003.C @@ -0,0 +1,25 @@ +/* PR rtl-optimization/22003 */ +/* { dg-do compile } */ +/* { dg-require-effective-target freorder } */ +/* { dg-options "-O2 -fno-exceptions -freorder-blocks-and-partition" } */ + +struct c1 +{ + virtual ~c1(); +}; +class c4; + +struct c2 +{ + virtual c4* func(); +}; + +struct c3 : c1, c2 +{ + c4* func(); +}; + +c4* c3::func() +{ +} + diff --git a/gcc/testsuite/g++.dg/other/pr22358.C b/gcc/testsuite/g++.dg/other/pr22358.C new file mode 100644 index 000000000..dbce0f8a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr22358.C @@ -0,0 +1,8 @@ +/* { dg-do compile } */ + +struct a +{ + virtual ~a(); +}; +struct b : virtual a { }; +b a11; diff --git a/gcc/testsuite/g++.dg/other/pr23205-2.C b/gcc/testsuite/g++.dg/other/pr23205-2.C new file mode 100644 index 000000000..608108ad9 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr23205-2.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-skip-if "No stabs" { mmix-*-* *-*-aix* *-*-netware* alpha*-*-* hppa*64*-*-* ia64-*-* } { "*" } { "" } } */ +/* { dg-options "-gstabs+ -fno-eliminate-unused-debug-types -ftoplevel-reorder" } */ + +const int foobar = 4; +int foo () +{ + return foobar + 1; +} + +int main() +{ + int i; + i = foo(); + return i; +} + +/* { dg-final { scan-assembler ".stabs.*foobar:c=i" } } */ diff --git a/gcc/testsuite/g++.dg/other/pr24623.C b/gcc/testsuite/g++.dg/other/pr24623.C new file mode 100644 index 000000000..480bb39b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr24623.C @@ -0,0 +1,69 @@ +/* This used to ICE due to a backend problem on s390. */ + +/* { dg-do compile } */ +/* { dg-options "-O1" } */ + +class ReferenceCounted +{ +public: + + virtual ~ ReferenceCounted () + { + } + void decrementRefCount () const + { + if (--const_cast < unsigned int &>(_ref_count) == 0) + { + delete this; + } + } + unsigned int _ref_count; +}; + +template < class T > class RefCountPointer +{ +public: + +RefCountPointer (T * p = 0):_p (p) + { + } + RefCountPointer & operator= (const RefCountPointer < T > &o) + { + if (_p != o._p) + { + if (_p != 0) + _p->decrementRefCount (); + } + } + ~RefCountPointer () + { + } + T *_p; +}; +class Item:public ReferenceCounted +{ +public: + + typedef RefCountPointer < const Item > Ptr; +}; +class AnyAtomicType:public Item +{ +}; +class StaticContext +{ +}; +class DynamicContext:public StaticContext +{ +}; +class SortableItem +{ + SortableItem (); + int m_bAscending:1; + DynamicContext *m_context; + AnyAtomicType::Ptr m_item; +}; +SortableItem::SortableItem () +{ + m_context = __null; + m_item = __null; +} diff --git a/gcc/testsuite/g++.dg/other/pr25632.C b/gcc/testsuite/g++.dg/other/pr25632.C new file mode 100644 index 000000000..e66ae3b51 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr25632.C @@ -0,0 +1,19 @@ +/* PR c++/25632 */ + +/* { dg-do compile } */ + +__extension__ typedef __INTPTR_TYPE__ intptr_t; + +struct sockaddr_un { + char sun_path[1]; +}; +const unsigned SI_SUN_HEAD_LEN = (intptr_t)(((struct sockaddr_un *)0)->sun_path); +int SiGetPeerName () +{ + return SI_SUN_HEAD_LEN; +} +int SiAccept () +{ + return SI_SUN_HEAD_LEN; +} + diff --git a/gcc/testsuite/g++.dg/other/pr27495.C b/gcc/testsuite/g++.dg/other/pr27495.C new file mode 100644 index 000000000..990b1ee5e --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr27495.C @@ -0,0 +1,8 @@ + +// Test to make sure we do not ICE on this invalid program. + +struct A +{ + template<int> void foo(); + void bar() { this.A::foo<0>(); } // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/other/pr28114.C b/gcc/testsuite/g++.dg/other/pr28114.C new file mode 100644 index 000000000..63ecbf51f --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr28114.C @@ -0,0 +1,10 @@ + +// Test to make sure we do not ICE on this invalid program. + +template<int> void foo(struct {}*); // { dg-message "" } + +void bar() +{ + foo<0>(0); // { dg-error "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 8 } +} diff --git a/gcc/testsuite/g++.dg/other/pr28304.C b/gcc/testsuite/g++.dg/other/pr28304.C new file mode 100644 index 000000000..9a0e9cdd7 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr28304.C @@ -0,0 +1,11 @@ + +// Test to make sure we do not ICE on this invalid program. + +struct A {}; + +template<typename T> void A::foo(T) {} // { dg-error "" } + +void bar() +{ + A::foo(1); // { dg-error "not a member" } +} diff --git a/gcc/testsuite/g++.dg/other/pr28432.C b/gcc/testsuite/g++.dg/other/pr28432.C new file mode 100644 index 000000000..2b9c76343 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr28432.C @@ -0,0 +1,7 @@ + +// Test to make sure we do not ICE on this invalid program. + +// { dg-options "" } + +struct A {}; +void A::foo(); // { dg-error "member function declared in class|outside of class is not definition" } diff --git a/gcc/testsuite/g++.dg/other/pr29610.C b/gcc/testsuite/g++.dg/other/pr29610.C new file mode 100644 index 000000000..6566fb9a2 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr29610.C @@ -0,0 +1,38 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -funswitch-loops" } */ + +struct __normal_iterator +{ + typedef int*const *_Iterator; + int*const * _M_current; + __normal_iterator(const _Iterator& __i) : _M_current(__i){} + const _Iterator& base() const {} +}; +struct string { ~string(){} }; +struct vector +{ + int** _M_finish; + __normal_iterator end() const { return __normal_iterator (_M_finish); } + int size() const { return end().base() - end().base(); } +}; +class Painter +{ + int redraw_window(void); + typedef int (Painter::* SliceWindowFunc)(void); + int for_each(vector&, SliceWindowFunc); + void tcl_command(void); +}; +inline int Painter::for_each(vector &layout, SliceWindowFunc func) +{ + for (unsigned int window = 0; window < layout.size();++window) + (this->*func)(); +} +int t; +int Painter::redraw_window(void) {t = 1;} +string t2(int); +vector *g(const string&); +void Painter::tcl_command(void) +{ + for_each(*g(t2(2)), &Painter::redraw_window); +} + diff --git a/gcc/testsuite/g++.dg/other/pr31078.C b/gcc/testsuite/g++.dg/other/pr31078.C new file mode 100644 index 000000000..7f6107130 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr31078.C @@ -0,0 +1,31 @@ +typedef int SLONG; +typedef char SCHAR; +typedef short SSHORT; +typedef char TEXT; +typedef long ISC_STATUS; +const SLONG gds_arg_string = 2; +const SLONG gds_sys_request = 335544373L; +enum jrd_blk_t +{ + type_str, type_dcc, type_sbm, type_smb, type_blb, type_irb, type_jrn +}; +struct blk +{ +}; +template < class RPT, SSHORT BLOCK_TYPE = 0 > class pool_alloc_rpt:public blk +{ +}; +class jrn:public pool_alloc_rpt < SCHAR, type_jrn > +{ +public:ISC_STATUS * jrn_status_vector; + TEXT jrn_server[1]; +}; +typedef jrn *JRN; +extern void IBERR_build_status (ISC_STATUS *, ISC_STATUS, ...); +static void +error (ISC_STATUS * status_vector, JRN journal, int status, TEXT * string) +{ + IBERR_build_status (status_vector, gds_sys_request, gds_arg_string, string, + gds_arg_string, (journal) ? journal->jrn_server : "", + 0); +} diff --git a/gcc/testsuite/g++.dg/other/pr33558-2.C b/gcc/testsuite/g++.dg/other/pr33558-2.C new file mode 100644 index 000000000..a8df840b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr33558-2.C @@ -0,0 +1,6 @@ +/* { dg-do compile } */ +/* { dg-options "-fpermissive" } */ + +class X { + mutable int &q; /* { dg-warning "cannot be declared 'mutable'" } */ +}; diff --git a/gcc/testsuite/g++.dg/other/pr33558.C b/gcc/testsuite/g++.dg/other/pr33558.C new file mode 100644 index 000000000..1a340af59 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr33558.C @@ -0,0 +1,5 @@ +/* { dg-do compile } */ + +class X { + mutable int &q; /* { dg-error "cannot be declared 'mutable'" } */ +}; diff --git a/gcc/testsuite/g++.dg/other/pr33601.C b/gcc/testsuite/g++.dg/other/pr33601.C new file mode 100644 index 000000000..0c170092a --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr33601.C @@ -0,0 +1,8 @@ +struct A +{ + int membervar; +}; + +typedef const A type; + +int type::* getmemberptr() { return &type::membervar; } diff --git a/gcc/testsuite/g++.dg/other/pr34435.C b/gcc/testsuite/g++.dg/other/pr34435.C new file mode 100644 index 000000000..107ff6a08 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr34435.C @@ -0,0 +1,20 @@ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-msse2 -Wno-abi" } */ +/* { dg-require-effective-target sse2 } */ + +#include <emmintrin.h> + +class Vec { + __m128i vec; +public: + Vec(int mm) { + vec = _mm_set1_epi16(mm); + } + operator __m128i() const { + return vec; + } +}; + +int main() { + _mm_shuffle_epi32(Vec(5), _MM_SHUFFLE(3,3,3,3)); +} diff --git a/gcc/testsuite/g++.dg/other/pr35011.C b/gcc/testsuite/g++.dg/other/pr35011.C new file mode 100644 index 000000000..ca75516d6 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr35011.C @@ -0,0 +1,26 @@ +// { dg-do compile } +// { dg-options "-O3 -fcheck-data-deps" } + +double foo(const double* p0, const double* p1, const double* q0) +{ + double d; + for (; p0 != p1; ++p0, ++q0) + d += *p0 * *q0; + return d; +} + +struct A +{ + double x[3]; + const double* begin() const { return x; } +}; + +struct B +{ + A a0, a1; + double d; + B(const A&); +}; + +B::B(const A& a) : a0(a), a1(a), d(foo(a0.begin(), a0.begin()+3, a1.begin())) +{} diff --git a/gcc/testsuite/g++.dg/other/pr35504.C b/gcc/testsuite/g++.dg/other/pr35504.C new file mode 100644 index 000000000..58422f24a --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr35504.C @@ -0,0 +1,159 @@ +// { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } + +#define ATTR0 __attribute__((__regparm__(0))) +#define ATTR1 __attribute__((__regparm__(1))) +#define ATTR2 __attribute__((__regparm__(2))) +#define ATTR3 __attribute__((__regparm__(3))) +#define ATTR4 __attribute__((__fastcall__)) +#define ATTR5 __attribute__((__stdcall__)) +#define ATTR6 __attribute__((__cdecl__)) +#define ATTR7 +#define ATTR8 __attribute__((__thiscall__)) + +extern "C" void abort (void); + +struct long_struct +{ + int a[3]; +}; + +struct long_struct ret; + +class c3 *this3; + +class c1 +{ + int val1; +public: + virtual void foo () { } +}; + +class c2 +{ +public: + virtual ATTR0 struct long_struct method0 () + { + return ret; + } + + virtual ATTR1 struct long_struct method1 () + { + return ret; + } + + virtual ATTR2 struct long_struct method2 () + { + return ret; + } + + virtual ATTR3 struct long_struct method3 () + { + return ret; + } + + virtual ATTR4 struct long_struct method4 () + { + return ret; + } + + virtual ATTR5 struct long_struct method5 () + { + return ret; + } + + virtual ATTR6 struct long_struct method6 () + { + return ret; + } + + virtual ATTR7 struct long_struct method7 () + { + return ret; + } + + virtual ATTR8 struct long_struct method8 () + { + return ret; + } +}; + +class c3:c1, public c2 +{ +public: + c3 () + { + this3 = this; + } + + struct long_struct check_this (int a) + { + if (this3 != this) + abort (); + + return ret; + } + + virtual ATTR0 struct long_struct method0 () + { + return check_this (0); + } + + virtual ATTR1 struct long_struct method1 () + { + return check_this (1); + } + + virtual ATTR2 struct long_struct method2 () + { + return check_this (2); + } + + virtual ATTR3 struct long_struct method3 () + { + return check_this (3); + } + + virtual ATTR4 struct long_struct method4 () + { + return check_this (4); + } + + virtual ATTR5 struct long_struct method5 () + { + return check_this (5); + } + + virtual ATTR6 struct long_struct method6 () + { + return check_this (6); + } + + virtual ATTR7 struct long_struct method7 () + { + return check_this (7); + } + + virtual ATTR8 struct long_struct method8 () + { + return check_this (7); + } +}; + +class c3 c3_instance; +class c2 *c2_ptr = &c3_instance; + +int +main () +{ + c2_ptr->method0 (); + c2_ptr->method1 (); + c2_ptr->method2 (); + c2_ptr->method3 (); + c2_ptr->method4 (); + c2_ptr->method5 (); + c2_ptr->method6 (); + c2_ptr->method7 (); + c2_ptr->method8 (); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/pr36944.C b/gcc/testsuite/g++.dg/other/pr36944.C new file mode 100644 index 000000000..b4a1dfa46 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr36944.C @@ -0,0 +1,26 @@ +/* { dg-do compile } */ + +class XObject +{ +public: + int foo; +}; + +class XObjectPtr +{ +public: + explicit + XObjectPtr(XObject* theXObject = 0) : m_xobjectPtr(theXObject) + { + } + +private: + XObject * m_xobjectPtr; +}; + +class SelectionEvent +{ +public: + SelectionEvent(bool selection) : m_selection() {} + const XObjectPtr m_selection; +}; diff --git a/gcc/testsuite/g++.dg/other/pr37394.C b/gcc/testsuite/g++.dg/other/pr37394.C new file mode 100644 index 000000000..7b5772e8e --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr37394.C @@ -0,0 +1,12 @@ +// Origin: Martin Michlmayr <tbm@cyrius.com> +// { dg-do compile { target ia64-*-* } } +// { dg-options "-O -fschedule-insns2" } + +struct _Words +{ + void *_M_pword; + _Words (): + _M_pword (0) + { + } +} _M_word_zero; diff --git a/gcc/testsuite/g++.dg/other/pr37789.C b/gcc/testsuite/g++.dg/other/pr37789.C new file mode 100644 index 000000000..728c2fcc6 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr37789.C @@ -0,0 +1,7 @@ +// PR c++/37789 +// { dg-do compile } + +void foo(): +{ // { dg-error "initializers|identifier" } + __FUNCTION__; +} diff --git a/gcc/testsuite/g++.dg/other/pr38706.C b/gcc/testsuite/g++.dg/other/pr38706.C new file mode 100644 index 000000000..ec10d90ba --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr38706.C @@ -0,0 +1,19 @@ +// PR target/38706 +// { dg-do compile } +// { dg-options "-O2" } + +class ios_base +{ +public: + virtual ~ios_base (); + +}; + +class istrstream:virtual public ios_base +{ +public: + virtual ~istrstream (); + +}; + +istrstream::~istrstream () {} diff --git a/gcc/testsuite/g++.dg/other/pr39060.C b/gcc/testsuite/g++.dg/other/pr39060.C new file mode 100644 index 000000000..a625aea10 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr39060.C @@ -0,0 +1,19 @@ +// PR c++/39060 +// { dg-do compile } + +struct A +{ + A(void* i=); // { dg-error "with|specification" } + A(void* i=); // { dg-error "overloaded" } + A(void* i=); // { dg-error "overloaded" } + + void operator+ (void* i=); // { dg-error "arguments" } + + virtual void foo1(=); // { dg-error "identifier" } + void foo2(=); // { dg-error "identifier" } + void foo3(=); // { dg-error "identifier" } + void foo4(=); // { dg-error "identifier" } + void foo5(=); // { dg-error "identifier" } +}; // { dg-error "primary-expression" } + +A::A (void* i=) {} // { dg-error "primary-expression|argument" } diff --git a/gcc/testsuite/g++.dg/other/pr39496.C b/gcc/testsuite/g++.dg/other/pr39496.C new file mode 100644 index 000000000..3791434e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr39496.C @@ -0,0 +1,36 @@ +// PR target/39496 +// { dg-do compile { target { { i?86-*-linux* x86_64-*-linux* } && ilp32 } } } +// { dg-options "-O0 -fverbose-asm -fno-omit-frame-pointer -mtune=i686 -msse2 -mfpmath=sse" } +// { dg-require-effective-target sse2 } +// Verify that {foo,bar}{,2}param are all passed on the stack, using +// normal calling conventions, when not optimizing. +// { dg-final { scan-assembler "\[^0-9-\]8\\(%ebp\\),\[^\n\]*fooparam," } } +// { dg-final { scan-assembler "\[^0-9-\]8\\(%ebp\\),\[^\n\]*barparam," } } +// { dg-final { scan-assembler "\[^0-9-\]8\\(%ebp\\),\[^\n\]*foo2param," } } +// { dg-final { scan-assembler "\[^0-9-\]8\\(%ebp\\),\[^\n\]*bar2param," } } + +static inline int foo (int fooparam) +{ + return fooparam; +} + +static int bar (int barparam) +{ + return foo (barparam); +} + +static inline double foo2 (double foo2param) +{ + return foo2param; +} + +static double bar2 (double bar2param) +{ + return foo2 (bar2param); +} + +int +main () +{ + return bar (0) + bar2 (0.0); +} diff --git a/gcc/testsuite/g++.dg/other/pr40446.C b/gcc/testsuite/g++.dg/other/pr40446.C new file mode 100644 index 000000000..72cd19606 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr40446.C @@ -0,0 +1,38 @@ +// PR middle-end/40446 +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-options "-O1 -msse2" } +// { dg-require-effective-target sse2_runtime } + +#include <emmintrin.h> + +extern "C" void abort (); + +struct S +{ + S (double r, double i) { __real__ s = r; __imag__ s = i; } + __complex__ double s; +}; + +__m128d +foo () +{ + S c (0, 1); + return _mm_load_pd ((double *) &c); +} + +static void +__attribute__((noinline)) +sse2_test () +{ + union { __m128d vec; double val[2]; } u; + u.vec = foo (); + if (u.val[0] != 0 || u.val[1] != 1) + abort (); +} + +int +main () +{ + sse2_test (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/pr40561.C b/gcc/testsuite/g++.dg/other/pr40561.C new file mode 100644 index 000000000..c94dfa4bd --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr40561.C @@ -0,0 +1,38 @@ +// { dg-do compile } + +#include <set> + +class SyAccess; +class VamsBase +{ + public: + virtual ~VamsBase(void); +}; + +class VamsFnct : public VamsBase +{ + public: + ~VamsFnct(void); + std::set<SyAccess*> getNullDependencies(void) const + { return std::set<SyAccess*>(); + } +}; + +class VamsFnctSystem:public VamsFnct +{ public: + VamsFnctSystem( + const bool _bPassDependencies); +}; + +template< std::set<SyAccess*> (VamsFnct::*__GET_DEP__)(void) const > +class VamsSystemFunction:public VamsFnctSystem +{ public: + VamsSystemFunction() + :VamsFnctSystem( + __GET_DEP__ != &VamsFnct::getNullDependencies + ) + { + } +}; + +VamsSystemFunction<&VamsFnct::getNullDependencies> s; diff --git a/gcc/testsuite/g++.dg/other/pr42645-1.C b/gcc/testsuite/g++.dg/other/pr42645-1.C new file mode 100644 index 000000000..5dc76f9ef --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr42645-1.C @@ -0,0 +1,26 @@ +// PR tree-optimization/42645 +// { dg-do compile } +// { dg-options "-fcompare-debug -O1" } + +extern void foo (); + +struct S +{ + struct T + { + int t1; + char t2[4]; + T *t3; + } t; + int m1 () const { return t.t3[0].t1; } + char *m2 () { foo (); } + void m3 (int x) { char *m = m2 (); if (m1 () > 0 && x > 0); } + void m4 () { if (m1 () > 0) for (int i = 0; i < 4; i++) t.t2[i] = 0; } +}; + +void +f (S *a) +{ + a->m3 (0); + a->m4 (); +} diff --git a/gcc/testsuite/g++.dg/other/pr42645-2.C b/gcc/testsuite/g++.dg/other/pr42645-2.C new file mode 100644 index 000000000..67632e51d --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr42645-2.C @@ -0,0 +1,34 @@ +// PR tree-optimization/42645 +// { dg-do compile } +// { dg-options "-fcompare-debug -O1" } + +struct C +{ + bool b; + C (); +}; + +static inline C *foo () {} + +extern void f4 (); + +static inline int +f3 () +{ + f4 (); +} + +static inline void +f2 (bool b) +{ + int tmp = f3 (); + if (C ().b && b) + C (); +} + +void +f1 () +{ + C *c = foo (); + f2 (c->b); +} diff --git a/gcc/testsuite/g++.dg/other/pr42685.C b/gcc/testsuite/g++.dg/other/pr42685.C new file mode 100644 index 000000000..b8b1ad63b --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr42685.C @@ -0,0 +1,10 @@ +// { dg-do compile } +// { dg-options "-O -funroll-loops -fcompare-debug" } + +void Remap(int n, int *src, int *dst, int *map) +{ + do { + int i = *src; + if (i != 0) *dst = map[i]; + } while (--n != 0); +} diff --git a/gcc/testsuite/g++.dg/other/pr42806.C b/gcc/testsuite/g++.dg/other/pr42806.C new file mode 100644 index 000000000..9823238d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr42806.C @@ -0,0 +1,22 @@ +// { dg-do compile } +// { dg-options "-O -fcompare-debug" } + +struct S1 { + ~S1() { } +}; + +struct S2 { + S1 s1; + void m(); + ~S2() { m(); } +}; + +struct S3 { + S3(int, S2); +}; + +void foo() +{ + S3(0, S2()); +} + diff --git a/gcc/testsuite/g++.dg/other/pr43116.C b/gcc/testsuite/g++.dg/other/pr43116.C new file mode 100644 index 000000000..f0d9d01e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr43116.C @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +extern "C" int rpl_open (const char *filename, int flags, ...) __attribute__ +((__nonnull__ (1))); + +namespace gnulib +{ + int (*const open) (const char *filename, int flags, ...) __attribute__ + ((__nonnull__ (1))) = rpl_open; +} diff --git a/gcc/testsuite/g++.dg/other/pr47218-1.C b/gcc/testsuite/g++.dg/other/pr47218-1.C new file mode 100644 index 000000000..aeb070b0c --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr47218-1.C @@ -0,0 +1,10 @@ +#include "pr47218.h" + +Foo2::~Foo2 () +{ + ((FooBaseBase1*)this)->Bar(); +} + +void Foo2::Bar() +{ +} diff --git a/gcc/testsuite/g++.dg/other/pr47218.C b/gcc/testsuite/g++.dg/other/pr47218.C new file mode 100644 index 000000000..f94e15742 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr47218.C @@ -0,0 +1,21 @@ +/* { dg-do link } */ +/* { dg-options "-save-temps" } */ +/* { dg-additional-sources "pr47218-1.C" } */ + +#include "pr47218.h" + +Foo3::~Foo3 () +{ + ((FooBaseBase1*)this)->Bar(); +} + +void Foo3::Bar() +{ +} + +int main () +{ + return 0; +} + +// { dg-final cleanup-saved-temps } diff --git a/gcc/testsuite/g++.dg/other/pr47218.h b/gcc/testsuite/g++.dg/other/pr47218.h new file mode 100644 index 000000000..1b07da746 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr47218.h @@ -0,0 +1,33 @@ + +class FooBaseBase0 +{ +public: + virtual ~FooBaseBase0 () {} +}; + +class FooBaseBase1 +{ +public: + virtual void Bar() {} +}; + + +class FooBase: public FooBaseBase0, public FooBaseBase1 +{ +public: + virtual void Bar() {} +}; + +class Foo2: public FooBase +{ +public: + ~Foo2 (); + virtual void Bar(); +}; + +class Foo3: public FooBase +{ +public: + ~Foo3 (); + virtual void Bar(); +}; diff --git a/gcc/testsuite/g++.dg/other/pr49133.C b/gcc/testsuite/g++.dg/other/pr49133.C new file mode 100644 index 000000000..a59687f9c --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr49133.C @@ -0,0 +1,36 @@ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-O2 -msse2" } */ +/* { dg-require-effective-target sse2_runtime } */ + +#include <xmmintrin.h> + +extern "C" void abort (); + +typedef double double_a __attribute__((__may_alias__)); + +struct V +{ + __m128d data; +}; + +int +main() +{ + V a; + __m128d b; + + b = _mm_set_pd (1., 0.); + a.data = _mm_set_pd (1., 0.); + a.data = _mm_add_pd (a.data, + _mm_and_pd (_mm_cmpeq_pd (a.data, _mm_set1_pd (0.)), + _mm_set1_pd (2.))); + reinterpret_cast<double_a *>(&a.data)[1] += 1.; + b = _mm_add_pd (b, _mm_and_pd (_mm_cmpeq_pd (b, _mm_set1_pd (0.)), + _mm_set1_pd (1.))); + b = _mm_add_pd (b, _mm_and_pd (_mm_cmpeq_pd (b, _mm_set1_pd (1.)), + _mm_set1_pd (1.))); + if (_mm_movemask_pd (_mm_cmpeq_pd (a.data, b)) != 0x3) + abort(); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/pr50464.C b/gcc/testsuite/g++.dg/other/pr50464.C new file mode 100644 index 000000000..8c6721373 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr50464.C @@ -0,0 +1,170 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-options "-O3 -mxop" } + +typedef long unsigned int size_t; +typedef unsigned long ulong_t; +typedef signed long slong_t; + + template<typename _Iterator> + struct iterator_traits + { + typedef typename _Iterator::reference reference; + }; + + template<typename _Tp> + struct iterator_traits<_Tp*> + { + typedef _Tp& reference; + }; + + template<typename _Iterator, typename _Container> + class __normal_iterator + { + protected: + _Iterator _M_current; + typedef iterator_traits<_Iterator> __traits_type; + + public: + typedef typename __traits_type::reference reference; + + explicit + __normal_iterator(const _Iterator& __i) : _M_current(__i) { } + + reference + operator*() const + { return *_M_current; } + + __normal_iterator& + operator++() + { + ++_M_current; + return *this; + } + + const _Iterator& + base() const + { return _M_current; } + }; + + template<typename _Iterator, typename _Container> + inline bool + operator!=(const __normal_iterator<_Iterator, _Container>& __lhs, + const __normal_iterator<_Iterator, _Container>& __rhs) + { return __lhs.base() != __rhs.base(); } + + template<typename _Tp> + class allocator + { + public: + typedef _Tp* pointer; + typedef _Tp value_type; + + template<typename _Tp1> + struct rebind + { typedef allocator<_Tp1> other; }; + + pointer allocate(size_t __n, const void* = 0) + { + return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp))); + } + }; + + template<typename _Tp, typename _Alloc> + struct _Vector_base + { + typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type; + + struct _Vector_impl + : public _Tp_alloc_type + { + typename _Tp_alloc_type::pointer _M_start; + typename _Tp_alloc_type::pointer _M_finish; + typename _Tp_alloc_type::pointer _M_end_of_storage; + + _Vector_impl(_Tp_alloc_type const& __a) { } + }; + + public: + typedef _Alloc allocator_type; + + _Vector_base(size_t __n, const allocator_type& __a) + : _M_impl(__a) + { + this->_M_impl._M_start = this->_M_allocate(__n); + this->_M_impl._M_finish = this->_M_impl._M_start; + this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n; + } + + public: + _Vector_impl _M_impl; + + typename _Tp_alloc_type::pointer + _M_allocate(size_t __n) + { return __n != 0 ? _M_impl.allocate(__n) : 0; } + + }; + + template<typename _Tp, typename _Alloc = allocator<_Tp> > + class vector : protected _Vector_base<_Tp, _Alloc> + { + typedef _Vector_base<_Tp, _Alloc> _Base; + typedef typename _Base::_Tp_alloc_type _Tp_alloc_type; + + public: + typedef _Tp value_type; + typedef typename _Tp_alloc_type::pointer pointer; + typedef __normal_iterator<pointer, vector> iterator; + typedef _Alloc allocator_type; + + protected: + using _Base::_M_allocate; + using _Base::_M_impl; + + public: + + explicit + vector(size_t __n, const value_type& __value = value_type(), + const allocator_type& __a = allocator_type()) + : _Base(__n, __a) + { _M_fill_initialize(__n, __value); } + + iterator begin() + { return iterator(this->_M_impl._M_start); } + + iterator end() + { return iterator(this->_M_impl._M_finish); } + + protected: + void + _M_fill_initialize(size_t __n, const value_type& __value) + { + this->_M_impl._M_finish = this->_M_impl._M_end_of_storage; + } + }; + + template<typename _InputIterator, typename _OutputIterator, typename _Tp> + _OutputIterator + replace_copy(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, + const _Tp& __old_value, const _Tp& __new_value) + { + ; + for (; __first != __last; ++__first, ++__result) + if (*__first == __old_value) + *__result = __new_value; + else + *__result = *__first; + return __result; + } + +extern size_t shape_rank; + +void createDataspaceIdentifier() +{ + vector< ulong_t > dataspaceDims( shape_rank ); + vector< ulong_t > maxDataspaceDims( shape_rank ); + + replace_copy( + dataspaceDims.begin(), dataspaceDims.end(), + maxDataspaceDims.begin(), ulong_t( 0 ), ((ulong_t)(slong_t)(-1)) ); +} diff --git a/gcc/testsuite/g++.dg/other/pragma-ep-1.C b/gcc/testsuite/g++.dg/other/pragma-ep-1.C new file mode 100644 index 000000000..9362943a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pragma-ep-1.C @@ -0,0 +1,27 @@ +/* { dg-do compile { target *-*-osf5* } } */ +/* { dg-final { scan-assembler "xyzzy_one" } } */ +/* { dg-final { scan-assembler "xyzzy_two" } } */ +/* { dg-final { scan-assembler "xyzzz_three" } } */ +/* { dg-final { scan-assembler "four" } } */ +/* { dg-final { scan-assembler-not "_four" } } */ + +#ifndef __PRAGMA_EXTERN_PREFIX +#error +#endif + +#pragma extern_prefix "xyzzy_" + +extern "C" int one(void); +extern "C" int two(void); + +#pragma extern_prefix "xyzzz_" + +extern "C" int three(void); + +#pragma extern_prefix "" + +extern "C" int four(void); + +int (*p[])(void) = { + one, two, three, four +}; diff --git a/gcc/testsuite/g++.dg/other/pragma-re-1.C b/gcc/testsuite/g++.dg/other/pragma-re-1.C new file mode 100644 index 000000000..35ffab1a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pragma-re-1.C @@ -0,0 +1,19 @@ +/* { dg-final { scan-assembler "bar" } } */ +/* { dg-final { scan-assembler-not "foo" } } */ +/* { dg-final { scan-assembler "_Z3bazv" } } */ +/* { dg-final { scan-assembler-not "baq" } } */ + +#ifndef __PRAGMA_REDEFINE_EXTNAME +#error +#endif + +/* This one is expected to work. */ +#pragma redefine_extname foo bar +extern "C" int foo(void); +int (*p)(void) = foo; + +/* This one is expected not to work (redefine_extname + can only be applied to extern "C" names). */ +#pragma redefine_extname baz baq +extern int baz(void); +int (*q)(void) = baz; diff --git a/gcc/testsuite/g++.dg/other/pragma-re-2.C b/gcc/testsuite/g++.dg/other/pragma-re-2.C new file mode 100644 index 000000000..ca71a01a2 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pragma-re-2.C @@ -0,0 +1,24 @@ +/* PR c++/14962 */ +/* Originator: <phil@fsel.com> */ + +/* { dg-final { scan-assembler "new_name" } } */ +/* { dg-final { scan-assembler-not "old_name" } } */ + +#ifndef __PRAGMA_REDEFINE_EXTNAME +#error +#endif + +extern "C" { + +struct old_name { int i; }; + +#pragma redefine_extname old_name new_name + +int old_name(void); + +} + +int foo(void) +{ + return old_name(); +} diff --git a/gcc/testsuite/g++.dg/other/profile1.C b/gcc/testsuite/g++.dg/other/profile1.C new file mode 100644 index 000000000..a4bf6b3d0 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/profile1.C @@ -0,0 +1,54 @@ +// PR 11767 +// { dg-do run } +// { dg-require-profiling "" } +// { dg-options "-fnon-call-exceptions -fprofile-arcs" } + +#include <string> + +typedef unsigned long ACE_UINT32; +extern "C" void abort(); + +static ACE_UINT32 const msc_maxCurrencyID = 9999; + +class ResourceBalanceType2 +{ + public: + explicit ResourceBalanceType2( + ACE_UINT32 resourceBalanceTypeID, + ACE_UINT32 isoValue, + const std::string& rc_shortName, + const std::string& rc_symbol + ); + public: + const ACE_UINT32 mc_resBalTypeID; + const ACE_UINT32 mc_isoValue; + const std::string mc_shortName; + const std::string mc_symbol; +}; + +void f(){} + +ResourceBalanceType2::ResourceBalanceType2( + ACE_UINT32 resourceBalanceTypeID, + ACE_UINT32 isoValue, + const std::string& rc_shortName, + const std::string& rc_symbol) + : mc_resBalTypeID(resourceBalanceTypeID), + mc_isoValue(isoValue), + mc_shortName(rc_shortName), + mc_symbol(rc_symbol) +{ + bool isGreater = (mc_isoValue > msc_maxCurrencyID); + f(); + bool temp = mc_isoValue > msc_maxCurrencyID; + if (!isGreater) abort(); + if (!temp) abort(); +} + +int main (int argc, char * argv[]) +{ + ACE_UINT32 const mc_isoValue = 10000; + ResourceBalanceType2 rbResourceBalanceType2(3, mc_isoValue, "ATM", "M"); +} + +// { dg-final { cleanup-coverage-files } } diff --git a/gcc/testsuite/g++.dg/other/ptrmem1.C b/gcc/testsuite/g++.dg/other/ptrmem1.C new file mode 100644 index 000000000..fa9115e50 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ptrmem1.C @@ -0,0 +1,66 @@ +// { dg-do run } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 31 Dec 2001 <nathan@codesourcery.com> + +// PR 4379. We created pointers to member references and pointers to +// member fields when we shouldn't have. + +int gs; +int gm; + +struct D { + D () :m (gm) {} + + int &m; + static int &s; + + int Foo (); +}; + +int &D::s = gs; + +template<class T> int f1(T x) +{ + return x != &gm; +} +template<class T> int f2(T x) +{ + return x != &gs; +} + +int D::Foo () +{ + int r; + + if (f1( &(D::m))) + return 3; + + if (f2( &D::s)) + return 1; + if (f2( &(D::s))) + return 2; + return 0; +} + +int Foo () +{ + if (f2( &D::s)) + return 4; + if (f2( &(D::s))) + return 5; + return 0; +} + +int main () +{ + D d; + int r = d.Foo (); + if (r) + return r; + r = Foo (); + if (r) + return r; + return 0; + +} diff --git a/gcc/testsuite/g++.dg/other/ptrmem10.C b/gcc/testsuite/g++.dg/other/ptrmem10.C new file mode 100644 index 000000000..bc386ed56 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ptrmem10.C @@ -0,0 +1,30 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/37093 + +template <class C, void (C::*M) ()> +static +void foo(void *obj) // { dg-message "note" } +{ + C *p = static_cast<C*>(obj); + (p->*M)(); +} + +template <class C> +static void +bar(C *c, void (C::*m) ()) +{ + foo<C,m>((void *)c);// { dg-error "(not a valid template arg|pointer-to-member|no matching fun)" } + // { dg-message "candidate" "candidate note" { target *-*-* } 16 } +} + +struct S +{ + void baz () {} +}; + +int +main () +{ + S a; + bar(&a, &S::baz); +} diff --git a/gcc/testsuite/g++.dg/other/ptrmem11.C b/gcc/testsuite/g++.dg/other/ptrmem11.C new file mode 100644 index 000000000..119cbb078 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ptrmem11.C @@ -0,0 +1,22 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/37093 + +struct A {}; + +template <int A::* p> +int +foo(A* q) // { dg-message "note" } +{ + return q->*p; +} + +template <typename T> +int +bar(int T::* p) +{ + return foo<p>(0);// { dg-error "(not a valid template arg|no matching func|pointer-to-member)" } + // { dg-message "candidate" "candidate note" { target *-*-* } 17 } +} + +int i = bar<A>(0); + diff --git a/gcc/testsuite/g++.dg/other/ptrmem2.C b/gcc/testsuite/g++.dg/other/ptrmem2.C new file mode 100644 index 000000000..d267df15b --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ptrmem2.C @@ -0,0 +1,36 @@ +// { dg-do compile } + +// Copyright (C) 2001, 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 31 Dec 2001 <nathan@codesourcery.com> + +// PR 4379. We created pointers to member references and pointers to +// member fields when we shouldn't have. + +struct D { + + int &m; // { dg-error "invalid use of non-static data member" "" } + static int &s; + + int Foo (); +}; + +template<class T> int f1(T x); +template<class T> int f2(T x); + +int D::Foo () +{ + f1( &D::m); // { dg-error "cannot create pointer to ref" "" } + f1( &(D::m)); // ok + f2( &D::s); // ok + f2( &(D::s)); // ok + return 0; +} + +int Foo () +{ + f1( &D::m); // { dg-error "cannot create pointer to ref" "" } + f1( &(D::m)); // { dg-error "from this location" "" } + f2( &D::s); // ok + f2( &(D::s)); // ok + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/ptrmem3.C b/gcc/testsuite/g++.dg/other/ptrmem3.C new file mode 100644 index 000000000..ed6d87574 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ptrmem3.C @@ -0,0 +1,14 @@ +// Bug: The double cast had an TREE_INT_CST_HIGH of 0, while the single +// cast had -1, so the comparison failed. + +// { dg-do run } + +struct A { }; + +typedef int A::* aip; +typedef long A::* alp; + +int main() +{ + return ((aip)(alp)0 != (aip)0); +} diff --git a/gcc/testsuite/g++.dg/other/ptrmem4.C b/gcc/testsuite/g++.dg/other/ptrmem4.C new file mode 100644 index 000000000..4f3f541e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ptrmem4.C @@ -0,0 +1,18 @@ +// Bug: This checks that the pointer-to-member-function type is not +// shared between differently-qualified pointer-to-method types. + +// { dg-do compile } +struct A +{ + void f () {} +}; + +void (A::*const cp)() = &A::f; + +int main () +{ + void (A::* p)(); + void (A::** ip)() = &p; + + *ip = &A::f; +} diff --git a/gcc/testsuite/g++.dg/other/ptrmem5.C b/gcc/testsuite/g++.dg/other/ptrmem5.C new file mode 100644 index 000000000..75a78b2f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ptrmem5.C @@ -0,0 +1,12 @@ +// PR 14123 + +struct a +{ + int x[8]; +}; + +int main() +{ + int a::*n[8]; + n = &a::x; // { dg-error "int \\(a::\\*\\)" } +} diff --git a/gcc/testsuite/g++.dg/other/ptrmem6.C b/gcc/testsuite/g++.dg/other/ptrmem6.C new file mode 100644 index 000000000..5fe796e1c --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ptrmem6.C @@ -0,0 +1,10 @@ +// PR c++/19666 +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> +// { dg-do compile } + +struct A { int i; }; + +int foo (A *p) +{ + return &p->i - &(p->*&A::i); +} diff --git a/gcc/testsuite/g++.dg/other/ptrmem7.C b/gcc/testsuite/g++.dg/other/ptrmem7.C new file mode 100644 index 000000000..e7722b8de --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ptrmem7.C @@ -0,0 +1,4 @@ +// PR c++/27447 +// { dg-do compile } + +void (A::* p)(); // { dg-error "declared|token" } diff --git a/gcc/testsuite/g++.dg/other/ptrmem8.C b/gcc/testsuite/g++.dg/other/ptrmem8.C new file mode 100644 index 000000000..d0b0ba722 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ptrmem8.C @@ -0,0 +1,16 @@ +// PR c++/33844 +// { dg-do compile } + +struct A {}; + +template<int> void foo(void (A::* f)()) +{ + A a; + &(a.*f); // { dg-error "invalid use of\[^\n\]*\\.\\*\[^\n\]*to form|qualified-id is required" } +} + +template<int> void bar(void (A::* f)()) +{ + A *p; + &(p->*f); // { dg-error "invalid use of\[^\n\]*->\\*\[^\n\]*to form|qualified-id is required" } +} diff --git a/gcc/testsuite/g++.dg/other/ptrmem9.C b/gcc/testsuite/g++.dg/other/ptrmem9.C new file mode 100644 index 000000000..c4d3656a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ptrmem9.C @@ -0,0 +1,5 @@ +// PR c++/33969 +// { dg-do compile } + +struct A; +void (*A::* fp)() const; // { dg-error "invalid in variable declaration" } diff --git a/gcc/testsuite/g++.dg/other/qual1.C b/gcc/testsuite/g++.dg/other/qual1.C new file mode 100644 index 000000000..e4bae2315 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/qual1.C @@ -0,0 +1,11 @@ +// PR c++/28257 +// { dg-do compile } + +struct A +{ + int i; + void foo() + { + int A::i = i; // { dg-error "qualified" } + } +}; diff --git a/gcc/testsuite/g++.dg/other/redecl1.C b/gcc/testsuite/g++.dg/other/redecl1.C new file mode 100644 index 000000000..cfcf66826 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/redecl1.C @@ -0,0 +1,10 @@ +// PR c++/5857 +// This testcase failed because during duplicate_decls the type was promoted +// to int. + +// { dg-do compile } + +typedef char baz; +extern const char foo[]; +const baz foo[] = "xyz"; +const char bar[] = "abc"; diff --git a/gcc/testsuite/g++.dg/other/redecl2.C b/gcc/testsuite/g++.dg/other/redecl2.C new file mode 100644 index 000000000..591c258b8 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/redecl2.C @@ -0,0 +1,11 @@ +// PR c++/17816 +// We failed to report duplicate definitions of pure virtual ns. + +// { dg-do compile } + +struct S { + virtual int foo() = 0; +}; + +int S::foo() { return 0; } // { dg-error "defined here" } +int S::foo() { return 0; } // { dg-error "redefinition" } diff --git a/gcc/testsuite/g++.dg/other/return1.C b/gcc/testsuite/g++.dg/other/return1.C new file mode 100644 index 000000000..2473b8deb --- /dev/null +++ b/gcc/testsuite/g++.dg/other/return1.C @@ -0,0 +1,15 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 12 Oct 2005 <nathan@codesourcery.com> + +// PR 21117:ICE after error +// Origin: Andrew Pinski <pinskia@gcc.gnu.org> + +struct wxString; +struct wxString* wxGetEmptyString(); + +struct wxString GetHeader() // { dg-error "return type" "" } +{ + return *wxGetEmptyString(); +} + + diff --git a/gcc/testsuite/g++.dg/other/s390-1.C b/gcc/testsuite/g++.dg/other/s390-1.C new file mode 100644 index 000000000..bf37ca449 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/s390-1.C @@ -0,0 +1,32 @@ +// { dg-do compile { target s390x-*-* } } +// { dg-options "-O3 -fPIC" } + +class A +{ +public: + void f (void) { _M_a = 0; } + void g (void) { _M_a = 1; } + void h (void); + +private: + int _M_a; +}; + +class B : virtual public A +{ +}; + +void +test (B& x) +{ + for (int i = 0; i < 17; i++) + { + x.f (); + (x.*&A::g) (); + x.h (); + } +} + +// Check that every call to A::g goes via the PLT. +// { dg-final { scan-assembler-not "brasl\[^@\]*\n" } } + diff --git a/gcc/testsuite/g++.dg/other/scope1.C b/gcc/testsuite/g++.dg/other/scope1.C new file mode 100644 index 000000000..73b141bdf --- /dev/null +++ b/gcc/testsuite/g++.dg/other/scope1.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Copyright (C) 2000 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Nov 2001 <nathan@nathan@codesourcery.com> + +// PR 3381 + +namespace N { + template<class T> + class A { }; +} + +template class N::A<unsigned>; // this works (by itself) +template class ::N::A<int>; // but this doesn't diff --git a/gcc/testsuite/g++.dg/other/semicolon.C b/gcc/testsuite/g++.dg/other/semicolon.C new file mode 100644 index 000000000..8797bd32f --- /dev/null +++ b/gcc/testsuite/g++.dg/other/semicolon.C @@ -0,0 +1,10 @@ +// PR c++/18368 +// Origin: Chris Lattner <sabre@nondot.org> +// { dg-do compile } +// { dg-options "-fshow-column" } + +struct A +{ + struct B { int i; } // { dg-error "after struct definition" } + void foo(); +}; diff --git a/gcc/testsuite/g++.dg/other/spu2vmx-1.C b/gcc/testsuite/g++.dg/other/spu2vmx-1.C new file mode 100644 index 000000000..d9c8faf94 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/spu2vmx-1.C @@ -0,0 +1,15 @@ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-require-effective-target powerpc_spu } */ +/* { dg-options "-maltivec" } */ + +#include <altivec.h> +#include <spu2vmx.h> + +vec_uint4 f(vec_uint4 a, vec_uint4 b) +{ + return spu_add(a, b); +} +vec_float4 f(vec_float4 a, vec_float4 b) +{ + return spu_add(a, b); +} diff --git a/gcc/testsuite/g++.dg/other/static1.C b/gcc/testsuite/g++.dg/other/static1.C new file mode 100644 index 000000000..5cf0b9256 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/static1.C @@ -0,0 +1,17 @@ +// PR c++/9574 +// Origin: fche@redhat.com and bangerth@dealii.org +// The new parser ICE on this test and then it could +// not find z in bar::bar(). + +// { dg-do compile } + +struct X { + void operator[](const int& __k); +}; +struct foo { + static X x; +}; +struct bar { + int z; + bar () { foo::x[z]; } +}; diff --git a/gcc/testsuite/g++.dg/other/static11.C b/gcc/testsuite/g++.dg/other/static11.C new file mode 100644 index 000000000..e04cbc154 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/static11.C @@ -0,0 +1,34 @@ +// This is a copy of g++.old-deja/g++.pt/static11.C which at one +// time got a SEGV for mmix-knuth-mmixware when compiled with +// -da (or either -dj or -df). +// { dg-do compile } +// { dg-options "-da" } + +extern "C" void _exit (int); + +int r = 1; + +struct A +{ + void f(){}; + A(){ ++r; } + ~A(){ r -= 2; _exit (r); } +}; + +template<class T> +struct C +{ + C(){ a.f(); } + static A a; +}; + +template <class T> A C<T>::a; +typedef C<int> B; + +int main() +{ + C<int> c; + return r; +} + +// { dg-final { cleanup-rtl-dump "*" } } diff --git a/gcc/testsuite/g++.dg/other/static2.C b/gcc/testsuite/g++.dg/other/static2.C new file mode 100644 index 000000000..ff1478c2a --- /dev/null +++ b/gcc/testsuite/g++.dg/other/static2.C @@ -0,0 +1,12 @@ +//PR c++/26573 + +void foo() +{ + struct A { static int i; }; // { dg-error "shall not have" } +} + +template<typename T> +void bar() +{ + struct B { static int j; }; // { dg-error "shall not have" } +} diff --git a/gcc/testsuite/g++.dg/other/stdarg1.C b/gcc/testsuite/g++.dg/other/stdarg1.C new file mode 100644 index 000000000..1ac9e8fb2 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/stdarg1.C @@ -0,0 +1,27 @@ +// Test stdarg function with anonymous argument +// { dg-do run } +// { dg-options "-Wno-abi" { target arm_eabi } } + +#include <stdarg.h> + +extern "C" void abort (void); + +void baz (va_list list) +{ + if (va_arg (list, long) != 3) + abort (); +} + +void foo (long p1, long, long p2, ...) +{ + va_list list; + va_start (list, p2); + baz (list); + va_end (list); +} + +int main () +{ + foo (0, 1, 2, (long)3); + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/stdarg2.C b/gcc/testsuite/g++.dg/other/stdarg2.C new file mode 100644 index 000000000..99e904013 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/stdarg2.C @@ -0,0 +1,12 @@ +// PR c++/11929 +// Bug: We were complaining about the call to va_start because o is of +// non-POD type. + +struct s { + s(int); +}; + +void test(s o, ...) { + __builtin_va_list varg; + __builtin_va_start(varg, o); +} diff --git a/gcc/testsuite/g++.dg/other/stdarg3.C b/gcc/testsuite/g++.dg/other/stdarg3.C new file mode 100644 index 000000000..0e7abd8dd --- /dev/null +++ b/gcc/testsuite/g++.dg/other/stdarg3.C @@ -0,0 +1,16 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 8 Mar 2005 <nathan@codesourcery.com> + +// PR 20375: ICE +// Origin: Joseph S. Myers <jsm28@gcc.gnu.org> +// { dg-options "-mlp64" { target "ia64-*-hpux*" } } + +union U +{ + void *m[7]; +}; + +struct C; + +void f(struct C *c, float f, union U, ...) +{ } diff --git a/gcc/testsuite/g++.dg/other/struct-va_list.C b/gcc/testsuite/g++.dg/other/struct-va_list.C new file mode 100644 index 000000000..769b909ff --- /dev/null +++ b/gcc/testsuite/g++.dg/other/struct-va_list.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// PR target/13302 + +#include <stdarg.h> + +struct NumArgState{ + va_list ap; +}; diff --git a/gcc/testsuite/g++.dg/other/switch1.C b/gcc/testsuite/g++.dg/other/switch1.C new file mode 100644 index 000000000..a22d2b573 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/switch1.C @@ -0,0 +1,20 @@ +// { dg-do compile } +// Contributed by: Nick Savoiu <savoiu at ics dot uci dot edu> +// PR c++/14250: Incomplete type in switch statement + +template <typename T> +struct A { + operator int(); +}; + +struct C1 { + static A<void> t1; + + void fun() + { + switch(t1) + { + default: break; + } + } +}; diff --git a/gcc/testsuite/g++.dg/other/switch2.C b/gcc/testsuite/g++.dg/other/switch2.C new file mode 100644 index 000000000..6994e2a39 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/switch2.C @@ -0,0 +1,23 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 13 Oct 2005 <nathan@codesourcery.com> + +// PR 22551:ICE +// Origin: Johnny Casey <emailwastefilter-bugzillagccorg@yahoo.com> + +const int B = ~(~0u >> 1); + +#define b(x) (B + x) + + +int Foo (int error) +{ + switch (error) + { + case b (1): return 0; + case b (2): return 0; + case b (3): return 0; + case b (4): return 0; + case b (5): return 0; + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/switch3.C b/gcc/testsuite/g++.dg/other/switch3.C new file mode 100644 index 000000000..4f9b5485e --- /dev/null +++ b/gcc/testsuite/g++.dg/other/switch3.C @@ -0,0 +1,25 @@ +// PR c++/39371 +// { dg-do compile } + +void +foo (bool b) +{ + switch ((unsigned int) b) + { + case 1: + case 2: + break; + } +} + +void +bar (unsigned char b) +{ + switch ((unsigned int) b) + { + case 1: + case 257: + case 513: + break; + } +} diff --git a/gcc/testsuite/g++.dg/other/synth1.C b/gcc/testsuite/g++.dg/other/synth1.C new file mode 100644 index 000000000..5829c6c78 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/synth1.C @@ -0,0 +1,31 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 17 Dec 2004 <nathan@codesourcery.com> + +// PR 18975: Rejects legal +// Origin: Wolfgang Roehrl <wolfgang.roehrl@de.gi-de.com> + +struct PTR +{ + PTR (); + PTR (PTR&); + PTR& operator= (PTR&); + +private: + PTR (const PTR&); + PTR& operator= (const PTR&); +}; + + +struct XYZ +{ + XYZ (PTR& p) : ptr(p) {} + + mutable PTR ptr; +}; + + +XYZ f1 (); + + +XYZ f2 (void) { return f1(); } +void f3 (XYZ& dst, const XYZ& src) { dst = src; } diff --git a/gcc/testsuite/g++.dg/other/typedef1.C b/gcc/testsuite/g++.dg/other/typedef1.C new file mode 100644 index 000000000..ef1684d7a --- /dev/null +++ b/gcc/testsuite/g++.dg/other/typedef1.C @@ -0,0 +1,7 @@ +// PR c++/27572 +// { dg-do compile } + +void f1(typedef) {} // { dg-error "no type|typedef declaration" } +void f2(typedef x) {} // { dg-error "type|typedef declaration" } +void f3(typedef x[]) {} // { dg-error "type|typedef declaration" } +void f4(typedef int x) {} // { dg-error "typedef declaration" } diff --git a/gcc/testsuite/g++.dg/other/typedef2.C b/gcc/testsuite/g++.dg/other/typedef2.C new file mode 100644 index 000000000..902e102d6 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/typedef2.C @@ -0,0 +1,3 @@ +typedef void fn() const; + +fn* fp; // { dg-error "pointer.*qualified function type" } diff --git a/gcc/testsuite/g++.dg/other/typedef3.C b/gcc/testsuite/g++.dg/other/typedef3.C new file mode 100644 index 000000000..8ead5b845 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/typedef3.C @@ -0,0 +1,12 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/40357 +// { dg-do compile } + +struct XalanCProcessor +{ + typedef enum {eInvalid, eXalanSourceTree, eXercesDOM} ParseOptionType; + ParseOptionType getParseOption(void); +}; +typedef XalanCProcessor::ParseOptionType ParseOptionType; +ParseOptionType XalanCProcessor::getParseOption(void) {} + diff --git a/gcc/testsuite/g++.dg/other/typedef4.C b/gcc/testsuite/g++.dg/other/typedef4.C new file mode 100644 index 000000000..b752f2cae --- /dev/null +++ b/gcc/testsuite/g++.dg/other/typedef4.C @@ -0,0 +1,7 @@ +// { dg-options "-g" } +// { dg-do compile } + +// On some platforms like MIPS, __builtin_va_list is a +// RECORD_TYPE. Make sure we don't wrongly try to generate debug info +// for its TYPE_DECL and crash. +typedef __builtin_va_list foo; diff --git a/gcc/testsuite/g++.dg/other/ucnid-1.C b/gcc/testsuite/g++.dg/other/ucnid-1.C new file mode 100644 index 000000000..9a2728f25 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ucnid-1.C @@ -0,0 +1,28 @@ +/* { dg-do run } */ +/* { dg-options "-fextended-identifiers" } */ +/* { dg-xfail-if "" { powerpc-ibm-aix* } { "*" } { "" } } */ +/* { dg-skip-if "" { ! ucn } { "*" } { "" } } */ +#include <cstdlib> + +int \u00C0(void) { return 1; } +int \u00C1(void) { return 2; } +int \U000000C2(void) { return 3; } +int wh\u00ff(void) { return 4; } +int a\u00c4b\u0441\U000003b4e(void) { return 5; } + +int main (void) +{ + + if (\u00C0() != 1) + abort (); + if (\u00c1() != 2) + abort (); + if (\u00C2() != 3) + abort (); + if (wh\u00ff() != 4) + abort (); + if (a\u00c4b\u0441\U000003b4e() != 5) + abort (); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/unreachable1.C b/gcc/testsuite/g++.dg/other/unreachable1.C new file mode 100644 index 000000000..da468a099 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/unreachable1.C @@ -0,0 +1,11 @@ +// PR middle-end/17827 +// Origin: Andre Woebbeking <Woebbeking@web.de> +// Testcase by Volker Reichelt <reichelt@gcc.gnu.org> +// { dg-do compile } + +void foo() +{ + if (false) + if (int i=0) + int j=i; +} diff --git a/gcc/testsuite/g++.dg/other/unused1.C b/gcc/testsuite/g++.dg/other/unused1.C new file mode 100644 index 000000000..2a3ca1be7 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/unused1.C @@ -0,0 +1,49 @@ +/* { dg-do compile } */ +/* { dg-options "-g" } */ +/* { dg-skip-if "" { { hppa*-*-hpux* *-*-solaris2.[56]* } && { ! hppa*64*-*-* } } { "*" } { "" } } */ + +/* Make sure we didn't eliminate casted types because we thought they were + unused. */ + +void *voidp; + +struct foo { int i; }; +int bar (void) +{ + return ((struct foo *)0x1234)->i; +} + +struct boo { int i; }; +int bar2 (void) +{ + return reinterpret_cast<struct boo *>(0xC0FFEE)->i; +} + +struct cue { int i; }; +int bar3 (void) +{ + return static_cast<struct cue *>(voidp)->i; +} + +class printer { public: int i; }; +const printer *dotmatrix; +int bar4 (void) +{ + return const_cast<printer *>(dotmatrix)->i; +} + +class class1 { public: virtual ~class1(); } *c1; +class class2 : class1 { char j; }; +int bar5 (void) +{ + if (dynamic_cast <class2 *>(c1)) + return 5; + else + return 6; +} +/* { dg-final { scan-assembler "foo" } } */ +/* { dg-final { scan-assembler "boo" } } */ +/* { dg-final { scan-assembler "cue" } } */ +/* The xfail below is for PR33429. */ +/* { dg-final { scan-assembler "(string|ascii?)z?\[\t \]\"class2(\"|\\\\0)" { xfail *-*-* } } } */ +/* { dg-final { scan-assembler "(string|ascii?)z?\[\t \]\"printer(\"|\\\\0)" } } */ diff --git a/gcc/testsuite/g++.dg/other/var_copy-1.C b/gcc/testsuite/g++.dg/other/var_copy-1.C new file mode 100644 index 000000000..2fc6b780e --- /dev/null +++ b/gcc/testsuite/g++.dg/other/var_copy-1.C @@ -0,0 +1,14 @@ +// { dg-options "-std=c++0x" } +// { dg-do compile } + +// Test to allow for va_copy with C++0x standard. + +#include <cstdarg> + +va_list x; +va_list y; + +int main () +{ + va_copy (y, x); +} diff --git a/gcc/testsuite/g++.dg/other/vararg-1.C b/gcc/testsuite/g++.dg/other/vararg-1.C new file mode 100644 index 000000000..f25606e93 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/vararg-1.C @@ -0,0 +1,20 @@ +// C++/15119 +// This ICEd in substitute_placeholder_in_expr because it did not +// implement the 4 element trees. +// Orginal test by: <wanderer@rsu.ru> +// Reduced by: <bangerth@dealii.org> +/* { dg-do compile } */ + +template<typename T> +const T& xmin(const T& a, const T& b); + +void bar (char *, ...); + +char const* descs[4]; + +int main() { + int t = 1; + char buf[100]; + bar( buf, descs[ xmin(t-1,4) ], 0 ); + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/vararg-2.C b/gcc/testsuite/g++.dg/other/vararg-2.C new file mode 100644 index 000000000..5b3b9a3bf --- /dev/null +++ b/gcc/testsuite/g++.dg/other/vararg-2.C @@ -0,0 +1,11 @@ +// { dg-do compile } +struct QString {}; +typedef __builtin_va_list __gnuc_va_list; +typedef __gnuc_va_list va_list; + QString & sprintf(QString &s,const QString &szFmt,...) + { + va_list list; + __builtin_va_start(list,((const char *)(&(szFmt)))); + __builtin_va_end(list); + return s; + } diff --git a/gcc/testsuite/g++.dg/other/vararg-3.C b/gcc/testsuite/g++.dg/other/vararg-3.C new file mode 100644 index 000000000..4585f3249 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/vararg-3.C @@ -0,0 +1,16 @@ +// PR c++/31488: va_list considered non-POD on alpha +// { dg-do compile } + +typedef __builtin_va_list __gnuc_va_list; +typedef __gnuc_va_list va_list; + +extern int foo (int a, int b, ...); + +int bar (int a, int b, ...) +{ + va_list args; + __builtin_va_start(args,b); + int result = foo (a, b, args); + __builtin_va_end(args); + return result; +} diff --git a/gcc/testsuite/g++.dg/other/virtual1.C b/gcc/testsuite/g++.dg/other/virtual1.C new file mode 100644 index 000000000..5f44fa78a --- /dev/null +++ b/gcc/testsuite/g++.dg/other/virtual1.C @@ -0,0 +1,7 @@ +// PR c++/26070 +// { dg-do compile } + +struct A +{ + virtual static int i; // { dg-error "virtual" } +}; diff --git a/gcc/testsuite/g++.dg/other/virtual2.C b/gcc/testsuite/g++.dg/other/virtual2.C new file mode 100644 index 000000000..f007403df --- /dev/null +++ b/gcc/testsuite/g++.dg/other/virtual2.C @@ -0,0 +1,7 @@ +// PR c++/26071 +// { dg-do compile } + +struct A +{ + virtual static ~A(); // { dg-error "virtual" } +}; diff --git a/gcc/testsuite/g++.dg/other/void1.C b/gcc/testsuite/g++.dg/other/void1.C new file mode 100644 index 000000000..691e6f782 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/void1.C @@ -0,0 +1,16 @@ +// PR c++/9278 +// { dg-do compile } + +typedef void VOID; + +int foo(void); +int bar(VOID); // { dg-error "type|invalid use" } + +template<int> int foo(void); +template<int> int bar(VOID); // { dg-error "type|invalid use" } + +struct A +{ + int foo(void); + int bar(VOID); // { dg-error "type|invalid use" } +}; diff --git a/gcc/testsuite/g++.dg/other/void2.C b/gcc/testsuite/g++.dg/other/void2.C new file mode 100644 index 000000000..153e0f181 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/void2.C @@ -0,0 +1,5 @@ +// PR c++/27423 +// { dg-do compile } + +void foo(void = 0); // { dg-error "incomplete type|invalid use" } +void bar() { foo(); } diff --git a/gcc/testsuite/g++.dg/other/vrp1.C b/gcc/testsuite/g++.dg/other/vrp1.C new file mode 100644 index 000000000..0a798c995 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/vrp1.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// { dg-options "-O2" } +// This caused a crash in VRP because TREE_OVERFLOW was set for MIN. + +template<long long MIN> +long long mod (long long l, long long r) +{ + if (l == MIN && r == -1) + return 0LL; + return l % r; +} +template long long mod<-0x8000000000000000LL> (long long, long long); diff --git a/gcc/testsuite/g++.dg/other/vthunk1.C b/gcc/testsuite/g++.dg/other/vthunk1.C new file mode 100644 index 000000000..90165628b --- /dev/null +++ b/gcc/testsuite/g++.dg/other/vthunk1.C @@ -0,0 +1,26 @@ +// PR c++/12007 Multiple inheritance float pass by value fails +// { dg-do run } + +extern "C" void abort (void); + +class gvImpl +{ +public: + virtual void PutVal(float value){} +}; + +class foo { public: virtual void Bar(){} }; + +class myGv: public foo, public gvImpl +{ + void PutVal(float value){ if (value != 3.14159f) abort (); } +}; + +myGv x; +gvImpl* object = &x; + +int main() +{ + object->PutVal(3.14159f); + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/warning1.C b/gcc/testsuite/g++.dg/other/warning1.C new file mode 100644 index 000000000..77653a1df --- /dev/null +++ b/gcc/testsuite/g++.dg/other/warning1.C @@ -0,0 +1,19 @@ +// { dg-do compile } + +// PR c++/7804 +// Floating point formatting in error and warning messages + +extern "C" int printf(const char *, ...); + +struct S +{ + static const float inf = 1.0f / 0.0f; // { dg-warning "1.0|float|initialization" } + static const float nan = 0.0f / 0.0f; // { dg-warning "0.0|float|initialization" } +}; + +int main() +{ + // { dg-prune-output "not a member" } + printf("%f\n%f\n", S::inf, S::nan); + return 0; +} diff --git a/gcc/testsuite/g++.dg/overload/VLA.C b/gcc/testsuite/g++.dg/overload/VLA.C new file mode 100644 index 000000000..0c748f50c --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/VLA.C @@ -0,0 +1,16 @@ +//Origin: kengole@us.ibm.com + +//PR c++/2478 +// G++ was rejecting this as it could not convert `int (*)[]' to `int (*)[0]'. +// Using the C99 VLA style arrays in a struct. + +// { dg-do compile } + +struct S { + int (*p)[]; +} B; + +void foo() { + int (*p)[]; + B.p=p; // { dg-bogus "cannot convert" } +} diff --git a/gcc/testsuite/g++.dg/overload/addr1.C b/gcc/testsuite/g++.dg/overload/addr1.C new file mode 100644 index 000000000..25856a20f --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/addr1.C @@ -0,0 +1,50 @@ +// { dg-do run } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 6 Sep 2003 <nathan@codesourcery.com> +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> + +// PR c++/11788 we failed to instantiate a decl, and we lost some side +// effects + +static int flag = 0; + +template <typename> struct A +{ + A &active () { flag++;} + + static void foo() {} + + static void bar () {} + static void bar (int) {} + + int m; +}; + +void (*baz ()) () +{ + A<int> a; + return &a.active ().foo; +} + +void (*boz ()) () +{ + A<int> a; + return &a.active ().bar; +} + +int *buz () +{ + A<int> a; + + return &a.active ().m; +} + +int main () +{ + baz (); + boz (); + buz (); + + return flag != 3; +} diff --git a/gcc/testsuite/g++.dg/overload/ambig1.C b/gcc/testsuite/g++.dg/overload/ambig1.C new file mode 100644 index 000000000..d11e00a18 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/ambig1.C @@ -0,0 +1,24 @@ +// [over.best.ics]: For the purpose of ranking implicit conversion +// sequences as described in _over.ics.rank_, the ambiguous conversion +// sequence is treated as a user-defined sequence that is indistinguishable +// from any other user- defined conversion sequence. + +struct A +{ + A(long); + A(char); +}; + +struct B +{ + B(int); +}; + +void f(A); // { dg-message "note" "candidate" } +void f(B); // { dg-message "note" "candidate" } + +int main() +{ + f (42); // { dg-error "ambiguous" "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 22 } +} diff --git a/gcc/testsuite/g++.dg/overload/ambig2.C b/gcc/testsuite/g++.dg/overload/ambig2.C new file mode 100644 index 000000000..614166f9f --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/ambig2.C @@ -0,0 +1,22 @@ +// Bug: g++ thought that the QChar overload was a viable but ambiguous +// candidate. It isn't viable, because there's no conversion from const +// char * to QChar. + +class QChar { +public: + QChar( char c ); + QChar( unsigned char c ); +}; + +class QString +{ +public: + QString( const char *str ); // deep copy + + QString &insert( unsigned int index, const QString & ); + QString &insert( unsigned int index, QChar ); + QString &prepend( const char* ); +}; + +inline QString &QString::prepend( const char* s ) +{ return insert(0,s); } diff --git a/gcc/testsuite/g++.dg/overload/arg1.C b/gcc/testsuite/g++.dg/overload/arg1.C new file mode 100644 index 000000000..c765a9902 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/arg1.C @@ -0,0 +1,23 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Nov 2004 <nathan@codesourcery.com> + +// PR 17431. copy ctor from user conv +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +struct A {}; + +struct B : A +{ + B(int); + B(B &); + B(A); +}; + +void foo(B); + +void bar() +{ + foo(0); +} diff --git a/gcc/testsuite/g++.dg/overload/arg2.C b/gcc/testsuite/g++.dg/overload/arg2.C new file mode 100644 index 000000000..1e39186f7 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/arg2.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Nov 2004 <nathan@codesourcery.com> + +// PR 17431. copy ctor from user conv +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +struct A {}; + +struct B : A +{ + B(int); + B(A); +}; + +void foo(B); + +void bar() +{ + foo(0); +} diff --git a/gcc/testsuite/g++.dg/overload/arg3.C b/gcc/testsuite/g++.dg/overload/arg3.C new file mode 100644 index 000000000..34624cd22 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/arg3.C @@ -0,0 +1,23 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Nov 2004 <nathan@codesourcery.com> + +// PR 17431. copy ctor from user conv +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +struct A {}; + +struct B : A +{ + B(int); // { dg-message "B::B|no known conversion" "" } + B(B&); // { dg-message "note" "" } +}; + +void foo(B); // { dg-error "initializing" } + +void bar() +{ + foo(0); // { dg-error "no matching function" "no matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 21 } +} diff --git a/gcc/testsuite/g++.dg/overload/arg4.C b/gcc/testsuite/g++.dg/overload/arg4.C new file mode 100644 index 000000000..13e4bad63 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/arg4.C @@ -0,0 +1,29 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Nov 2004 <nathan@codesourcery.com> + +// PR 17431. copy ctor from user conv +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +struct A {}; + +struct B : A +{ + B(int); + B(B&); + B(A); +}; + +struct C +{ + operator B () const; +}; + + +void foo(B); + +void bar() +{ + C c; + foo(c);} diff --git a/gcc/testsuite/g++.dg/overload/arg5.C b/gcc/testsuite/g++.dg/overload/arg5.C new file mode 100644 index 000000000..63c66d4a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/arg5.C @@ -0,0 +1,24 @@ +// PR c++/34111 + +class QChar +{ +}; +struct QString +{ + QString(QChar); +}; +struct QPainter +{ + void drawText (int x, int y, const QString &); +}; + + class KHEChar:public QChar + { + public:KHEChar (QChar C); + }; + +void +drawByte (QPainter * P, char, KHEChar B) +{ + P->drawText (0, 0, B); +} diff --git a/gcc/testsuite/g++.dg/overload/autoptr1.C b/gcc/testsuite/g++.dg/overload/autoptr1.C new file mode 100644 index 000000000..fc8108350 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/autoptr1.C @@ -0,0 +1,29 @@ +// PR c++/35773 + +template< typename T > +class auto_ptr +{ + struct auto_ptr_ref { }; +public: + auto_ptr(auto_ptr&); + auto_ptr(auto_ptr_ref); + + operator auto_ptr_ref(); +}; + +template< typename T > +class reference_wrapper +{ +public: + reference_wrapper(T& t); + operator T& () const; +}; + +struct X { }; + +void f(auto_ptr< X >); + +void g(reference_wrapper< auto_ptr< X > > r) +{ + f(r); +} diff --git a/gcc/testsuite/g++.dg/overload/builtin1.C b/gcc/testsuite/g++.dg/overload/builtin1.C new file mode 100644 index 000000000..fdd208135 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/builtin1.C @@ -0,0 +1,18 @@ +// Test that we don't discard builtin candidates inappropriately. + +struct B { }; + +struct A { + operator int (); + operator B (); +}; + +void operator+ (B, B); // { dg-message "operator" "operator" } + +int main () +{ + A a; + a + a; // { dg-error "ambiguous" "ambiguous" } + // { dg-message "operator" "match candidate text" { target *-*-* } 15 } + // { dg-message "candidates" "candidates" { target *-*-* } 15 } +} diff --git a/gcc/testsuite/g++.dg/overload/builtin2.C b/gcc/testsuite/g++.dg/overload/builtin2.C new file mode 100644 index 000000000..4f9f52dda --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/builtin2.C @@ -0,0 +1,8 @@ +namespace __gnu_cxx { + void llabs(long long x); +} + +namespace std { + using __gnu_cxx::llabs; + using __gnu_cxx::llabs; +} diff --git a/gcc/testsuite/g++.dg/overload/builtin3.C b/gcc/testsuite/g++.dg/overload/builtin3.C new file mode 100644 index 000000000..dcd9fd02e --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/builtin3.C @@ -0,0 +1,10 @@ +// PR c++/11409 +// { dg-do compile } + +namespace std { + double fabs (double); +} +using std::fabs; + +double (*p) (double) = &fabs; // { dg-bogus "is ambiguous" "" } + diff --git a/gcc/testsuite/g++.dg/overload/cond1.C b/gcc/testsuite/g++.dg/overload/cond1.C new file mode 100644 index 000000000..74f0f3c49 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/cond1.C @@ -0,0 +1,24 @@ +// Test that converting a COND_EXPR to void doesn't result in trying to +// bitwise copy a class with a nontrivial copy constructor (and thus a +// compiler abort). + +// { dg-options "-O" } + +struct A { + virtual ~A() { } +}; + +A a1, a2; +inline A& one () { return a1; } +inline A& two () { return a2; } + +inline void f (int i) +{ + i ? a1 : a2; + i ? one() : two(); +} + +int main () +{ + f (1); +} diff --git a/gcc/testsuite/g++.dg/overload/cond2.C b/gcc/testsuite/g++.dg/overload/cond2.C new file mode 100644 index 000000000..cbcdc6ed0 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/cond2.C @@ -0,0 +1,15 @@ +struct C +{ + operator int(); +}; + +struct D +{ + operator int(); +}; + +int main() +{ + C c; D d; + true ? c : d; +} diff --git a/gcc/testsuite/g++.dg/overload/conv-op1.C b/gcc/testsuite/g++.dg/overload/conv-op1.C new file mode 100644 index 000000000..6a63cbaeb --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/conv-op1.C @@ -0,0 +1,17 @@ +// PR c++/47703 + +typedef void (*pfn)(int &); + +struct A +{ + operator pfn() { return 0; } +}; + +void f() +{ + const int i = 42; + A()(i); // { dg-message "<conversion>" } +} + +// { dg-prune-output "no match" } +// { dg-prune-output "candidate" } diff --git a/gcc/testsuite/g++.dg/overload/copy1.C b/gcc/testsuite/g++.dg/overload/copy1.C new file mode 100644 index 000000000..f0ec385fc --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/copy1.C @@ -0,0 +1,21 @@ +// PR c++/34824 + +struct A; + +struct B +{ + B (A const &); // { dg-message "note" } + B (B &); // { dg-message "note" } +}; + +struct A +{ + A (B); // { dg-error "initializing" } +}; + +B +f (B const& b) +{ + return b; // { dg-error "matching" "matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 19 } +} diff --git a/gcc/testsuite/g++.dg/overload/defarg1.C b/gcc/testsuite/g++.dg/overload/defarg1.C new file mode 100644 index 000000000..44de73373 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/defarg1.C @@ -0,0 +1,9 @@ +// PR c++/5247 + +template<typename T> +int foo (T t, int = foo(T())); + +int main() +{ + foo(0); // { dg-error "default argument" } +} diff --git a/gcc/testsuite/g++.dg/overload/defarg2.C b/gcc/testsuite/g++.dg/overload/defarg2.C new file mode 100644 index 000000000..d8ecb2fa7 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/defarg2.C @@ -0,0 +1,17 @@ +// PR c++/37971 +// { dg-do compile } + +class C { +private: + static int f(int); + static int f(char); + +public: + static void g(int (*)(int) = f); +}; + +void h() { + /* Although C::f is inaccessible here, it is accessible in the + context of C::g, so there is no error. */ + C::g(); +} diff --git a/gcc/testsuite/g++.dg/overload/defarg3.C b/gcc/testsuite/g++.dg/overload/defarg3.C new file mode 100644 index 000000000..6622e430a --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/defarg3.C @@ -0,0 +1,15 @@ +// PR c++/37971 +// { dg-do compile } + +class C { +private: + static int f(int); // { dg-error "private" } + static int f(char); +}; + +class D { +public: + /* C::f is inaccessible, so this is an error, even if this function + is never called. */ + static void g(int (*)(int) = C::f); // { dg-error "context" } +}; diff --git a/gcc/testsuite/g++.dg/overload/defarg4.C b/gcc/testsuite/g++.dg/overload/defarg4.C new file mode 100644 index 000000000..3fa0751b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/defarg4.C @@ -0,0 +1,26 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/39987 +// { dg-do compile } + +class foo +{ + template<typename U> + static bool func(const U& x) + {} +public: + template<typename U> + unsigned int Find(const U& x, bool (*pFunc) (const U&) = func) const + {} +}; + +class bar { + bool Initialize(); +protected: + foo b; +}; + +bool bar::Initialize() +{ + b.Find(b); +} + diff --git a/gcc/testsuite/g++.dg/overload/ellipsis1.C b/gcc/testsuite/g++.dg/overload/ellipsis1.C new file mode 100644 index 000000000..3dedaa6be --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/ellipsis1.C @@ -0,0 +1,18 @@ +// PR c++/15142 +// Bug: We were aborting after giving a warning about passing a non-POD. + +struct B { + B() throw() { } + B(const B&) throw() { } +}; + +struct X { + B a; + X& operator=(const X&); +}; + +struct S { S(...); }; + +void SillyFunc() { + throw S(X()); // { dg-error "copy" } +} diff --git a/gcc/testsuite/g++.dg/overload/error1.C b/gcc/testsuite/g++.dg/overload/error1.C new file mode 100644 index 000000000..dd10d9053 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/error1.C @@ -0,0 +1,7 @@ +// { dg-do compile } + +struct S +{ + void f () {} // { dg-error "with" "" } + int f () { return 0; } // { dg-error "overloaded" "" } +}; diff --git a/gcc/testsuite/g++.dg/overload/error2.C b/gcc/testsuite/g++.dg/overload/error2.C new file mode 100644 index 000000000..327062133 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/error2.C @@ -0,0 +1,11 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 18 Oct 2005 <nathan@codesourcery.com> + +// PR 22604 +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +struct A +{ + void foo(); // { dg-error "with" "" } + virtual void foo(); // { dg-error "cannot be overloaded" "" } +}; diff --git a/gcc/testsuite/g++.dg/overload/error3.C b/gcc/testsuite/g++.dg/overload/error3.C new file mode 100644 index 000000000..e0003dd88 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/error3.C @@ -0,0 +1,41 @@ +// PR c++/42701 +// Test for error-recovery on code that is ill-formed by DR 147. + +namespace Glib { + class ustring { + public: + typedef unsigned size_type; + ustring(const char* src, size_type n); + ustring(const char* src); + }; +} +namespace Gdk { + class Color { + public: + explicit Color(const Glib::ustring& value); + }; +} +namespace Gtk { + enum StateType { STATE_NORMAL }; + class Widget { + public: + void modify_bg(StateType state, const Gdk::Color& color); + }; + class Label { + public: + void set_text(const Glib::ustring &str); + }; +} +typedef enum Result { eSuccess = 0 } Result; +class MainWindow { + void update_status(Result result); + Gtk::Widget status_frame; + Gtk::Label status_label; +}; +void MainWindow::update_status(Result result) { + switch (result) { + status_frame.modify_bg(Gtk::STATE_NORMAL,Gdk::Color::Color("green")); // { dg-error "" } + status_frame.modify_bg(Gtk::STATE_NORMAL,Gdk::Color::Color("red")); // { dg-error "" } + status_label.set_text("Out of memory"); + } +} diff --git a/gcc/testsuite/g++.dg/overload/extern-C-1.C b/gcc/testsuite/g++.dg/overload/extern-C-1.C new file mode 100644 index 000000000..839a0b49a --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/extern-C-1.C @@ -0,0 +1,17 @@ +// PR c++/34691 + +namespace A { + extern "C" void f(int = 5); // { dg-message "= 5" } +} +namespace B { + extern "C" void f(int = 4); // { dg-message "= 4" } +} + +using A::f; +using B::f; +int main() { + void (*fp)(int) = f; // OK + f(3); // OK + f(); // { dg-error "default argument mismatch" } +} + diff --git a/gcc/testsuite/g++.dg/overload/extern-C-2.C b/gcc/testsuite/g++.dg/overload/extern-C-2.C new file mode 100644 index 000000000..562786c04 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/extern-C-2.C @@ -0,0 +1,22 @@ +// PR c++/39742 + +void f( int, ...); + +struct S +{ +}; + +void +g() +{ + void f( int, ...); + + S t; + + f(1, t); +} + +void +f( int i, ...) +{ +} diff --git a/gcc/testsuite/g++.dg/overload/koenig1.C b/gcc/testsuite/g++.dg/overload/koenig1.C new file mode 100644 index 000000000..a46125919 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/koenig1.C @@ -0,0 +1,19 @@ +// PR c++/9336 +// Bug: The first, invalid call to f caused us to crash on the second, +// valid call. + +namespace N { + template <class T> void f (T); // { dg-message "N::f" } + struct A; +} + +struct B; + +void g () +{ + B *bp; + N::A *ap; + f (bp); // { dg-error "not declared" } + // { dg-message "suggested alternative" "suggested alternative" { target *-*-* } 16 } + f (ap); +} diff --git a/gcc/testsuite/g++.dg/overload/koenig2.C b/gcc/testsuite/g++.dg/overload/koenig2.C new file mode 100644 index 000000000..f35aa1a31 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/koenig2.C @@ -0,0 +1,15 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 18 Oct 2005 <nathan@codesourcery.com> + +// PR 21383 +// Origin: Matthew Hall <mahall@ncsa.uiuc.edu> + +template <class T> +void dummy(T& t); + +void anyfunc(int x); + +void Foo () +{ + anyfunc (&dummy<>); // { dg-error "cannot resolve overload" "" } +} diff --git a/gcc/testsuite/g++.dg/overload/member1.C b/gcc/testsuite/g++.dg/overload/member1.C new file mode 100644 index 000000000..29896a511 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/member1.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 29 Sep 2002 <nathan@codesourcery.com> + +struct X +{ + template<typename T> static void ProcessProxy (); + typedef void (*Callback) (); + void Process (Callback); + + template<typename T> void Process () + { + Process (&ProcessProxy<T>); + } + +}; + +void foo (X *x) +{ + x->Process<int> (); +} diff --git a/gcc/testsuite/g++.dg/overload/member2.C b/gcc/testsuite/g++.dg/overload/member2.C new file mode 100644 index 000000000..b8914146f --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/member2.C @@ -0,0 +1,41 @@ +// { dg-do run } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 17 Oct 2002 <nathan@codesourcery.com> + +// PR 7676. We didn't notice template members were different. + +struct foo +{ + template<class T> + int bar() {return 1;} + + template<int I> + int bar() {return 2;} + +}; + +struct baz : foo +{ + using foo::bar; + template<int I> + int bar () {return 3;} +}; + +int main () +{ + baz b; + foo f; + + if (f.bar<1> () != 2) + return 1; + if (f.bar<int> () != 1) + return 2; + + if (b.bar<1> () != 3) + return 1; + if (b.bar<int> () != 1) + return 2; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/overload/new1.C b/gcc/testsuite/g++.dg/overload/new1.C new file mode 100644 index 000000000..9adb4c072 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/new1.C @@ -0,0 +1,22 @@ +typedef __SIZE_TYPE__ size_t; +void *operator new(size_t, unsigned int); + +struct X{ + X(); + X(int); +}; + + +void f(X *x = new X); // { dg-error "" } + +void f(X *x = new X(4)); // { dg-error "" } + +void f(X *x = new X[4]); // { dg-error "" } + +void f(X *x = new (3) X(6)); // { dg-error "" } + +void f(X *x = new (2) X[10]); // { dg-error "" } +// { dg-message "candidate" "candidate note" { target *-*-* } 18 } +// { dg-message "operator new|candidate expects" "match candidate text" { target *-*-* } 00 } + +void f(X *x = new X[10][5]); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/overload/operator-star-1.C b/gcc/testsuite/g++.dg/overload/operator-star-1.C new file mode 100644 index 000000000..8780d5f62 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/operator-star-1.C @@ -0,0 +1,27 @@ +// Copyright (C) 2002 Free Software Foundation +// Origin: C++/70 +// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net> +// { dg-do compile } + +template <class T> + struct S; + +template <class T> + void operator* (S<T>, S<T>); + +template <class T> + struct S + { + friend void operator*<> (S, S); // { } // okay + void operator* (T) { } + }; + +template <class T> + void operator* (S<T>, S<T>) { } + +int main() +{ + S<int> s1, s2; + s1 * s2; + s1 * 2; +} diff --git a/gcc/testsuite/g++.dg/overload/operator1.C b/gcc/testsuite/g++.dg/overload/operator1.C new file mode 100644 index 000000000..f4d1f53f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/operator1.C @@ -0,0 +1,34 @@ +typedef struct _GdkDrawable GdkDrawable; +typedef struct _GdkDrawable GdkBitmap; +typedef struct _GdkDrawable GdkPixmap; + +class Drawable +{ +public: + operator GdkDrawable* () const; +}; + + +class Pixmap : public Drawable +{ +public: + operator GdkPixmap* () const; + +}; + + +class Bitmap : public Pixmap +{ +public: + operator GdkBitmap* () const; + +}; + +class Event +{ +}; + +Bitmap::operator GdkBitmap* () const +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/overload/operator2.C b/gcc/testsuite/g++.dg/overload/operator2.C new file mode 100644 index 000000000..aba162244 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/operator2.C @@ -0,0 +1,14 @@ +// PR c++/19966 +// { dg-do compile } + +struct A +{ + static operator int(); // { dg-error "must be a nonstatic" } +}; + +struct B +{ + static int operator*(); // { dg-error "must be either" } +}; + +static operator int(); // { dg-error "must be a nonstatic" } diff --git a/gcc/testsuite/g++.dg/overload/operator3.C b/gcc/testsuite/g++.dg/overload/operator3.C new file mode 100644 index 000000000..ff5696788 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/operator3.C @@ -0,0 +1,31 @@ +// PR c++/32756 +// { dg-do compile } + +// bogus overload warning + +class QString; + +struct QByteArray +{ + QByteArray (); + bool operator!= (const QString & s2) const; +}; + +bool operator!= (const QByteArray & a1, const QByteArray & a2); + +struct QString +{ + QString (); + QString (const QByteArray & a); +}; + +QByteArray abbreviation (); + +void +fromString () +{ + QByteArray zoneAbbrev; + if (abbreviation () != zoneAbbrev) + { + } +} diff --git a/gcc/testsuite/g++.dg/overload/pmf1.C b/gcc/testsuite/g++.dg/overload/pmf1.C new file mode 100644 index 000000000..d20074931 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/pmf1.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 04 Mar 2002 <nathan@codesourcery.com> +// Jason Merrill <jason@redhat.com> + +struct A { int i; }; +struct B: private A {}; +struct C { + C (int A::*); +}; + +int A::*aip = &A::i; + +void f (int B::*) {} // should choose this, even though it's ill-formed +void f (C) {} // even though this would be well-formed + +int main () +{ + f (aip); // { dg-error "'A' is an inaccessible base of 'B'|conversion" "" } +} diff --git a/gcc/testsuite/g++.dg/overload/pmf2.C b/gcc/testsuite/g++.dg/overload/pmf2.C new file mode 100644 index 000000000..e95e1f83a --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/pmf2.C @@ -0,0 +1,20 @@ +// PR c++/561 + +class A { }; + +struct B : public A +{ + void foo (); + void foo (int); + template <class T> + void bar (T); + template <class T> + void bar (T, T); +}; + +int main () +{ + void (A::*f1)() = (void (A::*)()) &B::foo; + void (A::*f2)(int) = (void (A::*)(int)) &B::bar; + void (A::*f3)(int) = (void (A::*)(int)) &B::bar<int>; +} diff --git a/gcc/testsuite/g++.dg/overload/prom1.C b/gcc/testsuite/g++.dg/overload/prom1.C new file mode 100644 index 000000000..9eb387dc4 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/prom1.C @@ -0,0 +1,9 @@ +void foo(signed char) {} +typedef int bar; +void foo(bar) {} + +int main (int, char **) { + char c; + foo(c); + return 0; +} diff --git a/gcc/testsuite/g++.dg/overload/ref1.C b/gcc/testsuite/g++.dg/overload/ref1.C new file mode 100644 index 000000000..e239d88a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/ref1.C @@ -0,0 +1,21 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 5 Mar 2004 <nathan@codesourcery.com> + +// Origin: schmid@snake.iap.physik.tu-darmstadt.de +// Bug 14397: Bogus access error. + +struct S { + S (int); + S(S const&); + private: + S(S&); +}; + +S foo() +{ + int result = 0; + + S s ((0,S (result))); + + return S (result); +} diff --git a/gcc/testsuite/g++.dg/overload/reftemp1.C b/gcc/testsuite/g++.dg/overload/reftemp1.C new file mode 100644 index 000000000..89f941817 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/reftemp1.C @@ -0,0 +1,13 @@ +// PR c++/25950 + +struct X { + X(); + explicit X(const X&); +}; + +void g(const X&); + +int main() +{ + g(X()); +} diff --git a/gcc/testsuite/g++.dg/overload/reftemp2.C b/gcc/testsuite/g++.dg/overload/reftemp2.C new file mode 100644 index 000000000..365d5b13f --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/reftemp2.C @@ -0,0 +1,23 @@ +// DR 391 says that we always bind a reference to the base subobject; it is +// incorrect to call the A copy constructor to initialize the parameter of +// f. + +int fail; + +struct A { + A() { } + A(const A&) { fail = 1; } +}; +struct B : public A { }; +struct X { + operator B() { return B(); } +}; +X x; + +void f (const A&) { } + +int main() +{ + f(x); + return fail; +} diff --git a/gcc/testsuite/g++.dg/overload/rvalue1.C b/gcc/testsuite/g++.dg/overload/rvalue1.C new file mode 100644 index 000000000..41805949d --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/rvalue1.C @@ -0,0 +1,10 @@ +// PR c++/42655 + +void unused(const bool &) { } + +int main() { + volatile bool x = false; + unused(!!x); // type of "!x" is bool + unused(!x); // type of "!x" is bool +} + diff --git a/gcc/testsuite/g++.dg/overload/scope1.C b/gcc/testsuite/g++.dg/overload/scope1.C new file mode 100644 index 000000000..f783b7613 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/scope1.C @@ -0,0 +1,10 @@ +// PR c++/9868 + +template <typename T> struct D { + void (*p)(); + + void clear() { + D::p(); + } +}; +template class D<bool>; diff --git a/gcc/testsuite/g++.dg/overload/template1.C b/gcc/testsuite/g++.dg/overload/template1.C new file mode 100644 index 000000000..5bfad8464 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/template1.C @@ -0,0 +1,12 @@ +template<typename T> T Foo (int) {T d;} + +void Baz (void (*)(int), int); + +int Foo (); +int Baz (int (*)(), float); + +void Bar () +{ + Baz (Foo, 1.0f); + +} diff --git a/gcc/testsuite/g++.dg/overload/template2.C b/gcc/testsuite/g++.dg/overload/template2.C new file mode 100644 index 000000000..e7bdaa74b --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/template2.C @@ -0,0 +1,8 @@ +typedef int PyObject; +typedef PyObject *(*PyCFunction)(PyObject *, PyObject *); +template<class T> int _clear(PyObject* self); + +void _typeInfo() +{ + reinterpret_cast<PyCFunction>(_clear); // { dg-error "overloaded function" } +} diff --git a/gcc/testsuite/g++.dg/overload/template3.C b/gcc/testsuite/g++.dg/overload/template3.C new file mode 100644 index 000000000..90ccfd8ad --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/template3.C @@ -0,0 +1,15 @@ +// PR c++/33962 +// { dg-do compile } + +template <class T> struct A; + +template <class U> void foo (const U &x, ...); +template <class T> void foo (const A<T> &x, ...); + +void bar (const A<int> &x, const char *y) +{ + foo (x, y); +} + +/* { dg-final { scan-assembler "_Z3fooIiEvRK1AIT_Ez" } } */ +/* { dg-final { scan-assembler-not "_Z3fooI1AIiEEvRKT_z" } } */ diff --git a/gcc/testsuite/g++.dg/overload/template4.C b/gcc/testsuite/g++.dg/overload/template4.C new file mode 100644 index 000000000..8f00d4171 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/template4.C @@ -0,0 +1,24 @@ +// PR c++/35986 +// { dg-do compile } + +namespace +{ + template <int> void foo (...); // { dg-message "foo" } + template <int> void bar (int, ...); // { dg-message "bar" } + void baz (...); // { dg-message "baz" } +} + +template <int> void foo (...); // { dg-message "note" } +template <int> void bar (int, ...); // { dg-message "note" } +void baz (...); // { dg-message "note" } + +void +test () +{ + foo <0> (0); // { dg-error "is ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 18 } + bar <1> (0, 1); // { dg-error "is ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 20 } + baz (0); // { dg-error "is ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 22 } +} diff --git a/gcc/testsuite/g++.dg/overload/unknown1.C b/gcc/testsuite/g++.dg/overload/unknown1.C new file mode 100644 index 000000000..935f8d496 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/unknown1.C @@ -0,0 +1,10 @@ +// { dg-do compile } + +void foo(void); +int foo(int); +template <typename T> void bar(T f); // { dg-message "note" } + +void baz() { + bar(foo); // { dg-error "<unresolved overloaded function type>" } + // { dg-message "candidate" "candidate note" { target *-*-* } 8 } +} diff --git a/gcc/testsuite/g++.dg/overload/using1.C b/gcc/testsuite/g++.dg/overload/using1.C new file mode 100644 index 000000000..bc46c6049 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/using1.C @@ -0,0 +1,11 @@ +void f(); + +namespace N { + using ::f; +} + +bool b; + +void g() { + b = N::f == ::f; +} diff --git a/gcc/testsuite/g++.dg/overload/using2.C b/gcc/testsuite/g++.dg/overload/using2.C new file mode 100644 index 000000000..514d83f34 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/using2.C @@ -0,0 +1,92 @@ +// { dg-do compile } + +// Copyright 2005 Free Software Foundation +// by Alexandre Oliva <aoliva@redhat.com> +// based on https://bugzilla.redhat.com/beta/show_bug.cgi?id=149098 + +// Per the ISO C++ 90 Standard, using declarations before of after a +// declaration of the same function name and prototype should be +// errors (7.3.3/11). However, DR 101's resolution recommends +// accepting such duplicates if they denote the same function, which +// means extern "C" declarations are supposed to match and be +// accepted. + +// This test makes sure we reject or accept regular and using +// declarations regardless of order as appropriate, and that having +// built-in declarations or overloads doesn't affet the outcome. + +namespace std { + extern "C" void exit (int) throw (); // these are built-in (extern "C") + extern "C" void *malloc (__SIZE_TYPE__) throw () __attribute__((malloc)); + + void abort (void) throw (); // these aren't + void _exit (int) throw (); // { dg-message "std::_exit" } + + extern "C" void c1 (void) throw (); + void C1 (void) throw (); // { dg-message "std::C1" } + + extern "C" void c2 (void) throw (); + void C2 (void) throw (); + + extern "C" void c3 (void) throw (); + void C3 (void) throw (); // { dg-message "std::C3" } +} + +namespace other { + extern "C" void c3 (void) throw (); + void C3 (void) throw (); // { dg-message "other::C3" } +} + +using std::exit; +using std::_exit; +using std::c1; +using std::C1; + + extern "C" void exit (int) throw (); + extern "C" void *malloc (__SIZE_TYPE__) throw () __attribute__((malloc)); + + void abort (void) throw (); + void _exit (int) throw (); // { dg-error "conflicts" "conflicts" } + // { dg-message "void _exit" "_exit" { target *-*-* } 49 } + + extern "C" void c1 (void) throw (); + void C1 (void) throw (); // { dg-error "conflicts" "conflicts" } + // { dg-message "void C1" "C1" { target *-*-* } 53 } + + extern "C" void c2 (void) throw (); + void C2 (void) throw (); + + int C3 (int) throw (); + +using std::malloc; +using std::abort; // { dg-error "already declared" } +using std::c2; +using std::C2; // { dg-error "already declared" } + +using std::c3; using other::c3; +using std::C3; using other::C3; + + long C3 (long) throw (); + +int main () { + malloc (0); + exit (0); + + _exit (0); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 75 } + abort (); + + c1 (); + C1 (); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 80 } + + c2 (); + C2 (); // one might expect an ambiguous call error here as well, but + // we don't add the using decl if we find it to be in error. + + c3 (); + C3 (); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 88 } + C3 (0); + C3 (0l); +} diff --git a/gcc/testsuite/g++.dg/overload/virtual1.C b/gcc/testsuite/g++.dg/overload/virtual1.C new file mode 100644 index 000000000..8940aefd0 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/virtual1.C @@ -0,0 +1,21 @@ +// Test that explicit scope suprresses virtual lookup even after an +// explicit object. + +extern "C" int printf (const char *, ...); + +struct A +{ + virtual int f () { return 0; } +}; + +struct B: public A +{ + int f () { return 1; } + int g() { return this->A::f(); } +}; + +int main() +{ + B b; + return b.g(); +} diff --git a/gcc/testsuite/g++.dg/parse/access1.C b/gcc/testsuite/g++.dg/parse/access1.C new file mode 100644 index 000000000..f8994e39e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access1.C @@ -0,0 +1,13 @@ +// { dg-do compile } + +// Origin: Volker Lukas <vlukas@gmx.de> + +// PR c++/9554: Access checking for template ID as class head. + +class enclose +{ + template<typename T> struct enclosed; +}; + +template <> +struct enclose::enclosed<int>; diff --git a/gcc/testsuite/g++.dg/parse/access10.C b/gcc/testsuite/g++.dg/parse/access10.C new file mode 100644 index 000000000..62adc1b16 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access10.C @@ -0,0 +1,11 @@ +// PR c++/18698 +// The compiler was giving an error message for invalid syntax +// that irrelevantly talked about using-declarations. + +template<int> struct A +{ + ::A~(); // { dg-bogus "using-declaration" } +}; + +// Instead of the bogus error we get a different error. +// { dg-error "template-name" "" { target *-*-* } 7 } diff --git a/gcc/testsuite/g++.dg/parse/access2.C b/gcc/testsuite/g++.dg/parse/access2.C new file mode 100644 index 000000000..ee8cd234e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access2.C @@ -0,0 +1,15 @@ +// Copyright (C) 2003 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +// Deferred access checking of variable declaration. + +class A { + typedef int X; // { dg-error "private" } + static X a, b, c; +}; + +A::X A::a; +A::X A::b, x; // { dg-error "this context" } +A::X y, A::c; // { dg-error "this context" } +A::X z; // { dg-error "this context" } diff --git a/gcc/testsuite/g++.dg/parse/access3.C b/gcc/testsuite/g++.dg/parse/access3.C new file mode 100644 index 000000000..43303c95a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access3.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Origin: <bagnara@cs.unipr.it> + +// PR c++/7809: Befriending inaccessible name. + +class A { +private: + void f(); // { dg-error "private" } +}; + +class B { + friend void A::f(); // { dg-error "context" } +}; diff --git a/gcc/testsuite/g++.dg/parse/access4.C b/gcc/testsuite/g++.dg/parse/access4.C new file mode 100644 index 000000000..d3870bd34 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access4.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +// Origin: Mike Reed <mike.reed@amadron.com> + +// PR c++/11174: Access checking of pointer-to-member function + +class A { +protected: + void foo() {} // { dg-error "protected" } +public: + A(); +}; + +class B : public A { + void bar() { + A a; + void (A::*pmf)() = &A::foo; // { dg-error "this context" } + (a.*pmf)(); + } +}; diff --git a/gcc/testsuite/g++.dg/parse/access5.C b/gcc/testsuite/g++.dg/parse/access5.C new file mode 100644 index 000000000..cd1789eed --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access5.C @@ -0,0 +1,18 @@ +// { dg-do compile } + +// Origin: Giovanni Bajo <giovannibajo@libero.it> + +// PR c++/11174: Access checking on pointer to member data. + +struct A +{ +protected: + int a; // { dg-error "protected" } +}; + +struct B : A +{ + void foo() { + (void)&A::a; // { dg-error "this context" } + } +}; diff --git a/gcc/testsuite/g++.dg/parse/access6.C b/gcc/testsuite/g++.dg/parse/access6.C new file mode 100644 index 000000000..33d509058 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access6.C @@ -0,0 +1,24 @@ +// { dg-do compile } + +// Origin: David Baron <dbaron@fas.harvard.edu> + +// PR c++/3765: Changing access from public to private by member +// using declaration. + +class A +{ + public: + int foo() { return 1; } // { dg-error "inaccessible" } +}; + +class B : public A +{ + private: + using A::foo; +}; + +int main() +{ + B b; + return b.foo(); // { dg-error "this context" } +} diff --git a/gcc/testsuite/g++.dg/parse/access7.C b/gcc/testsuite/g++.dg/parse/access7.C new file mode 100644 index 000000000..2a7ca3c42 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access7.C @@ -0,0 +1,13 @@ +// { dg-do compile } + +// Origin: Paolo Carlini <pcarlini@unitus.it> + +// PR c++/5655: Access of member redeclaration. + +struct S { + class A; + template <class T> class B; +private: + class A {}; // { dg-error "different access" } + template <class T> class B {}; // { dg-error "different access" } +}; diff --git a/gcc/testsuite/g++.dg/parse/access8.C b/gcc/testsuite/g++.dg/parse/access8.C new file mode 100644 index 000000000..45f4be702 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access8.C @@ -0,0 +1,12 @@ +// PR c++/22618 + +class foo +{ + typedef int memfun; // { dg-error "private" } +}; + +template<foo::memfun> +struct fm_obj { }; // { dg-error "context" } + +template <typename T = foo::memfun> // { dg-error "context" } +struct S {}; diff --git a/gcc/testsuite/g++.dg/parse/access9.C b/gcc/testsuite/g++.dg/parse/access9.C new file mode 100644 index 000000000..2c29016b0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access9.C @@ -0,0 +1,5 @@ +// PR c++/24782 + +class Foo { public: typedef int type1; }; +class Bar { private: typedef Foo type2; }; // { dg-error "private" } +void g(Bar::type2::type1) {} // { dg-error "context" } diff --git a/gcc/testsuite/g++.dg/parse/ambig1.C b/gcc/testsuite/g++.dg/parse/ambig1.C new file mode 100644 index 000000000..2645879b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ambig1.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 4 Jan 2003 <nathan@codesourcery.com> + +// PR 9109. Ambiguity. [dcl.ambig.res]/7 + +template <typename T> void Foo (int (T)) +{ + try {} + catch (int (T)) {} +} diff --git a/gcc/testsuite/g++.dg/parse/ambig2.C b/gcc/testsuite/g++.dg/parse/ambig2.C new file mode 100644 index 000000000..7b000c620 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ambig2.C @@ -0,0 +1,27 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 6 Jan 2003 <nathan@codesourcery.com> + +// PR 9212. We erroneously accepted an ill-formed +// function-declaration, rather than a variable initializer. + + +struct A +{ + enum E { e }; + A(E); +}; + +struct B +{ + enum F { f }; + B(F); +}; + +struct C +{ + C(A, B, A); +}; + +C c(A(A::e), B(B::f), A(A::e)); // This is not a function declaration diff --git a/gcc/testsuite/g++.dg/parse/ambig3.C b/gcc/testsuite/g++.dg/parse/ambig3.C new file mode 100644 index 000000000..41390710f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ambig3.C @@ -0,0 +1,21 @@ +// PR c++/9452 +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> +// { dg-do compile } + +template <int> struct A { static const int i = 1; }; +template <int> struct B {}; + +template <typename> int foo(B<0>) +{ + return 0; +} + +template <typename, int j> B<A<j>::i-1> foo(B<j>) +{ + return B<0>(); +} + +int main() +{ + return foo<int>(B<0>()); +} diff --git a/gcc/testsuite/g++.dg/parse/ambig4.C b/gcc/testsuite/g++.dg/parse/ambig4.C new file mode 100644 index 000000000..868f07cf7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ambig4.C @@ -0,0 +1,18 @@ +// PR c++/20293 + +namespace hide { // { dg-error "hide" } + int k; +} + +namespace { + int i; + namespace hide { // { dg-error "hide" } + int j; + } +} + +void F(int) {} + +int main() { + F(hide::j); // { dg-error "ambiguous" } +} diff --git a/gcc/testsuite/g++.dg/parse/ambig5.C b/gcc/testsuite/g++.dg/parse/ambig5.C new file mode 100644 index 000000000..e554d961f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ambig5.C @@ -0,0 +1,7 @@ +// PR c++/41786 + +struct A { A(int, char const*); }; +int main() { + int i = 0, *b = &i; + A a(int(b[i]), "hello"); +} diff --git a/gcc/testsuite/g++.dg/parse/ambig6.C b/gcc/testsuite/g++.dg/parse/ambig6.C new file mode 100644 index 000000000..8f37feaea --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ambig6.C @@ -0,0 +1,12 @@ +// PR c++/48046 + +namespace N1 { typedef int T; } // { dg-error "" } +namespace N2 { typedef float T; } // { dg-error "" } + +int main() +{ + using namespace N1; + using namespace N2; + + static T t; // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/parse/angle-bracket.C b/gcc/testsuite/g++.dg/parse/angle-bracket.C new file mode 100644 index 000000000..39bb4eb10 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/angle-bracket.C @@ -0,0 +1,9 @@ +// Contributed by Gabriel Dos Reis <gdr@codesourcery.com> +// Origin: Bill Somerville <bill@classdesign.com> +// { dg-do compile } + +int main() +{ + ( int() > int() ); + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/angle-bracket2.C b/gcc/testsuite/g++.dg/parse/angle-bracket2.C new file mode 100644 index 000000000..fb758e33f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/angle-bracket2.C @@ -0,0 +1,6 @@ +// { dg-do compile } +// Contributed by MattyT <mattyt-bugzilla at tpg dot com dot au> +// PR c++/14028: Parser accepts invalid unbalanced bracket. + +template <int> struct A {}; +template <typename TP> class B : public A<4 {}; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/args1.C b/gcc/testsuite/g++.dg/parse/args1.C new file mode 100644 index 000000000..0eb6e64b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/args1.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 9 Jul 2003 <nathan@codesourcery.com> + +// PR c++ 11050. Accepted ill-formed + + +void Foo (int) +{ + Foo(2 2); // { dg-error "expected" "" } +} diff --git a/gcc/testsuite/g++.dg/parse/array-size1.C b/gcc/testsuite/g++.dg/parse/array-size1.C new file mode 100644 index 000000000..2bc31f758 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/array-size1.C @@ -0,0 +1,13 @@ +// PR c++/38 +// Origin: Wolfgang Bangerth <bangerth@dealii.org> +// { dg-do compile } + +template <int i> struct A +{ + static const int n = 1; + typedef double X[n]; + + A (const X&); +}; + +template <int i> A<i>::A (const X&) {} diff --git a/gcc/testsuite/g++.dg/parse/array-size2.C b/gcc/testsuite/g++.dg/parse/array-size2.C new file mode 100644 index 000000000..355ed6133 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/array-size2.C @@ -0,0 +1,20 @@ +// PR c/25682 +// { dg-do compile } +// Test whether we don't ICE on questionable constructs where offsetof +// should have been used instead. + +struct S +{ + char a[4]; + int b; +}; + +extern void bar (char *, char *); + +void +foo (void) +{ + char g[(char *) &((struct S *) 0)->b - (char *) 0]; + char h[(__SIZE_TYPE__) &((struct S *) 8)->b]; + bar (g, h); +} diff --git a/gcc/testsuite/g++.dg/parse/asm1.C b/gcc/testsuite/g++.dg/parse/asm1.C new file mode 100644 index 000000000..009ffbd3a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/asm1.C @@ -0,0 +1,6 @@ +//PR c++/30849 + +void foo() +{ + asm("" : 0); // { dg-error "numeric constant|token" } +} diff --git a/gcc/testsuite/g++.dg/parse/asm2.C b/gcc/testsuite/g++.dg/parse/asm2.C new file mode 100644 index 000000000..09924c9c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/asm2.C @@ -0,0 +1,6 @@ +//PR c++/30850 + +void foo() +{ + asm("" :: 0); // { dg-error "numeric constant|token" } +} diff --git a/gcc/testsuite/g++.dg/parse/asm3.C b/gcc/testsuite/g++.dg/parse/asm3.C new file mode 100644 index 000000000..91f19e48c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/asm3.C @@ -0,0 +1,6 @@ +//PR c++/30851 + +void foo() +{ + asm ("%[x]" : [0](x)); // { dg-error "numeric constant|token" } +} diff --git a/gcc/testsuite/g++.dg/parse/attr-ctor1.C b/gcc/testsuite/g++.dg/parse/attr-ctor1.C new file mode 100644 index 000000000..23d488a20 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/attr-ctor1.C @@ -0,0 +1,9 @@ +// PR c++/6992 +// Origin: <petr@scssoft.com> +// { dg-do compile } +// { dg-require-named-sections "" } + +class A +{ + __attribute__((section("whatever"))) A(); +}; diff --git a/gcc/testsuite/g++.dg/parse/attr-externally-visible-1.C b/gcc/testsuite/g++.dg/parse/attr-externally-visible-1.C new file mode 100644 index 000000000..845d873aa --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/attr-externally-visible-1.C @@ -0,0 +1,49 @@ +// { dg-do compile } +// { dg-options "-O3 -fwhole-program" } +// { dg-add-options bind_pic_locally } +// { dg-final { scan-assembler "foo1" } } +// { dg-final { scan-assembler "foo2" } } +// { dg-final { scan-assembler "foo3" } } +// { dg-final { scan-assembler "foo4" } } +// { dg-final { scan-assembler "foo5" } } +// { dg-final { scan-assembler-not "foo6" } } +// { dg-final { scan-assembler "bar1" } } +// { dg-final { scan-assembler "bar2" } } +// { dg-final { scan-assembler "bar3" } } +// { dg-final { scan-assembler "bar4" } } +// { dg-final { scan-assembler "bar5" } } +// { dg-final { scan-assembler-not "bar6" } } + +extern void foo1 (void) __attribute__((externally_visible)); +void foo1 (void) { } + +extern void foo2 (void) __attribute__((externally_visible)); +__attribute__((externally_visible)) void foo2 (void) { } + +extern void foo3 (void); +__attribute__((externally_visible)) void foo3 (void) { } + +__attribute__((externally_visible)) void foo4 (void) { } + +void foo5 (void) { } +extern void foo5 (void) __attribute__((externally_visible)); + +void foo6 (void) { } + +extern char *bar1 __attribute__((externally_visible)); +char *bar1; + +extern char *bar2 __attribute__((externally_visible)); +char *bar2 __attribute__((externally_visible)); + +extern char *bar3; +char *bar3 __attribute__((externally_visible)); + +char *bar4 __attribute__((externally_visible)); + +char *bar5; +extern char *bar5 __attribute__((externally_visible)); + +char *bar6; + +int main (void) { } diff --git a/gcc/testsuite/g++.dg/parse/attr-externally-visible-2.C b/gcc/testsuite/g++.dg/parse/attr-externally-visible-2.C new file mode 100644 index 000000000..d7feaabb2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/attr-externally-visible-2.C @@ -0,0 +1,38 @@ +// { dg-do compile } +// { dg-options "-O -fwhole-program" } + +static void foo1 (void) { } // { dg-warning "have effect only on public" } +extern void foo1 (void) __attribute__((externally_visible)); + +struct C +{ + __attribute__((externally_visible)) void foo3 (void) { } +}; + +__attribute__((externally_visible)) static void foo3 (void) { } // { dg-warning "have effect only on public" } + +static int bar1; +extern int bar1 __attribute__((externally_visible)); // { dg-warning "have effect only on public" } + +static int bar2 __attribute__((externally_visible)); // { dg-warning "have effect only on public" } + +void fn1 (void) +{ + static int bar3 __attribute__((externally_visible)); // { dg-warning "have effect only on public" } +} + +void fn2 (void) +{ + int bar4 __attribute__((externally_visible)); // { dg-warning "have effect only on public" } +} + +struct A +{ +} __attribute__((externally_visible)); // { dg-warning "does not apply to types" } + +typedef int B __attribute__((externally_visible)); // { dg-warning "attribute ignored" } + +struct D +{ + static int d __attribute__((externally_visible)); +}; diff --git a/gcc/testsuite/g++.dg/parse/attr1.C b/gcc/testsuite/g++.dg/parse/attr1.C new file mode 100644 index 000000000..10d6f57d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/attr1.C @@ -0,0 +1,50 @@ +// Test whether attributes are accepted both immediately after +// struct/union keyword and after the closing brace. +// { dg-do compile } + +struct foo +{ + union __attribute__ ((packed)) + { + int a; + long b; + }; + union __attribute__ ((packed)) __attribute__ ((unused)) + { + int c; + long d; + }; +}; + +union __attribute__ ((packed)) bar +{ + int c; + long d; +}; + +struct __attribute__ ((packed)) baz +{ + int e; + long f; +}; + +struct foo2 +{ + union + { + int a; + long b; + } __attribute__ ((packed)); +}; + +union bar2 +{ + int c; + long d; +} __attribute__ ((packed)); + +struct baz2 +{ + int e; + long f; +} __attribute__ ((packed)); diff --git a/gcc/testsuite/g++.dg/parse/attr2.C b/gcc/testsuite/g++.dg/parse/attr2.C new file mode 100644 index 000000000..ce770029c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/attr2.C @@ -0,0 +1,12 @@ +// PR c++/16337 + +#define vector __attribute__((vector_size(16))) +void foo (void) +{ + vector signed int v1 = { 1, 2, 3, 4 }; + vector signed int v2, v3; + vector signed int v4; + v2 = v1; + v3 = v1; + v4 = v1; +} diff --git a/gcc/testsuite/g++.dg/parse/attr3.C b/gcc/testsuite/g++.dg/parse/attr3.C new file mode 100644 index 000000000..848df055c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/attr3.C @@ -0,0 +1,14 @@ +// PR c++/39219 + +enum __attribute__ ((deprecated)) E { e }; +struct S { enum __attribute__ ((deprecated)) F { f = e }; }; + +int main () { + E x; // { dg-warning "'E' is deprecated" "" } + x = e; + + S::F y; // { dg-warning "'F' is deprecated" "" } + y = S::f; + + return x + y; +} diff --git a/gcc/testsuite/g++.dg/parse/bitfield1.C b/gcc/testsuite/g++.dg/parse/bitfield1.C new file mode 100644 index 000000000..2e0760585 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/bitfield1.C @@ -0,0 +1,11 @@ +// PR c++/27803 + +struct A +{ + double i : 8; // { dg-error "type" } +}; + +void foo(A& a) +{ + (char)a.i; // { dg-error "no member" } +} diff --git a/gcc/testsuite/g++.dg/parse/bitfield2.C b/gcc/testsuite/g++.dg/parse/bitfield2.C new file mode 100644 index 000000000..a04d2adf8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/bitfield2.C @@ -0,0 +1,34 @@ +//PR c++/28053 + +struct X {}; + +struct A +{ + X x : 2; // { dg-error "non-integral type" } +}; +struct B : A {}; + +template <typename T> +struct C +{ + T t : 3; +}; + +C<int> c; + +template <typename T> +struct D +{ + T t : 3; // { dg-error "non-integral type" } +}; + +D<double> d; // { dg-message "instantiated" } + +template <typename T> +struct E +{ + typedef T* U; + U t : 3; // { dg-error "non-integral type" } +}; + +E<double> e; diff --git a/gcc/testsuite/g++.dg/parse/bitfield3.C b/gcc/testsuite/g++.dg/parse/bitfield3.C new file mode 100644 index 000000000..387548a68 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/bitfield3.C @@ -0,0 +1,9 @@ +/* PR c++/35320 */ +/* { dg-do compile } */ + +typedef void (func_type)(); + +struct A +{ + friend func_type f : 2; /* { dg-error "with non-integral type" } */ +}; diff --git a/gcc/testsuite/g++.dg/parse/break-in-for.C b/gcc/testsuite/g++.dg/parse/break-in-for.C new file mode 100644 index 000000000..3028cdc80 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/break-in-for.C @@ -0,0 +1,12 @@ +/* PR17412 - ICE in fold_const.c during parsing. + fold would try to fold the operands of the break statement. */ +/* { dg-do compile } */ +/* { dg-options "" } */ + + +void foo () +{ + for (;;) + for (;;({break;})); +} + diff --git a/gcc/testsuite/g++.dg/parse/builtin1.C b/gcc/testsuite/g++.dg/parse/builtin1.C new file mode 100644 index 000000000..3b826bd86 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/builtin1.C @@ -0,0 +1,16 @@ +namespace std { +class Base {}; +} + +struct Derived : public std::Base { + operator const char*() const; + operator bool(void) const; +}; + +void log(const char* str); + +void nothing() +{ + Derived temp; + log(temp); +} diff --git a/gcc/testsuite/g++.dg/parse/builtin2.C b/gcc/testsuite/g++.dg/parse/builtin2.C new file mode 100644 index 000000000..c524ea684 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/builtin2.C @@ -0,0 +1,5 @@ +// PR c++/14432 +// { dg-options "" } + +struct Y {}; +Y y1; diff --git a/gcc/testsuite/g++.dg/parse/cast1.C b/gcc/testsuite/g++.dg/parse/cast1.C new file mode 100644 index 000000000..c8dbed1ac --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/cast1.C @@ -0,0 +1,11 @@ +// PR c++/13536 +// { dg-require-effective-target ilp32 } */ +// { dg-options "-w" } + +#include <typeinfo> + +void f() { + (int((char*)0)); + sizeof ((int((char*)0))); + typeid ((int((char*)0))); +} diff --git a/gcc/testsuite/g++.dg/parse/cast2.C b/gcc/testsuite/g++.dg/parse/cast2.C new file mode 100644 index 000000000..d447bb4ba --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/cast2.C @@ -0,0 +1,13 @@ +// PR c++/13736 + +struct string +{ + string() {} + string(const string&) {} + string(const char*) {} +}; + +int main() +{ + string s2(string( (const char*)(""))); +} diff --git a/gcc/testsuite/g++.dg/parse/casting-operator1.C b/gcc/testsuite/g++.dg/parse/casting-operator1.C new file mode 100644 index 000000000..867221a35 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/casting-operator1.C @@ -0,0 +1,11 @@ +// PR c++/8578 +// Origin: <Delana.Lorenzo@libero.it> +// { dg-do compile } + +template <typename T> struct A +{ + typedef typename T::X X; + operator X(); +}; + +template <typename T> A<T>::operator typename A<T>::X () {} diff --git a/gcc/testsuite/g++.dg/parse/casting-operator2.C b/gcc/testsuite/g++.dg/parse/casting-operator2.C new file mode 100644 index 000000000..008fa62dc --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/casting-operator2.C @@ -0,0 +1,27 @@ +// { dg-do compile } +// Contributed by Martin Loewis <loewis at informatik dot hu-berlin dot de> +// PR c++/8856: Make sure template conversion operators are not parsed as +// template names. + +struct K {}; +template <bool> struct K2 {}; + +template <class T> struct A { + template <class U> operator U() { return U(); } +}; + +int main() { + A<double> a; + + (void)a.operator int(); + (void)a.operator double(); + (void)a.operator K2<true>(); + (void)a.A<double>::operator int(); + (void)a.A<double>::operator double(); + (void)a.A<double>::operator K2<true>(); + + (void)a.operator double<int>(); // { dg-error "not a template" } + (void)a.operator K<int>(); // { dg-error "not a template" } + (void)a.A<double>::operator double<int>(); // { dg-error "not a template" } + (void)a.A<double>::operator K<int>(); // { dg-error "not a template" } +} diff --git a/gcc/testsuite/g++.dg/parse/catch1.C b/gcc/testsuite/g++.dg/parse/catch1.C new file mode 100644 index 000000000..877402231 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/catch1.C @@ -0,0 +1,8 @@ +// PR c++/28249 +// { dg-do compile } + +void foo() +{ + try {} + catch (long long long) {} // { dg-error "long long long" } +} diff --git a/gcc/testsuite/g++.dg/parse/class1.C b/gcc/testsuite/g++.dg/parse/class1.C new file mode 100644 index 000000000..819c48d9c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/class1.C @@ -0,0 +1,10 @@ +namespace N +{ + struct A; + int f() { + struct N::A { // { dg-error "" } + A() {} + }; + return 0; + } +} diff --git a/gcc/testsuite/g++.dg/parse/class2.C b/gcc/testsuite/g++.dg/parse/class2.C new file mode 100644 index 000000000..2014f9b50 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/class2.C @@ -0,0 +1,14 @@ +// PR c++/13140 + +struct foo { + foo(); + void f(); + static int i; +}; + + +namespace bar { + foo::foo() {} // { dg-error "namespace" } + void foo::f() {} // { dg-error "namespace" } + int foo::i; // { dg-error "namespace" } +} diff --git a/gcc/testsuite/g++.dg/parse/colon-autocorrect-1.C b/gcc/testsuite/g++.dg/parse/colon-autocorrect-1.C new file mode 100644 index 000000000..8e25fbac2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/colon-autocorrect-1.C @@ -0,0 +1,31 @@ +// PR c++/44522 +// { dg-do compile } + +namespace x { + struct a { }; + a A0; +} + +x:a a2; // { dg-error "nested-name-specifier" } +x::a a3 = a2; + +x:a f (void) // { dg-error "nested-name-specifier" } +{ + x::a a4; // x:a would parse like a label + return a4; +} + +x::a g (x:a a4) // { dg-error "nested-name-specifier" } +{ + return a4; +} + +class B +{ + x::a f(void) // x:a would parse like a bitfield + { + x::a a4; + a4 = x:A0; // { dg-error "nested-name-specifier" } + return a4; + } +}; diff --git a/gcc/testsuite/g++.dg/parse/colon-autocorrect-2.C b/gcc/testsuite/g++.dg/parse/colon-autocorrect-2.C new file mode 100644 index 000000000..1dfcbc068 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/colon-autocorrect-2.C @@ -0,0 +1,15 @@ +// PR c++/44523 +// { dg-do compile } + +namespace x { + struct a { }; +} + +template <typename t> +class foo { +}; + +foo<x::a> a1; +foo<x:a> a2; // { dg-error "nested-name-specifier" } + +x::a a3 = a2; // { dg-error "conversion" } diff --git a/gcc/testsuite/g++.dg/parse/comma1.C b/gcc/testsuite/g++.dg/parse/comma1.C new file mode 100644 index 000000000..4983535a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/comma1.C @@ -0,0 +1,14 @@ +// PR c++/14278 +// { dg-options "" } + +struct X { + X (int p); +}; + +struct A { + A(X); +}; + +void *p_fun; + +A a(X ((*(int (*)(int, int)) p_fun)(0, 0))); diff --git a/gcc/testsuite/g++.dg/parse/comma2.C b/gcc/testsuite/g++.dg/parse/comma2.C new file mode 100644 index 000000000..0f405876d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/comma2.C @@ -0,0 +1,19 @@ +// { dg-do compile } + +// Copyright (C) 2005 Free Software Foundation, Inc. + +// PR c++/24907 [3.4/4.0/4.1/4.2 Regression] "int x, ;" accepted + +int x; +int y,; /* { dg-error "expected" } */ + +int main() +{ + int a; + int b,; /* { dg-error "expected" } */ + int c,d; + int e,f,; /* { dg-error "expected" } */ + int g,h,i; + int j,k,l,;/* { dg-error "expected" } */ + int m,,,n; /* { dg-error "expected" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/concat1.C b/gcc/testsuite/g++.dg/parse/concat1.C new file mode 100644 index 000000000..7bf97a628 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/concat1.C @@ -0,0 +1,15 @@ +/* PR c/3581 */ +/* { dg-do compile } */ + +/* Intended as a compile-time test for string literal concatenation. + The fact that the string isn't actually used in the resulting program + should allow this to compile for any target. */ + +#define e0 "a" +#define e1 e0 e0 e0 e0 e0 e0 e0 e0 e0 e0 +#define e2 e1 e1 e1 e1 e1 e1 e1 e1 e1 e1 +#define e3 e2 e2 e2 e2 e2 e2 e2 e2 e2 e2 +#define e4 e3 e3 e3 e3 e3 e3 e3 e3 e3 e3 +#define e5 e4 e4 e4 e4 e4 e4 e4 e4 e4 e4 + +void foo() { (void)(e5); } diff --git a/gcc/testsuite/g++.dg/parse/cond1.C b/gcc/testsuite/g++.dg/parse/cond1.C new file mode 100644 index 000000000..699477305 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/cond1.C @@ -0,0 +1,6 @@ +// PR c++/18389 + +void foo() +{ + for (; struct A {}; ); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/parse/cond2.C b/gcc/testsuite/g++.dg/parse/cond2.C new file mode 100644 index 000000000..2dbe42b34 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/cond2.C @@ -0,0 +1,14 @@ +// PR c++/20905 + +struct name {}; + +int +f (); + +void +g () +{ + if (int name = f ()) + { + } +} diff --git a/gcc/testsuite/g++.dg/parse/cond3.C b/gcc/testsuite/g++.dg/parse/cond3.C new file mode 100644 index 000000000..96d9c1e3b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/cond3.C @@ -0,0 +1,15 @@ +// PR c++/30847 +// { dg-do compile } +// { dg-options "" } + +int j, k, l; +extern void baz (); + +void +foo (int i) +{ + (i ? j : k) = ({ l++; (void) l; }); // { dg-error "void value not ignored" } + (i ? j : k) += ({ l++; (void) l; }); // { dg-error "void value not ignored" } + (i ? j : k) = baz (); // { dg-error "void value not ignored" } + (i ? j : k) *= baz (); // { dg-error "void value not ignored" } +} diff --git a/gcc/testsuite/g++.dg/parse/cond4.C b/gcc/testsuite/g++.dg/parse/cond4.C new file mode 100644 index 000000000..ae210e0d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/cond4.C @@ -0,0 +1,6 @@ +// PR c++/38635 +// { dg-do compile } + +void foo() +{ + if (struct A{}// { dg-error "types may not be defined|expected" } diff --git a/gcc/testsuite/g++.dg/parse/cond5.C b/gcc/testsuite/g++.dg/parse/cond5.C new file mode 100644 index 000000000..7ed9fbe89 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/cond5.C @@ -0,0 +1,10 @@ +// PR c++/40566 + +void +f (int x, int y) +{ + int c = x ? 23 : throw "bla"; + short d = y ? throw "bla" : 23; + char e = x ? 23 : throw "bla"; + long f = x ? 23 : throw "bla"; +} diff --git a/gcc/testsuite/g++.dg/parse/condexpr1.C b/gcc/testsuite/g++.dg/parse/condexpr1.C new file mode 100644 index 000000000..1ca7dbfa6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/condexpr1.C @@ -0,0 +1,13 @@ +// PR c++/10247 +// Origin: Lars Gullik Bjønes <larsbj@lyx.org> +// { dg-do compile } + +struct A {}; + +A const foo(); + +void bar() +{ + A a = foo(); + A b = true ? a : foo(); +} diff --git a/gcc/testsuite/g++.dg/parse/constant1.C b/gcc/testsuite/g++.dg/parse/constant1.C new file mode 100644 index 000000000..c8a948a57 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constant1.C @@ -0,0 +1,15 @@ +// { dg-options -std=c++98 } + +void f () { + switch (0) { + case (3, 0): // { dg-error "" } + break; + } +} + +int g (); + +struct S { + int i : (false ? g () : 1); // { dg-error "" } +}; + diff --git a/gcc/testsuite/g++.dg/parse/constant2.C b/gcc/testsuite/g++.dg/parse/constant2.C new file mode 100644 index 000000000..43fad2e28 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constant2.C @@ -0,0 +1,28 @@ +// { dg-do compile } +// Origin: <gawrilow at math dot tu-berlin dot de> +// PR c++/10750: error when using a static const member initialized +// with a dependent expression as constant-expression + +struct A +{ + enum { a = 42 }; +}; + +template <class Q> +struct B +{ + static const int b = Q::a; +}; + +template <typename T, template <typename> class P> +struct C +{ + static const bool a = T::a; + static const bool a_ = a; + static const bool b = P<T>::b; + static const bool b_ = b; + static const int c = sizeof(T); + static const int c_ = c; +}; + +template struct C<A,B>; diff --git a/gcc/testsuite/g++.dg/parse/constant3.C b/gcc/testsuite/g++.dg/parse/constant3.C new file mode 100644 index 000000000..c029e33ed --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constant3.C @@ -0,0 +1,7 @@ +const int i = 1; +const int j (2); +const int k = { 3 }; + +enum { a = i, b = j, c = k }; + + diff --git a/gcc/testsuite/g++.dg/parse/constant4.C b/gcc/testsuite/g++.dg/parse/constant4.C new file mode 100644 index 000000000..a1be5dd02 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constant4.C @@ -0,0 +1,40 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 31 Jul 2003 <nathan@codesourcery.com> + +// PR c++/11525 incorrect error about non-constant initalizer + +template<typename> class X; +template<unsigned> class Y {}; + + +template<typename T> +void Foo () +{ + static const unsigned I = X<T>::I; + + Y<I> i; + + static const unsigned J = X<T>::J; // { dg-message "not initialized with a constant expression" } + + Y<J> j; // { dg-error "constant|template argument" "" } +} + +struct A +{ + operator unsigned () const; +}; + +template <typename> struct X +{ + enum {I}; + static A const J; +}; + +void Baz () +{ + Foo<int> (); // { dg-message "instantiated" "" } +} + + diff --git a/gcc/testsuite/g++.dg/parse/constant5.C b/gcc/testsuite/g++.dg/parse/constant5.C new file mode 100644 index 000000000..f868108a6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constant5.C @@ -0,0 +1,16 @@ +// { dg-options "-std=c++98 -pedantic-errors" } + +enum E { + a = 24.2, // { dg-error "constant" } + b = (int)3.7, + c = int(4.2), + d = (int)(4.2 + 3.7), // { dg-error "constant" } + e = int(4.2 - 3.7), // { dg-error "constant" } + f = (int)17.25 +}; + +struct S { + static const int i = (int)4.2; + int j[(int)4.2]; + static const int k = static_cast<short>(3.7); +}; diff --git a/gcc/testsuite/g++.dg/parse/constant6.C b/gcc/testsuite/g++.dg/parse/constant6.C new file mode 100644 index 000000000..dae01d47b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constant6.C @@ -0,0 +1,23 @@ +// PR c++/19883 + +template<typename T> struct A +{ + static const T i = 1; + char a[int(i)]; +}; + +template<int> struct B {}; + +template<typename T> struct C +{ + static const T i = 2; + B<int(i)> a; +}; + +template< typename T, T N > +struct integral_c +{ + static const T value = N; + + typedef integral_c< T, static_cast<T>((value + 1)) > next; +}; diff --git a/gcc/testsuite/g++.dg/parse/constant7.C b/gcc/testsuite/g++.dg/parse/constant7.C new file mode 100644 index 000000000..c54ad55c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constant7.C @@ -0,0 +1,9 @@ +// PR c++/19991 + +enum { e = 1 }; + +template<typename> struct A +{ + static const int i = e; + char a[i]; +}; diff --git a/gcc/testsuite/g++.dg/parse/constructor1.C b/gcc/testsuite/g++.dg/parse/constructor1.C new file mode 100644 index 000000000..1bb9ee0a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constructor1.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// { dg-options "-fshow-column" } + +ACE_Process_Descriptor::ACE_Process_Descriptor () : + // { dg-error "does not name a type" "no type" { target *-*-* } 4 } + process_ (0) +{ +} diff --git a/gcc/testsuite/g++.dg/parse/constructor2.C b/gcc/testsuite/g++.dg/parse/constructor2.C new file mode 100644 index 000000000..e514e9397 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constructor2.C @@ -0,0 +1,11 @@ +// PR c++/14260 + +template <class TClass> +class T +{ +public: + T(short,short f=0) {} + T<TClass>(int f) {} + T<TClass>(int f=0,const char* b=0) {} +}; + diff --git a/gcc/testsuite/g++.dg/parse/constructor3.C b/gcc/testsuite/g++.dg/parse/constructor3.C new file mode 100644 index 000000000..fe741c833 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constructor3.C @@ -0,0 +1,14 @@ +/* PR c++/29077 */ +/* { dg-do compile } */ + +class c { + c(); + c(const c&); + ~c(); +}; + +namespace m { + c::c() {} /* { dg-error "c::c" } */ + c::c(const c&) {} /* { dg-error "c::c" } */ + c::~c() {} /* { dg-error "c::~c" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/conv_op1.C b/gcc/testsuite/g++.dg/parse/conv_op1.C new file mode 100644 index 000000000..e892f01aa --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/conv_op1.C @@ -0,0 +1,30 @@ + +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 21 Dec 2002 <nathan@codesourcery.com> + +// PR 8572. ICE with templated conversion operators. + +template <typename T> struct A +{ + struct B { }; + operator B* () const; + B *Foo (); +}; + +template <typename T> typename A<T>::B *A<T>::Foo () +{ + return 0; +} + +template <typename T> A<T>::operator typename A<T>::B* () const +{ + return 0; +} + +void Foo (A<int> &p) +{ + p.Foo (); + static_cast <A<int>::B *> (p); +} diff --git a/gcc/testsuite/g++.dg/parse/crash1.C b/gcc/testsuite/g++.dg/parse/crash1.C new file mode 100644 index 000000000..750ed18e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash1.C @@ -0,0 +1 @@ +struct s { s(std::b o) { } }; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/crash10.C b/gcc/testsuite/g++.dg/parse/crash10.C new file mode 100644 index 000000000..712e87674 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash10.C @@ -0,0 +1,13 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 22 Jul 2003 <nathan@codesourcery.com> + +// PR c++ 10953. ICE + +// { dg-bogus "" "" { target *-*-* } 14 } + +class +{ + typename:: +; // { dg-error "" "" } diff --git a/gcc/testsuite/g++.dg/parse/crash11.C b/gcc/testsuite/g++.dg/parse/crash11.C new file mode 100644 index 000000000..eb5cf3c24 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash11.C @@ -0,0 +1,34 @@ +// { dg-do compile } + +// Origin: priesnit@math.uni-goettingen.de + +// PR c++/5767: ICE parsing typename with invalid scope. + +template <template <typename> class TP> +struct A +{ + template <typename T> + struct Template + { + typedef typename TP<T>::Type Type; + }; +}; +template <template <typename> class TP> +struct B +{ + template <typename T> + struct Template + { + typedef typename A<A<TP>::Template> // { dg-error "mismatch|class template" } + ::template Template<T>::Type Type; // { dg-error "" } + }; +}; +template <typename T> +struct C +{ + typedef void Type; +}; +int main() +{ + typedef B<C>::Template<void>::Type Type; // { dg-error "does not name a type" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash12.C b/gcc/testsuite/g++.dg/parse/crash12.C new file mode 100644 index 000000000..769ca2e93 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash12.C @@ -0,0 +1,24 @@ +// { dg-do compile } + +// Origin: Martin von Loewis <martin@v.loewis.de> + +// PR c++/157: Incorrect type/template decision in function parameter. + +template <class _Tp> class auto_ptr {}; +template <class _Tp> +class counted_ptr +{ +public: + counted_ptr(::auto_ptr<_Tp>& __a); // { dg-error "candidate" } + ::auto_ptr<_Tp> auto_ptr(); +}; + +template <class _Tp> +inline counted_ptr<_Tp>::counted_ptr(class auto_ptr& __a) // { dg-error "required|not match|template" } +{ +} + +template <class _Tp> +inline class auto_ptr<_Tp> counted_ptr<_Tp>::auto_ptr() +{ +} diff --git a/gcc/testsuite/g++.dg/parse/crash13.C b/gcc/testsuite/g++.dg/parse/crash13.C new file mode 100644 index 000000000..3c298ec8e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash13.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Origin: Giovanni Bajo <giovannibajo@libero.it> + +// PR c++/10583: ICE using template function with invalid signature. + +template <typename> +struct A +{ + struct B + {}; +}; + +template <typename T> +void func(A<T>::B* ) // { dg-error "variable|template|expression" } +{ +} + +int main() +{ + func<void>(0); // { dg-error "not declared|expression|;" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash14.C b/gcc/testsuite/g++.dg/parse/crash14.C new file mode 100644 index 000000000..b4cf49a99 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash14.C @@ -0,0 +1,20 @@ +// { dg-do compile } +// Contributed by: Giovanni Bajo <giovannibajo at libero dot it> +// PR c++/14448: Fold constant initializers in templates + +template <int> struct A +{ + A(); +}; + + +template<typename T> void foo(T) +{ + static const int n=1+1; + A<n+1> a; +} + +void bar() +{ + foo(0); +} diff --git a/gcc/testsuite/g++.dg/parse/crash15.C b/gcc/testsuite/g++.dg/parse/crash15.C new file mode 100644 index 000000000..afad4c1fe --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash15.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 29 Jun 2004 <nathan@codesourcery.com> + +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> +// Bug 16260. ICE + +template<typename T> int foo() { return T::X::Y; } diff --git a/gcc/testsuite/g++.dg/parse/crash16.C b/gcc/testsuite/g++.dg/parse/crash16.C new file mode 100644 index 000000000..dc8f7a608 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash16.C @@ -0,0 +1,8 @@ +// PR c++/16971 + +namespace N { + int i; // { dg-error "" } + // By checking for an explicit keyword on the next line we avoid + // matching an ICE message. + int i; // { dg-error "redefinition" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash17.C b/gcc/testsuite/g++.dg/parse/crash17.C new file mode 100644 index 000000000..e50f07af4 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash17.C @@ -0,0 +1,9 @@ +// PR c++/16716 + +template <typename> class allocator; + +template<typename T> class vector { + // With the dg-error on the next line, we are really just trying to + // check that the message is not an ICE message. + typedef typename allocator<T> allocator_type; // { dg-error "expected|invalid" } +}; diff --git a/gcc/testsuite/g++.dg/parse/crash18.C b/gcc/testsuite/g++.dg/parse/crash18.C new file mode 100644 index 000000000..94be360ab --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash18.C @@ -0,0 +1,7 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 20 Oct 2004 <nathan@codesourcery.com> + +// PR 18095: ICE +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +struct A // { dg-error "expected" "" } diff --git a/gcc/testsuite/g++.dg/parse/crash19.C b/gcc/testsuite/g++.dg/parse/crash19.C new file mode 100644 index 000000000..cc50d9507 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash19.C @@ -0,0 +1,7 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 20 Oct 2004 <nathan@codesourcery.com> + +// PR 18095: ICE +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +struct A {} // { dg-error "expected" "" } diff --git a/gcc/testsuite/g++.dg/parse/crash2.C b/gcc/testsuite/g++.dg/parse/crash2.C new file mode 100644 index 000000000..ccf89ccc8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash2.C @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +int main(void) +{ + char x, y; + if ('A' == x) && ('B' == y)) { } /* { dg-error "" } */ + if (x == 'A') && (y == 'B')) { } /* { dg-error "" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/crash20.C b/gcc/testsuite/g++.dg/parse/crash20.C new file mode 100644 index 000000000..d04869fa7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash20.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 1 Dec 2004 <nathan@codesourcery.com> + +// PR 18729: ICE on ill formed +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +template<typename T> struct A +{ + typedef typename T::X Y; // { dg-error "not a class" "" } +}; + +A<int>::Y y; // { dg-message "instantiated from here" "" } diff --git a/gcc/testsuite/g++.dg/parse/crash21.C b/gcc/testsuite/g++.dg/parse/crash21.C new file mode 100644 index 000000000..283f6b4d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash21.C @@ -0,0 +1,7 @@ +namespace N +{ + struct A; // { dg-error "previous declaration" "" } +} + +template<int I> +struct N::A {}; // { dg-error "redeclared" "" } diff --git a/gcc/testsuite/g++.dg/parse/crash22.C b/gcc/testsuite/g++.dg/parse/crash22.C new file mode 100644 index 000000000..eaf4d1a5c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash22.C @@ -0,0 +1,25 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 4 Jan 2005 <nathan@codesourcery.com> + +// PR 19030: ICE +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +struct A; // { dg-error "A" } + +namespace N +{ + struct A; // { dg-error "A" } +} + +using namespace N; + +int A::i; // { dg-error "ambiguous|declared here" "" } +int A::i; // { dg-error "ambiguous|redefinition of" "" } + +namespace N +{ + struct C; + struct C {}; +} + +class D : N::C {}; diff --git a/gcc/testsuite/g++.dg/parse/crash23.C b/gcc/testsuite/g++.dg/parse/crash23.C new file mode 100644 index 000000000..19ad70a64 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash23.C @@ -0,0 +1,12 @@ +// PR c++/19733 + +struct A {}; +typedef int I; +void foo() { + A().~A; // { dg-error "" } + A().A::~A; // { dg-error "" } + (int().I::~I, 3); // { dg-error "" } + int().I::~I; // { dg-error "" } +} + + diff --git a/gcc/testsuite/g++.dg/parse/crash24.C b/gcc/testsuite/g++.dg/parse/crash24.C new file mode 100644 index 000000000..fdc4f1e7c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash24.C @@ -0,0 +1,6 @@ +// PR c++/20461 +// { dg-do compile } + +class C; // { dg-error "forward declaration" } + +C::C() : f() {} // { dg-error "invalid use|does not have" } diff --git a/gcc/testsuite/g++.dg/parse/crash25.C b/gcc/testsuite/g++.dg/parse/crash25.C new file mode 100644 index 000000000..d7f20c62f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash25.C @@ -0,0 +1,10 @@ +// PR c++/20536 +// Found by Wolfgang Wieser 03/2005. +// { dg-do compile } + +struct yyguts_t +{ + class TestScanner* yyextra_r; // { dg-error "forward declaration" } +}; + +TestScanner::TestScanner() {} // { dg-error "invalid use" } diff --git a/gcc/testsuite/g++.dg/parse/crash26.C b/gcc/testsuite/g++.dg/parse/crash26.C new file mode 100644 index 000000000..2b4f165f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash26.C @@ -0,0 +1,12 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 13 Jun 2005 <nathan@codesourcery.com> + +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> +// Bug 21929: ICE on invalid + +template<int> struct A +{ + struct B; +}; + +template<> struct A<void>::B {}; // { dg-error "mismatch|expected|name a type|extra" } diff --git a/gcc/testsuite/g++.dg/parse/crash27.C b/gcc/testsuite/g++.dg/parse/crash27.C new file mode 100644 index 000000000..217928781 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash27.C @@ -0,0 +1,4 @@ +// Bug: 23225 + +void Dispatcher() + (__builtin_offsetof (ArgsType, largeMsgLen)) // { dg-error "initialize|end of input" } diff --git a/gcc/testsuite/g++.dg/parse/crash28.C b/gcc/testsuite/g++.dg/parse/crash28.C new file mode 100644 index 000000000..67d78d6bb --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash28.C @@ -0,0 +1,14 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 10 Aug 2005 <nathan@codesourcery.com> + +// PR 23219, ICE +// Origin:Andrew Pinski <pinskia@gcc.gnu.org> +// Volker Reichelt <reichelt@gcc.gnu.org> + +template <class _Tp> class insert_iterator<slist<_Tp> > {}; // { dg-error "not a template|not declared in this scope|expected unqualified-id|extra" } +template <class _Value> class insert_iterator<int > { // { dg-error "template" } + hash_set<_Value>; +}; + +template<int> struct A<X<> > {}; // { dg-error "not a template|not declared in this scope|expected unqualified-id|extra" } +struct A {}; diff --git a/gcc/testsuite/g++.dg/parse/crash29.C b/gcc/testsuite/g++.dg/parse/crash29.C new file mode 100644 index 000000000..29ede042b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash29.C @@ -0,0 +1,10 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 23 Aug 2005 <nathan@codesourcery.com> + +// PR 22454: ICE +// Origin: Volker Reichelt reichelt@gcc.gnu.org + +template<int> struct A +{ + A(void* = &operator new); +}; diff --git a/gcc/testsuite/g++.dg/parse/crash3.C b/gcc/testsuite/g++.dg/parse/crash3.C new file mode 100644 index 000000000..5a48ebc7c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash3.C @@ -0,0 +1,2 @@ +template <class T> struct L { struct I {}; }; +template <class T> void L<T>::I::foo() {} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/crash30.C b/gcc/testsuite/g++.dg/parse/crash30.C new file mode 100644 index 000000000..9b68535fa --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash30.C @@ -0,0 +1,18 @@ +// { dg-do compile } +namespace N { template<int> struct A { operator int() const; }; } +namespace M { template<int> struct A {}; } +namespace P { typedef int I; } + +template<typename> void foo() +{ + +typename N::A<0>(); // { dg-bogus "expected" } +} + +template<typename> void bar() +{ + +typename M::A<0>; // { dg-error "expected" } +} + +template<typename T> void baz() { + typename P::I i; // { dg-bogus "expected" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash31.C b/gcc/testsuite/g++.dg/parse/crash31.C new file mode 100644 index 000000000..b0a7e1877 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash31.C @@ -0,0 +1,9 @@ +struct A // { dg-error "forward declaration" } +{ + A : A; // { dg-error "expected|incomplete" } + A : B; // { dg-error "not declared|incomplete" } + A : A(); // { dg-error "undefined type|incomplete" } + A : B(); // { dg-error "function call|incomplete|not declared" } + A : A[]; // { dg-error "expected|array reference|incomplete" } + A : B[]; // { dg-error "not declared|expected|array reference|incomplete" } +}; diff --git a/gcc/testsuite/g++.dg/parse/crash32.C b/gcc/testsuite/g++.dg/parse/crash32.C new file mode 100644 index 000000000..df6aa55a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash32.C @@ -0,0 +1,13 @@ +// { dg-do compile } +struct Visitor; + +struct Ast +{ + virtual void accept (Visitor& v); +}; + +void +Ast::accept (Visitor& v) +{ + v (*this); // { dg-error "no match for call" "" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash33.C b/gcc/testsuite/g++.dg/parse/crash33.C new file mode 100644 index 000000000..2ab84df46 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash33.C @@ -0,0 +1,8 @@ +// PR c++/28878 +// { dg-do compile } + +template<int> +void foo() +[ + throw; // { dg-error "expected" } +} // { dg-error "expected" } diff --git a/gcc/testsuite/g++.dg/parse/crash34.C b/gcc/testsuite/g++.dg/parse/crash34.C new file mode 100644 index 000000000..181e58417 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash34.C @@ -0,0 +1,6 @@ +/* PR c++/31745 */ +/* { dg-do compile } */ + +void foo() +{ + namespace N { /* { dg-error "is not allowed|at end of input" } */ diff --git a/gcc/testsuite/g++.dg/parse/crash35.C b/gcc/testsuite/g++.dg/parse/crash35.C new file mode 100644 index 000000000..4937cdc66 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash35.C @@ -0,0 +1,7 @@ +/* This used to ICE. */ +/* { dg-do compile } */ + +struct a {}; + +class foo : public a, a +{ /* { dg-error "duplicate base type|at end of input" } */ diff --git a/gcc/testsuite/g++.dg/parse/crash36.C b/gcc/testsuite/g++.dg/parse/crash36.C new file mode 100644 index 000000000..a5a142c2e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash36.C @@ -0,0 +1,12 @@ +// PR c++/32567 +// { dg-do compile } +// { dg-options "-std=c++98" } + +template <typename... T> struct A // { dg-warning "variadic templates" } +{ + static T &t; // { dg-error "not expanded with" "not expanded" } + // { dg-message "T" "T" { target *-*-* } 7 } + static const int i = sizeof (++t); // { dg-error "was not declared in this scope" } +}; + +int x[A <int>::i]; // { dg-error "constant-expression" } diff --git a/gcc/testsuite/g++.dg/parse/crash37.C b/gcc/testsuite/g++.dg/parse/crash37.C new file mode 100644 index 000000000..8320dfaa5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash37.C @@ -0,0 +1,15 @@ +// PR c++/31941 +// { dg-do compile } + +struct S +{ + S() throw () { } + virtual ~S () throw (); + virtual const char* what () const throw (); +}; + +const char * +foo (S &e) +{ + return e.what ().c_str (); // { dg-error "c_str.*S::what.*which is of non-class type" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash38.C b/gcc/testsuite/g++.dg/parse/crash38.C new file mode 100644 index 000000000..724f9b80a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash38.C @@ -0,0 +1,11 @@ +/* PR c++/33207 */ + +/* This would not ICE. */ +namespace M { } /* { dg-error "previous declaration" } */ +struct M; /* { dg-error "redeclared as different kind of symbol" } */ +M *p; /* { dg-error "does not name a type" } */ + +/* This would ICE when processing 'p'. */ +namespace N { } /* { dg-error "previous declaration" } */ +struct N; /* { dg-error "redeclared as different kind of symbol" } */ +struct N* p; /* { dg-error "redeclared as different kind of symbol|invalid type" } */ diff --git a/gcc/testsuite/g++.dg/parse/crash39.C b/gcc/testsuite/g++.dg/parse/crash39.C new file mode 100644 index 000000000..2f39c10e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash39.C @@ -0,0 +1,3 @@ +// PR c++/31747 + +static extern int i; // { dg-error "conflicting specifiers" } diff --git a/gcc/testsuite/g++.dg/parse/crash4.C b/gcc/testsuite/g++.dg/parse/crash4.C new file mode 100644 index 000000000..a24f0dd00 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash4.C @@ -0,0 +1,12 @@ +struct Bar + { + typedef int type; + }; + + struct Foo + { + void func(void) + { + mutable Bar::type x; // { dg-error "" } + } + }; diff --git a/gcc/testsuite/g++.dg/parse/crash40.C b/gcc/testsuite/g++.dg/parse/crash40.C new file mode 100644 index 000000000..410c2111e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash40.C @@ -0,0 +1,42 @@ +/* PR c++/34059 */ +/* { dg-do compile } */ + +struct A +{ + template<int> void foo(); +}; +struct B : A {}; +struct C : A {}; + +class AA +{ + template<int> void foo(); /* { dg-error "is private" } */ +}; +struct BB : AA {}; + +class AAA { + int get() const {} +}; +struct BBB { + static BBB *foo(); +private: + int get() const {} /* { dg-error "is private" } */ +}; +template<bool> struct S { + S(unsigned int = BBB::foo()->AAA::get()); /* { dg-error "is not a base of" } */ +}; +template<bool> struct SS { + SS(unsigned int = BBB::foo()->get()); +}; + +void bar() +{ + B().C::foo<0>(); /* { dg-error "is not a member of" } */ + BB().AA::foo<0>(); /* { dg-error "within this context" } */ + + int i; + i.C::foo<0>(); /* { dg-error "which is of non-class type" } */ + + S<false> s; /* { dg-error "default argument" } */ + SS<false> ss; /* { dg-error "within this context" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/crash41.C b/gcc/testsuite/g++.dg/parse/crash41.C new file mode 100644 index 000000000..746dbbca8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash41.C @@ -0,0 +1,8 @@ +// PR c++/35327 + +struct A +{ + A(int)(); // { dg-error "declared" } +}; + +template<int> void foo(bool b, A a) { b ? a : 0; } // { dg-error "no match" } diff --git a/gcc/testsuite/g++.dg/parse/crash42.C b/gcc/testsuite/g++.dg/parse/crash42.C new file mode 100644 index 000000000..9cb07d514 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash42.C @@ -0,0 +1,9 @@ +// Created by: Dodji Seketeli <dseketel@redhat.com> +// { dg-do compile } +// { dg-options "-O2 -fprofile-arcs" } +// Origin: PR C++/36767 + +struct A { A (); ~A (); }; +A a[2]; + + diff --git a/gcc/testsuite/g++.dg/parse/crash43.C b/gcc/testsuite/g++.dg/parse/crash43.C new file mode 100644 index 000000000..ff073cf46 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash43.C @@ -0,0 +1,9 @@ +// PR c++/34600 + +namespace N +{ + void foo() + { + extern int i = 0; // { dg-error "'i' has both 'extern' and initializer" } + } +} diff --git a/gcc/testsuite/g++.dg/parse/crash44.C b/gcc/testsuite/g++.dg/parse/crash44.C new file mode 100644 index 000000000..41947b7d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash44.C @@ -0,0 +1,15 @@ +// PR c++/37260 +// { dg-options "" } + +struct pthread_once_t { }; +struct test { + pthread_once_t once; +}; + +int main(void) { + struct test foo = { + once: PTHREAD_ONCE_INITIALIZER // { dg-error "'PTHREAD_ONCE_INITIALIZER' was not declared in this scope" } + }; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/crash45.C b/gcc/testsuite/g++.dg/parse/crash45.C new file mode 100644 index 000000000..8696ab4bb --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash45.C @@ -0,0 +1,7 @@ +// PR c++/37348 +// { dg-do compile } + +struct A +{ + template <class> int f (B); // { dg-error "was not declared in this scope|cannot be a member template" } +}; diff --git a/gcc/testsuite/g++.dg/parse/crash46.C b/gcc/testsuite/g++.dg/parse/crash46.C new file mode 100644 index 000000000..f454a0a19 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash46.C @@ -0,0 +1,18 @@ +// PR c++/37532 +// { dg-do compile } + +void +foo (_Decimal32) // { dg-error "declared void" } +{ +} + // { dg-error "was not declared" "" { target *-*-* } 5 } +void +bar (_Bool) // { dg-error "declared void" } +{ +} + // { dg-error "was not declared" "" { target *-*-* } 10 } +void +baz (_Fract) // { dg-error "declared void" } +{ +} + // { dg-error "was not declared" "" { target *-*-* } 15 } diff --git a/gcc/testsuite/g++.dg/parse/crash47.C b/gcc/testsuite/g++.dg/parse/crash47.C new file mode 100644 index 000000000..e77c49fe4 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash47.C @@ -0,0 +1,9 @@ +// PR c++/37531 +// { dg-do compile } +// { dg-options "-std=gnu++98" } + +void +foo () +{ + (int[i]) { 0 }; // { dg-error "was not declared in this scope" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash48.C b/gcc/testsuite/g++.dg/parse/crash48.C new file mode 100644 index 000000000..45415484b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash48.C @@ -0,0 +1,9 @@ +// PR c++/37530 +// { dg-do compile } + +void +foo (bool b) +{ + if (b) + try { throw 0; } catch (X) { } // { dg-error "expected type-specifier before" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash49.C b/gcc/testsuite/g++.dg/parse/crash49.C new file mode 100644 index 000000000..07d7c3b2f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash49.C @@ -0,0 +1,10 @@ +// PR c++/37552 +// { dg-do compile } + +extern struct A a[1]; // { dg-error "forward declaration" } + +void +foo () +{ + a[0]; // { dg-error "invalid use of incomplete type" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash5.C b/gcc/testsuite/g++.dg/parse/crash5.C new file mode 100644 index 000000000..0ac702979 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash5.C @@ -0,0 +1,15 @@ +// { dg-options "-w" } + +class QString { // { dg-error "previous definition" } + QString (const QString & a); // { dg-message "QString::QString|candidate expects" } +}; + +class QString { }; // { dg-error "redefinition" } + +const QString q () { + QString z; // { dg-error "matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 10 } + int x; + return x ? QString () : QString (); // { dg-error "matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 13 } +} diff --git a/gcc/testsuite/g++.dg/parse/crash50.C b/gcc/testsuite/g++.dg/parse/crash50.C new file mode 100644 index 000000000..711048de1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash50.C @@ -0,0 +1,10 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/38636 +// { dg-do compile } + +struct A; // { dg-error "forward declaration of 'struct A'" } + +A::A( + +struct B; // { dg-error "expected '\\)' before ';' token|invalid use of incomplete type 'struct A'" } + diff --git a/gcc/testsuite/g++.dg/parse/crash51.C b/gcc/testsuite/g++.dg/parse/crash51.C new file mode 100644 index 000000000..03fcd3613 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash51.C @@ -0,0 +1,9 @@ +// PR c++/37554 + +struct A {}; +class B : A {}; + +void foo(B b) +{ + (A)b; // { dg-error "inaccessible base" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash52.C b/gcc/testsuite/g++.dg/parse/crash52.C new file mode 100644 index 000000000..bc7f03c8d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash52.C @@ -0,0 +1,3 @@ +// PR c++/39053 + +void foo() = // { dg-error "initialized|expected" } diff --git a/gcc/testsuite/g++.dg/parse/crash53.C b/gcc/testsuite/g++.dg/parse/crash53.C new file mode 100644 index 000000000..de6d412f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash53.C @@ -0,0 +1,13 @@ +// PR c++/35112 + +namespace X { struct A; } // { dg-error "struct X::A" } +namespace Y { struct A; } // { dg-error "struct Y::A" } +namespace Z { struct A; } // { dg-error "struct Z::A" } +namespace W { struct A; } // { dg-error "struct W::A" } + +using namespace X; +using namespace Y; +using namespace Z; +using namespace W; + +A* p; // { dg-error "reference to 'A' is ambiguous|'A' does not name a type" } diff --git a/gcc/testsuite/g++.dg/parse/crash54.C b/gcc/testsuite/g++.dg/parse/crash54.C new file mode 100644 index 000000000..222082ab7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash54.C @@ -0,0 +1,15 @@ +// PR c++/42057 + +struct A; // { dg-error "forward declaration" } + +struct B +{ + virtual B* foo(A); +}; + +struct C : virtual B +{ + virtual C* foo(A) { return 0; } // { dg-error "incomplete type" } +}; + +C c; diff --git a/gcc/testsuite/g++.dg/parse/crash55.C b/gcc/testsuite/g++.dg/parse/crash55.C new file mode 100644 index 000000000..7676d49bc --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash55.C @@ -0,0 +1,8 @@ +// PR c++/42038 + +extern int __cxa_begin_catch; + +void f(void) +{ + try { } catch (int) { } // { dg-error "cannot be used" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash56.C b/gcc/testsuite/g++.dg/parse/crash56.C new file mode 100644 index 000000000..9a370cb5f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash56.C @@ -0,0 +1,17 @@ +/* PR c++/43081 */ +/* { dg-do compile } */ +/* { dg-options "-std=c++0x" } */ + +struct A +{ + typedef void (F)(); + F f = []{}; /* { dg-error "invalid initializer" } */ +}; + +struct B +{ + typedef void (F)(); + F f = 1; /* { dg-error "invalid initializer" } */ + virtual F f2 = 2; /* { dg-error "invalid initializer" } */ + F f3 = 3; /* { dg-error "invalid initializer" } */ +}; diff --git a/gcc/testsuite/g++.dg/parse/crash57.C b/gcc/testsuite/g++.dg/parse/crash57.C new file mode 100644 index 000000000..c6daf777e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash57.C @@ -0,0 +1,10 @@ +// PR c++/46117 + +struct A +{ + A (typename int); // { dg-error "before|declaration" } +}; + +struct B : A {}; + +B b; diff --git a/gcc/testsuite/g++.dg/parse/crash6.C b/gcc/testsuite/g++.dg/parse/crash6.C new file mode 100644 index 000000000..0cc5c84fa --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash6.C @@ -0,0 +1,10 @@ +struct P {}; + +template <typename > +struct O +{ + struct I; +}; + +template <typename T> +struct O<T>::I::S : P {}; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/crash7.C b/gcc/testsuite/g++.dg/parse/crash7.C new file mode 100644 index 000000000..86fa47726 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash7.C @@ -0,0 +1,10 @@ +struct A +{ + int foo () const { return 0; } +}; + +template <typename> void bar (int x[], const A &a) +{ + const int i=a.foo(); + x[i]=0; +} diff --git a/gcc/testsuite/g++.dg/parse/crash9.C b/gcc/testsuite/g++.dg/parse/crash9.C new file mode 100644 index 000000000..d121d5dd1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash9.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +// PR c++/10793: ICE in handling base class when the current class +// contains error. + +template <typename> struct A {}; +template <typename> struct A<INVALID> : A<int> { }; // { dg-error "not declared|invalid|token|extra" } diff --git a/gcc/testsuite/g++.dg/parse/ctor1.C b/gcc/testsuite/g++.dg/parse/ctor1.C new file mode 100644 index 000000000..38428842c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor1.C @@ -0,0 +1,9 @@ +class L { +public: + L(int); +}; + +class R { + friend L::L(int); +}; + diff --git a/gcc/testsuite/g++.dg/parse/ctor2.C b/gcc/testsuite/g++.dg/parse/ctor2.C new file mode 100644 index 000000000..604fb2ffd --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor2.C @@ -0,0 +1,4 @@ +// PR c++/19244 + +typedef struct { void f(); } f; +void f::f() { } diff --git a/gcc/testsuite/g++.dg/parse/ctor3.C b/gcc/testsuite/g++.dg/parse/ctor3.C new file mode 100644 index 000000000..e597d926f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor3.C @@ -0,0 +1,8 @@ +// PR c++/25633 + +struct A {}; + +struct B : A +{ + B() : A {} // { dg-error "initializer|expected" } +}; diff --git a/gcc/testsuite/g++.dg/parse/ctor4.C b/gcc/testsuite/g++.dg/parse/ctor4.C new file mode 100644 index 000000000..a3e4868e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor4.C @@ -0,0 +1,7 @@ +// PR c++/27279 +// { dg-do compile } + +struct A +{ + A(void,void); // { dg-error "incomplete type|invalid use" } +}; diff --git a/gcc/testsuite/g++.dg/parse/ctor5.C b/gcc/testsuite/g++.dg/parse/ctor5.C new file mode 100644 index 000000000..3ea23549c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor5.C @@ -0,0 +1,14 @@ +// PR c++/27309 + +struct A +{ + int i; // { dg-error "conflicts" } + A() i() {} // { dg-error "declaration" } +}; + +struct B +{ + A a; +}; + +B b; diff --git a/gcc/testsuite/g++.dg/parse/ctor6.C b/gcc/testsuite/g++.dg/parse/ctor6.C new file mode 100644 index 000000000..0b14ecc6e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor6.C @@ -0,0 +1,11 @@ +// { dg-do compile } + +// There is no ambiguity in finding a right constructor for X b(a). + +class X { +public: + X(const X&, int = 3); +}; + +extern X a; +X b(a); diff --git a/gcc/testsuite/g++.dg/parse/ctor7.C b/gcc/testsuite/g++.dg/parse/ctor7.C new file mode 100644 index 000000000..9fa051b79 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor7.C @@ -0,0 +1,15 @@ +//PR c++/28505 + +struct A +{ + A : (); // { dg-error "primary-expression|incomplete type" } + A : (int); // { dg-error "primary-expression|incomplete type|'int'" } +}; + +struct B +{ + char c; + A a; +}; + +B b = (B){0}; // { dg-error "compound-literals" } diff --git a/gcc/testsuite/g++.dg/parse/ctor8.C b/gcc/testsuite/g++.dg/parse/ctor8.C new file mode 100644 index 000000000..e43ce4023 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor8.C @@ -0,0 +1,9 @@ +//PR c++/28505 + +struct A +{ + A : (); // { dg-error "primary-expression|incomplete type" } + A : (int); // { dg-error "primary-expression|incomplete type|'int'" } +}; + +A a = (A){0}; // { dg-error "too many initializers|compound-literals" } diff --git a/gcc/testsuite/g++.dg/parse/ctor9.C b/gcc/testsuite/g++.dg/parse/ctor9.C new file mode 100644 index 000000000..8b2cbf7a6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor9.C @@ -0,0 +1,7 @@ +/* PR c++/37647 */ +/* { dg-do compile } */ + +struct A +{ + A() { void A(); } /* { dg-error "return type specification for constructor invalid|non-class scope" } */ +}; diff --git a/gcc/testsuite/g++.dg/parse/dce1.C b/gcc/testsuite/g++.dg/parse/dce1.C new file mode 100644 index 000000000..f4de52257 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dce1.C @@ -0,0 +1,13 @@ +/* Make sure that dead code isn't eliminated too early, avoiding + detection of errors. */ +/* { dg-do compile } */ + +void foo(void) +{ + if (0) + break; /* { dg-error "" } */ + if (1) + ; + else + continue; /* { dg-error "" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/decl-specifier-1.C b/gcc/testsuite/g++.dg/parse/decl-specifier-1.C new file mode 100644 index 000000000..baf0fe778 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/decl-specifier-1.C @@ -0,0 +1,17 @@ +// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net> +// Origin: PRs 7721 and 7803 +// { dg-do compile } + +namespace N +{ + template<typename> + struct X { }; // { dg-message "N::X" } +} + +N::X X; // { dg-error "" "" } + +int main() +{ + return sizeof(X); // { dg-error "" "" } + // { dg-message "suggested alternative" "suggested alternative" { target *-*-* } 15 } +} diff --git a/gcc/testsuite/g++.dg/parse/def-tmpl-arg1.C b/gcc/testsuite/g++.dg/parse/def-tmpl-arg1.C new file mode 100644 index 000000000..6c3659f75 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/def-tmpl-arg1.C @@ -0,0 +1,9 @@ +// PR c++/8895 +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> +// { dg-do compile } + +template <typename X, typename Y = B<X> > struct A // { dg-error "" } +{ + A(); + A(const A&); +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg1.C b/gcc/testsuite/g++.dg/parse/defarg1.C new file mode 100644 index 000000000..77c50e8c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg1.C @@ -0,0 +1,5 @@ +class A +{ +public: + A(int nBits = ((int)0x8) | ((int)0x4) | ((int)0x2)); +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg10.C b/gcc/testsuite/g++.dg/parse/defarg10.C new file mode 100644 index 000000000..bbf9ac04b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg10.C @@ -0,0 +1,11 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 7 Jun 2005 <nathan@codesourcery.com> + +// From java library. + +void Foo (int = 0); + +class Klasse +{ + friend void Foo (int); +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg11.C b/gcc/testsuite/g++.dg/parse/defarg11.C new file mode 100644 index 000000000..60199c2e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg11.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// { dg-options "-pedantic" } + +class foo { +public: + void operator& (int = 1); // { dg-error "default argument" } + void operator++ (int = 2); // { dg-warning "default argument" } + void operator-- (int = 3); // { dg-warning "default argument" } +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg12.C b/gcc/testsuite/g++.dg/parse/defarg12.C new file mode 100644 index 000000000..2d2d7e7a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg12.C @@ -0,0 +1,13 @@ +/* PR28266 This used to ICE in gimple_add_tmp_var */ +/* { dg-do compile } */ + +struct A +{ + int i; + A(int = X); /* { dg-error "was not declared in this scope" }*/ +}; + +void foo() +{ + A().i; /* { dg-error "default argument" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/defarg13.C b/gcc/testsuite/g++.dg/parse/defarg13.C new file mode 100644 index 000000000..27c6db50a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg13.C @@ -0,0 +1,8 @@ +// PR c++/38485 + +template <class Key, class T> +class QMap { }; + +class XMLConfigurations { + void translateToOther(QMap<int, int> match = (QMap<int, int>())); +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg14.C b/gcc/testsuite/g++.dg/parse/defarg14.C new file mode 100644 index 000000000..0930b45ee --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg14.C @@ -0,0 +1,6 @@ +// PR c++/28274 + +extern "C" { +void foo (int i, int j = 6); +void foo (int i = 4, int j); +} diff --git a/gcc/testsuite/g++.dg/parse/defarg15.C b/gcc/testsuite/g++.dg/parse/defarg15.C new file mode 100644 index 000000000..b93af4c92 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg15.C @@ -0,0 +1,5 @@ +// PR c++/44991 + +class bar { + void foo(bool a = 3 < 2, bool b = true) {} +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg2.C b/gcc/testsuite/g++.dg/parse/defarg2.C new file mode 100644 index 000000000..571855a3c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg2.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 4 Jan 2003 <nathan@codesourcery.com> + +// We erroneously prohibited default args on parenthesized function +// declarations. + +void (foo)(int i = 0); diff --git a/gcc/testsuite/g++.dg/parse/defarg3.C b/gcc/testsuite/g++.dg/parse/defarg3.C new file mode 100644 index 000000000..5c81c69e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg3.C @@ -0,0 +1,5 @@ +struct A { + enum { value = 10 }; + A() { f(); } + static int f(int i=value); +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg4.C b/gcc/testsuite/g++.dg/parse/defarg4.C new file mode 100644 index 000000000..bafdadb94 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg4.C @@ -0,0 +1,32 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 3 Jul 2003 <nathan@codesourcery.com> + +// PR c++ 9162. default args got left unprocessed + +struct S { + friend int foo (const S&, int = 100); +}; +S s; +int i = foo (s); + +struct R +{ + template <typename T> R (T, int = 0); +}; + +int Foo () +{ + R s (1); +} + +template <typename T> struct Q +{ + int Foo (T, int = 0); +}; + +int Foo (Q<int> *s) +{ + s->Foo (1); +} diff --git a/gcc/testsuite/g++.dg/parse/defarg5.C b/gcc/testsuite/g++.dg/parse/defarg5.C new file mode 100644 index 000000000..01a67ed59 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg5.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 5 Sep 2003 <nathan@codesourcery.com> +// Origin:Wolfgang Bangerth bangerth@dealii.org + +// PR c++/12167 - infinite recursion + +class A { + void report(int d + // the default arg is what NAN etc can expand to, but + // with the floatiness removed. + = (__extension__ ((union { unsigned l; int d; }) + { l: 0x7fc00000U }).d)); +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg6.C b/gcc/testsuite/g++.dg/parse/defarg6.C new file mode 100644 index 000000000..827b605b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg6.C @@ -0,0 +1,11 @@ +// { dg-do compile } + +// Origin: Falk Hueffner <falk@debian.org> + +// PR c++/13166: ICE default function argument for friend declaration. + +namespace sc_dt { + class sc_length_param { + friend int compare_unsigned(int if_v_signed = 0) {} + }; +} diff --git a/gcc/testsuite/g++.dg/parse/defarg7.C b/gcc/testsuite/g++.dg/parse/defarg7.C new file mode 100644 index 000000000..c1f75ce8f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg7.C @@ -0,0 +1,5 @@ +// PR c++/14361 + +class A { + A ( int n=0 int n ); // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg8.C b/gcc/testsuite/g++.dg/parse/defarg8.C new file mode 100644 index 000000000..1f1f078aa --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg8.C @@ -0,0 +1,10 @@ +struct A { + static void g(int); +}; + +struct S { + static int i; + + friend void f(int = i); + friend void A::g(int = i); +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg9.C b/gcc/testsuite/g++.dg/parse/defarg9.C new file mode 100644 index 000000000..8496cfb26 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg9.C @@ -0,0 +1,20 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 6 Jun 2005 <nathan@codesourcery.com> + +// PR 21903:Reject legal with default arg confusion +// Origin: Wolfgang Bangerth <bangerth@dealii.org> + + +struct O { + template<typename T> struct B { + void set (T, bool=true); + }; + + struct D : public B<int> {}; +}; + +void x () +{ + O::D d; + d.set(1); +} diff --git a/gcc/testsuite/g++.dg/parse/direct-initialization-2.C b/gcc/testsuite/g++.dg/parse/direct-initialization-2.C new file mode 100644 index 000000000..f362c74a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/direct-initialization-2.C @@ -0,0 +1,18 @@ +// Copyright (C) 2002 Free Software Foundation +// Origin: C++/729 +// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net> +// { dg-do compile } + +struct A { + A(int) { } +}; + +struct B { + typedef B T; + B(A, char**) {} +}; + +int main(int argc, char** argv) +{ + B::T t(A(argc), argv); +} diff --git a/gcc/testsuite/g++.dg/parse/dot1.C b/gcc/testsuite/g++.dg/parse/dot1.C new file mode 100644 index 000000000..3b027d7c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dot1.C @@ -0,0 +1,4 @@ +// PR c++/24560 + +struct A { void f(); }; +void g() { A().f.a; } // { dg-error "class" } diff --git a/gcc/testsuite/g++.dg/parse/dtor1.C b/gcc/testsuite/g++.dg/parse/dtor1.C new file mode 100644 index 000000000..08d070ea5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor1.C @@ -0,0 +1,6 @@ +struct A { typedef int I; }; +int main(void) +{ + int * p; + p->A::I::~I(); +} diff --git a/gcc/testsuite/g++.dg/parse/dtor10.C b/gcc/testsuite/g++.dg/parse/dtor10.C new file mode 100644 index 000000000..a6e905422 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor10.C @@ -0,0 +1,9 @@ +// PR c++/27508 +// { dg-do compile } + +namespace N +{ + struct A { ~A(); }; +} + +N::~A () {} // { dg-error "not a class-name" } diff --git a/gcc/testsuite/g++.dg/parse/dtor11.C b/gcc/testsuite/g++.dg/parse/dtor11.C new file mode 100644 index 000000000..63ffb60ba --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor11.C @@ -0,0 +1,12 @@ +// PR c++/28606 +// { dg-do compile } + +struct A +{ + ~A A(); // { dg-error "destructor" } +}; + +struct B +{ + A::~B B(); // { dg-error "as member of" } +}; diff --git a/gcc/testsuite/g++.dg/parse/dtor12.C b/gcc/testsuite/g++.dg/parse/dtor12.C new file mode 100644 index 000000000..1acdfa36b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor12.C @@ -0,0 +1,6 @@ +// PR c++/29408 + +template <class T> class a +{ + ~a<T>(); +}; diff --git a/gcc/testsuite/g++.dg/parse/dtor13.C b/gcc/testsuite/g++.dg/parse/dtor13.C new file mode 100644 index 000000000..96c0d227b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor13.C @@ -0,0 +1,8 @@ +/* PR c++/34963 This used to ICE */ +/* { dg-do compile } */ + +struct A +{ + static friend A::~A(); /* { dg-error "storage class specifiers|extra qualification|implicitly friend" } */ +}; + diff --git a/gcc/testsuite/g++.dg/parse/dtor14.C b/gcc/testsuite/g++.dg/parse/dtor14.C new file mode 100644 index 000000000..6ba7a5b6c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor14.C @@ -0,0 +1,8 @@ +// PR c++/39054 + +struct A {}; + +template<typename> void foo() +{ + A().~int(); // { dg-error "expected" } +} diff --git a/gcc/testsuite/g++.dg/parse/dtor15.C b/gcc/testsuite/g++.dg/parse/dtor15.C new file mode 100644 index 000000000..ae85a702a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor15.C @@ -0,0 +1,16 @@ +// PR c++/39225 + +template <class T> +class A +{ +public: + A() {} + ~B() {} // { dg-error "~B" } +}; + +int main() +{ + A<int> *a = new A<int>; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/dtor2.C b/gcc/testsuite/g++.dg/parse/dtor2.C new file mode 100644 index 000000000..60e132b4a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor2.C @@ -0,0 +1,4 @@ +struct A { + typedef A A2; + ~A2(); // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/parse/dtor3.C b/gcc/testsuite/g++.dg/parse/dtor3.C new file mode 100644 index 000000000..3041ae4a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor3.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// Contributed by Wolfgang Bangerth <bangerth at dealii dot org> +// PR c++/12335: Make sure we don't ICE on the qualified-id form of a +// destructor call. + +struct Y { + ~Y() {} // { dg-bogus "note" "implemented DR272" { xfail *-*-* } } +}; + +struct X : Y { + ~X() {} // { dg-bogus "note" "implemented DR272" { xfail *-*-* } } + void f() { + X::~X(); // { dg-bogus "" "implemented DR272" { xfail *-*-* } } + Y::~Y(); // { dg-bogus "" "implemented DR272" { xfail *-*-* } } + } +}; diff --git a/gcc/testsuite/g++.dg/parse/dtor4.C b/gcc/testsuite/g++.dg/parse/dtor4.C new file mode 100644 index 000000000..729ee2fa1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor4.C @@ -0,0 +1,10 @@ +// { dg-do compile } +// Contributed by Paul Koning <pkoning at equallogic dot com> +// PR c++/15947: Accept destructor as template in qualified-id + +template <int N> struct X { + ~X(); +}; + +template <int N> +X<N>::~X<N>(){} diff --git a/gcc/testsuite/g++.dg/parse/dtor5.C b/gcc/testsuite/g++.dg/parse/dtor5.C new file mode 100644 index 000000000..297a0e737 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor5.C @@ -0,0 +1,12 @@ +// PR c++/19732 + +struct A; +typedef int ~A; // { dg-error "non-function" } +struct B { + ~A(); // { dg-error "" } + typedef int ~A; // { dg-error "non-function" } + void f() { + extern ~B(); // { dg-error "non-member" } + } +}; +void ~A(); // { dg-error "non-member" } diff --git a/gcc/testsuite/g++.dg/parse/dtor6.C b/gcc/testsuite/g++.dg/parse/dtor6.C new file mode 100644 index 000000000..3333161c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor6.C @@ -0,0 +1,8 @@ +// PR c++/25638 + +struct A { ~A(); }; // { dg-error "candidate" } + +struct B : A +{ + template<int> friend A::~A(); // { dg-error "match" } +}; diff --git a/gcc/testsuite/g++.dg/parse/dtor7.C b/gcc/testsuite/g++.dg/parse/dtor7.C new file mode 100644 index 000000000..a80951266 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor7.C @@ -0,0 +1,4 @@ +// PR c++/25856 + +struct A; // { dg-error "forward" } +A::~A() {} // { dg-error "incomplete" } diff --git a/gcc/testsuite/g++.dg/parse/dtor8.C b/gcc/testsuite/g++.dg/parse/dtor8.C new file mode 100644 index 000000000..2fe0a974b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor8.C @@ -0,0 +1,8 @@ +// { dg-do compile } + +struct A {}; + +struct B +{ + friend A::~B(); // { dg-error "as member of" } +}; diff --git a/gcc/testsuite/g++.dg/parse/dtor9.C b/gcc/testsuite/g++.dg/parse/dtor9.C new file mode 100644 index 000000000..64c82ce67 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor9.C @@ -0,0 +1,5 @@ +// PR c++/27508 +// { dg-do compile } + +struct A; +using ::~A; // { dg-error "not a class-name" } diff --git a/gcc/testsuite/g++.dg/parse/dupl-tmpl-args1.C b/gcc/testsuite/g++.dg/parse/dupl-tmpl-args1.C new file mode 100644 index 000000000..a7beabc90 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dupl-tmpl-args1.C @@ -0,0 +1,13 @@ +// PR c++/8928 +// Origin: <sebor@roguewave.com> +// { dg-do compile } + +namespace N +{ + +template <typename T, typename U> struct A {}; +typedef A<int, int> B; + +} + +N::B<int, int> a; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/eh-decl.C b/gcc/testsuite/g++.dg/parse/eh-decl.C new file mode 100644 index 000000000..1c72fd39f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/eh-decl.C @@ -0,0 +1,8 @@ +// PR c++/41876 + +struct A; + +void foo() +{ + try {} catch(int A) {} +} diff --git a/gcc/testsuite/g++.dg/parse/elab1.C b/gcc/testsuite/g++.dg/parse/elab1.C new file mode 100644 index 000000000..92fcd1ca6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/elab1.C @@ -0,0 +1,9 @@ +namespace Name { + + typedef void *(*Function)( void *, int ); // { dg-error "previous declaration" } + + struct Foo { + struct Function xyz[5]; // { dg-error "" } + }; + +} diff --git a/gcc/testsuite/g++.dg/parse/elab2.C b/gcc/testsuite/g++.dg/parse/elab2.C new file mode 100644 index 000000000..6b42aed67 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/elab2.C @@ -0,0 +1,7 @@ +struct A {}; + +struct B +{ + typedef A T; // { dg-error "previous declaration" } + friend struct T; // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/parse/else-2.C b/gcc/testsuite/g++.dg/parse/else-2.C new file mode 100644 index 000000000..7f0b23cd7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/else-2.C @@ -0,0 +1,11 @@ +// { dg-do compile } +// { dg-options " " } + +int f() +{ + + else // { dg-error "'else' without a previous 'if'" } + { + return 0; + } +} diff --git a/gcc/testsuite/g++.dg/parse/else.C b/gcc/testsuite/g++.dg/parse/else.C new file mode 100644 index 000000000..87ea982a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/else.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options " " } + +int f() +{ + if (1) + { + return 1; + else // { dg-error "expected .\}. before 'else'" } + { + return 0; + } +} diff --git a/gcc/testsuite/g++.dg/parse/enum1.C b/gcc/testsuite/g++.dg/parse/enum1.C new file mode 100644 index 000000000..d5c5f8688 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/enum1.C @@ -0,0 +1,4 @@ +// PR c++/15862 + +enum yn { Y, N }; +enum yn x = Y; diff --git a/gcc/testsuite/g++.dg/parse/enum2.C b/gcc/testsuite/g++.dg/parse/enum2.C new file mode 100644 index 000000000..f77f91701 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/enum2.C @@ -0,0 +1,7 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +// PR c++/18123: ICE pushing tag from invalid template. + +template<int> enum E { e }; // { dg-error "declaration|expected" } diff --git a/gcc/testsuite/g++.dg/parse/enum3.C b/gcc/testsuite/g++.dg/parse/enum3.C new file mode 100644 index 000000000..dc07193d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/enum3.C @@ -0,0 +1,5 @@ +// PR c++/28261 + +struct A {}; // { dg-error "A::A" } + +A::A (enum { e }) {} // { dg-error "defined|prototype" } diff --git a/gcc/testsuite/g++.dg/parse/enum4.C b/gcc/testsuite/g++.dg/parse/enum4.C new file mode 100644 index 000000000..6a20ea9cb --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/enum4.C @@ -0,0 +1,10 @@ +// PR c++/37389 +// { dg-do compile } +// { dg-options "-std=gnu++98" } + +enum +{ + A = 9223372036854775807ULL * 2 + 1, + B = B0, // { dg-error "was not declared|overflow" } + C = C0 // { dg-error "was not declared" } +}; diff --git a/gcc/testsuite/g++.dg/parse/enum5.C b/gcc/testsuite/g++.dg/parse/enum5.C new file mode 100644 index 000000000..3ebb02f75 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/enum5.C @@ -0,0 +1,17 @@ +// PR c++/41127 + +#define CHAR_BIT 8 +enum EE {ee}; +typedef unsigned int T; + +struct D { + T : sizeof(unsigned int) * CHAR_BIT; // OK + EE : sizeof(EE) * CHAR_BIT; // OK + enum EE : sizeof(EE) * CHAR_BIT; // not OK + enum EE xxxx : sizeof(EE) * CHAR_BIT; // OK + T x : sizeof(unsigned int) * CHAR_BIT; // OK + enum FF {ff} : sizeof(int) * CHAR_BIT; // OK +} element; + +enum EE xx; +EE yy; diff --git a/gcc/testsuite/g++.dg/parse/error-column.C b/gcc/testsuite/g++.dg/parse/error-column.C new file mode 100644 index 000000000..18dc4633a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error-column.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// Make sure column information is correctly shown in error reporting +// { dg-options "-fshow-column" } + + +void foo () +{ + cout << "blah"; // { dg-error "3:'cout'" } +} diff --git a/gcc/testsuite/g++.dg/parse/error1.C b/gcc/testsuite/g++.dg/parse/error1.C new file mode 100644 index 000000000..1f8bb3773 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error1.C @@ -0,0 +1,7 @@ +// { dg-options "-fshow-column" } +struct INCOMPLETE; +template <int> struct X { + static INCOMPLETE value; +}; +template <> INCOMPLETE X<1>::value = 0; // { dg-error "30:variable 'INCOMPLETE X<1>::value' has initializer but incomplete type" } + diff --git a/gcc/testsuite/g++.dg/parse/error10.C b/gcc/testsuite/g++.dg/parse/error10.C new file mode 100644 index 000000000..8301172ad --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error10.C @@ -0,0 +1,19 @@ +// PR c++/3478 +// { dg-options "-fshow-column" } + +template <typename> struct A +{ + enum E {}; +}; + +template <typename T> void foo() +{ + enum A<void>::E e1; + typename A<T>::E e2; + enum A<T>::E e3; + enum typename A<T>::E e4; +} + +// Here, columns nums are not very accurate either. Still acceptable though +// { dg-error "30:invalid type in declaration before ';' token" "" { target *-*-* } 14 } +// { dg-error "30:two or more data types in declaration of 'e4'" "" { target *-*-* } 14 } diff --git a/gcc/testsuite/g++.dg/parse/error11.C b/gcc/testsuite/g++.dg/parse/error11.C new file mode 100644 index 000000000..39039a880 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error11.C @@ -0,0 +1,71 @@ +// { dg-do compile } +// { dg-options "-fshow-column" }" +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// Try to find out when the digraph '<:' is used as a mistake, and parse it +// correctly to avoid cascaded errors. + +struct B; + +template <class A> +struct Foo +{ + template <class T> + struct Nested + { + static void method(void) {} + }; + + void method(void) { + typename Foo<::B>::template Nested<::B> n; // { dg-error "17:'<::' cannot begin" "17-begin" } +// { dg-message "17:'<:' is an alternate spelling" "17-alt" { target *-*-* } 19 } +// { dg-error "39:'<::' cannot begin" "39-begin" { target *-*-* } 19 } +// { dg-message "39:'<:' is an alternate spelling" "39-alt" { target *-*-* } 19 } + n.template Nested<B>::method(); + n.template Nested<::B>::method(); // { dg-error "22:'<::' cannot begin" "error" } +// { dg-message "22:'<:' is an alternate" "note" { target *-*-* } 24 } + Nested<B>::method(); + Nested<::B>::method(); // { dg-error "11:'<::' cannot begin" "error" } +// { dg-message "11:'<:' is an alternate" "note" { target *-*-* } 27 } + } +}; + +template <int N> struct Foo2 {}; +template struct Foo2<::B>; // { dg-error "21:'<::' cannot begin" "begin" } +// { dg-message "21:'<:' is an alternate" "alt" { target *-*-* } 33 } +// { dg-message "25:type/value mismatch" "mismatch" { target *-*-* } 33 } +// { dg-error "25:expected a constant" "const" { target *-*-* } 33 } + +int value = 0; + +void func(void) +{ + Foo<::B> f; // { dg-error "cannot begin" "begin" } +// { dg-message "alternate spelling" "alt" { target *-*-* } 42 } + f.Foo<B>::method(); + f.Foo<::B>::method(); // { dg-error "8:cannot begin" "begin" } +// { dg-message "8:alternate spelling" "alt" { target *-*-* } 45 } + + // Check cases where we the token sequence is the correct one, but there + // was no digraph or whitespaces in the middle, so we should not emit + // the special error message. + Foo<: :B> k2; // { dg-bogus "cannot begin|alternate spelling" "smart error should not be triggered here" } + Foo[:B> k1; // { dg-bogus "cannot begin|alternate spelling" "smart error should not be triggered here" } +// { dg-error "6:missing template arguments before" "template" { target *-*-* } { 51 } } +// { dg-error "9:expected primary-expression before ':' token" "primary" { target *-*-* } 51 } +// { dg-error "9:expected '\]' before ':' token" "backslash" { target *-*-* } 51 } +// { dg-error "9:expected ';' before ':' token" "semicolon" { target *-*-* } 51 } +// { dg-error "6:missing template arguments before" "template" { target *-*-* } 52 } +// { dg-error "7:expected primary-expression before ':' token" "primary" { target *-*-* } 52 } +// { dg-error "7:expected '\]' before ':' token" "backslash" { target *-*-* } 52 } +// { dg-error "7:expected ';' before ':' token" "semicolon" { target *-*-* } 52 } +// + int Foo[2]; + Foo[::value] = 0; +} + +template struct Foo<::B>; // { dg-error "20:'<::' cannot begin" "begin" } +// { dg-message "20:is an alternate" "alt" { target *-*-* } 66 } + +// On the first error message, an additional note about the use of +// -fpermissive should be present +// { dg-message "17:\\(if you use '-fpermissive' G\\+\\+ will accept your code\\)" "-fpermissive" { target *-*-* } 19 } diff --git a/gcc/testsuite/g++.dg/parse/error12.C b/gcc/testsuite/g++.dg/parse/error12.C new file mode 100644 index 000000000..3ebcf3894 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error12.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// Make sure the error about '<:' can be turned into a warning +// { dg-options "-fpermissive -fshow-column" } + +struct B; + +template <class A> +struct Foo {}; + +Foo<::B> foo; // { dg-bogus "error" "error in place of warning" } +// { dg-warning "4: '<::' cannot begin a template-argument list" "warning <::" { target *-*-* } 11 } +// { dg-message "4:'<:' is an alternate spelling for '.'. Insert whitespace between '<' and '::'" "note <:" { target *-*-* } 11 } diff --git a/gcc/testsuite/g++.dg/parse/error13.C b/gcc/testsuite/g++.dg/parse/error13.C new file mode 100644 index 000000000..9bce98d7f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error13.C @@ -0,0 +1,14 @@ +// { dg-options "-fshow-column" } +// PR c++/13975 + +public: // { dg-error "1:expected unqualified-id before 'public'" } + +int i; + +protected: // { dg-error "1:expected unqualified-id before 'protected'" } + +int j; + +private: // { dg-error "1:expected unqualified-id before 'private'" } + +int k; diff --git a/gcc/testsuite/g++.dg/parse/error14.C b/gcc/testsuite/g++.dg/parse/error14.C new file mode 100644 index 000000000..04f2f56b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error14.C @@ -0,0 +1,26 @@ +// { dg-options "-fshow-column" } +// PR c++/13970 + +struct X +{ + template< typename Z > Z Zunc() + { + return Z(); + } + + template< typename Z > void Zinc() + { + } + + void tst() + { + Zunc<int>(); + + Zinc<int>( //); + // } + +}; // { dg-error "2:expected '.' at end of input" "at end of input" } + // { dg-error "1:expected primary-expression before '.' token" "primary" { target *-*-* } 22 } + // { dg-error "1:expected unqualified-id" "unqualified-id" { target *-*-* } 22 } + // { dg-error "1:expected ';' before '.' token" "function" { target *-*-* } 22 } + diff --git a/gcc/testsuite/g++.dg/parse/error15.C b/gcc/testsuite/g++.dg/parse/error15.C new file mode 100644 index 000000000..607a1dbb8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error15.C @@ -0,0 +1,41 @@ +// { dg-do compile } +// Contributed by Volker Reichelt <reichelt at gcc dot gnu dot org> +// { dg-options "-fshow-column" } +// PR c++/14008: Improve diagnostic on invalid types in declarators. + +namespace N +{ + template<int> struct A {}; + struct C {}; + int K; +} + +N::A f2; // { dg-error "1:invalid use of template-name 'N::A' without an argument list" } +N::INVALID f3; // { dg-error "1:'INVALID' in namespace 'N' does not name a type" } +N::C::INVALID f4; // { dg-error "1:'INVALID' in 'struct N::C' does not name a type" } +N::K f6; // { dg-error "1:'K' in namespace 'N' does not name a type" } +typename N::A f7; +// { dg-error "13:invalid use of template-name 'N::A' without an argument list" "13" { target *-*-* } 17 } +// { dg-error "17:invalid type in declaration before ';' token" "17" { target *-*-* } 17 } + +struct B +{ + N::A f2; // { dg-error "3:invalid use of template-name 'N::A' without an argument list" } + N::INVALID f3; // { dg-error "3:'INVALID' in namespace 'N' does not name a type" } + N::C::INVALID f4; // { dg-error "3:'INVALID' in 'struct N::C' does not name a type" } + N::K f6; // { dg-error "3:'K' in namespace 'N' does not name a type" } + typename N::A f7; +// { dg-error "15:invalid use of template-name 'N::A' without an argument list" "15" { target *-*-* } 27 } +}; + +template <int> +struct C +{ + N::A f2; // { dg-error "3:invalid use of template-name 'N::A' without an argument list" } + N::INVALID f3; // { dg-error "3:'INVALID' in namespace 'N' does not name a type" } + N::C::INVALID f4; // { dg-error "3:'INVALID' in 'struct N::C' does not name a type" } + N::K f6; // { dg-error "3:'K' in namespace 'N' does not name a type" } + typename N::A f7; // { dg-error "15:invalid use of template-name 'N::A' without an argument list" } +}; + +// { dg-bogus "bogus excess errors in declaration" "bogus excess errors in declaration" { target *-*-* } 17 } diff --git a/gcc/testsuite/g++.dg/parse/error16.C b/gcc/testsuite/g++.dg/parse/error16.C new file mode 100644 index 000000000..3d9dcc334 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error16.C @@ -0,0 +1,9 @@ +// { dg-options "-fshow-column" } +// PR c++/16964 + +struct A +{ + struct B {}; // { dg-error "10:previous definition of 'struct A::B'" } +}; + +struct A::B{}; // { dg-error "11:redefinition of 'struct A::B'" } diff --git a/gcc/testsuite/g++.dg/parse/error17.C b/gcc/testsuite/g++.dg/parse/error17.C new file mode 100644 index 000000000..b308c912f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error17.C @@ -0,0 +1,9 @@ +// { dg-options "-fshow-column" } +// PR c++/16965 + +template <typename T> struct B { + static int Bar(T); // { dg-error "14:candidates are: |with T = int" } +}; +struct D : B<int>, B<char> {}; + +int i2 = D::Bar(2); // { dg-error "10:reference to 'Bar' is ambiguous" } diff --git a/gcc/testsuite/g++.dg/parse/error18.C b/gcc/testsuite/g++.dg/parse/error18.C new file mode 100644 index 000000000..b5e722221 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error18.C @@ -0,0 +1,8 @@ +// { dg-options "-fshow-column" } +// PR c++/16002 + +void f() +{ + double Q *= 5.0; // { dg-error "12:expected initializer before '..' token" } +} + diff --git a/gcc/testsuite/g++.dg/parse/error19.C b/gcc/testsuite/g++.dg/parse/error19.C new file mode 100644 index 000000000..010a4032e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error19.C @@ -0,0 +1,15 @@ +// { dg-options "-fshow-column -fmessage-length=0 -ansi -pedantic-errors -Wno-long-long " } +// PR C++/17867 + +struct A // { dg-message "8:operator=|no known conversion for implicit" } +{ + A(int); +}; + +const A& foo(); + +void bar() +{ + foo()=A(0); // { dg-error "12:no match for 'operator='" } + // { dg-message "candidate" "candidate note" { target *-*-* } 13 } +} diff --git a/gcc/testsuite/g++.dg/parse/error2.C b/gcc/testsuite/g++.dg/parse/error2.C new file mode 100644 index 000000000..7b08df454 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error2.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// { dg-options "-fshow-column -std=c++98" } +// Properly print CALL_EXPRs while dumping expressions + +double g; +int func(double); + +template <int> +struct Foo {}; + +Foo<func(g)> f; // { dg-error "5:'int func.double.' cannot appear in a constant-expression" "" { target *-*-* } 11 } +// { dg-error "10:'g' cannot appear in a constant-expression" "" { target *-*-* } 11 } +// { dg-error "11:a function call cannot appear in a constant-expression" "" { target *-*-* } 11 } +// { dg-error "12:template argument 1 is invalid" "" { target *-*-* } 11 } +// { dg-error "15:invalid type in declaration before ';' token" "" { target *-*-* } 11 } diff --git a/gcc/testsuite/g++.dg/parse/error20.C b/gcc/testsuite/g++.dg/parse/error20.C new file mode 100644 index 000000000..d2f9353a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error20.C @@ -0,0 +1,18 @@ +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } +// PR c++/17821 + +struct A { + A(int i) {} +}; +struct B { + int i; +}; +struct C { + B* p; +}; +int main() { + C c; + A(c.p.i); // { dg-error "9:request for member 'i' in 'c.C::p', which is of non-class type 'B" } + return 0; +} + diff --git a/gcc/testsuite/g++.dg/parse/error21.C b/gcc/testsuite/g++.dg/parse/error21.C new file mode 100644 index 000000000..469e5fb4e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error21.C @@ -0,0 +1,13 @@ +// PR c++/17393 +// { dg-options "-Wall -fshow-column" } + +struct A { }; + +void foo() +{ + // Check that we do not complain about an unused + // compiler-generated variable. + A& = a; // { dg-error "6:expected unqualified-id before '=' token" "6" } + // { dg-error "8:'a' was not declared in this scope" "8" { target *-*-* } 10 } +} + diff --git a/gcc/testsuite/g++.dg/parse/error22.C b/gcc/testsuite/g++.dg/parse/error22.C new file mode 100644 index 000000000..29552c67a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error22.C @@ -0,0 +1,6 @@ +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } +// PR c++/15786 + +struct A { + void foo(bar* p); /* { dg-error "12:'bar' has not been declared" } */ +}; diff --git a/gcc/testsuite/g++.dg/parse/error23.C b/gcc/testsuite/g++.dg/parse/error23.C new file mode 100644 index 000000000..9c19b562c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error23.C @@ -0,0 +1,9 @@ +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } +// PR c++/19149 + +struct QChar { + QChar( char c ); + QChar( const QChar& c ); + //following column number is not accurate enough but will make it for now + static const ; // { dg-error "10:declaration does not declare anything" } +}; diff --git a/gcc/testsuite/g++.dg/parse/error24.C b/gcc/testsuite/g++.dg/parse/error24.C new file mode 100644 index 000000000..c8ab6d992 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error24.C @@ -0,0 +1,8 @@ +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } +// PR c++/19395 + +struct A { + typedef int ::X; // { dg-error "17:typedef name may not be a nested-name-specifier" } +}; + + diff --git a/gcc/testsuite/g++.dg/parse/error25.C b/gcc/testsuite/g++.dg/parse/error25.C new file mode 100644 index 000000000..a0fd24c3a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error25.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } +// Origin: Steven Bosscher <steven at gcc dot gnu dot org> +// PR c++/17401: ICE with invalid pure specifier + +// NOTE: This also tests QoI of diagnostic for invalid pure specifiers. +// Please do *not* relax the dg-error tests. + +class foo +{ + virtual void bar1 () = 0; + virtual void bar2 () = __null; // { dg-error "32:invalid pure specifier" } + virtual void bar3 () = 4; // { dg-error "27:invalid pure specifier" } + virtual void bar4 () = A::f; // { dg-error "27:invalid pure specifier" } + virtual void bar5 () = 0l; // { dg-error "28:invalid pure specifier" } + virtual void bar6 () = 00; // { dg-error "28:invalid pure specifier" } + virtual void bar7 () = 0x0; // { dg-error "29:invalid pure specifier" } +}; diff --git a/gcc/testsuite/g++.dg/parse/error26.C b/gcc/testsuite/g++.dg/parse/error26.C new file mode 100644 index 000000000..befaf3bb3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error26.C @@ -0,0 +1,14 @@ +// PR c++/20148 +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } + +void foo() +{ + if (({int c[2];})) ; // { dg-error "7:ISO C.. forbids" "7" } + // { dg-error "20:could not convert" "20" { target *-*-* } 6 } +} + +void bar() +{ + if (({})); // { dg-error "7:ISO C.. forbids" "7" } + // { dg-error "11:could not convert" "11" { target *-*-* } 12 } +} diff --git a/gcc/testsuite/g++.dg/parse/error27.C b/gcc/testsuite/g++.dg/parse/error27.C new file mode 100644 index 000000000..90cb231c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error27.C @@ -0,0 +1,8 @@ +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } +// PR c++/20152 + +struct KrSelectionMode { virtual void init() = 0; }; // { dg-error "8:previous definition of 'struct KrSelectionMode'" } +struct KrKDESelectionMode : public KrSelectionMode { void init() { } }; // { dg-error "8:previous definition of 'struct KrKDESelectionMode'" } +struct KrSelectionMode { virtual void init() = 0; }; // { dg-error "8:redefinition of 'struct KrSelectionMode'" } +struct KrKDESelectionMode : public KrSelectionMode { void init() { } }; // { dg-error "8:redefinition of 'struct KrKDESelectionMode'" } +KrKDESelectionMode krKDESelectionMode; diff --git a/gcc/testsuite/g++.dg/parse/error28.C b/gcc/testsuite/g++.dg/parse/error28.C new file mode 100644 index 000000000..3ca210aa6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error28.C @@ -0,0 +1,12 @@ +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } +// PR c++/21908 + +struct virt { virt () {} virt (int i) {} }; +struct der : public virtual virt { // { dg-message "8:der::der|candidate expects" } + der (int i) : virt(i) {} // { dg-message "3:der::der|candidate expects" } +}; +struct top : public der { + top () {} // { dg-bogus "der\\(const" } + // { dg-message "candidate" "candidate note" { target *-*-* } 9 } +}; +// { dg-error "10:no matching function for call to 'der" "" { target *-*-* } 9 } diff --git a/gcc/testsuite/g++.dg/parse/error29.C b/gcc/testsuite/g++.dg/parse/error29.C new file mode 100644 index 000000000..2c3a3a7f2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error29.C @@ -0,0 +1,13 @@ +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } +// PR c++/25637 + +struct A { + void foo(); + A(); + void operator delete(void *); +}; +struct B { + friend void A::foo() {} // { dg-error "22:cannot define member function 'A::foo' within 'B'" } + friend void A::operator delete(void*) {} // { dg-error "39:cannot define member function 'A::operator delete' within 'B'" } + friend A::A() {} // { dg-error "15:cannot define member function 'A::A' within 'B'" } +}; diff --git a/gcc/testsuite/g++.dg/parse/error3.C b/gcc/testsuite/g++.dg/parse/error3.C new file mode 100644 index 000000000..7e8cf8de0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error3.C @@ -0,0 +1,9 @@ +// { dg-options "-fshow-column" } +// PR c++/10779 + +static void InstantiateConstraint(const float&, unsigned, + void(*AddFunction)(const TYPE&,bool&, + char*, char*, + unsigned*)); +// { dg-error "64: ISO C\\+\\+ forbids declaration of 'parameter' with no type" "" { target *-*-* } { 5 } } +// { dg-error "60: 'TYPE' does not name a type" "" { target *-*-* } { 5 } } diff --git a/gcc/testsuite/g++.dg/parse/error30.C b/gcc/testsuite/g++.dg/parse/error30.C new file mode 100644 index 000000000..26c55c49c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error30.C @@ -0,0 +1,12 @@ +// PR c++/30854 +// { dg-do compile } +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } + +struct A +{ + A(); + A(int); +}; + +A a = -A(); // { dg-error "10:no match for.*operator-.*in.*-A\\(\\)" } +A b = -A(5); // { dg-error "11:no match for.*operator-.*in.*-A\\(5\\)" } diff --git a/gcc/testsuite/g++.dg/parse/error31.C b/gcc/testsuite/g++.dg/parse/error31.C new file mode 100644 index 000000000..e39285227 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error31.C @@ -0,0 +1,14 @@ +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } +// PR c++/32190 + +template<typename T> class foo{ }; + +int main() { + foo<int> i; + // this column number is not accurate yet, but that will make it for now. + foo<foo<int> j; // { dg-error "18:template argument 1 is invalid" } + int k; + int l; + foo<int> m; + return 0; + } diff --git a/gcc/testsuite/g++.dg/parse/error32.C b/gcc/testsuite/g++.dg/parse/error32.C new file mode 100644 index 000000000..da27afdda --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error32.C @@ -0,0 +1,12 @@ +/* PR c++/37555 */ +/* { dg-do compile } */ + +struct A {}; + +typedef void (A::T)(); /* { dg-error "typedef name may not be a nested-name-specifier" } */ + +void foo() +{ + T t; + t; /* { dg-error "was not declared" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/error33.C b/gcc/testsuite/g++.dg/parse/error33.C new file mode 100644 index 000000000..e3a7166ed --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error33.C @@ -0,0 +1,16 @@ +/* PR c++/37556 */ +/* { dg-do compile } */ + +struct A +{ + void foo(); +}; + +typedef void (A::T)(); /* { dg-error "typedef name may not be a nested" } */ + +void bar(T); /* { dg-message "note: declared here" } */ + +void baz() +{ + bar(&A::foo); /* { dg-error "too many arguments" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/error34.C b/gcc/testsuite/g++.dg/parse/error34.C new file mode 100644 index 000000000..449ea689a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error34.C @@ -0,0 +1,8 @@ +// PR c++/33465 + +int foo(int); + +void bar(double d) +{ + foo(d)(); // { dg-error "foo\\(\\(int\\)d\\)" } +} diff --git a/gcc/testsuite/g++.dg/parse/error35.C b/gcc/testsuite/g++.dg/parse/error35.C new file mode 100644 index 000000000..59e726a31 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error35.C @@ -0,0 +1,8 @@ +// PR c++/33465 + +int foo(double); + +void bar(int i) +{ + foo(i)(); // { dg-error "foo\\(\\(double\\)i\\)" } +} diff --git a/gcc/testsuite/g++.dg/parse/error36.C b/gcc/testsuite/g++.dg/parse/error36.C new file mode 100644 index 000000000..8fcaa2fb2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error36.C @@ -0,0 +1,32 @@ +// PR c++/15946 +// Test for helpful error message about missing typename. + +template <class T> struct A +{ + struct B { }; + static B b; +}; + +template <class T> +void f(T t) +{ + typedef A<T>::foo type; // { dg-error "typename" } + A<T>::bar b; // { dg-error "typename" } +} // { dg-error "expected ';'" "" { target *-*-* } 14 } + +// PR c++/36353 +template <class T> struct B +{ + void f() + { + A<T>::baz z; // { dg-error "typename" } + } // { dg-error "expected ';'" "" { target *-*-* } 22 } +}; + +// PR c++/40738 +template <class T> +void g(const A<T>::type &t); // { dg-error "typename" } +// { dg-error "no type" "" { target *-*-* } 28 } + +// PR c++/18451 +template <class T> A<T>::B A<T>::b; // { dg-error "typename" } diff --git a/gcc/testsuite/g++.dg/parse/error37.C b/gcc/testsuite/g++.dg/parse/error37.C new file mode 100644 index 000000000..309912647 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error37.C @@ -0,0 +1,5 @@ +/* PR c++/42054 */ +/* { dg-do compile } */ + +template<int int> struct A; /* { dg-error "two or more" } */ +template<int int> struct A; /* { dg-error "two or more" } */ diff --git a/gcc/testsuite/g++.dg/parse/error4.C b/gcc/testsuite/g++.dg/parse/error4.C new file mode 100644 index 000000000..792bf4dc0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error4.C @@ -0,0 +1,10 @@ +// PR c++/12160 +// { dg-options "-fshow-column" } + +struct X { + virtual void f(int, + itn, + int); +}; + +// { dg-error "4:'itn' has not been declared" "" { target *-*-* } 6 } diff --git a/gcc/testsuite/g++.dg/parse/error5.C b/gcc/testsuite/g++.dg/parse/error5.C new file mode 100644 index 000000000..eb1f9c730 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error5.C @@ -0,0 +1,19 @@ +// PR c++/13269 +// { dg-options "-fshow-column" } + +class Foo { int foo() return 0; } }; + +// { dg-error "30:expected identifier before numeric constant" "identifier" { target *-*-* } 4 } + +// { dg-error "23:named return values are no longer supported" "named return" { target *-*-* } 4 } + +// the column number info of this error output is still wrong because the error +// message has been generated by cp_parser_error() which does not +// necessarily allow accurate column number display. At some point, we will +// need make cp_parser_error() report more accurate column numbers. +// { dg-error "30:expected '\{' at end of input" "brace" { target *-*-* } 4 } + +// { dg-error "33:expected ';' after class definition" "semicolon" {target *-*-* } 4 } + +// { dg-error "35:expected declaration before '\}' token" "declaration" {target *-*-* } 4 } + diff --git a/gcc/testsuite/g++.dg/parse/error6.C b/gcc/testsuite/g++.dg/parse/error6.C new file mode 100644 index 000000000..8b8424fe3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error6.C @@ -0,0 +1,11 @@ +// PR c++/10603 +// { dg-options "-fshow-column" } + +int f(int not) { + return 1-not; +} + +// { dg-error "11:expected ',' or '...' before 'not' token" "" { target *-*-* } 4 } + +// { dg-error "15:expected primary\\-expression before ';' token" "" { target *-*-* } 5 } + diff --git a/gcc/testsuite/g++.dg/parse/error7.C b/gcc/testsuite/g++.dg/parse/error7.C new file mode 100644 index 000000000..78b7caac9 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error7.C @@ -0,0 +1,7 @@ +// PR c++/12827 +// { dg-options "-fshow-column" } + +void f(int x + int y); + +// { dg-error "8:expected ',' or '...' before 'int'" "" { target *-*-* } 5 } diff --git a/gcc/testsuite/g++.dg/parse/error8.C b/gcc/testsuite/g++.dg/parse/error8.C new file mode 100644 index 000000000..6d3bf5a85 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error8.C @@ -0,0 +1,9 @@ +// PR c++/13438 +// { dg-options "-fshow-column" } + +struct A { friend typename struct B; }; + + +// { dg-error "28:expected nested-name-specifier before 'struct'" "" { target *-*-* } 4 } +// { dg-error "35:multiple types in one declaration" "" { target *-*-* } 4 } +// { dg-error "12:friend declaration does not name a class or function" "" { target *-*-* } 4 } diff --git a/gcc/testsuite/g++.dg/parse/error9.C b/gcc/testsuite/g++.dg/parse/error9.C new file mode 100644 index 000000000..b16c84e81 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error9.C @@ -0,0 +1,9 @@ +// PR c++/12613 +// { dg-options "-fshow-column" } + +enum { FOO = 1, BAR = 2 }; +int a[] = { FOO: 1, BAR: 2 }; + +// the following 2 column locations are still not accurate enough +// { dg-error "28:name 'FOO' used in a GNU-style designated initializer for an array" "" { target *-*-* } 5 } +// { dg-error "28:name 'BAR' used in a GNU-style designated initializer for an array" "" { target *-*-* } 5 } diff --git a/gcc/testsuite/g++.dg/parse/explicit1.C b/gcc/testsuite/g++.dg/parse/explicit1.C new file mode 100644 index 000000000..35358749e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/explicit1.C @@ -0,0 +1,11 @@ +// { dg-do compile } + +// Origin: stefaandr@hotmail.com + +// PR c++/12403: ICE when explicit specialization is not in +// namespace scope. + +struct foo { + template<typename T> void bar (T &t) {} + template<> void bar<double>(double &t) {} // { dg-error "non-namespace|template|function" } +}; diff --git a/gcc/testsuite/g++.dg/parse/expr1.C b/gcc/testsuite/g++.dg/parse/expr1.C new file mode 100644 index 000000000..2ef82185b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/expr1.C @@ -0,0 +1,8 @@ +struct A { + A (int, int); + void f (); +}; + +void f (int a) { + A (a, a).f (); +} diff --git a/gcc/testsuite/g++.dg/parse/expr2.C b/gcc/testsuite/g++.dg/parse/expr2.C new file mode 100644 index 000000000..32800e4f9 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/expr2.C @@ -0,0 +1,8 @@ +struct X { + X(double *data, double d0, double d1); +}; + +int foo(double d0) { + double * data; + X(data,d0,d0); +} diff --git a/gcc/testsuite/g++.dg/parse/expr3.C b/gcc/testsuite/g++.dg/parse/expr3.C new file mode 100644 index 000000000..95d332f41 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/expr3.C @@ -0,0 +1,32 @@ +/* { dg-do compile } */ +/* PR/18047 Test that operators have the right precedence. */ +/* by bonzini@gnu.org */ + +#define test(lower, higher, a, b, c, d) \ + test_(lower, higher, a, b, c, d, __LINE__) + +#define test_(lower, higher, a, b, c, d, line)\ + test__(lower, higher, a, b, c, d, line) + +/* The first declaration tests that the parentheses are added correctly + by the expression parser. The second tests that the two possible + orderings of precedences do give different results. */ +#define test__(lower, higher, a, b, c, d, line) \ + char test##line[ \ + (a higher b lower c higher d) == \ + ((a higher b) lower (c higher d)) \ + ? 1 : -1]; \ + char doublecheck##line[ \ + (a higher b lower c higher d) == \ + (a higher (b lower c) higher d) \ + ? -1 : 1]; + +test (||, &&, 1, 1, 0, 0) +test (&&, |, 5, 1, 1, 19) +test (|, ^, 1, 2, 2, 1) +test (^, &, 1, 3, 2, 6) +test (&, ==, 1, 3, 2, 0) +test (==, <, 2, 0, 0, 0) +test (<, <<, 2, 3, 6, 8) +test (<<, +, 2, 3, 4, 5) +test (+, *, 2, 6, 9, 13) diff --git a/gcc/testsuite/g++.dg/parse/extern-C-1.C b/gcc/testsuite/g++.dg/parse/extern-C-1.C new file mode 100644 index 000000000..60a634832 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/extern-C-1.C @@ -0,0 +1,13 @@ +/* PR c++/4754 */ +/* { dg-do compile } */ +// GCC 3.2 got very confused by the nested extern "C" blocks, and thought +// there was a storage class specifier on 'int i'. + +extern "C" +{ + extern "C" struct Test + { + int i; + }; +} + diff --git a/gcc/testsuite/g++.dg/parse/extern1.C b/gcc/testsuite/g++.dg/parse/extern1.C new file mode 100644 index 000000000..cc95fa694 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/extern1.C @@ -0,0 +1,14 @@ +// PR c++/21495 +// { dg-do compile } + +class A +{ + extern void *copy (void) // { dg-error "storage class specified" } + { + return 0; + } + extern A &operator= (const A &) // { dg-error "storage class specified" } + { + return *this; + } +}; diff --git a/gcc/testsuite/g++.dg/parse/fn-typedef1.C b/gcc/testsuite/g++.dg/parse/fn-typedef1.C new file mode 100644 index 000000000..ebdc012f5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/fn-typedef1.C @@ -0,0 +1,19 @@ +// PR c++/40750 +// { dg-do run } + +extern "C" void abort (); + +typedef void Fn() const; + +struct Foo { + Fn fn; +}; + +bool called = false; +void Foo::fn() const { called = true; } + +int main() { + Foo f; f.fn(); + if (!called) + abort(); +} diff --git a/gcc/testsuite/g++.dg/parse/fn-typedef2.C b/gcc/testsuite/g++.dg/parse/fn-typedef2.C new file mode 100644 index 000000000..c9c7f060d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/fn-typedef2.C @@ -0,0 +1,7 @@ +// Test that merge_types preserves fn cv-quals. + +typedef void ft() const; +typedef void V; +typedef V ft() const; + +ft f; // { dg-error "qualified" } diff --git a/gcc/testsuite/g++.dg/parse/for1.C b/gcc/testsuite/g++.dg/parse/for1.C new file mode 100644 index 000000000..1e310ee02 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/for1.C @@ -0,0 +1,7 @@ +// PR c++/23440 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } +// { dg-options "" } + +# 0 "for1.C" +void foo() { for (;;) // { dg-error "at end of input" "" { target *-*-* } 0 } diff --git a/gcc/testsuite/g++.dg/parse/friend1.C b/gcc/testsuite/g++.dg/parse/friend1.C new file mode 100644 index 000000000..f19dc9c62 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/friend1.C @@ -0,0 +1,9 @@ +namespace N { + template <typename T> + static void f (); + + struct S { + friend void N::f<int> (); + static void f (int); + }; +} diff --git a/gcc/testsuite/g++.dg/parse/friend2.C b/gcc/testsuite/g++.dg/parse/friend2.C new file mode 100644 index 000000000..1a2ad8bfa --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/friend2.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// Origin: <struppi@acm.org> + +// PR c++/8591 +// Template or class detection in friend declaration + +namespace NS { + template <class T1, class T2, class T3 = int, class T4 = int> + struct C {}; +} + +template <class T> class X { + friend class NS::C; // { dg-error "template|friend" } +}; + +X<int> c; diff --git a/gcc/testsuite/g++.dg/parse/friend3.C b/gcc/testsuite/g++.dg/parse/friend3.C new file mode 100644 index 000000000..39322021e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/friend3.C @@ -0,0 +1,10 @@ +// { dg-do compile } +// +// PR 11553 catch duplicate friend specifiers + +struct S +{ + friend friend class C; // { dg-error "duplicate" } +}; + + diff --git a/gcc/testsuite/g++.dg/parse/friend4.C b/gcc/testsuite/g++.dg/parse/friend4.C new file mode 100644 index 000000000..5eca512e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/friend4.C @@ -0,0 +1,8 @@ +// { dg-do compile } + +// PR c++/4100 +// You can't use friend when defining a class. + +class A { + friend class B { }; // { dg-error "friend" } +}; diff --git a/gcc/testsuite/g++.dg/parse/friend5.C b/gcc/testsuite/g++.dg/parse/friend5.C new file mode 100644 index 000000000..ec134c26e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/friend5.C @@ -0,0 +1,8 @@ +// PR c++/23694 + +extern "C" struct A +{ + friend void foo(int) {} // { dg-error "declaration" } + friend void foo() {} // { dg-error "foo" "err" } + // { dg-warning "already a friend" "warn" { target *-*-* } 6 } +}; diff --git a/gcc/testsuite/g++.dg/parse/friend6.C b/gcc/testsuite/g++.dg/parse/friend6.C new file mode 100644 index 000000000..2d13606cb --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/friend6.C @@ -0,0 +1,3 @@ +// PR c++/27808 + +template<typename T> friend void T::foo; // { dg-error "friend|invalid" } diff --git a/gcc/testsuite/g++.dg/parse/friend7.C b/gcc/testsuite/g++.dg/parse/friend7.C new file mode 100644 index 000000000..668fd35d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/friend7.C @@ -0,0 +1,37 @@ +// PR c++/34488 +// { dg-do compile } + +struct A +{ + A (); + ~A (); + A (const A &); +}; + +struct B +{ + friend A::A (); + friend A::~A (); + friend A::A (const A &); +}; + +struct C +{ + friend int C (); // { dg-error "return type|in friend decl" } + friend int ~C (); // { dg-error "return type|in friend decl" } + friend int C (const C &); // { dg-error "return type|in friend decl" } +}; + +struct D +{ + friend int D () {} // { dg-error "return type|in friend decl" } + friend int ~D () {} // { dg-error "return type|in friend decl" } + friend int D (const D &) {} // { dg-error "return type|in friend decl" } +}; + +struct E +{ + friend A::A () {} // { dg-error "cannot define member" } + friend A::~A () {} // { dg-error "cannot define member" } + friend A::A (const A &) {} // { dg-error "cannot define member" } +}; diff --git a/gcc/testsuite/g++.dg/parse/friend8.C b/gcc/testsuite/g++.dg/parse/friend8.C new file mode 100644 index 000000000..aac5f0e55 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/friend8.C @@ -0,0 +1,8 @@ +// PR c++/35578 +// Check position of error message +// { dg-do compile } + +int i; + +friend // { dg-error "friend" } + void foo(); diff --git a/gcc/testsuite/g++.dg/parse/func-def1.C b/gcc/testsuite/g++.dg/parse/func-def1.C new file mode 100644 index 000000000..00c973d88 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/func-def1.C @@ -0,0 +1,11 @@ +// PR c++/7917 +// Origin: VACLAV HAISMAN <V.Haisman@sh.cvut.cz> +// { dg-do compile } + +struct A +{ + int i; + void foo() = 0 {} // { dg-error "" } + + A() : i(0) {} +}; diff --git a/gcc/testsuite/g++.dg/parse/funptr1.C b/gcc/testsuite/g++.dg/parse/funptr1.C new file mode 100644 index 000000000..bf63c122e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/funptr1.C @@ -0,0 +1,13 @@ +// PR c++/9282 +// Origin: Thomas Richter <thor@math.tu-berlin.de> +// { dg-do compile } + +typedef void (*fptr)(); + +struct A +{ + template<int> static void foo() {} + template<fptr f> static void bar() { (*f)(); } +}; + +fptr f = A::bar< A::foo<0> >; diff --git a/gcc/testsuite/g++.dg/parse/fused-params1.C b/gcc/testsuite/g++.dg/parse/fused-params1.C new file mode 100644 index 000000000..33732fc28 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/fused-params1.C @@ -0,0 +1,12 @@ +// PR c++/8785 +// Origin: Alexander Zvyagin <Alexander.Zviagine@cern.ch> +// { dg-do compile } + +template <int N,typename T> struct A // { dg-error "" } +{ + typedef T X; + template <int M> void foo (const A<M,X>&); +}; + +template <int N,int M,typename T> +void A<N,T>::foo (const A<M,X>&) {} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/inline1.C b/gcc/testsuite/g++.dg/parse/inline1.C new file mode 100644 index 000000000..5c3034c6e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/inline1.C @@ -0,0 +1,7 @@ +struct f +{ + int oo() + { + return (2; // { dg-error "" } + } +}; diff --git a/gcc/testsuite/g++.dg/parse/int-as-enum1.C b/gcc/testsuite/g++.dg/parse/int-as-enum1.C new file mode 100644 index 000000000..7c37eb087 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/int-as-enum1.C @@ -0,0 +1,6 @@ +// PR c++/4207 +// Origin: <wanderer@rsu.ru> +// { dg-do compile } + +typedef int A; // { dg-error "previous" } +enum ::A {}; // { dg-error "typedef-name|expected unqualified-id" } diff --git a/gcc/testsuite/g++.dg/parse/invalid-op1.C b/gcc/testsuite/g++.dg/parse/invalid-op1.C new file mode 100644 index 000000000..0b75d0791 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/invalid-op1.C @@ -0,0 +1,14 @@ +// PR c++/10150 +// Origin: Tom Evans <te200@eng.cam.ac.uk> +// { dg-do compile } + +template <int I> struct A +{ + template <int> struct B + { + enum { e = I * A<I-1>::B }; // { dg-error "dependent-name" "depname" } + // { dg-message "note" "note" { target *-*-* } 9 } + }; +}; + +A<0>::B<0> a; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/parse/limits-initializer1.C b/gcc/testsuite/g++.dg/parse/limits-initializer1.C new file mode 100644 index 000000000..4b507912f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/limits-initializer1.C @@ -0,0 +1,37 @@ +// PR middle-end/42803 +// { dg-do compile } +// { dg-options "-O0" } + +#define X2 (a + a) +#define X4 (X2 + X2) +#define X8 (X4 + X4) +#define X16 (X8 + X8) +#define X32 (X16 + X16) +#define X64 (X32 + X32) +#define X128 (X64 + X64) +#define X256 (X128 + X128) +#define X512 (X256 + X256) +#define X1024 (X512 + X512) +#define X2048 (X1024 + X1024) +#define X4096 (X2048 + X2048) +#define X8192 (X4096 + X4096) +#define X16384 (X8192 + X8192) +#define X32768 (X16384 + X16384) +#define X65536 (X32768 + X32768) +#define X131072 (X65536 + X65536) +#define X262144 (X131072 + X131072) + +int +foo (int a) +{ + int v = X262144; + return v; +} + +// Emit an error to just make sure we don't waste too much time +// in the middle-end compiling this. +int +bar (void) +{ + return x; // { dg-error "was not declared in this scope" } +} diff --git a/gcc/testsuite/g++.dg/parse/linkage1.C b/gcc/testsuite/g++.dg/parse/linkage1.C new file mode 100644 index 000000000..4a0d8942e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/linkage1.C @@ -0,0 +1,11 @@ +// PR c++/26068 + +extern "C" auto int a; // { dg-error "linkage" } +extern "C" register int b; // { dg-error "linkage" } +extern "C" static void c(); // { dg-error "linkage" } +extern "C" extern void d(); // { dg-error "linkage" } +extern "C" mutable int e; // { dg-error "linkage" } + +extern "C" { + static void f(); +} diff --git a/gcc/testsuite/g++.dg/parse/linkage2.C b/gcc/testsuite/g++.dg/parse/linkage2.C new file mode 100644 index 000000000..aa204df2a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/linkage2.C @@ -0,0 +1,3 @@ +// PR c++/27884 + +extern "C" void foo(register int *my_perl); diff --git a/gcc/testsuite/g++.dg/parse/linkage3.C b/gcc/testsuite/g++.dg/parse/linkage3.C new file mode 100644 index 000000000..0d952d1e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/linkage3.C @@ -0,0 +1,7 @@ +// PR c++/37877 +// { dg-do compile } + +extern "C++" struct S +{ + static int x; +} s; diff --git a/gcc/testsuite/g++.dg/parse/local-class1.C b/gcc/testsuite/g++.dg/parse/local-class1.C new file mode 100644 index 000000000..518dd7abd --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/local-class1.C @@ -0,0 +1,14 @@ + // Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 14 Feb 2005 <nathan@codesourcery.com> + +// Origin: Jorn Wolfgang Rennecke <amylaar@gcc.gnu.org> +// Bug 19608: ICE on invalid + + +void f () +{ + class c + { + friend void g () { } // { dg-error "local class" "" } + }; +} diff --git a/gcc/testsuite/g++.dg/parse/local1.C b/gcc/testsuite/g++.dg/parse/local1.C new file mode 100644 index 000000000..cfcffc908 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/local1.C @@ -0,0 +1,18 @@ +// PR c++/28056 + +void f1(); + +namespace N { + void f2(); +} + +class C { + static void f3(); +}; + +void foo() { + void ::f1(); // { dg-error "qualified" } + void N::f2(); // { dg-error "qualified" } + void C::f3(); // { dg-error "qualified" } + void ::f4(); // { dg-error "qualified" } +} diff --git a/gcc/testsuite/g++.dg/parse/long1.C b/gcc/testsuite/g++.dg/parse/long1.C new file mode 100644 index 000000000..c22d79117 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/long1.C @@ -0,0 +1,11 @@ +// PR c++/6634 +// { dg-do compile } +// { dg-options "" } + +long long double x; // { dg-error "long long" } +long double y; +long float z; // { dg-error "long" } + +typedef short void SV; // { dg-error "short" } +typedef long struct A LA; // { dg-error "long" } +typedef short char SC; // { dg-error "short" } diff --git a/gcc/testsuite/g++.dg/parse/lookup1.C b/gcc/testsuite/g++.dg/parse/lookup1.C new file mode 100644 index 000000000..0325d3c69 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/lookup1.C @@ -0,0 +1,9 @@ +#include <list> + +using namespace std; + +template <class T, class Alloc> +class new_list : public list<T, Alloc> { +public: + typedef typename list<T, Alloc>::iterator iterator; +}; diff --git a/gcc/testsuite/g++.dg/parse/lookup2.C b/gcc/testsuite/g++.dg/parse/lookup2.C new file mode 100644 index 000000000..fcf17cde4 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/lookup2.C @@ -0,0 +1,21 @@ +template <typename T> struct A +{ + typedef int X; +}; + +template <typename T> struct B +{ + typename A<T>::X x; +}; + +template <typename T> struct C +{ + void foo(int); + B<A<T>*> b; +}; + +template <typename T> struct D +{ + enum { e }; + void bar() { C<T*>::foo(e); } +}; diff --git a/gcc/testsuite/g++.dg/parse/lookup3.C b/gcc/testsuite/g++.dg/parse/lookup3.C new file mode 100644 index 000000000..d4bf79830 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/lookup3.C @@ -0,0 +1,12 @@ +struct X {}; + +template <int> +struct Base { + static void foo () { + X::NONEXISTENT (); // { dg-error "" } + } +}; + +int main () { + Base<2>::foo (); +} diff --git a/gcc/testsuite/g++.dg/parse/lookup4.C b/gcc/testsuite/g++.dg/parse/lookup4.C new file mode 100644 index 000000000..01e5662ad --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/lookup4.C @@ -0,0 +1,7 @@ +// PR c++/16637 + +typedef int I; + +struct S { + ::I I; +}; diff --git a/gcc/testsuite/g++.dg/parse/lookup5.C b/gcc/testsuite/g++.dg/parse/lookup5.C new file mode 100644 index 000000000..afdf023b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/lookup5.C @@ -0,0 +1,26 @@ +// { dg-do compile } + +struct A {}; + +template <class T> struct B +{ + T a, b; + B() {} + B(T x, T y) : a(x), b(y) {} + template <class U> operator B<U> () const + { return B<U>((U)(this->a), (U)(this->b)); } +}; + +template <class T> struct C : public B<int> +{ + T *c; + inline T & operator *() { return *c; } +}; + +template <class T> struct D : virtual public C<T> { }; + +void +foo (D<A> x) +{ + *x; +} diff --git a/gcc/testsuite/g++.dg/parse/memfnquals1.C b/gcc/testsuite/g++.dg/parse/memfnquals1.C new file mode 100644 index 000000000..ce8af7b72 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/memfnquals1.C @@ -0,0 +1,6 @@ +// PR c++/48166 + +struct foo { + static void func (); +}; +void foo::func () const {} // { dg-error "type qualifiers" } diff --git a/gcc/testsuite/g++.dg/parse/missing-template1.C b/gcc/testsuite/g++.dg/parse/missing-template1.C new file mode 100644 index 000000000..e5e03146d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/missing-template1.C @@ -0,0 +1,23 @@ +// PR c++/8736 +// Origin: Peter Kolloch <pkolloch@gmx.ne> +// { dg-do compile } + +template <typename T> struct A +{ + template <typename U> struct B + { + typedef int X; + }; +}; + +template <typename T> void foo() +{ + typedef typename A<T>::B<T>::X Y; // { dg-error "non-template" "non" } + // { dg-error "not declare" "decl" { target *-*-* } 15 } + // { dg-message "note" "note" { target *-*-* } 15 } +} + +void bar() +{ + foo<int>(); +} diff --git a/gcc/testsuite/g++.dg/parse/mutable1.C b/gcc/testsuite/g++.dg/parse/mutable1.C new file mode 100644 index 000000000..f3ac2e4a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/mutable1.C @@ -0,0 +1,7 @@ +// PR c++/16518 + +struct foo { + void bar() const { m1=1; m2=1;} + mutable int m1,m2; +}; + diff --git a/gcc/testsuite/g++.dg/parse/named_ops.C b/gcc/testsuite/g++.dg/parse/named_ops.C new file mode 100644 index 000000000..80e514992 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/named_ops.C @@ -0,0 +1,13 @@ +/* Copyright (C) 2002 Free Software Foundation, Inc. */ + +/* { dg-do compile } */ +/* { dg-options -fpreprocessed } */ + +/* Tests that C++ named ops are still there with -fpreprocessed. */ + +/* Source: Neil Booth, 23 May 2002. */ + +int main () +{ + return 2 xor 2; +} diff --git a/gcc/testsuite/g++.dg/parse/namespace-definition.C b/gcc/testsuite/g++.dg/parse/namespace-definition.C new file mode 100644 index 000000000..b7d4034cd --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace-definition.C @@ -0,0 +1,10 @@ +// PR 30891 +// { dg-do compile } + +int main() { + int i = 0; + namespace foo { // { dg-error "'namespace' definition is not allowed here" } + int j = 0; + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/namespace1.C b/gcc/testsuite/g++.dg/parse/namespace1.C new file mode 100644 index 000000000..7740bce2d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace1.C @@ -0,0 +1,7 @@ +namespace foo { +void baz(int); +} + +int bar(int foo) { + foo::baz (3); +} diff --git a/gcc/testsuite/g++.dg/parse/namespace10.C b/gcc/testsuite/g++.dg/parse/namespace10.C new file mode 100644 index 000000000..9f93d1b68 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace10.C @@ -0,0 +1,9 @@ +// PR c++/16529 + +namespace m {} // { dg-error "" } + +namespace n { + namespace m {} +} + +namespace m = n::m; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/namespace11.C b/gcc/testsuite/g++.dg/parse/namespace11.C new file mode 100644 index 000000000..7fa73b6e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace11.C @@ -0,0 +1,7 @@ +// PR c++/43069 + +namespace std { + template < typename > + void swap (); +} +template std::swap // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/namespace12.C b/gcc/testsuite/g++.dg/parse/namespace12.C new file mode 100644 index 000000000..25d6ae093 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace12.C @@ -0,0 +1,7 @@ +// PR c++/43109 + +namespace std { + namespace { + struct S {}; + } +} diff --git a/gcc/testsuite/g++.dg/parse/namespace2.C b/gcc/testsuite/g++.dg/parse/namespace2.C new file mode 100644 index 000000000..a2c10e053 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace2.C @@ -0,0 +1,15 @@ +/* PR c++/2537 */ +/* { dg-do compile } */ + +// Used to have namespace name/identifier conflict, prior to 3.4. + +namespace baz {} + +namespace foo + { + struct bar + { + unsigned baz:1; + }; + } + diff --git a/gcc/testsuite/g++.dg/parse/namespace3.C b/gcc/testsuite/g++.dg/parse/namespace3.C new file mode 100644 index 000000000..4665d0e9e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace3.C @@ -0,0 +1,12 @@ +/* PR c+/3816 */ +/* { dg-do compile } */ +namespace A {} + +namespace OtherNamespace { + + typedef struct { + int member; + } A; // used to conflict with A namespace + +} // end of namespace + diff --git a/gcc/testsuite/g++.dg/parse/namespace4.C b/gcc/testsuite/g++.dg/parse/namespace4.C new file mode 100644 index 000000000..2bee8dda8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace4.C @@ -0,0 +1,18 @@ +/* PR c++/4652 */ +/* { dg-do compile } */ +/* Another conflict between namespace IDs and other things. */ + +namespace A { } + +class B { + + struct { + int x; + } A; + +}; + +int main() { + B b; + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/namespace5.C b/gcc/testsuite/g++.dg/parse/namespace5.C new file mode 100644 index 000000000..277c0c8e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace5.C @@ -0,0 +1,5 @@ +// PR c++/7229 +// { dg-do compile } + +namespace A { namespace B { typedef int type; } } +typename A::B<0>::type x; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/namespace6.C b/gcc/testsuite/g++.dg/parse/namespace6.C new file mode 100644 index 000000000..06642d429 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace6.C @@ -0,0 +1,10 @@ +namespace a { + namespace b { + void foo(); + } +} + +void +a::b:foo() // { dg-error "" } +{ +} diff --git a/gcc/testsuite/g++.dg/parse/namespace7.C b/gcc/testsuite/g++.dg/parse/namespace7.C new file mode 100644 index 000000000..c8ac60882 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace7.C @@ -0,0 +1,8 @@ +namespace O { + struct SO; + namespace I { + struct SI; + struct O::SO {}; // { dg-error "" } + } + struct I::SI {}; +} diff --git a/gcc/testsuite/g++.dg/parse/namespace8.C b/gcc/testsuite/g++.dg/parse/namespace8.C new file mode 100644 index 000000000..d5a9b0ac1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace8.C @@ -0,0 +1,6 @@ +namespace X { + typedef struct { + } x; +} +typedef X::x x; +using X::x; diff --git a/gcc/testsuite/g++.dg/parse/namespace9.C b/gcc/testsuite/g++.dg/parse/namespace9.C new file mode 100644 index 000000000..7ff0267bf --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace9.C @@ -0,0 +1,8 @@ +namespace A { + void f(); +} +int g() +{ + struct f { }; + using A::f; +} diff --git a/gcc/testsuite/g++.dg/parse/new1.C b/gcc/testsuite/g++.dg/parse/new1.C new file mode 100644 index 000000000..d61c44633 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/new1.C @@ -0,0 +1,7 @@ +struct T; // { dg-error "forward" } +T* manage(T* t); +template <class Obj> struct ObjectSlot0_ { + void create() { + void* tmp = manage(new T()); // { dg-error "incomplete" } + } +}; diff --git a/gcc/testsuite/g++.dg/parse/new2.C b/gcc/testsuite/g++.dg/parse/new2.C new file mode 100644 index 000000000..d233b68ca --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/new2.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// Contributed by David Daney <daney at gcc dot gnu dot org> +// PR c++/14181: Cryptic error message for ill-formed new expressions + +void f1(void) +{ + (void)new (char*)[10]; // { dg-error "parenthesized|parentheses" } + (void)new char*[10]; +} diff --git a/gcc/testsuite/g++.dg/parse/new3.C b/gcc/testsuite/g++.dg/parse/new3.C new file mode 100644 index 000000000..d8faed294 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/new3.C @@ -0,0 +1,4 @@ +// PR c++/28593 +// { dg-do compile } + +void *p = new (::X; // { dg-error "declared|type-specifier" } diff --git a/gcc/testsuite/g++.dg/parse/new4.C b/gcc/testsuite/g++.dg/parse/new4.C new file mode 100644 index 000000000..34bd23230 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/new4.C @@ -0,0 +1,7 @@ +// PR c++/29291 +// { dg-do compile } + +template<int> void foo() +{ + new int(; // { dg-error "before" } +} diff --git a/gcc/testsuite/g++.dg/parse/no-type-defn1.C b/gcc/testsuite/g++.dg/parse/no-type-defn1.C new file mode 100644 index 000000000..9e899579e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/no-type-defn1.C @@ -0,0 +1,5 @@ +// PR c++/47144 + +template<typename> struct A { }; +A< struct B { }* >::SomeNonSense // { dg-error "types may not be defined" } +int y; diff --git a/gcc/testsuite/g++.dg/parse/no-typename1.C b/gcc/testsuite/g++.dg/parse/no-typename1.C new file mode 100644 index 000000000..42059ce7b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/no-typename1.C @@ -0,0 +1,11 @@ +// PR c++/4903 +// Origin: Dan Marinescu <theverylittleone@hotmail.com> +// { dg-do compile } + +template <typename T> struct A +{ + template <typename U> struct B + { + A<T>::template B<U> foo(); // { dg-error "" } + }; +}; diff --git a/gcc/testsuite/g++.dg/parse/no-value1.C b/gcc/testsuite/g++.dg/parse/no-value1.C new file mode 100644 index 000000000..443a389ce --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/no-value1.C @@ -0,0 +1,14 @@ +// PR c++/5533 +// { dg-do compile } + +namespace N +{ + template <class T> struct A{}; +} + +template <class T> void foo(T) {} + +void bar() +{ + foo(N::A); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/parse/non-dependent1.C b/gcc/testsuite/g++.dg/parse/non-dependent1.C new file mode 100644 index 000000000..d85ecb13a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/non-dependent1.C @@ -0,0 +1,19 @@ +// PR c++/8921 +// Origin: Chin-Lung Chang <evirt@iis.sinica.edu.tw> +// { dg-do compile } + +struct A +{ + template <typename T> void foo(); +}; + +template <typename T> void bar(A& a) +{ + a.foo<T>(); +} + +void baz() +{ + A a; + bar<int>(a); +} diff --git a/gcc/testsuite/g++.dg/parse/non-dependent2.C b/gcc/testsuite/g++.dg/parse/non-dependent2.C new file mode 100644 index 000000000..4df2da7fa --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/non-dependent2.C @@ -0,0 +1,37 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 16 Jul 2003 <nathan@codesourcery.com> + +// A non-dependent field_decl can bind at parse time. + +template <class T> +struct Foo { + int j; // we never see this one. + int k; // { dg-error "Foo" "" } + +}; + +struct Baz +{ + int j; + int k; // { dg-error "candidates" "" } + +}; + +template <class T> +struct Bar : public Foo<T>, Baz { + + int baz () { return j; } // binds to Baz::j + int foo () { return this->k; } // { dg-error "request for member" "" } +}; + +int main() +{ + Bar<int> bar; + + bar.baz (); + bar.foo (); // { dg-message "instantiated" "" } + + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/non-dependent3.C b/gcc/testsuite/g++.dg/parse/non-dependent3.C new file mode 100644 index 000000000..9dfb99636 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/non-dependent3.C @@ -0,0 +1,17 @@ +// PR c++/14586 + +enum E { e }; + +E & operator |= (E &f1, const E &f2); + +E operator | (const E &f1, const E &f2) { + E result = f1; + result |= f2; + return result; +} + +template <typename> void foo () { + const E flags = e | e; +} + +template void foo<double> (); diff --git a/gcc/testsuite/g++.dg/parse/non-templ1.C b/gcc/testsuite/g++.dg/parse/non-templ1.C new file mode 100644 index 000000000..07bb3793a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/non-templ1.C @@ -0,0 +1,10 @@ +// PR c++/9228 +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> +// { dg-do compile } + +struct A +{ + struct B { B(int); }; +}; + +template <typename T> typename A<T>::B foo() { return 1; } // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/nontype1.C b/gcc/testsuite/g++.dg/parse/nontype1.C new file mode 100644 index 000000000..e721700af --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/nontype1.C @@ -0,0 +1,9 @@ +// Copyright (C) 2003 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +// PR c++/13289: Incorrectly reject non-type template argument that has +// dependent type + +template <class T, T t> class C {}; +template <class T, T t> class D { C<T, t-1> c; }; diff --git a/gcc/testsuite/g++.dg/parse/octal1.C b/gcc/testsuite/g++.dg/parse/octal1.C new file mode 100644 index 000000000..8d62eef3c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/octal1.C @@ -0,0 +1 @@ +int i = 08; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/offsetof1.C b/gcc/testsuite/g++.dg/parse/offsetof1.C new file mode 100644 index 000000000..ae9d3110a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/offsetof1.C @@ -0,0 +1,11 @@ +#include <stddef.h> + +template <bool> struct StaticAssert; +template <> struct StaticAssert<true> {}; + +struct MyPOD +{ + int a; int b; int c; +}; + +StaticAssert<(offsetof(MyPOD, a) == 0)> s; diff --git a/gcc/testsuite/g++.dg/parse/offsetof2.C b/gcc/testsuite/g++.dg/parse/offsetof2.C new file mode 100644 index 000000000..4552d39fe --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/offsetof2.C @@ -0,0 +1,12 @@ +#include <cstddef> + +struct choke_me +{ + int size; + char storage[1]; +}; + +struct offset_is_broken +{ + static const int offset = offsetof(choke_me, storage); +}; diff --git a/gcc/testsuite/g++.dg/parse/offsetof3.C b/gcc/testsuite/g++.dg/parse/offsetof3.C new file mode 100644 index 000000000..905e5f58a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/offsetof3.C @@ -0,0 +1,11 @@ +// PR c++/13529 + +#include <cstddef> + +struct A { int i; }; +struct B { A a; }; + +int main() +{ + return offsetof(B,a.i) != 0; +} diff --git a/gcc/testsuite/g++.dg/parse/offsetof4.C b/gcc/testsuite/g++.dg/parse/offsetof4.C new file mode 100644 index 000000000..ba051480d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/offsetof4.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// Contributed by Bill Helfinstine <bhelf at flitterfly dot whirpon dot com> +// PR c++/14932: Allow subscript operator in offsetof + +#include <cstddef> + +struct A +{ + int bar; + int foo[22]; +}; + +const int off = offsetof(A, foo[12]); diff --git a/gcc/testsuite/g++.dg/parse/offsetof5.C b/gcc/testsuite/g++.dg/parse/offsetof5.C new file mode 100644 index 000000000..553e33ded --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/offsetof5.C @@ -0,0 +1,13 @@ +// PR c++/16618 + +#include <stddef.h> + +struct test +{ + const char a; +}; + +int main() +{ + offsetof(test,a); +} diff --git a/gcc/testsuite/g++.dg/parse/offsetof6.C b/gcc/testsuite/g++.dg/parse/offsetof6.C new file mode 100644 index 000000000..0e07a5380 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/offsetof6.C @@ -0,0 +1,19 @@ +/* { dg-do compile } */ + +// From PR28573 + +struct A +{ + char d[44]; + char &operator [] ( int indx ) { return d[indx]; } +}; + +struct B +{ + A a; +}; + +int main() +{ + return __builtin_offsetof(B, a[0]); /* { dg-error "cannot apply.*offsetof" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/offsetof7.C b/gcc/testsuite/g++.dg/parse/offsetof7.C new file mode 100644 index 000000000..113a79547 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/offsetof7.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ + +// From PR28573 + +struct A +{ + int operator [] ( int indx ) { return indx; } +}; + +struct B +{ + A a; +}; + +int main() +{ + return __builtin_offsetof(B, a[0]); /* { dg-error "cannot apply.*offsetof" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/offsetof8.C b/gcc/testsuite/g++.dg/parse/offsetof8.C new file mode 100644 index 000000000..e613ddcbb --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/offsetof8.C @@ -0,0 +1,16 @@ +// PR c++/35321 + +struct A +{ + A operator[] (int); +}; + +struct B +{ + A a; +}; + +void foo() +{ + __builtin_offsetof(B, a[0]); /* { dg-error "cannot apply 'offsetof' when 'operator\\\[\\\]' is overloaded" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/offsetof9.C b/gcc/testsuite/g++.dg/parse/offsetof9.C new file mode 100644 index 000000000..efc103837 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/offsetof9.C @@ -0,0 +1,32 @@ +/* PR c/32041 */ +/* { dg-do run } */ + +struct S +{ + int c; + struct { float f; } sa[2]; +}; + +char a[__builtin_offsetof (S, sa->f) + == __builtin_offsetof (S, sa[0].f) ? 1 : -1]; + +template <int N> +struct T +{ + int c[N]; + struct { float f; } sa[N]; + static int foo () { return __builtin_offsetof (T, sa->f); } + static int bar () { return __builtin_offsetof (T, sa[0].f); } +}; + +char b[__builtin_offsetof (T<5>, sa->f) + == __builtin_offsetof (T<5>, sa[0].f) ? 1 : -1]; + +int +main () +{ + if (T<1>::foo () != T<1>::bar ()) + __builtin_abort (); + if (T<7>::foo () != T<7>::bar ()) + __builtin_abort (); +} diff --git a/gcc/testsuite/g++.dg/parse/operator1.C b/gcc/testsuite/g++.dg/parse/operator1.C new file mode 100644 index 000000000..3a534d182 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/operator1.C @@ -0,0 +1,11 @@ +/* PR c++/8982 */ +/* { dg-do compile } */ +namespace foo { + template<class X> + int operator- (X x); +} + +int main() { + using foo::operator-; // syntax error under gcc 3.2 +} + diff --git a/gcc/testsuite/g++.dg/parse/operator2.C b/gcc/testsuite/g++.dg/parse/operator2.C new file mode 100644 index 000000000..a9ebde0d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/operator2.C @@ -0,0 +1,15 @@ +// PR c++/7906 +// Origin: Marcel Loose <loose@astron.nl> +// { dg-do compile } + +template <typename> struct A { typedef int X; }; + +template <typename T> struct B +{ + typedef A<T> Y; + struct C { operator typename Y::X() const; }; +}; + +template <typename T> B<T>::C::operator typename B<T>::Y::X() const { return 0; } + +B<int> b; diff --git a/gcc/testsuite/g++.dg/parse/operator3.C b/gcc/testsuite/g++.dg/parse/operator3.C new file mode 100644 index 000000000..08f5c83f2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/operator3.C @@ -0,0 +1,11 @@ +// PR c++/9454 +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> +// { dg-do compile } + +template <int> struct A +{ + struct B { operator int (); }; + struct C : B { operator int (); }; +}; + +A<0> a; diff --git a/gcc/testsuite/g++.dg/parse/operator4.C b/gcc/testsuite/g++.dg/parse/operator4.C new file mode 100644 index 000000000..054ddc835 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/operator4.C @@ -0,0 +1 @@ +int operator *(int, ...); // { dg-error "class|variable number of arguments" } diff --git a/gcc/testsuite/g++.dg/parse/operator5.C b/gcc/testsuite/g++.dg/parse/operator5.C new file mode 100644 index 000000000..3e453bdf3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/operator5.C @@ -0,0 +1,7 @@ +// PR c++/17685 + +struct S { + operator int; // { dg-error "" } + operator void; // { dg-error "" } +}; + diff --git a/gcc/testsuite/g++.dg/parse/operator6.C b/gcc/testsuite/g++.dg/parse/operator6.C new file mode 100644 index 000000000..e58a3a682 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/operator6.C @@ -0,0 +1,5 @@ +// PR c++/25635 + +struct A {}; + +A::operator int(); // { dg-error "class" } diff --git a/gcc/testsuite/g++.dg/parse/operator7.C b/gcc/testsuite/g++.dg/parse/operator7.C new file mode 100644 index 000000000..e3464f017 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/operator7.C @@ -0,0 +1,4 @@ +// PR c++/27278 +// { dg-do compile } + +int operator+(void,void); // { dg-error "incomplete type|invalid use" } diff --git a/gcc/testsuite/g++.dg/parse/parameter-declaration-1.C b/gcc/testsuite/g++.dg/parse/parameter-declaration-1.C new file mode 100644 index 000000000..22d6f214d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parameter-declaration-1.C @@ -0,0 +1,6 @@ +// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net> +// Origin: Robert Schiele; PR C++/8799 +// { dg-do compile } + +struct { + a(void = 0; a(0), a(0) // { dg-error "" "" { target *-*-* } } diff --git a/gcc/testsuite/g++.dg/parse/parameter-declaration-2.C b/gcc/testsuite/g++.dg/parse/parameter-declaration-2.C new file mode 100644 index 000000000..7a9a24fb7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parameter-declaration-2.C @@ -0,0 +1 @@ +void f (int i, int p[i]); // { dg-error "use of parameter .i. outside function body" } diff --git a/gcc/testsuite/g++.dg/parse/parens1.C b/gcc/testsuite/g++.dg/parse/parens1.C new file mode 100644 index 000000000..f63f50143 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parens1.C @@ -0,0 +1,18 @@ +/* PR c++/8237 */ +/* { dg-do compile } */ +class A { +public: + A() { } +}; + +class B { +public: + B(A a) { } + void form() { } +}; + +int main() { + // This used to give a parse error. + B(A()).form(); +} + diff --git a/gcc/testsuite/g++.dg/parse/parens2.C b/gcc/testsuite/g++.dg/parse/parens2.C new file mode 100644 index 000000000..636dd8df3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parens2.C @@ -0,0 +1,11 @@ +/* PR c++/8842. */ +/* { dg-do compile } */ +int main( int argc, char* argv[] ) +{ + int i = 5; + // This always worked: + // double l1 = double(int(i)) / double(int(i)); + // But this used to give a parse error before the `/' token: + double l2 = (double(int(i)) / double(int(i))); +} + diff --git a/gcc/testsuite/g++.dg/parse/parse1.C b/gcc/testsuite/g++.dg/parse/parse1.C new file mode 100644 index 000000000..cbac6da15 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parse1.C @@ -0,0 +1,9 @@ +/* PR c++/50 */ +/* { dg-do compile } */ + +namespace A {typedef int Z;} +int main(void) +{ + A::Z* z; + z->A::Z::~Z(); +} diff --git a/gcc/testsuite/g++.dg/parse/parse2.C b/gcc/testsuite/g++.dg/parse/parse2.C new file mode 100644 index 000000000..80a9e38f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parse2.C @@ -0,0 +1,8 @@ +/* PR c++/67 */ +/* { dg-do compile } */ + +template <class T> struct foo { + static const int bar [3]; +}; +// Used to fail if 2+1 rather than 3. +template <class T> const int foo<T>::bar [2+1] = { 0, 0, 0 }; diff --git a/gcc/testsuite/g++.dg/parse/parse3.C b/gcc/testsuite/g++.dg/parse/parse3.C new file mode 100644 index 000000000..5f24cd159 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parse3.C @@ -0,0 +1,7 @@ +/* PR c++/80 */ +/* { dg-do compile } */ + +/* Used to get: + bug.C:7: semicolon missing after declaration of `numbers' +*/ +enum numbers { zero, one, two, three } __attribute__ ((packed)) ; diff --git a/gcc/testsuite/g++.dg/parse/parse4.C b/gcc/testsuite/g++.dg/parse/parse4.C new file mode 100644 index 000000000..9df1754ab --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parse4.C @@ -0,0 +1,25 @@ +/* PR c++/88 */ +/* { dg-do compile } */ + +class Hvec +{ +public: + Hvec(double x, double y, double z); + ~Hvec(); +}; + + +class Camera1 +{ +public: + Camera1(const Hvec &basepos=Hvec(0.0,0.0,0.0)); + ~Camera1(); +}; + +class Camera2 +{ +public: + Camera2(const Hvec &basepos); + inline Camera2() { Camera2(Hvec(0.0,0.0,0.0)); } + ~Camera2(); +}; diff --git a/gcc/testsuite/g++.dg/parse/parse5.C b/gcc/testsuite/g++.dg/parse/parse5.C new file mode 100644 index 000000000..f9e6a0359 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parse5.C @@ -0,0 +1,33 @@ +/* PR c++/590 */ +/* { dg-do compile } */ + +#include <iostream> +#include <sstream> +using namespace std; + +enum ExternalEnum { EXTERNAL_VALUE = 2 }; + +class BadStream : public ostringstream +{ +public: + enum InternalEnum { VALUE = 0 }; + BadStream( InternalEnum e ) {} + BadStream( InternalEnum e, int i ) {} +}; + +int main() +{ + ( BadStream( BadStream::VALUE ) ) << "foobar" << endl; + + BadStream((BadStream::InternalEnum)BadStream::VALUE ) << "foobar"; + + BadStream::InternalEnum in = BadStream::VALUE; + BadStream( in ) << "foobar"; + + BadStream( BadStream::VALUE, 0 ) << "foobar" << endl; + + // This didn't used to compile: + BadStream( BadStream::VALUE ) << "foobar" << endl; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/parse6.C b/gcc/testsuite/g++.dg/parse/parse6.C new file mode 100644 index 000000000..73f7256d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parse6.C @@ -0,0 +1,31 @@ +/* PR c++/3012 */ +/* { dg-do compile } */ + +class A +{ + public: + + template <class T> + void foo() const + { + } +}; + +template <class T> +class B +{ + public: + + void bar(const A& a) const + { + // Compile used to fail with parse error before `;' token + a.foo<double>(); + } +}; + +int main() +{ + A a; + B<int> b; + b.bar(a); +} diff --git a/gcc/testsuite/g++.dg/parse/parse7.C b/gcc/testsuite/g++.dg/parse/parse7.C new file mode 100644 index 000000000..3676ded4c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parse7.C @@ -0,0 +1,24 @@ +/* PR c++/3650 */ +/* { dg-do compile } */ + +class class1 { +public: + explicit class1(double a) { data = a; } + double data; +}; + +class class2 { +public: + class2(class1 a, float t) { } + class2(float t, class1 a) { } +}; + +int main() { + float t2 = 1.5; + double pir = 3.14159; + // Used to get: error: type specifier omitted for parameter `t2' + class2 h(class1(double(pir)), t2); + class2 i(class1(pir), t2); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/parser-pr14875-2.C b/gcc/testsuite/g++.dg/parse/parser-pr14875-2.C new file mode 100644 index 000000000..3510aac90 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parser-pr14875-2.C @@ -0,0 +1,31 @@ +// PR 14875: When using 'or' keyword, the error message speaks of a '||' token +// { dg-do compile } +// { dg-options "" } +#define CHECK(x) void ::x + CHECK (and); // { dg-error "before .and. token" } + CHECK (and_eq); // { dg-error "before .and_eq. token" } + CHECK (bitand); // { dg-error "before .bitand. token" } + CHECK (bitor); // { dg-error "before .bitor. token" } + CHECK (compl); // { dg-error "before .compl. token" } + CHECK (not); // { dg-error "before .not. token" } + CHECK (not_eq); // { dg-error "before .not_eq. token" } + CHECK (or); // { dg-error "before .or. token" } + CHECK (or_eq); // { dg-error "before .or_eq. token" } + CHECK (xor); // { dg-error "before .xor. token" } + CHECK (xor_eq); // { dg-error "before .xor_eq. token" } +#undef CHECK +#define CHECK(x) int x + CHECK (<:); // { dg-error "before .<:. token" } + CHECK (:>); // { dg-error "before .:>. token" } +#undef CHECK +#define CHECK(x) x + CHECK (<%); // { dg-error "before .<%. token" } +#undef CHECK +#define CHECK(x) x x + CHECK (%>); // { dg-error "before .%>. token" } +#undef CHECK +#define CHECK(x) x + CHECK (%:); // { dg-error "stray .%:. " } + CHECK (%:%:); // { dg-error "stray .%:%:. " } + + diff --git a/gcc/testsuite/g++.dg/parse/parser-pr14875.C b/gcc/testsuite/g++.dg/parse/parser-pr14875.C new file mode 100644 index 000000000..7a6f06186 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parser-pr14875.C @@ -0,0 +1,20 @@ +// PR 14875: When using 'or' keyword, the error message speaks of a '||' token +// { dg-do compile } +// { dg-options "" } +using namespace std; + +class Sample +{ + +public: + Sample(); + void or(long Digital); // { dg-error "before .or. token" } +}; + +Sample::Sample() +{ +} + +void Sample::or(long Digital) // { dg-error "before .or. token" } +{ +} diff --git a/gcc/testsuite/g++.dg/parse/parser-pr28152-2.C b/gcc/testsuite/g++.dg/parse/parser-pr28152-2.C new file mode 100644 index 000000000..bcccb94a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parser-pr28152-2.C @@ -0,0 +1,13 @@ +/* PR 28152: error messages should mention __complex__ */ +/* { dg-do compile } */ +/* { dg-options "" } */ +int +main (void) +{ + __complex__ float z; + + z = __complex__ (1.90000007326203904e+19, 0.0); // { dg-error "expected primary-expression before '__complex__'" } + // { dg-error "expected .;. before .__complex__." "" { target *-*-* } 9 } + z = __complex__ (1.0e+0, 0.0) / z; // { dg-error "expected primary-expression before '__complex__'" } + // { dg-error "expected .;. before '__complex__'" "" { target *-*-* } 11 } + // { dg-error "at end of input" "" { target *-*-* } 11 } diff --git a/gcc/testsuite/g++.dg/parse/parser-pr28152.C b/gcc/testsuite/g++.dg/parse/parser-pr28152.C new file mode 100644 index 000000000..5b3a25e18 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parser-pr28152.C @@ -0,0 +1,13 @@ +/* PR 28152: error messages should mention _Complex */ +/* { dg-do compile } */ +/* { dg-options "" } */ +int +main (void) +{ + _Complex float z; + + z = _Complex (1.90000007326203904e+19, 0.0); // { dg-error "expected primary-expression before '_Complex'" } + // { dg-error "expected .;. before ._Complex." "" { target *-*-* } 9 } + z = _Complex (1.0e+0, 0.0) / z; // { dg-error "expected primary-expression before '_Complex'" } + // { dg-error "expected .;. before '_Complex'" "" { target *-*-* } 11 } + // { dg-error "at end of input" "" { target *-*-* } 11 } diff --git a/gcc/testsuite/g++.dg/parse/pr16696-permissive.C b/gcc/testsuite/g++.dg/parse/pr16696-permissive.C new file mode 100644 index 000000000..1d8a920ad --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr16696-permissive.C @@ -0,0 +1,17 @@ +// PR 16696 Strange message when operator++ not found +// { dg-do compile } +// { dg-options "-fdiagnostics-show-option -fpermissive" } + + +struct X { void operator++(); }; +struct Y { }; + +int main () { + X x; + Y y; + x++; // { dg-warning "trying prefix operator" } + + y++; // { dg-warning "trying prefix operator" } + // { dg-error "no match" "" { target *-*-* } 14 } +} + diff --git a/gcc/testsuite/g++.dg/parse/pr16696.C b/gcc/testsuite/g++.dg/parse/pr16696.C new file mode 100644 index 000000000..902e2a1a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr16696.C @@ -0,0 +1,17 @@ +// PR 16696 Strange message when operator++ not found +// { dg-do compile } +// { dg-options "-fdiagnostics-show-option" } + + +struct X { void operator++(); }; +struct Y { }; + +int main () { + X x; + Y y; + x++; // { dg-bogus "trying prefix operator" } + // { dg-error "fpermissive" "" { target *-*-* } 12 } + y++; // { dg-bogus "trying prefix operator" } + // { dg-error "fpermissive" "" { target *-*-* } 14 } +} + diff --git a/gcc/testsuite/g++.dg/parse/pr20118.C b/gcc/testsuite/g++.dg/parse/pr20118.C new file mode 100644 index 000000000..94e000a6f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr20118.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// { dg-options "-fshow-column" } +template<typename t>struct foo { + static const int i; }; + +const int foo<bool>::i = 5; // { dg-error "11:specializing member .foo<bool>::i. requires .template<>. syntax" } + +int main() { return 0; } + diff --git a/gcc/testsuite/g++.dg/parse/pr26997.C b/gcc/testsuite/g++.dg/parse/pr26997.C new file mode 100644 index 000000000..acd1e07be --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr26997.C @@ -0,0 +1,50 @@ +// PR c++/26997 +// { dg-do compile } +void * malloc (unsigned long size); +typedef struct { int a; } t; + +void foo() +{ + t *v3; + v3 = (t *) + malloc( + sizeof(t) + * + t->a // { dg-error "before '->' token" } + ); +} + +class C { +public: + void operator[](int); +}; + +C bar (void) +{ + (C ())(3); // { dg-error "invalid cast" } + return (C ()); +} + +extern void baz (C,C); + +void foo1 (void) +{ + baz ((C()), (C())); +} + +struct S { + void operator()(int); +}; + +int *var; +void foo2 (void) +{ + C ()[2]; + (C ())[2]; + (S ())(3); // { dg-error "invalid cast" } + (C())*var; // { dg-error "invalid cast" } + (C())+var; // { dg-error "invalid cast" } + S()(3); + (S()(3)); +} + diff --git a/gcc/testsuite/g++.dg/parse/pr37862.C b/gcc/testsuite/g++.dg/parse/pr37862.C new file mode 100644 index 000000000..89b4b6994 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr37862.C @@ -0,0 +1,25 @@ +// { dg-do run } +#include <stdlib.h> + +class A { +public: + virtual void get (void) { } +}; + +class B : public A { +public: + void get (void) { abort (); } +}; + +class C : public B { }; + +int main (void) +{ + C c; + C * p = &c; + + p->A::get (); + (p->A::get) (); // The C++ parser used to resolve this to B::get() + + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/pr56239.C b/gcc/testsuite/g++.dg/parse/pr56239.C new file mode 100644 index 000000000..08f7f6889 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr56239.C @@ -0,0 +1,13 @@ +// PR c++/56239 +// { dg-do compile } + +struct S +{ + int operator () () { return 0; } +}; + +int +main () +{ + return (S ()) (); +} diff --git a/gcc/testsuite/g++.dg/parse/pragma1.C b/gcc/testsuite/g++.dg/parse/pragma1.C new file mode 100644 index 000000000..88a56aafb --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pragma1.C @@ -0,0 +1,8 @@ +// PR c++/17916 + +class T { +#pragma X + struct S { + }; +#pragma Y +}; diff --git a/gcc/testsuite/g++.dg/parse/pragma2.C b/gcc/testsuite/g++.dg/parse/pragma2.C new file mode 100644 index 000000000..c5616ff74 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pragma2.C @@ -0,0 +1,8 @@ +// PR c++/17595 + +// Ideally, the #pragma error would come one line further down, but it +// does not. +int f(int x, +#pragma interface // { dg-error "not allowed here" } + // The parser gets confused and issues an error on the next line. + int y); // { dg-bogus "" "" { xfail *-*-* } } diff --git a/gcc/testsuite/g++.dg/parse/pragma3.C b/gcc/testsuite/g++.dg/parse/pragma3.C new file mode 100644 index 000000000..36d7a8c62 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pragma3.C @@ -0,0 +1,26 @@ +// PR c++/25294 +// { dg-do run } + +extern "C" void abort (void); + +struct S +{ + char a[3]; +#pragma pack(1) /* A block comment + that ends on the next line. */ + struct T + { + char b; + int c; + } d; +#pragma pack /*/ */ () // C++ comment + int e; +} s; + +int +main () +{ + if (sizeof (int) == 4 && sizeof (s) != 12) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/primary-expression-1.C b/gcc/testsuite/g++.dg/parse/primary-expression-1.C new file mode 100644 index 000000000..931ecd88a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/primary-expression-1.C @@ -0,0 +1,58 @@ +// Copyright (C) 2002 Free Software Foundation +// Origin: C++/717 +// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net +// { dg-do compile } + +class _eAny +{ +public: + _eAny(){} +}; + +template <class X> +class _eSeq +{ +public: + _eSeq(const X thing){} + int _oHash() {return 0;} + _eSeq<X > _oPlusPlus(const _eSeq<X > other) const + { + return *this; + } + _eSeq<X > take(const _eSeq<X > other) const + { + return *this; + } +}; + + +template <class X> +class _eHndl +{ +public: + _eHndl(const _eAny *obj){} +}; + +class VarInstances : public _eAny +{ +public: + VarInstances() : _eAny() {} +}; + +void testFunc(const VarInstances *testInstance) +{ + const _eSeq<_eHndl<VarInstances> > temp1 = + _eSeq<_eHndl<VarInstances> >(_eHndl<VarInstances>(testInstance)); + + if((_eSeq<_eHndl<VarInstances> + >(_eHndl<VarInstances>(testInstance))._oPlusPlus(temp1)._oHash() == + 7)) + { + return; + } +} + +int main(int argc, char** argv) +{ + testFunc(new VarInstances()); +} diff --git a/gcc/testsuite/g++.dg/parse/ptrmem1.C b/gcc/testsuite/g++.dg/parse/ptrmem1.C new file mode 100644 index 000000000..b1174c7d9 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ptrmem1.C @@ -0,0 +1,10 @@ +struct A { + void f(int = 0) const; +}; + +typedef void (A::*PF)(int) const; + +void f() +{ + PF pf = &A::f; +} diff --git a/gcc/testsuite/g++.dg/parse/ptrmem2.C b/gcc/testsuite/g++.dg/parse/ptrmem2.C new file mode 100644 index 000000000..bbc116e99 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ptrmem2.C @@ -0,0 +1,11 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 2 Dec 2004 <nathan@codesourcery.com> + +// PR 18782: ICE with ptr-to-member +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +namespace A {} + +int A::* p; // { dg-error "is a namespace" "" } diff --git a/gcc/testsuite/g++.dg/parse/ptrmem3.C b/gcc/testsuite/g++.dg/parse/ptrmem3.C new file mode 100644 index 000000000..444f25cd2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ptrmem3.C @@ -0,0 +1,11 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 14 Feb 2005 <nathan@codesourcery.com> + +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> +// Bug 19895: ICE on invalid + + +template<typename> struct A +{ + int A<0>::* p; // { dg-error "(type/value mismatch)|(expected)" "" } +}; diff --git a/gcc/testsuite/g++.dg/parse/ptrmem4.C b/gcc/testsuite/g++.dg/parse/ptrmem4.C new file mode 100644 index 000000000..fea08f206 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ptrmem4.C @@ -0,0 +1,4 @@ +// PR c++/26295 + +namespace A {} +int (A::*B)(); // { dg-error "namespace" } diff --git a/gcc/testsuite/g++.dg/parse/ptrmem5.C b/gcc/testsuite/g++.dg/parse/ptrmem5.C new file mode 100644 index 000000000..1101ad9fd --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ptrmem5.C @@ -0,0 +1,9 @@ +// PR c++/27806 + +struct A {}; + +void foo() +{ + p; // { dg-error "p" } + extern int A::* p; +} diff --git a/gcc/testsuite/g++.dg/parse/ptrmem6.C b/gcc/testsuite/g++.dg/parse/ptrmem6.C new file mode 100644 index 000000000..6dac21cf9 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ptrmem6.C @@ -0,0 +1,11 @@ +//PR C++/27805 + +struct A; + +void foo() +{ + int A::* p; + A a; // { dg-error "incomplete type" } + a.*p; +} + diff --git a/gcc/testsuite/g++.dg/parse/pure1.C b/gcc/testsuite/g++.dg/parse/pure1.C new file mode 100644 index 000000000..2b6f28b7d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pure1.C @@ -0,0 +1,11 @@ +// PR c++/28506 + +struct A +{ + virtual void* foo() = 1; // { dg-error "pure" } +}; + +struct B +{ + void operator()()() = 1; // { dg-error "pure|function|initializer" } +}; diff --git a/gcc/testsuite/g++.dg/parse/qualified1.C b/gcc/testsuite/g++.dg/parse/qualified1.C new file mode 100644 index 000000000..6dfb87e17 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/qualified1.C @@ -0,0 +1,14 @@ +struct A {}; + +struct B : public A +{ + static void foo (); +}; + +template <typename T> struct C +{ + C() : f(B::foo) {} + void (*f)(); +}; + +C<int> c; diff --git a/gcc/testsuite/g++.dg/parse/qualified2.C b/gcc/testsuite/g++.dg/parse/qualified2.C new file mode 100644 index 000000000..c582613c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/qualified2.C @@ -0,0 +1,4 @@ +namespace Glib { + template <typename> class Value {}; + template <> class Glib::Value<int> {}; // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/parse/qualified3.C b/gcc/testsuite/g++.dg/parse/qualified3.C new file mode 100644 index 000000000..ab160ab8d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/qualified3.C @@ -0,0 +1,8 @@ +// PR c++/18466 + +int ::i; // { dg-error "" } +void ::f(); // { dg-error "" } +namespace N { + int N::j; // { dg-error "" } + void N::g(); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/parse/qualified4.C b/gcc/testsuite/g++.dg/parse/qualified4.C new file mode 100644 index 000000000..c827fcfe7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/qualified4.C @@ -0,0 +1,6 @@ +// PR c++/16782 +// { dg-options "" } + +struct X { + void X::bar() {} // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/parse/redef1.C b/gcc/testsuite/g++.dg/parse/redef1.C new file mode 100644 index 000000000..0235ffb72 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/redef1.C @@ -0,0 +1,10 @@ +// { dg-options "" } +// PR c++/16193 + +# 1 "syshdr1.C" +# 1 "syshdr1.h" 1 3 +// Redefinitions of built-in types are allowed in system headers so +// that G++ will work with system headers that are not fully +// C++-aware. +typedef long wchar_t; +# 2 "syshdr1.C" 2 diff --git a/gcc/testsuite/g++.dg/parse/redef2.C b/gcc/testsuite/g++.dg/parse/redef2.C new file mode 100644 index 000000000..2435672d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/redef2.C @@ -0,0 +1,7 @@ +// { dg-do compile } + +char * d [10]; // { dg-error "8: 'd' has a previous declaration as" } +char e [15][10]; +int (*f)(); + +int d; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/ref1.C b/gcc/testsuite/g++.dg/parse/ref1.C new file mode 100644 index 000000000..d1dffb067 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ref1.C @@ -0,0 +1,17 @@ +// PR c++/6402 +// Origin: Wolfgang Bangerth <wolfgang@dealii.org> +// { dg-do compile } + +class A +{ + A (const A&); + public: + A(); +}; + +struct B { A a; }; + +struct C : public B +{ + void foo() { const A &ref = B::a; } // taking reference, not a copy! +}; diff --git a/gcc/testsuite/g++.dg/parse/register1.C b/gcc/testsuite/g++.dg/parse/register1.C new file mode 100644 index 000000000..3be2e6525 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/register1.C @@ -0,0 +1,14 @@ +// PR c++/23839 + +class C +{ + int i; +public: + C(int j) : i(j) { } + operator int() { return i; } +}; + +C f (register C x) +{ + return x + 31; +} diff --git a/gcc/testsuite/g++.dg/parse/repo1.C b/gcc/testsuite/g++.dg/parse/repo1.C new file mode 100644 index 000000000..efadd5872 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/repo1.C @@ -0,0 +1,10 @@ +// { dg-options "-frepo" } +// { dg-require-host-local "" } + +extern "C" inline void f() {} + +int main () { + f(); +} + +// { dg-final { cleanup-repo-files } } diff --git a/gcc/testsuite/g++.dg/parse/ret-type1.C b/gcc/testsuite/g++.dg/parse/ret-type1.C new file mode 100644 index 000000000..a5dc93ab0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ret-type1.C @@ -0,0 +1,10 @@ +// PR c++/2738 +// Origin: Wolfgang Bangerth <wolfgang.bangerth@iwr.uni-heidelberg.de> +// { dg-do compile } + +template <int i> class A +{ + class C { C(); }; +}; + +template <int i> void A<i>::C::C () {} // { dg-error "return type" } diff --git a/gcc/testsuite/g++.dg/parse/ret-type2.C b/gcc/testsuite/g++.dg/parse/ret-type2.C new file mode 100644 index 000000000..35638c28a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ret-type2.C @@ -0,0 +1,10 @@ +struct S {} f(); // { dg-error "return" "err" } +// { dg-message "note" "note" { target *-*-* } 1 } +struct T {} *g(); // { dg-error "return" } +// { dg-message "note" "note" { target *-*-* } 3 } +struct U {} h() {} // { dg-error "return" } +// { dg-message "note" "note" { target *-*-* } 5 } +struct V {} *i() {} // { dg-error "return" } +// { dg-message "note" "note" { target *-*-* } 7 } +struct W {} (*p) (); // { dg-error "return" } +// { dg-message "note" "note" { target *-*-* } 9 } diff --git a/gcc/testsuite/g++.dg/parse/ret-type3.C b/gcc/testsuite/g++.dg/parse/ret-type3.C new file mode 100644 index 000000000..33ee31748 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ret-type3.C @@ -0,0 +1,8 @@ +// PR c++/21369 + +struct bar; + +template <class T> struct bar *foo (T *p) +{ + return p->t; +} diff --git a/gcc/testsuite/g++.dg/parse/saved1.C b/gcc/testsuite/g++.dg/parse/saved1.C new file mode 100644 index 000000000..f7281088f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/saved1.C @@ -0,0 +1,6 @@ +// Test that the parser doesn't go into an infinite loop from ignoring the +// PRE_PARSED_FUNCTION_DECL token. + +class C { static void* operator new(size_t); }; // { dg-error "" "" } +void* C::operator new(size_t) { return 0; } // { dg-error "" "" } +class D { D(int i): integer(i){}}; // { dg-error "" "" } diff --git a/gcc/testsuite/g++.dg/parse/semicolon1.C b/gcc/testsuite/g++.dg/parse/semicolon1.C new file mode 100644 index 000000000..22c1e86e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/semicolon1.C @@ -0,0 +1,4 @@ +// PR c++/12479 +// { dg-options "-pedantic" } + +#include "semicolon1.h" diff --git a/gcc/testsuite/g++.dg/parse/semicolon1.h b/gcc/testsuite/g++.dg/parse/semicolon1.h new file mode 100644 index 000000000..0487fc783 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/semicolon1.h @@ -0,0 +1,2 @@ +#pragma GCC system_header +; diff --git a/gcc/testsuite/g++.dg/parse/semicolon2.C b/gcc/testsuite/g++.dg/parse/semicolon2.C new file mode 100644 index 000000000..d14a225a6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/semicolon2.C @@ -0,0 +1,9 @@ +// PR c++/45332 +// { dg-do compile } + +class C +{ + int x // { dg-error "at end of member declaration" } + + const int foo() { return x; } +}; diff --git a/gcc/testsuite/g++.dg/parse/semicolon3.C b/gcc/testsuite/g++.dg/parse/semicolon3.C new file mode 100644 index 000000000..8a2b1ac46 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/semicolon3.C @@ -0,0 +1,260 @@ +// PR c++/45331 +// { dg-do compile } +// { dg-options -std=c++98 } + +struct OK1 +{ + int a; +} // no complaints + *s5; + +struct OK2 +{ + int a; +} // no complaints + &s6 = *(new OK2()); + +struct OK3 +{ + int a; +} // no complaints + (s7); + +__SIZE_TYPE__ +test_offsetof (void) +{ + // no complaints about a missing semicolon + return __builtin_offsetof (struct OK4 { int a; int b; }, b); +} + +struct OK5 +{ + int a; +} ok5_var; // no complaints + +struct OK6 +{ + int a; +} static ok6_var; // no complaints + +class OK7 +{ +public: + OK7() { }; + int a; +} const ok7_var; // no complaints + +class OK8 +{ + int a; +} extern ok8_var; // no complaints + +class OK9 +{ + class OK9sub { int a; } mutable ok9sub; // no complaints + int a; +}; + +int +autotest (void) +{ + struct OK10 { int a; } auto ok10 = { 0 }; // no complaints + + return ok10.a; +} + +struct OK11 +{ + int a; +} // no complaints + const *ok11_var; + +struct OK12 +{ + int a; +} // no complaints + const &ok12_var = *(new OK12()); + +struct OK13 +{ + int a; +} // no complaints + static *ok13_var; + +class OK14 +{ + struct OK14sub + { + int a; + } // no complaints + static &ok14_var; +}; + +class OK15 +{ + int a; +} typedef tOK15; + +class OK16 +{ + int a; +} typedef *pOK16; + +class OK17 +{ + int a; +} typedef &rOK16; + +struct E1 +{ + int a; +} // { dg-error "after struct definition" } + +typedef float BAR; + +struct E2 +{ + int a; +} // { dg-error "after struct definition" } + +const int i0 = 1; + +struct E3 +{ + int a; +} // { dg-error "after struct definition" } + +volatile long l0 = 1; + +struct E4 +{ + int a; +} // { dg-error "after struct definition" } + +extern char c0; + +struct E5 +{ + int a; +} // { dg-error "after struct definition" } + +static wchar_t wc0; + +struct E6 +{ + int a; +} // { dg-error "after struct definition" } + +bool b0; + +class E7 +{ + int a; +} // { dg-error "after class definition" } + +extern double d0; + +class E8 +{ + int a; +} // { dg-error "after class definition" } + +inline short f(void) +{ + return 2; +} + +class E9 +{ + int a; +} // { dg-error "after class definition" } + +class D0 +{ + int a; +}; + +class E10 +{ + int a; +} // { dg-error "after class definition" } + +extern class D0 &f0 (void); + +class E11 +{ + int a; +} // { dg-error "after class definition" } + +const struct E6 *f1 (void) { return 0; } + +union U0 { + int i; + double d; +}; + +class E12 +{ + int a; +} // { dg-error "after class definition" } + +const union U0 *f2 (void) { return 0; } + +enum e { + U, V +}; + +class E13 +{ + int a; +} // { dg-error "after class definition" } + +static enum e f3 (void) { return U; } + +union E14 +{ + int i; + double d; +} // { dg-error "after union definition" } + +unsigned int i1 = 2; + +union E15 +{ + int i; + double d; +} // { dg-error "after union definition" } + +signed long l1 = 3; + +class E16 +{ + class sub0 { int a; } // { dg-error "after class definition" } + virtual int f2 (void); +} // { dg-error "after class definition" } + +class E17 +{ + class sub0 { int a; } // { dg-error "after class definition" } + mutable int i; +} // { dg-error "after class definition" } + +class E18 +{ + int a; +} // { dg-error "after class definition" } + +typedef int E18int; + +/* This was the original test from the PR. */ + +class C0 +{ +public: + int a; +} // { dg-error "after class definition" } + +const int foo(const C0 &x) +{ + return x.a; +} diff --git a/gcc/testsuite/g++.dg/parse/semicolon4.C b/gcc/testsuite/g++.dg/parse/semicolon4.C new file mode 100644 index 000000000..adba7a873 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/semicolon4.C @@ -0,0 +1,37 @@ +// PR c++/46890 +// { dg-do compile } + +struct OK1 +{ + int i; +} const *ok1_var; // No complains + +struct OK2; +extern OK2 ok2a_var; + +struct OK2 +{ + int i; +} const &ok2_var = ok2a_var; // No complains + +struct OK3 +{ + int i; +} volatile (ok3_var); // No complains + +struct E1 +{ + int i; +} const; // { dg-error "qualifiers can only be specified for objects and functions" } + +void foo ( +struct E2 +{ // { dg-error "types may not be defined in parameter types" } + int i; +} volatile); + +void bar ( +struct E3 +{ // { dg-error "types may not be defined in parameter types" } + int i; +} const, int); diff --git a/gcc/testsuite/g++.dg/parse/specialization1.C b/gcc/testsuite/g++.dg/parse/specialization1.C new file mode 100644 index 000000000..8a47f1772 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/specialization1.C @@ -0,0 +1,7 @@ +// PR c++/5723, PR c++/8522 +// Origin: Matthias Kleinmann, Peter Karl Mueller <peter.karl.mueller@gmx.de> +// { dg-do compile } + +template <typename T> class A; +template <typename T> class A<T>::B; // { dg-error "declaration" "err" } +// { dg-warning "declaration" "warn" { target *-*-* } 6 } diff --git a/gcc/testsuite/g++.dg/parse/stack1.C b/gcc/testsuite/g++.dg/parse/stack1.C new file mode 100644 index 000000000..ac26e6006 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/stack1.C @@ -0,0 +1,14 @@ +/* PR c/2161: parser stack overflow. */ +/* { dg-do compile } */ + +#define ONE else if (0) { } +#define TEN ONE ONE ONE ONE ONE ONE ONE ONE ONE ONE +#define HUN TEN TEN TEN TEN TEN TEN TEN TEN TEN TEN +#define THOU HUN HUN HUN HUN HUN HUN HUN HUN HUN HUN + +void foo() +{ + if (0) { } + /* 11,000 else if's. */ + THOU THOU THOU THOU THOU THOU THOU THOU THOU THOU THOU +} diff --git a/gcc/testsuite/g++.dg/parse/stmtexpr1.C b/gcc/testsuite/g++.dg/parse/stmtexpr1.C new file mode 100644 index 000000000..4455398bc --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/stmtexpr1.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// { dg-options "" } + +int +main (int argc, char **argv) +{ + int a = ({ 1 ? 0 : 1; }); + return ({ argc > 1 ? 1 : 0; }); +} diff --git a/gcc/testsuite/g++.dg/parse/stmtexpr2.C b/gcc/testsuite/g++.dg/parse/stmtexpr2.C new file mode 100644 index 000000000..44f7f85bc --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/stmtexpr2.C @@ -0,0 +1,11 @@ +// { dg-do compile } +// { dg-options "" } + +#define DMAX(a,b) ({double _a = (a), _b = (b); _a > _b ? _a : _b; }) + +void foo(void) +{ + double xl, dy; + xl = DMAX(dy, 0.0); +} + diff --git a/gcc/testsuite/g++.dg/parse/stmtexpr3.C b/gcc/testsuite/g++.dg/parse/stmtexpr3.C new file mode 100644 index 000000000..79f689316 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/stmtexpr3.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// { dg-options "" } + +struct B +{ + int a; + B() : a(({ 1; })) {} +}; diff --git a/gcc/testsuite/g++.dg/parse/struct-1.C b/gcc/testsuite/g++.dg/parse/struct-1.C new file mode 100644 index 000000000..6e0d93aad --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/struct-1.C @@ -0,0 +1,4 @@ +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// PR c++/18731 + +template<typename T> struct T::A {}; // { dg-error "invalid class name" } diff --git a/gcc/testsuite/g++.dg/parse/struct-2.C b/gcc/testsuite/g++.dg/parse/struct-2.C new file mode 100644 index 000000000..b63045bf9 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/struct-2.C @@ -0,0 +1,7 @@ +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// PR c++/18731 + +template<typename T> struct A +{ + struct T::B {}; // { dg-error "invalid class name" } +}; diff --git a/gcc/testsuite/g++.dg/parse/struct-3.C b/gcc/testsuite/g++.dg/parse/struct-3.C new file mode 100644 index 000000000..8e73ce4f0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/struct-3.C @@ -0,0 +1,10 @@ +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// PR c++/18731 + +struct A +{ + struct B; + typedef B C; +}; + +struct A::C {}; // { dg-error "invalid class name" } diff --git a/gcc/testsuite/g++.dg/parse/struct-4.C b/gcc/testsuite/g++.dg/parse/struct-4.C new file mode 100644 index 000000000..6d01f3e88 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/struct-4.C @@ -0,0 +1,13 @@ +/* PR c/35437 */ +/* { dg-do compile } */ + +struct A +{ + int i; + struct A a; /* { dg-error "has incomplete type" } */ +}; + +void foo() +{ + struct A b = { 0 }; +} diff --git a/gcc/testsuite/g++.dg/parse/struct-as-enum1.C b/gcc/testsuite/g++.dg/parse/struct-as-enum1.C new file mode 100644 index 000000000..f58c73881 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/struct-as-enum1.C @@ -0,0 +1,10 @@ +// PR c++/163, PR c++/8595 +// Origin: <martin@loewis.home.cs.tu-berlin.de>, Mark Leone <mleone@pixar.com> +// { dg-do compile } + +namespace N +{ + struct A {}; // { dg-error "previous declaration" } +} + +typedef enum N::A B; // { dg-error "enum|invalid type" } diff --git a/gcc/testsuite/g++.dg/parse/template1.C b/gcc/testsuite/g++.dg/parse/template1.C new file mode 100644 index 000000000..d7bbb073f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template1.C @@ -0,0 +1,11 @@ +struct CPU { + typedef int (*pfun)(); + + template <pfun step1> + static int dispatch(); +}; + +template<int> +static int foo(); + +template int CPU::dispatch<&template foo<2> > (); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/template10.C b/gcc/testsuite/g++.dg/parse/template10.C new file mode 100644 index 000000000..d5dec6ed1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template10.C @@ -0,0 +1,15 @@ +// PR c++/9486 +// Origin: John Levon <levon@movementarian.org> +// { dg-do compile } + +template <typename> struct A +{ + template <typename T> void foo(T); +}; + +template <typename T> void bar() +{ + A<void>().template foo<T>(0); +} + +template void bar<int>(); diff --git a/gcc/testsuite/g++.dg/parse/template11.C b/gcc/testsuite/g++.dg/parse/template11.C new file mode 100644 index 000000000..e651a3bd0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template11.C @@ -0,0 +1,15 @@ +// PR c++/9488 +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> +// { dg-do compile } + +struct A +{ + template <typename> void foo() {} +}; + +template <typename T> struct B +{ + void bar() { A().foo<T>(); } +}; + +template struct B<int>; diff --git a/gcc/testsuite/g++.dg/parse/template12.C b/gcc/testsuite/g++.dg/parse/template12.C new file mode 100644 index 000000000..ba375bc43 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template12.C @@ -0,0 +1,10 @@ +template <int J> +struct A { +}; + +struct B { + template <int I> + struct C : public A<I> {}; + + typedef double I; +}; diff --git a/gcc/testsuite/g++.dg/parse/template13.C b/gcc/testsuite/g++.dg/parse/template13.C new file mode 100644 index 000000000..b1c03690b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template13.C @@ -0,0 +1,10 @@ +// PR c++/14002 + +template <typename T> void foo (T x) { x; } + +void bar() { foo(0); } + +struct A +{ + friend void foo<int> (int); +}; diff --git a/gcc/testsuite/g++.dg/parse/template14.C b/gcc/testsuite/g++.dg/parse/template14.C new file mode 100644 index 000000000..ada875243 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template14.C @@ -0,0 +1,17 @@ +// PR c++/14550 + +struct A { + A(); +}; + +template <int> void foo() +{ + A *p = new A; +} + +void bar() +{ + foo<0>(); +} + + diff --git a/gcc/testsuite/g++.dg/parse/template15.C b/gcc/testsuite/g++.dg/parse/template15.C new file mode 100644 index 000000000..ce2d13036 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template15.C @@ -0,0 +1,26 @@ +// { dg-do compile } +// Contributed by: Peter Schmid +// <schmid at snake dot iap dot physik dot tu-darmstadt dot de> +// PR c++/14545: constructor calls are not integer constant expressions + +struct A1 { A1(); }; +struct A2 { }; + +template <class T> +struct B +{ + void foo() { + A1(); + A1 a1 = A1(); + + A2(); + A2 a2 = A2(); + + int(); + int a3 = int(); + float(); + float a4 = float(); + } +}; + +template struct B<void>; diff --git a/gcc/testsuite/g++.dg/parse/template16.C b/gcc/testsuite/g++.dg/parse/template16.C new file mode 100644 index 000000000..bc41b0f45 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template16.C @@ -0,0 +1,15 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 May 2005 <nathan@codesourcery.com> + +// Origin:Volker Reichelt reichelt@gcc.gnu.org +// PR 21681. ICE with inappropriate access check. + +template<int X> struct A; + +struct B +{ + template<int N> void foo() + { + A<N>::X::Y; + } +}; diff --git a/gcc/testsuite/g++.dg/parse/template17.C b/gcc/testsuite/g++.dg/parse/template17.C new file mode 100644 index 000000000..ade598d39 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template17.C @@ -0,0 +1,13 @@ +// PR c++/23841 + +template <int I> +struct S +{ + int f(int i = I) { return i; } +}; + +void +g () +{ + S<(int)0.> a2; +} diff --git a/gcc/testsuite/g++.dg/parse/template18.C b/gcc/testsuite/g++.dg/parse/template18.C new file mode 100644 index 000000000..98209b244 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template18.C @@ -0,0 +1,52 @@ +// PR c++/22173 + +struct A +{ + static void a1(); + template <typename T> + static void b1(T); + template <int I> + struct B { + static void b1(); + template <typename T> + static void b2(T); + }; + struct C { + static void c1(); + }; +}; + +template<int I> void f1() +{ + A* p; + A::template a1(); // { dg-error "template" } + A::template b1(0); + p->template a1(); // { dg-error "template" } + p->template b1('a'); + + A::template B<0>::b1(); + A::template B<0>::template b1(); // { dg-error "template" } + A::template B<0>::template b2(0); + A::template B<0>::template b2<double>(0); + + // Because B<I> is dependent, none of these are errors, as this + // function is not instantiated. + A::template B<I>::b1(); + A::template B<I>::template b1(); + A::template B<I>::template b2(0); + A::template B<I>::template b2<double>(0); + + A::template C::c1(); // { dg-error "template" } +} + +template<int I> void f2() +{ + // These are copies of lines from f1, but this function is + // instantiated, so we should get errors here. + A::template B<I>::b1(); + A::template B<I>::template b1(); // { dg-error "template" } + A::template B<I>::template b2(0); + A::template B<I>::template b2<double>(0); +} + +template void f2<0>(); // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/parse/template19.C b/gcc/testsuite/g++.dg/parse/template19.C new file mode 100644 index 000000000..dc1a67334 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template19.C @@ -0,0 +1,11 @@ +// PR c++/26558 +// Origin: Jan Gorski <slimak@yk74.internetdsl.tpnet.pl> +// { dg-do compile } + +template<int> struct A +{ + template<int> void foo() + { + foo<0>::; // { dg-error "before" } + } +}; diff --git a/gcc/testsuite/g++.dg/parse/template2.C b/gcc/testsuite/g++.dg/parse/template2.C new file mode 100644 index 000000000..6689c8bfa --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template2.C @@ -0,0 +1,7 @@ +namespace N { + template < typename T > class C : T {}; +} + +int main() { + N::C(); // { dg-error "template" } +} diff --git a/gcc/testsuite/g++.dg/parse/template20.C b/gcc/testsuite/g++.dg/parse/template20.C new file mode 100644 index 000000000..2705f4629 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template20.C @@ -0,0 +1,7 @@ +// PR c++/28858 +// { dg-do compile } + +template<int N struct A; // { dg-error "before" } + +bool i = 1 > 0; // { dg-bogus "" } +int j = i; // { dg-bogus "" } diff --git a/gcc/testsuite/g++.dg/parse/template21.C b/gcc/testsuite/g++.dg/parse/template21.C new file mode 100644 index 000000000..e1ac76916 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template21.C @@ -0,0 +1,5 @@ +// PR c++/28211 + +template <const int*> class Helper { }; +const int foo = 0; +typedef Helper<&foo> HelperType; // { dg-error "linkage|type" } diff --git a/gcc/testsuite/g++.dg/parse/template22.C b/gcc/testsuite/g++.dg/parse/template22.C new file mode 100644 index 000000000..c93375685 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template22.C @@ -0,0 +1,5 @@ +/* PR c++/29731. This used to ICE in uses_template_parms. */ + +template<int> struct A {}; + +A<({})> a; /* { dg-error "forbids braced-groups within expressions|statement-expressions|template argument 1 is invalid|invalid type" } */ diff --git a/gcc/testsuite/g++.dg/parse/template23.C b/gcc/testsuite/g++.dg/parse/template23.C new file mode 100644 index 000000000..893d78d15 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template23.C @@ -0,0 +1,10 @@ +/* PR c++/30895 This used to ICE. */ +/* { dg-do compile } */ + +template<int> struct A {}; + +template<typename T> struct B +{ + A<T(0i)> a1; /* { dg-error "imaginary constants are a GCC extension" } */ + A<T(0i)> a2; /* { dg-error "imaginary constants are a GCC extension" } */ +}; diff --git a/gcc/testsuite/g++.dg/parse/template24.C b/gcc/testsuite/g++.dg/parse/template24.C new file mode 100644 index 000000000..33d9d4cfd --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template24.C @@ -0,0 +1,8 @@ +/* PR c++/29731. This used to ICE in uses_template_parms. */ + +template<int> struct A {}; + +void foo() +{ + A<({})> a; /* { dg-error "forbids braced-groups within expressions|statement-expressions|template argument 1 is invalid|invalid type" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/template25.C b/gcc/testsuite/g++.dg/parse/template25.C new file mode 100644 index 000000000..8ffcd121e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template25.C @@ -0,0 +1,14 @@ +// PR c++/22318. Improve diagnostic for local template declaration. +// { dg-do compile } +void f(void) +{ + template<typename T> class A /* { dg-error "a template declaration cannot appear at block scope" } */ + { + }; +} + +void g(void) +{ + template f<int>(); /* { dg-error "expected primary-expression" } */ + /* { dg-error "expected ';'" "" { target *-*-* } 12 } */ +} diff --git a/gcc/testsuite/g++.dg/parse/template3.C b/gcc/testsuite/g++.dg/parse/template3.C new file mode 100644 index 000000000..d10d46d81 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template3.C @@ -0,0 +1,19 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 24 Jan 2003 <nathan@codesourcery.com> + +// PR 9403. We failed to parse template keyword, and we accepted code +// which required one. + +template<bool> struct Outer; + +template <bool b, typename T> +struct X : Outer<b>::template Inner<T> +{}; + +template <bool b, typename T> +struct Y : Outer<b>::Inner<T> {}; // { dg-error "used as template" "temp" } +// { dg-error "expected" "exp" { target *-*-* } 16 } +// { dg-message "note" "note" { target *-*-* } 16 } + diff --git a/gcc/testsuite/g++.dg/parse/template4.C b/gcc/testsuite/g++.dg/parse/template4.C new file mode 100644 index 000000000..11f11d535 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template4.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 32 Jan 2003 <nathan@codesourcery.com> + +// PR 795. fields are not necessarily a dependent type. + +struct V +{ + template<typename T> T get (); +}; + +struct L +{ + V v; + + template<typename T> T at (int i) + { + return v.get<T> (); + } +}; diff --git a/gcc/testsuite/g++.dg/parse/template5.C b/gcc/testsuite/g++.dg/parse/template5.C new file mode 100644 index 000000000..adc598672 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template5.C @@ -0,0 +1,19 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 28 Jan 2003 <nathan@codesourcery.com> + +// PR 3902. More type/decl confusion. + +template <class T> +struct S +{ + S foo (T (T)); + S foo (T(const T&)); +}; + +int main () +{ + S<int> (S<int>::*pf1)(int (int)) = &S<int>::foo; + S<int> (S<int>::*pf2)(int (const int&)) = &S<int>::foo; +} diff --git a/gcc/testsuite/g++.dg/parse/template6.C b/gcc/testsuite/g++.dg/parse/template6.C new file mode 100644 index 000000000..a83c313d0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template6.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Wolfgang Bangerth <bangerth@ticam.utexas.edu> 20 Feb 2003. + +// PR c++/9778. Ensure templated functions in other namespaces are +// correctly instantiated. + +namespace NS { + template <int N> void foo (); +} + +template <int N> struct X { + int m; + void g () { + NS::foo<sizeof(m)>(); + } +}; + +template class X<2>; diff --git a/gcc/testsuite/g++.dg/parse/template7.C b/gcc/testsuite/g++.dg/parse/template7.C new file mode 100644 index 000000000..0d3f3fa24 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template7.C @@ -0,0 +1,5 @@ +template <int I> +void f(); // { dg-message "note" } + +void g() { f<(3, 2)>(); } // { dg-error "" } +// { dg-message "candidate" "candidate note" { target *-*-* } 4 } diff --git a/gcc/testsuite/g++.dg/parse/template8.C b/gcc/testsuite/g++.dg/parse/template8.C new file mode 100644 index 000000000..e4af7eea3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template8.C @@ -0,0 +1,16 @@ +namespace N +{ + +template <typename> struct A +{ + template <typename T> A(A<T>); +}; + +} + +void foo(N::A<int>); + +void bar() +{ + foo(N::A); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/parse/template9.C b/gcc/testsuite/g++.dg/parse/template9.C new file mode 100644 index 000000000..17b7da91f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template9.C @@ -0,0 +1,6 @@ +template <typename T> +void f() { + g(); // { dg-error "must be available" "err" } + // { dg-message "note" "note" { target *-*-* } 3 } + h(3); // { dg-error "must be available" } +} diff --git a/gcc/testsuite/g++.dg/parse/tmpl-outside1.C b/gcc/testsuite/g++.dg/parse/tmpl-outside1.C new file mode 100644 index 000000000..e63e3cd44 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/tmpl-outside1.C @@ -0,0 +1,10 @@ +// PR c++/3792 +// Origin: <david.abrahams@rcn.com> +// { dg-do compile } + +struct X +{ + template <int i> struct Y {}; +}; + +typedef X::template Y<0> y; // { dg-error "template|invalid" } diff --git a/gcc/testsuite/g++.dg/parse/tmpl-tmpl-operator1.C b/gcc/testsuite/g++.dg/parse/tmpl-tmpl-operator1.C new file mode 100644 index 000000000..dcf2852d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/tmpl-tmpl-operator1.C @@ -0,0 +1,20 @@ +// PR c++/8857 +// Origin: Martin v. Loewis <loewis@informatik.hu-berlin.de> +// { dg-do compile } + +template <typename T> struct A +{ + template <typename U> operator U() { return sizeof(U); } +}; + +template <typename T> struct B +{ + template <template <typename U> class X> operator X<double>() { return X<double>(); } +}; + +int main() +{ + A<double> a; + B<long> b; + a = b; +} diff --git a/gcc/testsuite/g++.dg/parse/tmpl-tmpl-param1.C b/gcc/testsuite/g++.dg/parse/tmpl-tmpl-param1.C new file mode 100644 index 000000000..1fec1af42 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/tmpl-tmpl-param1.C @@ -0,0 +1,14 @@ +// PR c++/7259 +// Origin: Philipp Buettgenbach <P.Buettgenbach@FH-Wolfenbuettel.DE> +// Reduced version: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } + +template <template <int> class T> class A : public T<0> {}; + +template <typename> struct B +{ + template <int> class C {}; + typedef A<C> D; +}; + +B<void>::D d; diff --git a/gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C b/gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C new file mode 100644 index 000000000..4d98e7546 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C @@ -0,0 +1,11 @@ +// PR c++/9229 +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> +// { dg-do compile } + +template <typename T> class A // { dg-error "" } +{ + struct B; + template <typename U> friend typename A<U,void>::B foo(); // { dg-error "" } +}; + +template class A<int>; diff --git a/gcc/testsuite/g++.dg/parse/try-catch-1.C b/gcc/testsuite/g++.dg/parse/try-catch-1.C new file mode 100644 index 000000000..e4ed1ad8e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/try-catch-1.C @@ -0,0 +1,14 @@ +// Test case from: <ncm-nospam@cantrip.org> +// Reduced by <bangerth@dealii.org> +// The problem was that g++ was ICE because +// it was deferring an NULL pointer because +// it should have been taking the operand 1 +// instead of the chain in finish_fname_decls. + + +void fun() +try +{ + __FUNCTION__; +} +catch (...) {} diff --git a/gcc/testsuite/g++.dg/parse/typedef1.C b/gcc/testsuite/g++.dg/parse/typedef1.C new file mode 100644 index 000000000..c4fbb950c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef1.C @@ -0,0 +1,3 @@ +// PR c++/6477 +typedef struct A_ *A; // { dg-error "previous declaration" } +typedef struct A B; // { dg-error "typedef|invalid type" } diff --git a/gcc/testsuite/g++.dg/parse/typedef2.C b/gcc/testsuite/g++.dg/parse/typedef2.C new file mode 100644 index 000000000..3ae347d75 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef2.C @@ -0,0 +1,3 @@ +template <typename T> struct B { typedef typename T::X X; }; +template <typename T> struct A { typedef B<T>::X::Y Z; }; // { dg-error "" } + diff --git a/gcc/testsuite/g++.dg/parse/typedef3.C b/gcc/testsuite/g++.dg/parse/typedef3.C new file mode 100644 index 000000000..6b4e531b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef3.C @@ -0,0 +1,7 @@ +// PR c++/3004 +// Origin: Travis J.I. Corcoran <tjic@permabit.com> +// { dg-do compile } + +struct A { typedef A* Ptr; }; // { dg-error "previous declaration" } + +struct A::Ptr; // { dg-error "typedef|not declare anything" } diff --git a/gcc/testsuite/g++.dg/parse/typedef4.C b/gcc/testsuite/g++.dg/parse/typedef4.C new file mode 100644 index 000000000..8599fd1d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef4.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +// Origin: Matt Austern <austern@apple.com> + +// PR c++/7983: ICE typedef to typename as friend. + +template<class T> class smart_ptr2 { + T* real_ptr; + public: + typedef typename T::subT td; // { dg-error "previous declaration" } + friend class td; // { dg-error "typedef|not name a class" } +}; diff --git a/gcc/testsuite/g++.dg/parse/typedef5.C b/gcc/testsuite/g++.dg/parse/typedef5.C new file mode 100644 index 000000000..7079f3713 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef5.C @@ -0,0 +1,6 @@ +namespace A +{ + typedef int T; // { dg-error "previous declaration" } +} + +class A::T x; // { dg-error "using typedef-name|invalid type" } diff --git a/gcc/testsuite/g++.dg/parse/typedef6.C b/gcc/testsuite/g++.dg/parse/typedef6.C new file mode 100644 index 000000000..d3a39fc85 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef6.C @@ -0,0 +1,6 @@ +// PR c++/14667 + +template<class T> +class Class1; + +class Class2 {} typedef Class1<Class2> Type1; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/typedef7.C b/gcc/testsuite/g++.dg/parse/typedef7.C new file mode 100644 index 000000000..126fb7ed8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef7.C @@ -0,0 +1,2 @@ +// PR c++/18285 +typedef void int char void double X; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/typedef8.C b/gcc/testsuite/g++.dg/parse/typedef8.C new file mode 100644 index 000000000..6ff26febb --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef8.C @@ -0,0 +1,11 @@ +//PR c++ 29024 + +typedef static int a; // { dg-error "conflicting" } +typedef register int b; // { dg-error "conflicting" } +typedef extern int c; // { dg-error "conflicting" } +static typedef int a; // { dg-error "conflicting" } + +int foo() +{ + typedef auto int bar; // { dg-error "conflicting" } +} diff --git a/gcc/testsuite/g++.dg/parse/typedef9.C b/gcc/testsuite/g++.dg/parse/typedef9.C new file mode 100644 index 000000000..7788f781f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef9.C @@ -0,0 +1,8 @@ +// PR c++/38794 +// { dg-do compile } + +typedef void foo () {} // { dg-error "invalid function declaration" } +struct S +{ + typedef int bar (void) { return 0; } // { dg-error "invalid member function declaration" } +}; diff --git a/gcc/testsuite/g++.dg/parse/typename1.C b/gcc/testsuite/g++.dg/parse/typename1.C new file mode 100644 index 000000000..2af84e3d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename1.C @@ -0,0 +1,5 @@ +template <class baz> +struct bar +{ + typedef typename baz::typename rebind<int> foo; // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/parse/typename10.C b/gcc/testsuite/g++.dg/parse/typename10.C new file mode 100644 index 000000000..64d6ae8c2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename10.C @@ -0,0 +1,8 @@ +// PR c++/19253 + +namespace N { struct X; } + +template<typename> struct A +{ + A<typename N::X x> a; // { dg-error "invalid" } +}; diff --git a/gcc/testsuite/g++.dg/parse/typename11.C b/gcc/testsuite/g++.dg/parse/typename11.C new file mode 100644 index 000000000..a79e6d887 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename11.C @@ -0,0 +1,16 @@ +// PR c++/11987 + +template <int dim> struct X { + struct I { I(); }; +}; + +template <int dim> struct Y : X<dim> { + typedef typename X<dim>::I I; +}; + +// note: I is nested type in X, not Y! +template <int dim> +Y<dim>::I::I () {} // { dg-error "dependent typedef" } +// { dg-error "no type|dependent type" "" { target *-*-* } 13 } + +template struct Y<1>; diff --git a/gcc/testsuite/g++.dg/parse/typename2.C b/gcc/testsuite/g++.dg/parse/typename2.C new file mode 100644 index 000000000..8878497ad --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename2.C @@ -0,0 +1,17 @@ +template<class T, class U> +struct UnaryReturn { + typedef T Type_t; +}; + +struct foo +{ + template <class T> + typename UnaryReturn<T, int>::Type_t + bar(); +}; + +template<class T> +struct UnaryReturn<T, int> { + typedef bool Type_t; +}; + diff --git a/gcc/testsuite/g++.dg/parse/typename3.C b/gcc/testsuite/g++.dg/parse/typename3.C new file mode 100644 index 000000000..ce6ecbef8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename3.C @@ -0,0 +1,8 @@ +template <typename T> +struct D2 : public T::B { + typedef typename T::X::Y Y; + + void f () { + Y::f (); + } +}; diff --git a/gcc/testsuite/g++.dg/parse/typename4.C b/gcc/testsuite/g++.dg/parse/typename4.C new file mode 100644 index 000000000..529889df6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename4.C @@ -0,0 +1,7 @@ +// { dg-do compile } + +// Origin: Christian Ehrhardt <ehrhardt@mathematik.uni-ulm.de> + +// PR c++/9364: ICE processing typename with name error. + +void find(typename int&); // { dg-error "typename|void|expected" } diff --git a/gcc/testsuite/g++.dg/parse/typename5.C b/gcc/testsuite/g++.dg/parse/typename5.C new file mode 100644 index 000000000..36647519f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename5.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> + +// PR c++/10553: ICE processing typename with context error. + +template <typename> struct A {}; + +template <typename> struct B +{ + typedef A<typename X::Y> C; // { dg-error "declared|invalid|no type|expected" } +}; diff --git a/gcc/testsuite/g++.dg/parse/typename6.C b/gcc/testsuite/g++.dg/parse/typename6.C new file mode 100644 index 000000000..dc458bee5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename6.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// Contributed by Matt Austern <austern at apple dot com> +// PR c++/13407: Gracefully handle keyword typename in base class specifier. + +struct A { }; +struct B { typedef A Type; }; + +template <typename T> +struct X : + public typename T::Type // { dg-error "not allowed in this context" } +{ }; + +X<B> x; + +struct C : + public typename A // { dg-error "not allowed outside of templates" } +{ }; diff --git a/gcc/testsuite/g++.dg/parse/typename7.C b/gcc/testsuite/g++.dg/parse/typename7.C new file mode 100644 index 000000000..2d823f807 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename7.C @@ -0,0 +1,33 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> and +// Alexandre Oliva <aoliva@redhat.com> + +// PR c++/18757: ICE in get_innermost_template_args + +struct A +{ + template<typename> void foo(int); // { dg-message "note" } + template<typename T> void bar(T t) { // { dg-message "note" } + this->foo<typename T>(t); } // { dg-error "expected|parse error|no matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 12 } + template<typename T> void bad(T t) { + foo<typename T>(t); } // { dg-error "expected|parse error|no matching" } +}; + +template <typename T> +struct B +{ + void bar(T t) { + A().bar<typename T>(t); } // { dg-error "expected|parse error|no matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 22 } + void bad(T t) { + B<typename T>::bar(t); } // { dg-error "invalid|not a template" } +}; + +void baz() +{ + A().bar(0); + A().bad(0); + B<int>().bar(0); +} diff --git a/gcc/testsuite/g++.dg/parse/typename8.C b/gcc/testsuite/g++.dg/parse/typename8.C new file mode 100644 index 000000000..e8e762709 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename8.C @@ -0,0 +1,11 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 12 Oct 2005 <nathan@codesourcery.com> + +// PR 23797:ICE +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +// { dg-options "-fpermissive -w" } + +struct A { typedef int X; }; + +int i = typename A::X(); diff --git a/gcc/testsuite/g++.dg/parse/typename9.C b/gcc/testsuite/g++.dg/parse/typename9.C new file mode 100644 index 000000000..8d7707219 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename9.C @@ -0,0 +1,6 @@ +// check that using a qualified name with a typename does +// not report an error. + +struct A { typedef int X; }; + +int i = typename A::X(); diff --git a/gcc/testsuite/g++.dg/parse/typespec1.C b/gcc/testsuite/g++.dg/parse/typespec1.C new file mode 100644 index 000000000..44ee116f6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typespec1.C @@ -0,0 +1,4 @@ +// PR c++/26571 + +struct A {}; +unsigned A a; // { dg-error "expected initializer" } diff --git a/gcc/testsuite/g++.dg/parse/undefined1.C b/gcc/testsuite/g++.dg/parse/undefined1.C new file mode 100644 index 000000000..0ae4e8877 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/undefined1.C @@ -0,0 +1,10 @@ +// PR c++/8143 +// { dg-do compile } + +struct foo +{ + X x; // { dg-error "" } + + foo(X) {} // { dg-error "" } + foo(X y, int) : x() {} // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/parse/undefined2.C b/gcc/testsuite/g++.dg/parse/undefined2.C new file mode 100644 index 000000000..a7e76f1b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/undefined2.C @@ -0,0 +1,12 @@ +// PR c++/9173 +// Origin: <wwieser@gmx.de> +// { dg-do compile } + +class A {}; + +class B +{ + void foo(int,A::X); // { dg-error "" } +}; + +void B::foo(int,A::X) {} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/undefined3.C b/gcc/testsuite/g++.dg/parse/undefined3.C new file mode 100644 index 000000000..6bafd6fc6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/undefined3.C @@ -0,0 +1,6 @@ +// PR c++/5657 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } + +template<typename T> struct A { A(B); }; +template<typename T> A<T>::A(B) {} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/undefined4.C b/gcc/testsuite/g++.dg/parse/undefined4.C new file mode 100644 index 000000000..0bdc188d6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/undefined4.C @@ -0,0 +1,11 @@ +// PR c++/5665 +// Origin: Bergur Ragnarsson <bergur@tern.is> +// Reduced version: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } + +template<typename T> class A +{ + class B { X foo(); }; // { dg-error "" } +}; + +template<typename T> X A<T>::B::foo() {} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/undefined5.C b/gcc/testsuite/g++.dg/parse/undefined5.C new file mode 100644 index 000000000..f1dba6e48 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/undefined5.C @@ -0,0 +1,5 @@ +// PR c++/5975 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } + +typedef typename X::Y<> y; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/undefined6.C b/gcc/testsuite/g++.dg/parse/undefined6.C new file mode 100644 index 000000000..bc8a86d15 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/undefined6.C @@ -0,0 +1,6 @@ +// PR c++/8596 +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> +// { dg-do compile } + +template <int i> struct A {}; +template <int i> struct B : A<x>{}; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/undefined7.C b/gcc/testsuite/g++.dg/parse/undefined7.C new file mode 100644 index 000000000..1a525fc65 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/undefined7.C @@ -0,0 +1,5 @@ +// PR c++/9228 +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> +// { dg-do compile } + +template <typename T> typename A<T>::B foo() {} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/using1.C b/gcc/testsuite/g++.dg/parse/using1.C new file mode 100644 index 000000000..efe7a0e31 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/using1.C @@ -0,0 +1 @@ +namespace A { using ::B; } // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/using2.C b/gcc/testsuite/g++.dg/parse/using2.C new file mode 100644 index 000000000..bfdb09f88 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/using2.C @@ -0,0 +1,8 @@ +namespace N { + template <typename T> + struct foo {}; +} + +int main() { + using N::foo<double>; // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/parse/using3.C b/gcc/testsuite/g++.dg/parse/using3.C new file mode 100644 index 000000000..c266b68ea --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/using3.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 6 Sep 2003 <nathan@codesourcery.com> +// Origin: stefaandr@hotmail.com + +// PR c++/11794. Using decl in nested classes of a template class + +template <typename T> struct a +{ + struct a1: T + { + using T::aa; + + a1() { aa = 5; } + }; +}; +struct b { int aa; }; +template <> struct a<int>::a1 { a1 () {} }; + +a<b>::a1 a_b; +a<int>::a1 a_i; diff --git a/gcc/testsuite/g++.dg/parse/varmod1.C b/gcc/testsuite/g++.dg/parse/varmod1.C new file mode 100644 index 000000000..d64f04b78 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/varmod1.C @@ -0,0 +1,7 @@ +int main(int argc, char** argv) { + int nx = 2; + void theerror(double a[][nx+1]); // { dg-message "" } + double** a; + theerror(a); + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/wrong-inline1.C b/gcc/testsuite/g++.dg/parse/wrong-inline1.C new file mode 100644 index 000000000..22b9a9768 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/wrong-inline1.C @@ -0,0 +1,12 @@ +// PR c++/5921 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } + +struct A +{ + struct B { B(); }; +}; + +static A::B b; + +inline template <int i> void f (); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/pch/array-1.C b/gcc/testsuite/g++.dg/pch/array-1.C new file mode 100644 index 000000000..a8935ed26 --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/array-1.C @@ -0,0 +1,15 @@ +// PR c++/36852 + +#include "array-1.H" + +template <class T> +T +A::foo (T t[3][3]) +{ + return t[0][1]; +} + +int +main () +{ +} diff --git a/gcc/testsuite/g++.dg/pch/array-1.Hs b/gcc/testsuite/g++.dg/pch/array-1.Hs new file mode 100644 index 000000000..fb44b675e --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/array-1.Hs @@ -0,0 +1,4 @@ +struct A +{ + template <class T> static T foo (T[3][3]); +}; diff --git a/gcc/testsuite/g++.dg/pch/empty.C b/gcc/testsuite/g++.dg/pch/empty.C new file mode 100644 index 000000000..92b3cbcdc --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/empty.C @@ -0,0 +1,5 @@ +#include "empty.H" +int main() +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/pch/empty.Hs b/gcc/testsuite/g++.dg/pch/empty.Hs new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/empty.Hs diff --git a/gcc/testsuite/g++.dg/pch/externc-1.C b/gcc/testsuite/g++.dg/pch/externc-1.C new file mode 100644 index 000000000..26ffb50a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/externc-1.C @@ -0,0 +1,6 @@ +#include "externc-1.H" + +template <typename X> struct foo +{ + X y; +}; diff --git a/gcc/testsuite/g++.dg/pch/externc-1.Hs b/gcc/testsuite/g++.dg/pch/externc-1.Hs new file mode 100644 index 000000000..21aaf7436 --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/externc-1.Hs @@ -0,0 +1 @@ +#include <stddef.h> diff --git a/gcc/testsuite/g++.dg/pch/local-1.C b/gcc/testsuite/g++.dg/pch/local-1.C new file mode 100644 index 000000000..75847e5c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/local-1.C @@ -0,0 +1,6 @@ +#include "local-1.H" +int main() +{ + func<int> (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/pch/local-1.Hs b/gcc/testsuite/g++.dg/pch/local-1.Hs new file mode 100644 index 000000000..56a6c7e47 --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/local-1.Hs @@ -0,0 +1,7 @@ +template<typename T> void func() +{ + struct object + { + object() {} + }; +} diff --git a/gcc/testsuite/g++.dg/pch/pch.C b/gcc/testsuite/g++.dg/pch/pch.C new file mode 100644 index 000000000..9483efad0 --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/pch.C @@ -0,0 +1,9 @@ +// { dg-options "-save-temps -fpch-preprocess -I." } + +#include "pch.H" +int main() +{ + return 0; +} + +// { dg-final { cleanup-saved-temps ".s" } } diff --git a/gcc/testsuite/g++.dg/pch/pch.Hs b/gcc/testsuite/g++.dg/pch/pch.Hs new file mode 100644 index 000000000..4bd8276f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/pch.Hs @@ -0,0 +1 @@ +// empty file diff --git a/gcc/testsuite/g++.dg/pch/pch.exp b/gcc/testsuite/g++.dg/pch/pch.exp new file mode 100644 index 000000000..209a6a52c --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/pch.exp @@ -0,0 +1,39 @@ +# Copyright (C) 1997, 2002, 2003, 2007 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# GCC testsuite for precompiled header interaction, +# that uses the `dg.exp' driver. + +# Load support procs. +load_lib "g++-dg.exp" +load_lib dg-pch.exp + +# Initialize `dg'. +dg-init + +set old_dg_do_what_default "${dg-do-what-default}" + +# Main loop. +foreach test [lsort [glob -nocomplain $srcdir/$subdir/*.C]] { + # We don't try to use the loop-optimizing options, since they are highly + # unlikely to make any difference to PCH. + dg-pch $subdir $test [list "-g" "-O2 -g" "-O2"] ".H" +} + +set dg-do-what-default "$old_dg_do_what_default" + +# All done. +dg-finish diff --git a/gcc/testsuite/g++.dg/pch/static-1.C b/gcc/testsuite/g++.dg/pch/static-1.C new file mode 100644 index 000000000..21e778982 --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/static-1.C @@ -0,0 +1,10 @@ +#include "static-1.H" +int LocalStaticTest() +{ + static A sa; +} + +int main(int argc, char **argv) +{ + A::StaticTest(); +} diff --git a/gcc/testsuite/g++.dg/pch/static-1.Hs b/gcc/testsuite/g++.dg/pch/static-1.Hs new file mode 100644 index 000000000..d277b787b --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/static-1.Hs @@ -0,0 +1,13 @@ +class A +{ +public: + int val; + + ~A() { + int i = 2; + } + + static void StaticTest() { + static A a; + } +}; diff --git a/gcc/testsuite/g++.dg/pch/system-1.C b/gcc/testsuite/g++.dg/pch/system-1.C new file mode 100644 index 000000000..72bea3c9a --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/system-1.C @@ -0,0 +1,7 @@ +#include "system-1.H" + +int main() +{ + std::cout << "hello world!" << '\n'; + return 0; +} diff --git a/gcc/testsuite/g++.dg/pch/system-1.Hs b/gcc/testsuite/g++.dg/pch/system-1.Hs new file mode 100644 index 000000000..604782e4d --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/system-1.Hs @@ -0,0 +1 @@ +#include <iostream> diff --git a/gcc/testsuite/g++.dg/pch/system-2.C b/gcc/testsuite/g++.dg/pch/system-2.C new file mode 100644 index 000000000..44f3ec018 --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/system-2.C @@ -0,0 +1,7 @@ +#include "system-2.H" + +int main() +{ + std::cout << "hello world!" << std::endl; + return 0; +} diff --git a/gcc/testsuite/g++.dg/pch/system-2.Hs b/gcc/testsuite/g++.dg/pch/system-2.Hs new file mode 100644 index 000000000..13c79d104 --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/system-2.Hs @@ -0,0 +1,2 @@ +#include <iostream> +#include <string> diff --git a/gcc/testsuite/g++.dg/pch/template-1.C b/gcc/testsuite/g++.dg/pch/template-1.C new file mode 100644 index 000000000..c1718a991 --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/template-1.C @@ -0,0 +1,8 @@ +// PR c++/28217 + +#include "template-1.H" + +int +main (void) +{ +} diff --git a/gcc/testsuite/g++.dg/pch/template-1.Hs b/gcc/testsuite/g++.dg/pch/template-1.Hs new file mode 100644 index 000000000..afdb13f08 --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/template-1.Hs @@ -0,0 +1,5 @@ +template<int> struct A +{ + enum { a, b = a }; + void foo(A<b>); +}; diff --git a/gcc/testsuite/g++.dg/pch/uninst.C b/gcc/testsuite/g++.dg/pch/uninst.C new file mode 100644 index 000000000..b7cd8bfc2 --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/uninst.C @@ -0,0 +1,8 @@ +#include "uninst.H" + +template <class Type> void FOO() { } + +int main() { + FOO<char>(); // stage 2 needs this + return min<unsigned long>(5, 0); +} diff --git a/gcc/testsuite/g++.dg/pch/uninst.Hs b/gcc/testsuite/g++.dg/pch/uninst.Hs new file mode 100644 index 000000000..2f2b6dd3e --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/uninst.Hs @@ -0,0 +1,2 @@ +#include <bits/stl_algobase.h> +using namespace std; diff --git a/gcc/testsuite/g++.dg/pch/wchar-1.C b/gcc/testsuite/g++.dg/pch/wchar-1.C new file mode 100644 index 000000000..6cb5fe15e --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/wchar-1.C @@ -0,0 +1 @@ +#include "wchar-1.H" diff --git a/gcc/testsuite/g++.dg/pch/wchar-1.Hs b/gcc/testsuite/g++.dg/pch/wchar-1.Hs new file mode 100644 index 000000000..431908b88 --- /dev/null +++ b/gcc/testsuite/g++.dg/pch/wchar-1.Hs @@ -0,0 +1,2 @@ +#include <stddef.h> +const wchar_t test_var[] = L"wide string"; diff --git a/gcc/testsuite/g++.dg/plugin/attribute_plugin-test-1.C b/gcc/testsuite/g++.dg/plugin/attribute_plugin-test-1.C new file mode 100644 index 000000000..1ca321d1f --- /dev/null +++ b/gcc/testsuite/g++.dg/plugin/attribute_plugin-test-1.C @@ -0,0 +1,16 @@ +// { dg-warning "Callback to register attributes" "" { target *-*-* } 0 } + +void normal_func (char c, char c2); +void normal_func (char __attribute__((user("param"))) c, char); +void normal_func (char c, char __attribute__((user("param"))) c2) +{ +} // { dg-warning "attribute 'user' on param 'c' of function normal_func" } +// { dg-warning "attribute 'user' on param 'c2' of function normal_func" "" { target *-*-* } 7 } + +class Foo { + void method (char __attribute__((user("param"))) c); +}; + +void Foo::method(char c) +{ +} // { dg-warning "attribute 'user' on param 'c' of function method" } diff --git a/gcc/testsuite/g++.dg/plugin/attribute_plugin.c b/gcc/testsuite/g++.dg/plugin/attribute_plugin.c new file mode 100644 index 000000000..e5b056683 --- /dev/null +++ b/gcc/testsuite/g++.dg/plugin/attribute_plugin.c @@ -0,0 +1,71 @@ +/* Demonstrates how to add custom attributes */ + +#include "gcc-plugin.h" +#include <stdlib.h> +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tree.h" +#include "tree-pass.h" +#include "intl.h" +#include "toplev.h" +#include "plugin.h" +#include "diagnostic.h" + +int plugin_is_GPL_compatible; + +/* Attribute handler callback */ + +static tree +handle_user_attribute (tree *node, tree name, tree args, + int flags, bool *no_add_attrs) +{ + return NULL_TREE; +} + +/* Attribute definition */ + +static struct attribute_spec user_attr = + { "user", 1, 1, false, false, false, handle_user_attribute }; + +/* Plugin callback called during attribute registration */ + +static void +register_attributes (void *event_data, void *data) +{ + warning (0, G_("Callback to register attributes")); + register_attribute (&user_attr); +} + +/* Callback function to invoke before the function body is genericized. */ + +void +handle_pre_generic (void *event_data, void *data) +{ + tree fndecl = (tree) event_data; + tree arg; + for (arg = DECL_ARGUMENTS(fndecl); arg; arg = DECL_CHAIN (arg)) { + tree attr; + for (attr = DECL_ATTRIBUTES (arg); attr; attr = TREE_CHAIN (attr)) { + tree attrname = TREE_PURPOSE (attr); + tree attrargs = TREE_VALUE (attr); + warning (0, G_("attribute '%s' on param '%s' of function %s"), + IDENTIFIER_POINTER (attrname), + IDENTIFIER_POINTER (DECL_NAME (arg)), + IDENTIFIER_POINTER (DECL_NAME (fndecl)) + ); + } + } +} + +int +plugin_init (struct plugin_name_args *plugin_info, + struct plugin_gcc_version *version) +{ + const char *plugin_name = plugin_info->base_name; + register_callback (plugin_name, PLUGIN_PRE_GENERICIZE, + handle_pre_generic, NULL); + + register_callback (plugin_name, PLUGIN_ATTRIBUTES, register_attributes, NULL); + return 0; +} diff --git a/gcc/testsuite/g++.dg/plugin/dumb-plugin-test-1.C b/gcc/testsuite/g++.dg/plugin/dumb-plugin-test-1.C new file mode 100644 index 000000000..70101c868 --- /dev/null +++ b/gcc/testsuite/g++.dg/plugin/dumb-plugin-test-1.C @@ -0,0 +1,53 @@ +// Test case for the dumb plugin. +// { dg-do compile } +// { dg-options "-O -fplugin-arg-dumb_plugin-ref-pass-name=ccp -fplugin-arg-dumb_plugin-ref-pass-instance-num=1" } + +class Foo { + private: + int a_; + + public: + Foo() : a_(a_) {} // { dg-warning "Before genericizing function" } + + void setA(int a) { + a_ = a_; + } // { dg-warning "Before genericizing function" } + + void operator=(Foo& rhs) { + this->a_ = rhs.a_; + } // { dg-warning "Before genericizing function" } +}; // { dg-warning "Process struct Foo" } + +struct Bar { + int b_; + int c_; +}; // { dg-warning "Process struct Bar" } + +int g = g; +Foo foo = foo; + +int func() +{ + Bar *bar1, bar2; + Foo local_foo; + int x = x; + static int y = y; + float *f; + Bar bar_array[5]; + char n; + int overflow; + + *f = *f; + bar1->b_ = bar1->b_; + bar2.c_ = bar2.c_; + local_foo = local_foo; + foo = foo; + foo.setA(5); + bar_array[3].c_ = bar_array[3].c_; + bar_array[x+g].b_ = bar_array[x+g].b_; + y = x; + x = y; +} // { dg-warning "Before genericizing function" } + +// { dg-warning "Analyze function" "" { target *-*-* } 50 } +// { dg-warning "End of compilation unit" "" { target *-*-* } 50 } diff --git a/gcc/testsuite/g++.dg/plugin/dumb_plugin.c b/gcc/testsuite/g++.dg/plugin/dumb_plugin.c new file mode 100644 index 000000000..5bbd5d790 --- /dev/null +++ b/gcc/testsuite/g++.dg/plugin/dumb_plugin.c @@ -0,0 +1,141 @@ +/* A trivial (dumb) plugin example that shows how to use the GCC plugin + mechanism. */ + +#include "gcc-plugin.h" +#include <stdlib.h> +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tree.h" +#include "tree-pass.h" +#include "intl.h" +#include "toplev.h" +#include "diagnostic.h" + +int plugin_is_GPL_compatible; + +/* Callback function to invoke after GCC finishes parsing a struct. */ + +void +handle_struct (void *event_data, void *data) +{ + tree type = (tree) event_data; + warning (0, G_("Process struct %s"), + IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))); +} + +/* Callback function to invoke before the function body is genericized. */ + +void +handle_pre_generic (void *event_data, void *data) +{ + tree fndecl = (tree) event_data; + warning (0, G_("Before genericizing function %s"), + IDENTIFIER_POINTER (DECL_NAME (fndecl))); +} + +/* Callback function to invoke after GCC finishes the compilation unit. */ + +void +handle_end_of_compilation_unit (void *event_data, void *data) +{ + warning (0, G_("End of compilation unit")); +} + + +static unsigned int +execute_dumb_plugin_example (void) +{ + warning (0, G_("Analyze function %s"), + IDENTIFIER_POINTER (DECL_NAME (current_function_decl))); + return 0; +} + +static bool +gate_dumb_plugin_example (void) +{ + return true; +} + +static struct gimple_opt_pass pass_dumb_plugin_example = +{ + { + GIMPLE_PASS, + "dumb_plugin_example", /* name */ + gate_dumb_plugin_example, /* gate */ + execute_dumb_plugin_example, /* execute */ + NULL, /* sub */ + NULL, /* next */ + 0, /* static_pass_number */ + TV_NONE, /* tv_id */ + PROP_cfg, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_dump_func /* todo_flags_finish */ + } +}; + +/* Initialization function that GCC calls. This plugin takes an argument + that specifies the name of the reference pass and an instance number, + both of which determine where the plugin pass should be inserted. */ + +int +plugin_init (struct plugin_name_args *plugin_info, + struct plugin_gcc_version *version) +{ + struct register_pass_info pass_info; + const char *plugin_name = plugin_info->base_name; + int argc = plugin_info->argc; + struct plugin_argument *argv = plugin_info->argv; + char *ref_pass_name = NULL; + int ref_instance_number = 0; + int i; + + /* Process the plugin arguments. This plugin takes the following arguments: + ref-pass-name=<PASS_NAME> and ref-pass-instance-num=<NUM>. */ + for (i = 0; i < argc; ++i) + { + if (!strcmp (argv[i].key, "ref-pass-name")) + { + if (argv[i].value) + ref_pass_name = argv[i].value; + else + warning (0, G_("option '-fplugin-arg-%s-ref-pass-name'" + " requires a pass name"), plugin_name); + } + else if (!strcmp (argv[i].key, "ref-pass-instance-num")) + { + if (argv[i].value) + ref_instance_number = strtol (argv[i].value, NULL, 0); + else + warning (0, G_("option '-fplugin-arg-%s-ref-pass-instance-num'" + " requires an integer value"), plugin_name); + } + else + warning (0, G_("plugin %qs: unrecognized argument %qs ignored"), + plugin_name, argv[i].key); + } + + if (!ref_pass_name) + { + error (G_("plugin %qs requires a reference pass name"), plugin_name); + return 1; + } + + pass_info.pass = &pass_dumb_plugin_example.pass; + pass_info.reference_pass_name = ref_pass_name; + pass_info.ref_pass_instance_number = ref_instance_number; + pass_info.pos_op = PASS_POS_INSERT_AFTER; + + register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &pass_info); + + register_callback (plugin_name, PLUGIN_FINISH_TYPE, handle_struct, NULL); + + register_callback (plugin_name, PLUGIN_PRE_GENERICIZE, + handle_pre_generic, NULL); + + register_callback (plugin_name, PLUGIN_FINISH_UNIT, + handle_end_of_compilation_unit, NULL); + return 0; +} diff --git a/gcc/testsuite/g++.dg/plugin/header-plugin-test.C b/gcc/testsuite/g++.dg/plugin/header-plugin-test.C new file mode 100644 index 000000000..bd6aff11f --- /dev/null +++ b/gcc/testsuite/g++.dg/plugin/header-plugin-test.C @@ -0,0 +1,3 @@ +// Test case for the dumb plugin. +// { dg-do compile } + diff --git a/gcc/testsuite/g++.dg/plugin/header_plugin.c b/gcc/testsuite/g++.dg/plugin/header_plugin.c new file mode 100644 index 000000000..a464827de --- /dev/null +++ b/gcc/testsuite/g++.dg/plugin/header_plugin.c @@ -0,0 +1,32 @@ +#include "gcc-plugin.h" +#include <stdlib.h> +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tree.h" +#include "tree-pass.h" +#include "intl.h" + +/* reqs */ +#include "tm.h" + +/* gcc/ headers. */ +#include "cp/cp-tree.h" +#include "diagnostic.h" +#include "c-family/c-common.h" +#include "c-family/c-pretty-print.h" +#include "tree-iterator.h" +#include "plugin.h" +#include "tree-flow.h" +#include "langhooks.h" +#include "cp/cxx-pretty-print.h" +#include "cp/name-lookup.h" + +int plugin_is_GPL_compatible; + +int +plugin_init (struct plugin_name_args *plugin_info, + struct plugin_gcc_version *version) +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/plugin/plugin.exp b/gcc/testsuite/g++.dg/plugin/plugin.exp new file mode 100644 index 000000000..72de92dfd --- /dev/null +++ b/gcc/testsuite/g++.dg/plugin/plugin.exp @@ -0,0 +1,69 @@ +# Copyright (C) 2009 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# Test the functionality of the GCC plugin support + +load_lib target-supports.exp +load_lib g++-dg.exp + +global TESTING_IN_BUILD_TREE +global ENABLE_PLUGIN + +# The plugin testcases currently only work when the build tree is available. +# Also check whether the host supports plugins. +if { ![info exists TESTING_IN_BUILD_TREE] || ![info exists ENABLE_PLUGIN] } { + return +} + +# If a testcase doesn't have special options, use these. +global DEFAULT_CXXFLAGS +if ![info exists DEFAULT_CXXFLAGS] then { + set DEFAULT_CXXFLAGS " -ansi -pedantic-errors -Wno-long-long" +} + +# The procedures in plugin-support.exp need these parameters. +set default_flags $DEFAULT_CXXFLAGS + +if $tracelevel then { + strace $tracelevel +} + +# Load support procs. +load_lib plugin-support.exp + +# Specify the plugin source file and the associated test files in a list. +# plugin_test_list={ {plugin1 test1 test2 ...} {plugin2 test1 ...} ... } +set plugin_test_list [list \ + { attribute_plugin.c attribute_plugin-test-1.C } \ + { pragma_plugin.c pragma_plugin-test-1.C } \ + { selfassign.c self-assign-test-1.C self-assign-test-2.C self-assign-test-3.C } \ + { dumb_plugin.c dumb-plugin-test-1.C } \ + { header_plugin.c header-plugin-test.C } ] + +foreach plugin_test $plugin_test_list { + # Replace each source file with its full-path name + for {set i 0} {$i < [llength $plugin_test]} {incr i} { + set basename [lindex $plugin_test $i] + set plugin_test [lreplace $plugin_test $i $i $srcdir/$subdir/$basename] + } + set plugin_src [lindex $plugin_test 0] + # If we're only testing specific files and this isn't one of them, skip it. + if ![runtest_file_p $runtests $plugin_src] then { + continue + } + set plugin_input_tests [lreplace $plugin_test 0 0] + plugin-test-execute $plugin_src $plugin_input_tests +} diff --git a/gcc/testsuite/g++.dg/plugin/pragma_plugin-test-1.C b/gcc/testsuite/g++.dg/plugin/pragma_plugin-test-1.C new file mode 100644 index 000000000..3c084208b --- /dev/null +++ b/gcc/testsuite/g++.dg/plugin/pragma_plugin-test-1.C @@ -0,0 +1,18 @@ +// { dg-warning "Callback to register pragmas" "" { target *-*-* } 0 } + +int some_func (int c); + +#pragma GCCPLUGIN sayhello "here" // { dg-warning "'pragma GCCPLUGIN sayhello' outside of function: here" } + +int some_func (const char* s) +{ +#pragma GCCPLUGIN sayhello "at start" // { dg-warning "'pragma GCCPLUGIN sayhello' from function 'some_func': at start" } + +#define DO_PRAGMA(x) _Pragma(#x) + if (!s) + { + DO_PRAGMA(GCCPLUGIN sayhello "in block"); // { dg-warning "'pragma GCCPLUGIN sayhello' from function 'some_func': in block" } + return 0; + } + return 1; +} diff --git a/gcc/testsuite/g++.dg/plugin/pragma_plugin.c b/gcc/testsuite/g++.dg/plugin/pragma_plugin.c new file mode 100644 index 000000000..940c302df --- /dev/null +++ b/gcc/testsuite/g++.dg/plugin/pragma_plugin.c @@ -0,0 +1,62 @@ +/* Demonstrates how to add custom pragmas */ + +#include "gcc-plugin.h" +#include <stdlib.h> +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tm.h" +#include "rtl.h" +#include "tree.h" +#include "function.h" +#include "c-family/c-pragma.h" +#include "cpplib.h" +#include "tree-pass.h" +#include "intl.h" +#include "toplev.h" +#include "diagnostic.h" + +int plugin_is_GPL_compatible; + + +/* handler of #pragma GCCPLUGIN sayhello "message" is quite similar to + handler of #pragma GCC message...*/ + +static void +handle_pragma_sayhello (cpp_reader *dummy) +{ + tree message = 0; + if (pragma_lex (&message) != CPP_STRING) + { + warning (OPT_Wpragmas, "%<#pragma GCCPLUGIN sayhello%> is not a string"); + return; + } + if (TREE_STRING_LENGTH (message) > 1) + if (cfun) + warning (OPT_Wpragmas, + "%<pragma GCCPLUGIN sayhello%> from function %qE: %s", + cfun->decl, TREE_STRING_POINTER (message)); + else + warning (OPT_Wpragmas, + "%<pragma GCCPLUGIN sayhello%> outside of function: %s", + TREE_STRING_POINTER (message)); +} + +/* Plugin callback called during pragma registration */ + +static void +register_my_pragma (void *event_data, void *data) +{ + warning (0, G_("Callback to register pragmas")); + c_register_pragma ("GCCPLUGIN", "sayhello", handle_pragma_sayhello); +} + +int +plugin_init (struct plugin_name_args *plugin_info, + struct plugin_gcc_version *version) +{ + const char *plugin_name = plugin_info->base_name; + + register_callback (plugin_name, PLUGIN_PRAGMAS, register_my_pragma, NULL); + return 0; +} diff --git a/gcc/testsuite/g++.dg/plugin/self-assign-test-1.C b/gcc/testsuite/g++.dg/plugin/self-assign-test-1.C new file mode 100644 index 000000000..607381fb4 --- /dev/null +++ b/gcc/testsuite/g++.dg/plugin/self-assign-test-1.C @@ -0,0 +1,50 @@ +// Test the self-assignemnt detection plugin. +// { dg-do compile } +// { dg-options "-O" } + +class Foo { + private: + int a_; + + public: + Foo() : a_(a_) {} // { dg-warning "assigned to itself" } + + void setA(int a) { + a_ = a_; // { dg-warning "assigned to itself" } + } + + void operator=(Foo& rhs) { + this->a_ = rhs.a_; + } +}; + +struct Bar { + int b_; + int c_; +}; + +int g = g; // { dg-warning "assigned to itself" } +Foo foo = foo; // { dg-warning "assigned to itself" } + +int func() +{ + Bar *bar1, bar2; + Foo local_foo; + int x = x; // { dg-warning "assigned to itself" } + static int y = y; // { dg-warning "assigned to itself" } + float *f; + Bar bar_array[5]; + char n; + int overflow; + + *f = *f; // { dg-warning "assigned to itself" } + bar1->b_ = bar1->b_; // { dg-warning "assigned to itself" } + bar2.c_ = bar2.c_; // { dg-warning "assigned to itself" } + local_foo = local_foo; // { dg-warning "assigned to itself" } + foo = foo; // { dg-warning "assigned to itself" } + foo.setA(5); + bar_array[3].c_ = bar_array[3].c_; // { dg-warning "assigned to itself" } + bar_array[x+g].b_ = bar_array[x+g].b_; // { dg-warning "self-assignment detected" } + y = x; + x = y; +} diff --git a/gcc/testsuite/g++.dg/plugin/self-assign-test-2.C b/gcc/testsuite/g++.dg/plugin/self-assign-test-2.C new file mode 100644 index 000000000..35e1fb8f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/plugin/self-assign-test-2.C @@ -0,0 +1,50 @@ +// Test the self-assignemnt detection plugin without checking of operator-eq. +// { dg-do compile } +// { dg-options "-O -fplugin-arg-selfassign-no-check-operator-eq" } + +class Foo { + private: + int a_; + + public: + Foo() : a_(a_) {} // { dg-warning "assigned to itself" } + + void setA(int a) { + a_ = a_; // { dg-warning "assigned to itself" } + } + + void operator=(Foo& rhs) { + this->a_ = rhs.a_; + } +}; + +struct Bar { + int b_; + int c_; +}; + +int g = g; // { dg-warning "assigned to itself" } +Foo foo = foo; // { dg-warning "assigned to itself" } + +int func() +{ + Bar *bar1, bar2; + Foo local_foo; + int x = x; // { dg-warning "assigned to itself" } + static int y = y; // { dg-warning "assigned to itself" } + float *f; + Bar bar_array[5]; + char n; + int overflow; + + *f = *f; // { dg-warning "assigned to itself" } + bar1->b_ = bar1->b_; // { dg-warning "assigned to itself" } + bar2.c_ = bar2.c_; // { dg-warning "assigned to itself" } + local_foo = local_foo; // { dg-bogus "assigned to itself" } + foo = foo; // { dg-bogus "assigned to itself" } + foo.setA(5); + bar_array[3].c_ = bar_array[3].c_; // { dg-warning "assigned to itself" } + bar_array[x+g].b_ = bar_array[x+g].b_; // { dg-warning "self-assignment detected" } + y = x; + x = y; +} diff --git a/gcc/testsuite/g++.dg/plugin/self-assign-test-3.C b/gcc/testsuite/g++.dg/plugin/self-assign-test-3.C new file mode 100644 index 000000000..e5b354baf --- /dev/null +++ b/gcc/testsuite/g++.dg/plugin/self-assign-test-3.C @@ -0,0 +1,50 @@ +// Test the self-assignemnt detection plugin with the 'disable' argument. +// { dg-do compile } +// { dg-options "-O -fplugin-arg-selfassign-disable" } + +class Foo { + private: + int a_; + + public: + Foo() : a_(a_) {} // { dg-bogus "assigned to itself" } + + void setA(int a) { + a_ = a_; // { dg-bogus "assigned to itself" } + } + + void operator=(Foo& rhs) { + this->a_ = rhs.a_; + } +}; + +struct Bar { + int b_; + int c_; +}; + +int g = g; // { dg-bogus "assigned to itself" } +Foo foo = foo; // { dg-bogus "assigned to itself" } + +int func() +{ + Bar *bar1, bar2; + Foo local_foo; + int x = x; // { dg-bogus "assigned to itself" } + static int y = y; // { dg-bogus "assigned to itself" } + float *f; + Bar bar_array[5]; + char n; + int overflow; + + *f = *f; // { dg-bogus "assigned to itself" } + bar1->b_ = bar1->b_; // { dg-bogus "assigned to itself" } + bar2.c_ = bar2.c_; // { dg-bogus "assigned to itself" } + local_foo = local_foo; // { dg-bogus "assigned to itself" } + foo = foo; // { dg-bogus "assigned to itself" } + foo.setA(5); + bar_array[3].c_ = bar_array[3].c_; // { dg-bogus "assigned to itself" } + bar_array[x+g].b_ = bar_array[x+g].b_; // { dg-bogus "self-assignment detected" } + y = x; + x = y; +} diff --git a/gcc/testsuite/g++.dg/plugin/selfassign.c b/gcc/testsuite/g++.dg/plugin/selfassign.c new file mode 100644 index 000000000..84d2801d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/plugin/selfassign.c @@ -0,0 +1,366 @@ +/* This plugin contains an analysis pass that detects and warns about + self-assignment statements. */ +/* { dg-options "-O" } */ + +#include "gcc-plugin.h" +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tm.h" +#include "toplev.h" +#include "basic-block.h" +#include "gimple.h" +#include "tree.h" +#include "tree-pass.h" +#include "intl.h" +#include "plugin-version.h" +#include "diagnostic.h" + +int plugin_is_GPL_compatible; + +/* Indicate whether to check overloaded operator '=', which is performed by + default. To disable it, use -fplugin-arg-NAME-no-check-operator-eq. */ +bool check_operator_eq = true; + +/* Given a rhs EXPR of a gimple assign statement, if it is + - SSA_NAME : returns its var decl, or, if it is a temp variable, + returns the rhs of its SSA def statement. + - VAR_DECL, PARM_DECL, FIELD_DECL, or a reference expression : + returns EXPR itself. + - any other expression : returns NULL_TREE. */ + +static tree +get_real_ref_rhs (tree expr) +{ + switch (TREE_CODE (expr)) + { + case SSA_NAME: + { + /* Given a self-assign statement, say foo.x = foo.x, + the IR (after SSA) looks like: + + D.1797_14 = foo.x; + foo.x ={v} D.1797_14; + + So if the rhs EXPR is an SSA_NAME of a temp variable, + e.g. D.1797_14, we need to grab the rhs of its SSA def + statement (i.e. foo.x). */ + tree vdecl = SSA_NAME_VAR (expr); + if (DECL_ARTIFICIAL (vdecl) + && !gimple_nop_p (SSA_NAME_DEF_STMT (expr))) + { + gimple def_stmt = SSA_NAME_DEF_STMT (expr); + /* We are only interested in an assignment with a single + rhs operand because if it is not, the original assignment + will not possibly be a self-assignment. */ + if (gimple_assign_single_p (def_stmt)) + return get_real_ref_rhs (gimple_assign_rhs1 (def_stmt)); + else + return NULL_TREE; + } + else + return vdecl; + } + case VAR_DECL: + case PARM_DECL: + case FIELD_DECL: + case COMPONENT_REF: + case MEM_REF: + case ARRAY_REF: + return expr; + default: + return NULL_TREE; + } +} + +/* Given an expression tree, EXPR, that may contains SSA names, returns an + equivalent tree with the SSA names converted to var/parm/field decls + so that it can be used with '%E' format modifier when emitting warning + messages. + + This function currently only supports VAR/PARM/FIELD_DECL, reference + expressions (COMPONENT_REF, INDIRECT_REF, ARRAY_REF), integer constant, + and SSA_NAME. If EXPR contains any other tree nodes (e.g. an arithmetic + expression appears in array index), NULL_TREE is returned. */ + +static tree +get_non_ssa_expr (tree expr) +{ + switch (TREE_CODE (expr)) + { + case VAR_DECL: + case PARM_DECL: + case FIELD_DECL: + { + if (DECL_NAME (expr)) + return expr; + else + return NULL_TREE; + } + case COMPONENT_REF: + { + tree base, orig_base = TREE_OPERAND (expr, 0); + tree component, orig_component = TREE_OPERAND (expr, 1); + base = get_non_ssa_expr (orig_base); + if (!base) + return NULL_TREE; + component = get_non_ssa_expr (orig_component); + if (!component) + return NULL_TREE; + /* If either BASE or COMPONENT is converted, build a new + component reference tree. */ + if (base != orig_base || component != orig_component) + return build3 (COMPONENT_REF, TREE_TYPE (component), + base, component, NULL_TREE); + else + return expr; + } + case MEM_REF: + { + tree orig_base = TREE_OPERAND (expr, 0); + if (TREE_CODE (orig_base) == SSA_NAME) + { + tree base = get_non_ssa_expr (orig_base); + if (!base) + return NULL_TREE; + return fold_build2 (MEM_REF, TREE_TYPE (expr), + base, TREE_OPERAND (expr, 1)); + } + return expr; + } + case ARRAY_REF: + { + tree array, orig_array = TREE_OPERAND (expr, 0); + tree index, orig_index = TREE_OPERAND (expr, 1); + array = get_non_ssa_expr (orig_array); + if (!array) + return NULL_TREE; + index = get_non_ssa_expr (orig_index); + if (!index) + return NULL_TREE; + /* If either ARRAY or INDEX is converted, build a new array + reference tree. */ + if (array != orig_array || index != orig_index) + return build4 (ARRAY_REF, TREE_TYPE (expr), array, index, + TREE_OPERAND (expr, 2), TREE_OPERAND (expr, 3)); + else + return expr; + } + case SSA_NAME: + { + tree vdecl = SSA_NAME_VAR (expr); + if (DECL_ARTIFICIAL (vdecl) + && !gimple_nop_p (SSA_NAME_DEF_STMT (expr))) + { + gimple def_stmt = SSA_NAME_DEF_STMT (expr); + if (gimple_assign_single_p (def_stmt)) + vdecl = gimple_assign_rhs1 (def_stmt); + } + return get_non_ssa_expr (vdecl); + } + case INTEGER_CST: + return expr; + default: + /* Return NULL_TREE for any other kind of tree nodes. */ + return NULL_TREE; + } +} + +/* Given the LHS and (real) RHS of a gimple assign statement, STMT, check if + they are the same. If so, print a warning message about self-assignment. */ + +static void +compare_and_warn (gimple stmt, tree lhs, tree rhs) +{ + if (operand_equal_p (lhs, rhs, OEP_PURE_SAME)) + { + location_t location; + location = (gimple_has_location (stmt) + ? gimple_location (stmt) + : (DECL_P (lhs) + ? DECL_SOURCE_LOCATION (lhs) + : input_location)); + /* If LHS contains any tree node not currently supported by + get_non_ssa_expr, simply emit a generic warning without + specifying LHS in the message. */ + lhs = get_non_ssa_expr (lhs); + if (lhs) + warning_at (location, 0, G_("%qE is assigned to itself"), lhs); + else + warning_at (location, 0, G_("self-assignment detected")); + } +} + +/* Check and warn if STMT is a self-assign statement. */ + +static void +warn_self_assign (gimple stmt) +{ + tree rhs, lhs; + + /* Check assigment statement. */ + if (gimple_assign_single_p (stmt)) + { + rhs = get_real_ref_rhs (gimple_assign_rhs1 (stmt)); + if (!rhs) + return; + + lhs = gimple_assign_lhs (stmt); + if (TREE_CODE (lhs) == SSA_NAME) + { + lhs = SSA_NAME_VAR (lhs); + if (DECL_ARTIFICIAL (lhs)) + return; + } + + compare_and_warn (stmt, lhs, rhs); + } + /* Check overloaded operator '=' (if enabled). */ + else if (check_operator_eq && is_gimple_call (stmt)) + { + tree fdecl = gimple_call_fndecl (stmt); + if (fdecl && (DECL_NAME (fdecl) == maybe_get_identifier ("operator="))) + { + /* If 'operator=' takes reference operands, the arguments will be + ADDR_EXPR trees. In this case, just remove the address-taken + operator before we compare the lhs and rhs. */ + lhs = gimple_call_arg (stmt, 0); + if (TREE_CODE (lhs) == ADDR_EXPR) + lhs = TREE_OPERAND (lhs, 0); + rhs = gimple_call_arg (stmt, 1); + if (TREE_CODE (rhs) == ADDR_EXPR) + rhs = TREE_OPERAND (rhs, 0); + + compare_and_warn (stmt, lhs, rhs); + } + } +} + +/* Entry point for the self-assignment detection pass. */ + +static unsigned int +execute_warn_self_assign (void) +{ + gimple_stmt_iterator gsi; + basic_block bb; + + FOR_EACH_BB (bb) + { + for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) + warn_self_assign (gsi_stmt (gsi)); + } + + return 0; +} + +/* Pass gate function. Currently always returns true. */ + +static bool +gate_warn_self_assign (void) +{ + return true; +} + +static struct gimple_opt_pass pass_warn_self_assign = +{ + { + GIMPLE_PASS, + "warn_self_assign", /* name */ + gate_warn_self_assign, /* gate */ + execute_warn_self_assign, /* execute */ + NULL, /* sub */ + NULL, /* next */ + 0, /* static_pass_number */ + TV_NONE, /* tv_id */ + PROP_ssa, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_dump_func /* todo_flags_finish */ + } +}; + +/* The initialization routine exposed to and called by GCC. The spec of this + function is defined in gcc/gcc-plugin.h. + + PLUGIN_NAME - name of the plugin (useful for error reporting) + ARGC - the size of the ARGV array + ARGV - an array of key-value argument pair + + Returns 0 if initialization finishes successfully. + + Note that this function needs to be named exactly "plugin_init". */ + +int +plugin_init (struct plugin_name_args *plugin_info, + struct plugin_gcc_version *version) +{ + struct register_pass_info pass_info; + const char *plugin_name = plugin_info->base_name; + int argc = plugin_info->argc; + struct plugin_argument *argv = plugin_info->argv; + bool enabled = true; + int i; + + if (!plugin_default_version_check (version, &gcc_version)) + return 1; + + /* Self-assign detection should happen after SSA is constructed. */ + pass_info.pass = &pass_warn_self_assign.pass; + pass_info.reference_pass_name = "ssa"; + pass_info.ref_pass_instance_number = 1; + pass_info.pos_op = PASS_POS_INSERT_AFTER; + + /* Process the plugin arguments. This plugin takes the following arguments: + check-operator-eq, no-check-operator-eq, enable, and disable. + By default, the analysis is enabled with 'operator=' checked. */ + for (i = 0; i < argc; ++i) + { + if (!strcmp (argv[i].key, "check-operator-eq")) + { + if (argv[i].value) + warning (0, G_("option '-fplugin-arg-%s-check-operator-eq=%s'" + " ignored (superfluous '=%s')"), + plugin_name, argv[i].value, argv[i].value); + else + check_operator_eq = true; + } + else if (!strcmp (argv[i].key, "no-check-operator-eq")) + { + if (argv[i].value) + warning (0, G_("option '-fplugin-arg-%s-no-check-operator-eq=%s'" + " ignored (superfluous '=%s')"), + plugin_name, argv[i].value, argv[i].value); + else + check_operator_eq = false; + } + else if (!strcmp (argv[i].key, "enable")) + { + if (argv[i].value) + warning (0, G_("option '-fplugin-arg-%s-enable=%s' ignored" + " (superfluous '=%s')"), + plugin_name, argv[i].value, argv[i].value); + else + enabled = true; + } + else if (!strcmp (argv[i].key, "disable")) + { + if (argv[i].value) + warning (0, G_("option '-fplugin-arg-%s-disable=%s' ignored" + " (superfluous '=%s')"), + plugin_name, argv[i].value, argv[i].value); + else + enabled = false; + } + else + warning (0, G_("plugin %qs: unrecognized argument %qs ignored"), + plugin_name, argv[i].key); + } + + /* Register this new pass with GCC if the analysis is enabled. */ + if (enabled) + register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, + &pass_info); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/pr37742.C b/gcc/testsuite/g++.dg/pr37742.C new file mode 100644 index 000000000..2bbb01723 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr37742.C @@ -0,0 +1,10 @@ +/* { dg-do compile } */ + +__extension__ typedef __SIZE_TYPE__ size_t; +void* __valarray_get_memory(size_t __n); +int*__restrict__ +__valarray_get_storage(size_t __n) +{ + return static_cast<int* __restrict__>(__valarray_get_memory(__n)); +} + diff --git a/gcc/testsuite/g++.dg/pr44328.C b/gcc/testsuite/g++.dg/pr44328.C new file mode 100644 index 000000000..bbfe23334 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr44328.C @@ -0,0 +1,39 @@ +/* { dg-do compile } */ +/* { dg-options "-c -O2 -Wextra" } */ +#define O_RDONLY (1<<0) +#define O_WRONLY (1<<1) +#define O_RDWR (O_RDONLY|O_WRONLY) +#define O_CREAT (1<<3) +#define O_TRUNC (1<<6) + +typedef enum { + OM_READ = 0, + OM_WRITE, + OM_READWRITE_NOCREATE, + OM_READWRITE_CREATE +} OpenMode; + +extern int open(const char *name, int mode); + +void open_file(const char *filename, const OpenMode rw) +{ + int mode = 0; + + switch( rw ) + { + case OM_WRITE: + mode = O_WRONLY|O_CREAT|O_TRUNC; + break; + case OM_READ: + mode = O_RDONLY; + break; + case OM_READWRITE_NOCREATE: + mode = O_RDWR; + break; + case OM_READWRITE_CREATE: + mode = O_RDWR|O_CREAT|O_TRUNC; + break; + } + + open( filename, mode ); +} diff --git a/gcc/testsuite/g++.dg/pr44486.C b/gcc/testsuite/g++.dg/pr44486.C new file mode 100644 index 000000000..01e84289f --- /dev/null +++ b/gcc/testsuite/g++.dg/pr44486.C @@ -0,0 +1,10 @@ +// PR c++/44486 missing space in __PRETTY_FUNCTION__ expansion in anonymous namespace +// { dg-do compile } +// { dg-options "" } + +struct S { }; +namespace { S f() { const char * s = __PRETTY_FUNCTION__; return S(); } } + +int main() { f(); } + +// { dg-final { scan-assembler "S \{anonymous\}::f" } } diff --git a/gcc/testsuite/g++.dg/pr45038.C b/gcc/testsuite/g++.dg/pr45038.C new file mode 100644 index 000000000..57c0c4417 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr45038.C @@ -0,0 +1,9 @@ +// PR preprocessor/45038 +// { dg-do compile } +// { dg-options "-Werror -Wold-style-cast" } + +double f(void) +{ + // We used to produce old-style casts for this. + return __DBL_MIN__; +} diff --git a/gcc/testsuite/g++.dg/pr45049-1.C b/gcc/testsuite/g++.dg/pr45049-1.C new file mode 100644 index 000000000..7b1dcd568 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr45049-1.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ + +namespace n1 { + void modf (); +} + +namespace n2 { + void trunc (); + void modf (); +} + +void max () +{ + using n1::modf; + using n2::trunc; + using n2::modf; +} diff --git a/gcc/testsuite/g++.dg/pr45049-2.C b/gcc/testsuite/g++.dg/pr45049-2.C new file mode 100644 index 000000000..a9518842e --- /dev/null +++ b/gcc/testsuite/g++.dg/pr45049-2.C @@ -0,0 +1,9 @@ +/* { dg-do compile } */ + +void foo() +{ + void bar(int); + void baz(int); + void baz(void); + void bar(void); +} diff --git a/gcc/testsuite/g++.dg/pr45056.C b/gcc/testsuite/g++.dg/pr45056.C new file mode 100644 index 000000000..a69107e35 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr45056.C @@ -0,0 +1,54 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fschedule-insns2 -fschedule-insns -g" } */ + +template < class _T1, class _T2 > struct pair +{ + _T1 first; + _T2 second; + pair (_T1 & __a, _T2 & __b) + :first (__a), second (__b) + { } +} +; +template < typename _Tp > struct _Vector_base +{ + ~_Vector_base (); +} +; +template < typename _Tp>struct vector +: _Vector_base < _Tp> +{ + template < typename _ForwardIterator > inline void _Destroy (_ForwardIterator) { } + _Tp * _M_finish; + ~vector () + { + _Destroy ( this->_M_finish); + } +} ; +template < typename ITV > struct Box +{ + Box (const Box &); + Box (); + typedef vector < ITV > Sequence; + Sequence seq; +}; +template < typename D > struct Powerset +{ + Powerset (const Powerset &y) :reduced (y.reduced) {} + bool reduced; +} ; +template < typename PS > struct Pointset_Powerset :Powerset < int > +{ + Pointset_Powerset (); + int space_dim; +} ; +pair +< +Box<int>, +Pointset_Powerset < int > > +linear_partition () +{ + Pointset_Powerset < int > r ; + Box<int> qq; + return pair<Box<int>,Pointset_Powerset < int > > (qq, r); +} diff --git a/gcc/testsuite/g++.dg/pr45112.C b/gcc/testsuite/g++.dg/pr45112.C new file mode 100644 index 000000000..34dd3e1bc --- /dev/null +++ b/gcc/testsuite/g++.dg/pr45112.C @@ -0,0 +1,12 @@ +/* { dg-do compile } */ + +struct JSString +{ + unsigned char mLength; + static JSString unitStringTable[]; +}; + +JSString JSString::unitStringTable[] __attribute__ ((aligned (8))) = { 1 }; + +int bug [__alignof__ (JSString::unitStringTable) >= 8 ? 1 : -1]; + diff --git a/gcc/testsuite/g++.dg/pr45310.C b/gcc/testsuite/g++.dg/pr45310.C new file mode 100644 index 000000000..335c78257 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr45310.C @@ -0,0 +1,31 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fnon-call-exceptions" } */ + +static inline const int & +max (const int &a, const int &b) +{ + return a ? a : b; +} + +static inline int +baz () +{ + return max (0, 0); +} + +struct S +{ + ~S () + { + baz (); + } +}; + +void bar (); +void +foo () +{ + S s; + bar (); +} + diff --git a/gcc/testsuite/g++.dg/pr45330.C b/gcc/testsuite/g++.dg/pr45330.C new file mode 100644 index 000000000..02d9b3f63 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr45330.C @@ -0,0 +1,37 @@ +// { dg-do compile } +// Search std, __cxxabiv1, and global namespaces, plus one more. +// { dg-options "--param cxx-max-namespaces-for-diagnostic-help=4" } + +#define NSPACE(NAME) namespace NAME { int foo; } + +namespace A +{ + int foo; // { dg-message "A::foo" "suggested alternative" } +} + +namespace B +{ + int foo; +} + +namespace C +{ + int foo; +} + +namespace D +{ + int foo; +} + +namespace E +{ + int foo; +} + +int bar() +{ + return foo; // { dg-error "was not declared" } + // { dg-message "maximum limit of 4 namespaces" "maximum limit" { target *-*-* } 34 } + // { dg-message "suggested alternative" "suggested alternative" { target *-*-* } 34 } +} diff --git a/gcc/testsuite/g++.dg/pr45788.C b/gcc/testsuite/g++.dg/pr45788.C new file mode 100644 index 000000000..de3340df3 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr45788.C @@ -0,0 +1,108 @@ +// { dg-do compile { target x86_64-*-* } } +// { dg-options "-O3 -fwhole-program -msse2" } + +typedef long unsigned int __darwin_size_t; +typedef __darwin_size_t size_t; + +typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__)); +typedef float __v4sf __attribute__ ((__vector_size__ (16))); +extern inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _mm_mul_ps (__m128 __A, __m128 __B) { + return (__m128) __builtin_ia32_mulps ((__v4sf)__A, (__v4sf)__B); +} +extern inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _mm_set1_ps (float __F) { + return __extension__ (__m128)(__v4sf){ + __F, __F, __F, __F }; +} +extern inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _mm_setr_ps (float __Z, float __Y, float __X, float __W) { +} +typedef float real; +template <typename T, int N> struct vectorX { +}; +template<> struct vectorX<float, 3> { + union { + __m128 s; + struct { + }; + }; + vectorX(__m128 s) : s(s) { + } + +} +__attribute__((aligned)); +template<> struct vectorX<float, 4> { + typedef float T; + typedef vectorX<float, 4> V; + union { + __m128 s; + struct { + T r, g, b, a; + }; + }; + vectorX(T a_, T b, T c, T d = 1) : s(_mm_setr_ps(a_,b,c,d)) { + } + vectorX(__m128 s) : s(s) { + } + vectorX(const V &t) : s(t.s) { + } + V &operator *=(const T t) { + s = _mm_mul_ps(s, _mm_set1_ps(t)); + return *this; + } + inline V operator *(const T t) const __attribute__((always_inline)) { + return V(*this) *= t; + }; +} +__attribute__((aligned)); +typedef vectorX<real, 3> color3; +typedef vectorX<real, 4> color4; +typedef color3 color; +static inline color4 c3to4(color c) { + color4 res(c.s); + res.a=1; + return res; +} +static inline color c4to3(color4 c) { + return color(c.s); +} +static inline color4 to_premultiplied(color c, real a) { + color4 res = c3to4(c); + return res * a; +} +static inline color4 to_premultiplied(color4 cs) { + return to_premultiplied(c4to3(cs), cs.a); +} +struct texture { +}; +struct flat_texture : public texture { + color4 c; + flat_texture(const color4 &c) : c(to_premultiplied(c)) { + } +}; +struct checkerboard_texture : public texture { + color4 even, odd; + checkerboard_texture(const color4 &even, const color4 &odd) : even(to_premultiplied(even)), odd(to_premultiplied(odd)) { + } +}; +struct texture_placement { + texture *tex; +}; +struct surface { + texture_placement textures[16]; + size_t texcount; +}; +struct primitive { + surface mat; +}; +static void set_color(primitive *p, color4 c) { + p->mat.textures[0].tex = new flat_texture(c); +} +static primitive **checkerboard_scene(int *pi) { + primitive **prims = new primitive*[6]; + set_color(prims[0], color4(.7,.7,.7)); + prims[1]->mat.textures[prims[1]->mat.texcount++].tex = new checkerboard_texture(color4(1,.1,.1),color4(.1,.15,1)); + set_color(prims[2], color4(.7,.9,.7)); +} +int main (int argc, char * const argv[]) { + int primi; + primitive **prims = checkerboard_scene(&primi); +} diff --git a/gcc/testsuite/g++.dg/pr46065.C b/gcc/testsuite/g++.dg/pr46065.C new file mode 100644 index 000000000..75c171db6 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr46065.C @@ -0,0 +1,11 @@ +// PR c++/46065 +// { dg-do compile } + +void bar (); + +void +foo () +{ + using ::bar; +label:; +} diff --git a/gcc/testsuite/g++.dg/pr46852.C b/gcc/testsuite/g++.dg/pr46852.C new file mode 100644 index 000000000..2c9d8dd41 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr46852.C @@ -0,0 +1,7 @@ +// PR c++/46852 +// { dg-do compile } + +template +< +class +{ // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/pr46868.C b/gcc/testsuite/g++.dg/pr46868.C new file mode 100644 index 000000000..544c7b219 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr46868.C @@ -0,0 +1,4 @@ +// PR c++/46868 +// { dg-do compile } + +template < int > struct S { S < // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/pr46890.C b/gcc/testsuite/g++.dg/pr46890.C new file mode 100644 index 000000000..3ecef5a52 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr46890.C @@ -0,0 +1,6 @@ +// PR c++/46890 +// { dg-do compile } + +struct MdatResource { +const char *mdatAlloc; +} const *_resource; diff --git a/gcc/testsuite/g++.dg/pr47053.C b/gcc/testsuite/g++.dg/pr47053.C new file mode 100644 index 000000000..186e3a7ad --- /dev/null +++ b/gcc/testsuite/g++.dg/pr47053.C @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fnon-call-exceptions" } */ +struct A +{ + int i; + virtual ~A () + {} +}; + +struct B : virtual A +{}; + +struct C : public B +{ + C (); + ~C (){} +}; + +void foo () +{ + C c; +} diff --git a/gcc/testsuite/g++.dg/pr47589.C b/gcc/testsuite/g++.dg/pr47589.C new file mode 100644 index 000000000..6bc3c8034 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr47589.C @@ -0,0 +1,26 @@ +// PR c++/47589 +// { dg-do compile } + +struct F +{ + typedef void(*Cb)(); + + F(Cb); +}; + +struct C +{ + template<class D> static void f(); +}; + +template<class D> +struct TF : F +{ + TF() : F(C::f<D>) { } +}; + +struct DTC : TF<DTC> +{ + DTC() { } +}; + diff --git a/gcc/testsuite/g++.dg/pr48660.C b/gcc/testsuite/g++.dg/pr48660.C new file mode 100644 index 000000000..37b61741a --- /dev/null +++ b/gcc/testsuite/g++.dg/pr48660.C @@ -0,0 +1,22 @@ +template<int N> struct val { char a[N]; }; + +class Base +{ +public: + virtual val<1> get1() const = 0; + virtual val<2> get2() const = 0; + virtual val<3> get3() const = 0; + virtual val<4> get4() const = 0; +}; + +class Derived : public virtual Base +{ +public: + virtual val<1> get1() const { return foo->get1(); } + virtual val<2> get2() const { return foo->get2(); } + virtual val<3> get3() const { return foo->get3(); } + virtual val<4> get4() const { return foo->get4(); } + Base *foo; +}; + +Base* make() { return new Derived; } diff --git a/gcc/testsuite/g++.dg/pubtypes.C b/gcc/testsuite/g++.dg/pubtypes.C new file mode 100644 index 000000000..74bff595a --- /dev/null +++ b/gcc/testsuite/g++.dg/pubtypes.C @@ -0,0 +1,65 @@ +/* Radar 4535968 */ +/* { dg-do compile { target *-*-darwin* } } */ +/* { dg-options "-O0 -gdwarf-2 -dA -fno-eliminate-unused-debug-types" } */ +/* { dg-final { scan-assembler "__debug_pubtypes" } } */ +/* { dg-final { scan-assembler "long+\[ \t\]+\(0x\)?\[0-9a-f]+\[ \t\n\]+\[#;@]+\[ \t\]+Length of Public Type Names Info" } } */ +/* { dg-final { scan-assembler "\"empty\\\\0\"+\[ \t\]+\[#;@]+\[ \t\]+external name" } } */ +/* { dg-final { scan-assembler "\"A\\\\0\"+\[ \t\]+\[#;@]+\[ \t\]+external name" } } */ +/* { dg-final { scan-assembler "\"B\\\\0\"+\[ \t\]+\[#;@]+\[ \t\]+external name" } } */ + + +struct A +{ + virtual ~A (); + int a1; +}; + +A::~A() +{ + a1 = 800; +} + +struct B : public A +{ + virtual ~B (); + int b1; + int b2; +}; + +B::~B() +{ + a1 = 900; + b1 = 901; + b2 = 902; +} + +// Stop the compiler from optimizing away data. +void refer (A *) +{ + ; +} + +struct empty {}; + +// Stop the compiler from optimizing away data. +void refer (empty *) +{ + ; +} + +int main (void) +{ + A alpha, *aap, *abp; + B beta, *bbp; + empty e; + + alpha.a1 = 100; + beta.a1 = 200; beta.b1 = 201; beta.b2 = 202; + + aap = α refer (aap); + abp = β refer (abp); + bbp = β refer (bbp); + refer (&e); + + return 0; // marker return 0 +} // marker close brace diff --git a/gcc/testsuite/g++.dg/rtti/anon-ns1.C b/gcc/testsuite/g++.dg/rtti/anon-ns1.C new file mode 100644 index 000000000..e18be4300 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/anon-ns1.C @@ -0,0 +1,15 @@ +// PR c++/49440 +// The typeinfo name for A should start with * so we compare +// it by address rather than contents. + +// { dg-final { scan-assembler "\"\*N\[^\"\]+1AE" } } + +namespace +{ + class A { }; +} + +void f() +{ + throw A(); +} diff --git a/gcc/testsuite/g++.dg/rtti/crash1.C b/gcc/testsuite/g++.dg/rtti/crash1.C new file mode 100644 index 000000000..eea6a3950 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/crash1.C @@ -0,0 +1,10 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 29 Sep 2002 <nathan@codesourcery.com> + +// PR 7788. ICE + +class foo; +extern const foo bar; +class bar; diff --git a/gcc/testsuite/g++.dg/rtti/crash2.C b/gcc/testsuite/g++.dg/rtti/crash2.C new file mode 100644 index 000000000..9646dfdc1 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/crash2.C @@ -0,0 +1,9 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 16 Jun 2005 <nathan@codesourcery.com> + +// Crash when compiler is optimized +// Origin: Andrew Pinski pinskia@gcc.gnu.org + +struct facet { virtual ~facet(); }; +struct ctype_base {}; +struct ctype : facet, ctype_base {}; diff --git a/gcc/testsuite/g++.dg/rtti/crash3.C b/gcc/testsuite/g++.dg/rtti/crash3.C new file mode 100644 index 000000000..076e36002 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/crash3.C @@ -0,0 +1,10 @@ +// PR c++/23947 +// { dg-do compile } + +class A {}; +class B {}; +class C : public A, public B {}; +class D : public C {}; +void f () throw (D) +{ +} diff --git a/gcc/testsuite/g++.dg/rtti/crash4.C b/gcc/testsuite/g++.dg/rtti/crash4.C new file mode 100644 index 000000000..49807e99f --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/crash4.C @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O" } */ + +class ios_base { +public: + virtual ~ios_base(); +}; +template<typename _CharT> +class basic_ostream : virtual public ios_base { +public: + virtual ~basic_ostream() { } +}; +extern template class basic_ostream<char>; +template <typename _CharT> +class basic_ostringstream : public basic_ostream<_CharT> { }; +template class basic_ostringstream<char>; diff --git a/gcc/testsuite/g++.dg/rtti/cv1.C b/gcc/testsuite/g++.dg/rtti/cv1.C new file mode 100644 index 000000000..59dd6592c --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/cv1.C @@ -0,0 +1,17 @@ +// { dg-do run } + +#include <typeinfo> +#include <string.h> + +struct S {}; + +typedef S volatile T[4]; + +T t[3]; + +const std::type_info& ti = typeid (t); + +int main () { + if (strcmp (ti.name (), "A3_A4_1S") != 0) + return 1; +} diff --git a/gcc/testsuite/g++.dg/rtti/darwin-builtin-linkage.C b/gcc/testsuite/g++.dg/rtti/darwin-builtin-linkage.C new file mode 100644 index 000000000..6db161169 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/darwin-builtin-linkage.C @@ -0,0 +1,20 @@ +/* { dg-do compile { target *-*-darwin* } } */ +/* { dg-final { scan-assembler-not "\\.weak_definition __ZTI" } } */ + +/* Verify that none of the type_info structures for the fundamental + types are emitted as weak on Darwin. */ + +#include <cxxabi.h> + +namespace __cxxabiv1 { + +using namespace std; + +// This has special meaning to the compiler, and will cause it +// to emit the type_info structures for the fundamental types which are +// mandated to exist in the runtime. +__fundamental_type_info:: +~__fundamental_type_info () +{} + +} diff --git a/gcc/testsuite/g++.dg/rtti/dyncast1.C b/gcc/testsuite/g++.dg/rtti/dyncast1.C new file mode 100644 index 000000000..ace1aef06 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/dyncast1.C @@ -0,0 +1,23 @@ +class JunkBase +{ +public: + virtual void DoSomething( void ) = 0; +protected: + virtual ~JunkBase( void ) {} + JunkBase( void ) {} +}; + +class Junk : protected JunkBase +{ +public: + Junk( void ) : JunkBase() {} + virtual ~Junk( void ) {} +protected: + inline JunkBase * AsBase( void ) + { return dynamic_cast< JunkBase * >( this ); } + virtual void DoSomething( void ) { } +}; + + + + diff --git a/gcc/testsuite/g++.dg/rtti/dyncast2.C b/gcc/testsuite/g++.dg/rtti/dyncast2.C new file mode 100644 index 000000000..2e4f61596 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/dyncast2.C @@ -0,0 +1,31 @@ +// PR c++/34364 +// { dg-do run } + +struct A +{ + virtual ~A () {} +}; + +struct B : public A +{ + template <typename T> struct C + { + static void f (A &a) + { + dynamic_cast <B &>(a).g (); + } + }; + + B () : c (6) {} + void g () { c++; } + int c; +}; + +B b; + +int +main (void) +{ + B::C<int>::f (b); + return b.c != 7; +} diff --git a/gcc/testsuite/g++.dg/rtti/dyncast3.C b/gcc/testsuite/g++.dg/rtti/dyncast3.C new file mode 100644 index 000000000..08352599b --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/dyncast3.C @@ -0,0 +1,81 @@ +// This testcase used to crash while looking in A for my_module. I'm still +// not sure it's well-formed, but it works now because of the optimization +// to look at the expected address first. + +// { dg-do run } + +extern "C" int puts (const char *); +extern "C" void abort (); + +struct my_object +{ + my_object() { puts ("in my_object ctor");} + virtual ~my_object() { puts ("in my_object dtor"); } +}; + +my_object* my_module_ptr = 0; + +struct my_module : my_object +{ + my_module() + { + puts ("in my_module ctor, setting up ptr"); + my_module_ptr = this; + } + ~my_module() { puts ("in my_module dtor");} +}; + +struct D +{ + D() { puts ("in D ctor"); } + virtual ~D(); +}; + +D::~D() +{ + puts ("in D dtor"); + puts ("before DCASTing to my_module*"); + my_module* m = dynamic_cast<my_module*>(my_module_ptr); + if (m != my_module_ptr) + abort (); + puts ("after DCASTing to my_module*"); +} + +struct my_interface +{ + my_interface() { puts ("in my_interface ctor");} + ~my_interface() { puts ("in my_interface dtor");} +}; + +struct myif : virtual my_interface +{ + myif() { puts ("in myif ctor");} + ~myif() { puts ("in myif dtor");} +}; + +struct A: virtual myif +{ + A() { puts ("in A ctor"); } + ~A() { puts ("in A dtor"); } + + D d; +}; + +struct B: virtual myif +{ + B() { puts ("in B ctor"); } + ~B() { puts ("in B dtor"); } + + D d; +}; + +struct C : my_module, A, B +{ + C() { puts ("in C ctor");} + ~C() { puts ("in C dtor"); } +}; + +int main(int, char**) +{ + C t; +} diff --git a/gcc/testsuite/g++.dg/rtti/dyncast4.C b/gcc/testsuite/g++.dg/rtti/dyncast4.C new file mode 100644 index 000000000..2a5fd2b3b --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/dyncast4.C @@ -0,0 +1,26 @@ +// Test to make sure that we keep searching if we don't find the type we +// want at the expected address. + +// { dg-do run } + +struct A +{ + virtual void f() {}; +}; + +struct B: A { }; + +struct C: A { }; + +struct D: B, C { }; + +int main() +{ + D d; + A* ap = static_cast<B*>(&d); + C* cp = dynamic_cast<C*>(ap); + if (cp == 0) + return 1; + else + return 0; +} diff --git a/gcc/testsuite/g++.dg/rtti/incomplete1.C b/gcc/testsuite/g++.dg/rtti/incomplete1.C new file mode 100644 index 000000000..2bf46e079 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/incomplete1.C @@ -0,0 +1,12 @@ +// PR c++/28109 +// { dg-do compile } + +#include <typeinfo> + +struct A; + +void foo() +{ + A a; // { dg-error "incomplete type" } + typeid (a); +} diff --git a/gcc/testsuite/g++.dg/rtti/no-rtti-voidptr.C b/gcc/testsuite/g++.dg/rtti/no-rtti-voidptr.C new file mode 100644 index 000000000..2b3915d17 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/no-rtti-voidptr.C @@ -0,0 +1,21 @@ +// { dg-do compile } +// { dg-options "-fno-rtti" } + +// PR C++/28687 + +struct A { + virtual ~A() { } +}; + +struct B : A { +}; + +A* f() +{ + return new B(); +} + +int main() +{ + void* b = dynamic_cast<void*>(f()); +} diff --git a/gcc/testsuite/g++.dg/rtti/no-rtti.C b/gcc/testsuite/g++.dg/rtti/no-rtti.C new file mode 100644 index 000000000..fdf2e6052 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/no-rtti.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// { dg-options "-fno-rtti" } + +// PR C++/10891 + +struct A { + virtual ~A() { } +}; + +struct B : A { +}; + +A* f(); + +int main() +{ + B* b = dynamic_cast<B*>(f()); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/rtti/predefined-rtti-macro-1.C b/gcc/testsuite/g++.dg/rtti/predefined-rtti-macro-1.C new file mode 100644 index 000000000..5c94bc1de --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/predefined-rtti-macro-1.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +struct A { virtual ~A() { }; }; +struct B : A { }; + +void f(B* bp) +{ + bp = +#ifdef __GXX_RTTI + dynamic_cast<B*>(static_cast<A*>(0)); +#endif +} diff --git a/gcc/testsuite/g++.dg/rtti/predefined-rtti-macro-2.C b/gcc/testsuite/g++.dg/rtti/predefined-rtti-macro-2.C new file mode 100644 index 000000000..284f2f64a --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/predefined-rtti-macro-2.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// { dg-options "-fno-rtti" } + +struct B { }; + +void f(B* bp) +{ + bp = +#ifndef __GXX_RTTI + static_cast<B*>(0); +#endif +} diff --git a/gcc/testsuite/g++.dg/rtti/repo1.C b/gcc/testsuite/g++.dg/rtti/repo1.C new file mode 100644 index 000000000..f72a9730a --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/repo1.C @@ -0,0 +1,19 @@ +// PR c++/22204 +// { dg-options "-frepo" } +// { dg-require-host-local "" } +// { dg-skip-if "dkms are not final links" { vxworks_kernel } } + +#include <typeinfo> +template<int> +struct function1 +{ + function1() + { + typeid(int[100]); + } +}; +function1<1> b; + +int main () {} + +// { dg-final { cleanup-repo-files } } diff --git a/gcc/testsuite/g++.dg/rtti/tinfo1.C b/gcc/testsuite/g++.dg/rtti/tinfo1.C new file mode 100644 index 000000000..bd379aace --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/tinfo1.C @@ -0,0 +1,40 @@ +// Test if a local definition is in a linkonce/comdat section. +// { dg-do compile } +// { dg-final { scan-assembler "_ZTIP9CTemplateIhE\[: \t\n\]" } } +// { dg-final { scan-assembler-not "(.globl|.global)\[ \]+_ZTIP9CTemplateIhE" } } +// { dg-final { scan-assembler-not ".section\[^\n\r\]*_ZTIP9CTemplateIhE\[^\n\r\]*" } } + + +namespace std +{ + class type_info + { + protected: + const char *__name; + + protected: + explicit type_info(const char *__n): __name(__n) { } + + public: + const char* name() const + { return __name; } + }; +} + +template<class TYPE> +class CTemplate +{ +}; + +class CSecondModule { +public: + CSecondModule(); + +private: + const CTemplate<unsigned char> *m_variable; typedef CTemplate<unsigned char> m_variable_type; +}; + +CSecondModule::CSecondModule() +{ + typeid(const_cast<m_variable_type *>(m_variable)).name() != 0; +} diff --git a/gcc/testsuite/g++.dg/rtti/typeid1.C b/gcc/testsuite/g++.dg/rtti/typeid1.C new file mode 100644 index 000000000..e26517576 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/typeid1.C @@ -0,0 +1,11 @@ +#include <typeinfo> + +struct A { + virtual ~A() {} +}; + +int main() { + A* a = new A; + typeid(*a).name(); +} + diff --git a/gcc/testsuite/g++.dg/rtti/typeid2.C b/gcc/testsuite/g++.dg/rtti/typeid2.C new file mode 100644 index 000000000..0dbcc598b --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/typeid2.C @@ -0,0 +1,15 @@ +// { dg-do run } + +#include <typeinfo> + +template <typename T> const char *print_type (const T &) { + return typeid(T).name(); +} + +/* no template */ void pp1 (int) {} +template <typename X> void pp2 (X) {} + +int main () { + if (print_type (&pp1) != print_type (&pp2<int>)) + return 1; +} diff --git a/gcc/testsuite/g++.dg/rtti/typeid3.C b/gcc/testsuite/g++.dg/rtti/typeid3.C new file mode 100644 index 000000000..a07b39924 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/typeid3.C @@ -0,0 +1,11 @@ +#include <typeinfo> + +template <template <class> class T> struct A { + void error() { + typeid(T).name(); // { dg-error "missing" } + } +}; + +template <class T> struct B {}; + +template void A<B>::error(); diff --git a/gcc/testsuite/g++.dg/rtti/typeid4.C b/gcc/testsuite/g++.dg/rtti/typeid4.C new file mode 100644 index 000000000..e6a1dce16 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/typeid4.C @@ -0,0 +1,26 @@ +// { dg-do run } +// { dg-options "-O2" } + +#include <typeinfo> +#include <iostream> + +struct A { virtual ~A () {} }; + +struct APtr +{ + APtr (A* p) : p_ (p) { } + A& operator* () const { return *p_; } + A* p_; +}; + +int main () +{ + APtr ap (new A); + std::type_info const* const exp = &typeid (*ap); + for (bool cont = true; cont; cont = false) + { + std::cout << "inner: cont " << cont << std::endl; + if (exp) ; + } +} + diff --git a/gcc/testsuite/g++.dg/rtti/typeid5.C b/gcc/testsuite/g++.dg/rtti/typeid5.C new file mode 100644 index 000000000..ef769ce53 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/typeid5.C @@ -0,0 +1,13 @@ +// PR c++/29928 +// { dg-do compile } + +#include <typeinfo> + +struct S; + +void f() +{ + const std::type_info& info1 = typeid(int []); + const std::type_info& info2 = typeid(S [3]); + const std::type_info& info3 = typeid(S []); +} diff --git a/gcc/testsuite/g++.dg/rtti/typeid6.C b/gcc/testsuite/g++.dg/rtti/typeid6.C new file mode 100644 index 000000000..d8879c59c --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/typeid6.C @@ -0,0 +1,12 @@ +// PR c++/33463 + +namespace std +{ + class type_info {}; +} + +template<int> void foo() +{ + !typeid(void); // { dg-error "!typeid\\(void\\)|candidate is" } + // { dg-message "" "match candidate text" { target *-*-* } 10 } +} diff --git a/gcc/testsuite/g++.dg/rtti/typeid7.C b/gcc/testsuite/g++.dg/rtti/typeid7.C new file mode 100644 index 000000000..7391405fc --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/typeid7.C @@ -0,0 +1,61 @@ +// PR c++/32260 +// { dg-do compile } +// { dg-options "-O2 -W -Wall" } + +#include <typeinfo> + +const std::type_info & +f1 (int i) +{ + return typeid (i + 1); +} + +const std::type_info & +f2 () +{ + return typeid (int); +} + +struct A +{ + A (); + virtual ~A (); + void foo (); +}; + +const std::type_info & +f3 () +{ + return typeid (A); +} + +const std::type_info & +f4 (A *p) +{ + return typeid (*p); +} + +const std::type_info & +f5 () +{ + return typeid (int *); +} + +const std::type_info & +f6 () +{ + return typeid (int [26][12]); +} + +const std::type_info & +f7 () +{ + return typeid (int [26][12]); +} + +void (A::*pmr) (); +const std::type_info & +f8 () +{ + return typeid (pmr); +} diff --git a/gcc/testsuite/g++.dg/rtti/typeid8.C b/gcc/testsuite/g++.dg/rtti/typeid8.C new file mode 100644 index 000000000..2b13be5ef --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/typeid8.C @@ -0,0 +1,26 @@ +// PR c++/36405 +// { dg-do compile } + +#include <typeinfo> + +struct A +{ + void foo () + { + typeid (foo).name (); // { dg-error "invalid use of member" } + typeid (A::foo).name (); // { dg-error "invalid use of member" } + } + void bar () + { + typeid (foo).name (); // { dg-error "invalid use of member" } + typeid (A::foo).name (); // { dg-error "invalid use of member" } + } + static void baz () + { + typeid (baz).name (); + typeid (A::baz).name (); + } +}; + +const char *p1 = typeid (A::foo).name (); // { dg-error "invalid use of non-static member" } +const char *p2 = typeid (A::baz).name (); diff --git a/gcc/testsuite/g++.dg/rtti/typeid9.C b/gcc/testsuite/g++.dg/rtti/typeid9.C new file mode 100644 index 000000000..381252dc6 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/typeid9.C @@ -0,0 +1,21 @@ +// Test that the typeid name for a local class is properly null-terminated. +// { dg-do run } + +#include <string.h> +#include <typeinfo> +#include <stdio.h> + +int f() +{ + struct A {}; struct B {}; + const std::type_info &ti = typeid(A); + const std::type_info &ti2 = typeid(B); + puts (ti.name()); + puts (ti2.name()); + return strcmp (ti.name(), "Z1fvE1A") || strcmp (ti2.name(), "Z1fvE1B"); +} + +int main() +{ + return f(); +} diff --git a/gcc/testsuite/g++.dg/special/conpr-1.C b/gcc/testsuite/g++.dg/special/conpr-1.C new file mode 100644 index 000000000..ef694dbe6 --- /dev/null +++ b/gcc/testsuite/g++.dg/special/conpr-1.C @@ -0,0 +1,20 @@ +/* { dg-do run { target init_priority } } */ + +#include <stdlib.h> + +class foo_t { + int x; +public: + foo_t(void) { x=1; } + int get(void) { return x; } +}; + +static foo_t foo __attribute__((init_priority(5000))); + +int main(void) { + + if (foo.get()) + exit(0); + else + abort(); +} diff --git a/gcc/testsuite/g++.dg/special/conpr-2.C b/gcc/testsuite/g++.dg/special/conpr-2.C new file mode 100644 index 000000000..ac826942a --- /dev/null +++ b/gcc/testsuite/g++.dg/special/conpr-2.C @@ -0,0 +1,23 @@ +/* { dg-do run { target init_priority } } */ +/* { dg-additional-sources "conpr-2a.cc" } */ + +#include <stdlib.h> + +class foo_t { + int x; + static int count; +public: + foo_t(void) { x=++count; } + int get(void) { return x; } +}; + +int foo_t::count; + +extern foo_t foo1, foo2; + +int main(void) { + + if ( (foo1.get() != 2) || (foo2.get() != 1) ) + abort(); + exit(0); +} diff --git a/gcc/testsuite/g++.dg/special/conpr-2a.cc b/gcc/testsuite/g++.dg/special/conpr-2a.cc new file mode 100644 index 000000000..69fb7d648 --- /dev/null +++ b/gcc/testsuite/g++.dg/special/conpr-2a.cc @@ -0,0 +1,12 @@ +/* { dg-do run } */ + +class foo_t { + int x; + static int count; +public: + foo_t(void) { x=++count; } + int get(void) { return x; } +}; + +foo_t foo1 __attribute__((init_priority(6000))); +foo_t foo2 __attribute__((init_priority(5000))); diff --git a/gcc/testsuite/g++.dg/special/conpr-3.C b/gcc/testsuite/g++.dg/special/conpr-3.C new file mode 100644 index 000000000..71fadcc64 --- /dev/null +++ b/gcc/testsuite/g++.dg/special/conpr-3.C @@ -0,0 +1,23 @@ +/* { dg-do run { target init_priority } } */ +/* { dg-additional-sources "conpr-3a.cc conpr-3b.cc" } */ + +#include <stdlib.h> + +class foo_t { + int x; + static int count; +public: + foo_t(void) { x=++count; } + int get(void) { return x; } +}; + +int foo_t::count; + +extern foo_t foo1, foo2; + +int main(void) { + + if ( (foo1.get() != 2) || (foo2.get() != 1) ) + abort(); + exit(0); +} diff --git a/gcc/testsuite/g++.dg/special/conpr-3a.cc b/gcc/testsuite/g++.dg/special/conpr-3a.cc new file mode 100644 index 000000000..b237bb57f --- /dev/null +++ b/gcc/testsuite/g++.dg/special/conpr-3a.cc @@ -0,0 +1,11 @@ +/* { dg-do run } */ + +class foo_t { + int x; + static int count; +public: + foo_t(void) { x=++count; } + int get(void) { return x; } +}; + +foo_t foo1 __attribute__((init_priority(6000))); diff --git a/gcc/testsuite/g++.dg/special/conpr-3b.cc b/gcc/testsuite/g++.dg/special/conpr-3b.cc new file mode 100644 index 000000000..b5efa0c35 --- /dev/null +++ b/gcc/testsuite/g++.dg/special/conpr-3b.cc @@ -0,0 +1,11 @@ +/* { dg-do run } */ + +class foo_t { + int x; + static int count; +public: + foo_t(void) { x=++count; } + int get(void) { return x; } +}; + +foo_t foo2 __attribute__((init_priority(5000))); diff --git a/gcc/testsuite/g++.dg/special/conpr-4.C b/gcc/testsuite/g++.dg/special/conpr-4.C new file mode 100644 index 000000000..40ce21d98 --- /dev/null +++ b/gcc/testsuite/g++.dg/special/conpr-4.C @@ -0,0 +1,23 @@ +/* { dg-do run { target init_priority } } */ +/* { dg-additional-sources "conpr-3b.cc conpr-3a.cc" } */ + +#include <stdlib.h> + +class foo_t { + int x; + static int count; +public: + foo_t(void) { x=++count; } + int get(void) { return x; } +}; + +int foo_t::count; + +extern foo_t foo1, foo2; + +int main(void) { + + if ( (foo1.get() != 2) || (foo2.get() != 1) ) + abort(); + exit(0); +} diff --git a/gcc/testsuite/g++.dg/special/ecos.exp b/gcc/testsuite/g++.dg/special/ecos.exp new file mode 100644 index 000000000..eb0c1eacd --- /dev/null +++ b/gcc/testsuite/g++.dg/special/ecos.exp @@ -0,0 +1,35 @@ +# Copyright (C) 1999, 2001, 2003, 2007 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# Please email any bugs, comments, and/or additions to this file to: +# jlarmour@cygnus.co.uk + +# This file was written by Jonathan Larmour (jlarmour@cygnus.co.uk). + +# G++ testsuite that uses the `dg.exp' driver. + +# Load support procs. +load_lib g++-dg.exp + +# Initialize 'dg'. +dg-init + +# Main loop. +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C]] "" "" + +# All done. +dg-finish + diff --git a/gcc/testsuite/g++.dg/special/initp1.C b/gcc/testsuite/g++.dg/special/initp1.C new file mode 100644 index 000000000..4a539a5a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/special/initp1.C @@ -0,0 +1,90 @@ +/* { dg-do run { target init_priority } } */ +#include <stdlib.h> + +class Two { +private: + int i, j, k; +public: + static int count; + Two( int ii, int jj ) { i = ii; j = jj; k = count++; }; + Two( void ) { i = 0; j = 0; k = count++; }; + int eye( void ) { return i; }; + int jay( void ) { return j; }; + int kay( void ) { return k; }; +}; + +extern Two foo; +extern Two goo; +extern Two coo[]; +extern Two koo[]; + +Two foo __attribute__((init_priority(1005))) ( 5, 6 ); + +Two goo __attribute__((init_priority(1007))) = Two( 7, 8 ); + +Two doo[ 3 ]; + +Two hoo[ 3 ] = { + Two( 11, 12 ), + Two( 13, 14 ), + Two( 15, 16 ) +}; + +Two coo[ 3 ] __attribute__((init_priority(1000))); + +Two koo[ 3 ] __attribute__((init_priority(1000))) = { + Two( 21, 22 ), + Two( 23, 24 ), + Two( 25, 26 ) +}; + +Two xoo[ 3 ] __attribute__((init_priority(1100))); + +Two zoo[ 3 ] __attribute__((init_priority(1100))) = { + Two( 31, 32 ), + Two( 33, 34 ), + Two( 35, 36 ) +}; + +int Two::count; + +long x = 0; + +#define X( n ) \ + do { if ( x & (1L << (n)) ) return 1; else x |= (1L << (n)); } while (0) + +int main() +{ + + X( coo[0].kay() ); + X( coo[1].kay() ); + X( coo[2].kay() ); + X( koo[0].kay() ); + X( koo[1].kay() ); + X( koo[2].kay() ); + if ( 0x3f != x ) abort (); + + X( foo.kay() ); + if ( 0x7f != x ) abort (); + + X( goo.kay() ); + if ( 0xff != x ) abort (); + + X( xoo[0].kay() ); + X( xoo[1].kay() ); + X( xoo[2].kay() ); + X( zoo[0].kay() ); + X( zoo[1].kay() ); + X( zoo[2].kay() ); + if ( 0x3fff != x ) abort (); + + X( doo[0].kay() ); + X( doo[1].kay() ); + X( doo[2].kay() ); + X( hoo[0].kay() ); + X( hoo[1].kay() ); + X( hoo[2].kay() ); + if ( 0xfffff != x ) abort (); + + exit (0); +} diff --git a/gcc/testsuite/g++.dg/special/initpri1.C b/gcc/testsuite/g++.dg/special/initpri1.C new file mode 100644 index 000000000..bd24961e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/special/initpri1.C @@ -0,0 +1,62 @@ +/* { dg-do run { target init_priority } } */ + +extern "C" void abort (); + +int i; +int j; + +void c1() __attribute__((constructor (500))); +void c2() __attribute__((constructor (700))); +void c3() __attribute__((constructor (600))); + +void c1() { + if (i++ != 0) + abort (); +} + +void c2() { + if (i++ != 2) + abort (); +} + +void c3() { + if (i++ != 1) + abort (); +} + +void d1() __attribute__((destructor (500))); +void d2() __attribute__((destructor (700))); +void d3() __attribute__((destructor (600))); + +void d1() { + if (--i != 0) + abort (); +} + +void d2() { + if (--i != 2) + abort (); +} + +void d3() { + if (j != 2) + abort (); + if (--i != 1) + abort (); +} + +void cd4() __attribute__((constructor (800), destructor (800))); + +void cd4() { + if (i != 3) + abort (); + ++j; +} + +int main () { + if (i != 3) + return 1; + if (j != 1) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/special/initpri2.C b/gcc/testsuite/g++.dg/special/initpri2.C new file mode 100644 index 000000000..fa9fda0d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/special/initpri2.C @@ -0,0 +1,39 @@ +/* { dg-do compile { target init_priority } } */ + +/* Priorities must be in the range [0, 65535]. */ +void c1() + __attribute__((constructor (-1))); /* { dg-error "priorities" } */ +void c2() + __attribute__((constructor (65536))); /* { dg-error "priorities" } */ +void d1() + __attribute__((destructor (-1))); /* { dg-error "priorities" } */ +void d2() + __attribute__((destructor (65536))); /* { dg-error "priorities" } */ + +/* Priorities 0-100 are reserved for system libraries. */ +void c3() + __attribute__((constructor (50))); /* { dg-warning "reserved" } */ +void d3() + __attribute__((constructor (50))); /* { dg-warning "reserved" } */ + +/* Priorities must be integral constants. */ + +/* Pointers, even with constant values, are not allowed. */ +void c4() + __attribute__((constructor ((void*) 500))); /* { dg-error "priorities" } */ +void d4() + __attribute__((destructor ((void*) 500))); /* { dg-error "priorities" } */ + +/* Integer variables are not allowed. */ +int i; +void c5() + __attribute__((constructor ((i)))); /* { dg-error "priorities" } */ +void d5() + __attribute__((destructor ((i)))); /* { dg-error "priorities" } */ + +/* Enumeration constants are allowed. */ +enum E { e = 500 }; +void c6() + __attribute__((constructor ((e)))); +void d6() + __attribute__((destructor ((e)))); diff --git a/gcc/testsuite/g++.dg/tc1/dr1.C b/gcc/testsuite/g++.dg/tc1/dr1.C new file mode 100644 index 000000000..9196218f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr1.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR1: What if two using-declarations refer to the same function but the +// declarations introduce different default-arguments? + +namespace A { + extern "C" void f(int = 5); +} +namespace B { + extern "C" void f(int = 5); +} +using A::f; +using B::f; + +void use() { + f(3); + f(); // { dg-error "" "" { xfail *-*-* } } +} diff --git a/gcc/testsuite/g++.dg/tc1/dr101.C b/gcc/testsuite/g++.dg/tc1/dr101.C new file mode 100644 index 000000000..0316aaaa7 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr101.C @@ -0,0 +1,30 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR101: Redeclaration of extern "C" names via using-declarations + +namespace Test1 { + + typedef unsigned int X; + extern "C" void f1(); + namespace N { + typedef unsigned int X; + extern "C" void f1(); + } + using N::f1; // { dg-bogus "" "redeclaration through 'using' should not be ambiguous" } + using N::X; // { dg-bogus "" "redeclaration through 'using' should not be ambiguous" } +} + + +namespace Test2 { + + typedef unsigned int X; // { dg-bogus "X" "" } + extern "C" int f2(); + namespace N { + typedef unsigned int X; // { dg-bogus "X" "" } + extern "C" int f2(); + } + using namespace N; + int i = f2(); // { dg-bogus "" "redeclaration through 'using' should not be ambiguous" } + X x; // { dg-bogus "" "redeclaration through 'using' should not be ambiguous" } + +} diff --git a/gcc/testsuite/g++.dg/tc1/dr108.C b/gcc/testsuite/g++.dg/tc1/dr108.C new file mode 100644 index 000000000..43bae15ea --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr108.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR108: Are classes nested in templates dependent? + +template <class T> struct S { + struct I1 { + typedef int X; + }; + struct I2 : public I1 { + X x; // { dg-error "does not name a type" "name" } + // { dg-message "note" "note" { target *-*-* } 10 } + }; +}; diff --git a/gcc/testsuite/g++.dg/tc1/dr127.C b/gcc/testsuite/g++.dg/tc1/dr127.C new file mode 100644 index 000000000..4dddc6d77 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr127.C @@ -0,0 +1,28 @@ +// { dg-do link } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR127: Ambiguity in description of matching deallocation function + +#include <cstddef> +#include <new> + +struct A +{ + // placement new, but can be called through normal new syntax. + void* operator new(std::size_t size, float = 0.0f) + { + return ::operator new(size); + } + + // The matching deallocation function must be called, which means + // the placemente delete. + void operator delete(void*); + void operator delete(void*, float) {} + + A() + { throw 5; } +}; + +int main() +{ + (void)new A; +} diff --git a/gcc/testsuite/g++.dg/tc1/dr128.C b/gcc/testsuite/g++.dg/tc1/dr128.C new file mode 100644 index 000000000..4dd78d57f --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr128.C @@ -0,0 +1,17 @@ +// { dg-do run } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR128: Casting between enum types + +extern "C" void abort(void); + +enum E1 { BLACK = 0, RED = 1 }; +enum E2 { WHITE = 0, YELLOW = 1}; + +int main(void) +{ + E1 e1 = RED; + E2 e2 = static_cast<E2>(e1); + if (e2 != YELLOW) + abort(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/tc1/dr135.C b/gcc/testsuite/g++.dg/tc1/dr135.C new file mode 100644 index 000000000..beed8cdfd --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr135.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR135: Class type in in-class member function definitions + +struct S { + S f() { return S(); } // { dg-bogus "" "incomplete class type is allowed as return type" } + void g(S) { } // { dg-bogus "" "incomplete class type is allowed as parameter type" } +}; diff --git a/gcc/testsuite/g++.dg/tc1/dr137.C b/gcc/testsuite/g++.dg/tc1/dr137.C new file mode 100644 index 000000000..bc1beb021 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr137.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR137: static_cast of cv void* + +struct A; + +const void* v; + +void foo(void) +{ + (void)static_cast<const volatile A *>(v); + (void)static_cast<A *>(v); // { dg-error "" "static_cast cannot remove cv qualifiers" } +} diff --git a/gcc/testsuite/g++.dg/tc1/dr142.C b/gcc/testsuite/g++.dg/tc1/dr142.C new file mode 100644 index 000000000..c49f4dd20 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr142.C @@ -0,0 +1,32 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR142: Injection-related errors in access example + +class B { // { dg-error "inaccessible" } +public: + int mi; // { dg-error "inaccessible" } + static int si; // { dg-error "inaccessible" } +}; + +class D: private B { +}; + +class DD: public D { + void f(); +}; + +void DD::f() { + mi = 3; // { dg-error "within this context" "" } + si = 3; // { dg-error "within this context" "" } + ::B b; + b.mi = 3; + b.si = 3; + ::B::si = 3; + ::B* bp1 = this; // { dg-error "inaccessible base" "" } + ::B* bp2 = (::B*)this; + bp2->mi = 3; + + + B b2; // { dg-error "within this context" "" } + B::si = 3; // { dg-error "within this context" "" } +} diff --git a/gcc/testsuite/g++.dg/tc1/dr147.C b/gcc/testsuite/g++.dg/tc1/dr147.C new file mode 100644 index 000000000..6799b7dcc --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr147.C @@ -0,0 +1,66 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR147: Naming the constructor (PR 11764) + +namespace N1 { + +struct A { A(); void f(); }; +struct B: public A { B(); }; + +A::A() { } +B::B() { } + +B::A ba; +A::A a; // { dg-error "constructor" "the injected-class-name can never be found through qualified lookup" } + +void A::f() +{ + A::A(); // { dg-message "::A" "c++/42415" } +} + +void f() +{ + A::A a; // { dg-error "constructor" } +} // { dg-error "" "" { target *-*-* } 23 } error cascade +} + +namespace N2 { + +// This is nasty: if we allowed the injected-class-name to be looked as a +// qualified type, then the following code would be well-formed. Basically +// the last line is defining the static member (with redundant parenthesis). +// Instead, it should be rejected as a malformed constructor declaration. + +template <class T> struct A { + template <class T2> A(T2); + static A x; +}; +template<> template <> A<char>::A<char>(char); +template<> A<int>::A<int>(A<int>::x); // { dg-error "" "this is an invalid declaration of the constructor" } + +} + +// But DR 318 says that in situations where a type is syntactically +// required, lookup finds it. + +struct C +{ + C(); + typedef int T; +}; +struct C::C c; +C::C::T t; +struct D: C::C +{ + D(): C::C() { } +}; + +// And if lookup doesn't find the injected-class-name, we aren't naming the +// constructor (c++/44401). + +struct E +{ + int E; +}; + +int E::*p = &E::E; diff --git a/gcc/testsuite/g++.dg/tc1/dr152.C b/gcc/testsuite/g++.dg/tc1/dr152.C new file mode 100644 index 000000000..f930d2e28 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr152.C @@ -0,0 +1,38 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR152: explicit copy constructors + +namespace N1 { + struct X { + X(); // { dg-message "note" } + explicit X(const X&); + }; + void f(X); // { dg-error "initializing" } + int foo() + { + X x; + f(x); // { dg-error "matching" "matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 14 } + } +} + +namespace N2 { + template <class T> + struct X { + X(); // { dg-message "note" } + explicit X(const X&); + }; + + template <class T> + void f(T ) {} // { dg-error "initializing" } + + template <class T> + int foo() + { + X<T> x; + N2::f(x); // { dg-error "matching" "matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 33 } + } + + template int foo<float>(); // { dg-message "instantiated from here" } +} diff --git a/gcc/testsuite/g++.dg/tc1/dr159.C b/gcc/testsuite/g++.dg/tc1/dr159.C new file mode 100644 index 000000000..74d23f1cd --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr159.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR159: Namespace qualification in declarators + +namespace N { + namespace M { + void f(); + void g(); + } + void M::f(){} + void N::M::g(){} +} diff --git a/gcc/testsuite/g++.dg/tc1/dr161.C b/gcc/testsuite/g++.dg/tc1/dr161.C new file mode 100644 index 000000000..49f679a0c --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr161.C @@ -0,0 +1,50 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR161: Access to protected nested type + +namespace N1 { + struct A + { + protected: + typedef int type; + }; + + struct B : public A + { + void test(void) + { + A::type t; + } + + friend void ftest(void) + { + A::type t; + } + }; +} + + +namespace N2 { + template <class T> + struct A + { + protected: + typedef int type; + }; + + template <class T> + struct B : public A<T> + { + void test(B b) + { + typename A<T>::type t; + } + + friend void ftest(B b) + { + typename A<T>::type t; + } + }; + + template struct B<void>; +} diff --git a/gcc/testsuite/g++.dg/tc1/dr164.C b/gcc/testsuite/g++.dg/tc1/dr164.C new file mode 100644 index 000000000..026ec096f --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr164.C @@ -0,0 +1,17 @@ +// { dg-do link } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR164: Overlap between Koenig and normal lookup + +void f(int); + +template <class T> void g(T t) { + f(t); +} + +enum E { e }; + +void f(E) {} + +int main() { + g(e); +} diff --git a/gcc/testsuite/g++.dg/tc1/dr166.C b/gcc/testsuite/g++.dg/tc1/dr166.C new file mode 100644 index 000000000..8c142906a --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr166.C @@ -0,0 +1,60 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR166: Friend declarations of template-ids + +namespace N { + template <class T> void f(T); + void g(); + + namespace M { + class A { + friend void f<int>(int); // N::f + static int x; // { dg-error "private" } + }; + + class B { + template <class T> friend void f(T); // M::f + static int x; // { dg-error "private" } + }; + + class C { + friend void g(); // M::g + static int x; // { dg-error "private" } + }; + + template <class T> void f(T) // will be instantiated as f<long> + { + M::A::x = 0; // { dg-error "within this context" } + M::B::x = 0; + } + template <> void f<int>(int) + { M::A::x = 0; } // { dg-error "within this context" } + template <> void f<double>(double ) + { + M::B::x = 0; + M::f<long>(0); // { dg-message "instantiated" } + } + + void g(void) + { M::C::x = 0; } + } + + template <class T> void f(T) // will be instantiated as f<long> + { + M::A::x = 0; // { dg-error "within this context" } + M::B::x = 0; // { dg-error "within this context" } + } + + template <> void f<int>(int ) + { + N::f<long>(0); // { dg-message "instantiated" } + M::A::x = 0; + M::B::x = 0; // { dg-error "within this context" } + } + + template <> void f<char>(char ) + { M::A::x = 0; } // { dg-error "within this context" } + + void g(void) + { M::C::x = 0; } // { dg-error "within this context" } +} diff --git a/gcc/testsuite/g++.dg/tc1/dr176.C b/gcc/testsuite/g++.dg/tc1/dr176.C new file mode 100644 index 000000000..2879ac4e7 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr176.C @@ -0,0 +1,29 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR176: Name injection and templates + +namespace N1 { + template <class T> struct Base { + Base* p; + Base<T*>* p2; + ::Base* p3; // { dg-error "" "" } + }; + + template <class T> struct Derived: public Base<T> { + Base* p; // { dg-error "" "unqualified name binds to N1::Base" } + Base<T*>* p2; + typename Derived::Base* p3; // { dg-bogus "" "injected class name in derived classes" } + }; + + template struct Derived<void>; // { dg-bogus "instantiated from here" "everything should be looked up at parsing time (after DR224)" } +} + + +namespace N2 { + template <class T> struct Base {}; + template <class T> struct Derived: public Base<T> { + typename Derived::template Base<double>* p1; // { dg-bogus "" "" } + }; + + template struct Derived<void>; +} diff --git a/gcc/testsuite/g++.dg/tc1/dr179.C b/gcc/testsuite/g++.dg/tc1/dr179.C new file mode 100644 index 000000000..39e4164d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr179.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR179: Function pointers and subtraction + +void foo(void); +typedef void (*fp)(void); + +int main() +{ + fp f1 = foo; + fp f2 = foo; + (void)f2-f1; // { dg-error "" "cannot subtract pointers to function" } +} diff --git a/gcc/testsuite/g++.dg/tc1/dr185.C b/gcc/testsuite/g++.dg/tc1/dr185.C new file mode 100644 index 000000000..2cd4e397f --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr185.C @@ -0,0 +1,26 @@ +// { dg-do run } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR185: "Named" temporaries and copy elision + +extern "C" void abort(void); + +struct A { + mutable int value; + explicit A(int i) : value(i) {} + void mutate(int i) const { value = i; } +}; + +int foo() { + A const& t = A(1); + A n(t); // can this copy be elided? NO! + t.mutate(2); + return n.value; // can this return 2? NO! +} + +int main() +{ + int x = foo(); + if (x != 1) + abort(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/tc1/dr188.C b/gcc/testsuite/g++.dg/tc1/dr188.C new file mode 100644 index 000000000..3a10fa476 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr188.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR188: Comma operator and rvalue conversion + +template <bool> struct StaticAssert; +template <> struct StaticAssert<true> {}; + +char arr[100]; +StaticAssert<(sizeof(0,arr) == 100)> check; diff --git a/gcc/testsuite/g++.dg/tc1/dr193.C b/gcc/testsuite/g++.dg/tc1/dr193.C new file mode 100644 index 000000000..40b065084 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr193.C @@ -0,0 +1,72 @@ +// { dg-do run } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR193: Order of destruction of local automatics of destructor + +extern "C" void abort(void); + +namespace N1 { + bool a_done = false; + struct A + { + ~A() + { + a_done = true; + } + }; + + struct B + { + ~B() + { + if (!a_done) + abort(); + } + }; + + struct C { + B x; + ~C() { + A y; + } + }; +} + + +namespace N2 { + bool a_done = false; + + template <class> + struct A + { + ~A() + { + a_done = true; + } + }; + + template <class> + struct B + { + ~B() + { + if (!a_done) + abort(); + } + }; + + template <class T> + struct C { + B<T> x; + ~C() { + A<T> y; + } + }; +} + + +int main(void) +{ + N1::C c1; + N2::C<void> c2; + return 0; +} diff --git a/gcc/testsuite/g++.dg/tc1/dr194.C b/gcc/testsuite/g++.dg/tc1/dr194.C new file mode 100644 index 000000000..3ed130071 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr194.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR194: Identifying constructors + +struct A +{ + inline explicit A(); +}; + +template <class> +struct B +{ + inline explicit B(); +}; + +template struct B<void>; diff --git a/gcc/testsuite/g++.dg/tc1/dr20.C b/gcc/testsuite/g++.dg/tc1/dr20.C new file mode 100644 index 000000000..fe5862129 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr20.C @@ -0,0 +1,34 @@ +// { dg-do run } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR20: Some clarifications needed for 12.8 para 15 + +extern "C" void printf(const char*, ...); +extern "C" void abort(void); + +int count = 0; + +class Thing { +public: + Thing() { + } + ~Thing() { + } + Thing(const Thing&) + { + count += 1; + } +}; + +Thing f() { + Thing t; + return t; +} + +int main(void) +{ + Thing t2 = f(); + printf("%d %x\n", count, &t2); + if (count != 0) + abort(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/tc1/dr213.C b/gcc/testsuite/g++.dg/tc1/dr213.C new file mode 100644 index 000000000..2cc70138a --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr213.C @@ -0,0 +1,27 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR213: Lookup in dependent base classes + +// We should emit an error at *instantiation* time because g(t) can't be +// resolved to any function. + +template <class T> struct A : T { + void h(T t) { + f(t); + g(t); // { dg-error "" "" { xfail *-*-* } } + } +}; + +struct B { + void f(B); + void g(B) {} +}; + +void f(B) {} + +int main() +{ + A<B> ab; // { dg-error "" "" { xfail *-*-* } } + B b; + ab.h(b); +} diff --git a/gcc/testsuite/g++.dg/tc1/dr217.C b/gcc/testsuite/g++.dg/tc1/dr217.C new file mode 100644 index 000000000..cfa280397 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr217.C @@ -0,0 +1,14 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR217: Default arguments for non-template member functions of class +// templates + +template <class T> +struct S +{ + void foo (int); +}; + +template <class T> +void S<T>::foo (int = 0) // { dg-error "" "default arguments for parameters of member functions of class templates can be specified in the initial declaration only" { xfail *-*-* } } +{ } diff --git a/gcc/testsuite/g++.dg/tc1/dr48.C b/gcc/testsuite/g++.dg/tc1/dr48.C new file mode 100644 index 000000000..19c173878 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr48.C @@ -0,0 +1,13 @@ +// { dg-do link } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR48: Definitions of unused static members + +struct A { + static const int size = 10; + int array[size]; +}; + +int main() { + A a; + return 0; +} diff --git a/gcc/testsuite/g++.dg/tc1/dr49.C b/gcc/testsuite/g++.dg/tc1/dr49.C new file mode 100644 index 000000000..753d96b69 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr49.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// Contributed by: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR 49: Non-constant pointers are invalid template arguments. + +template<int *a> struct R { /* ... */ }; +template<int b[5]> struct S { /* ... */ }; + +int p; +template struct R<&p>; // OK +template struct S<&p>; // OK due to parameter adjustment + +int *ptr; +template struct R<ptr>; // { dg-error "argument" } +template struct S<ptr>; // { dg-error "argument" } + +int v[5]; +template struct R<v>; // OK due to implicit argument conversion +template struct S<v>; // OK due to both adjustment and conversion + diff --git a/gcc/testsuite/g++.dg/tc1/dr52.C b/gcc/testsuite/g++.dg/tc1/dr52.C new file mode 100644 index 000000000..4f4015dc9 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr52.C @@ -0,0 +1,34 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR52: Non-static members, member selection and access checking + +struct A +{ + void foo(void); +}; + +struct B +{ +private: + void foo(void); +}; + +struct B1 : B {}; +struct B2 : B {}; + +struct C +{ // { dg-error "C" } + void foo(void); +}; + +struct D : private C {}; + +struct X: A, B1, B2, D +{ +public: + void bar(void) + { + this->B::foo(); // { dg-error "" } + this->C::foo(); // { dg-error "inaccessible|context" } + } +}; diff --git a/gcc/testsuite/g++.dg/tc1/dr68.C b/gcc/testsuite/g++.dg/tc1/dr68.C new file mode 100644 index 000000000..253f04943 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr68.C @@ -0,0 +1,20 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR68: Grammar does not allow "friend class A<int>;" + +namespace A{ + class B{}; +} + +namespace B{ + class A{}; + class C{ + friend class ::A::B; + }; +} + + +template <typename> class K; +class J { + friend class K<int>; +}; diff --git a/gcc/testsuite/g++.dg/tc1/dr74.C b/gcc/testsuite/g++.dg/tc1/dr74.C new file mode 100644 index 000000000..155c7981b --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr74.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR74: Enumeration value in direct-new-declarator + +struct A {}; +enum E1 { COUNT = 10 }; + +A* a = new A[COUNT]; + diff --git a/gcc/testsuite/g++.dg/tc1/dr76.C b/gcc/testsuite/g++.dg/tc1/dr76.C new file mode 100644 index 000000000..0859b0c73 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr76.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR76: Are const volatile variables considered "constant expressions"? + +volatile const int a = 5; + +template <int> struct K; +template struct K<a>; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/tc1/dr80.C b/gcc/testsuite/g++.dg/tc1/dr80.C new file mode 100644 index 000000000..2327428a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr80.C @@ -0,0 +1,53 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR80: Class members with same name as class + +struct A +{ + int A; +}; + +struct A2 +{ + static int A2; // { dg-error "same name as" } +}; + + +template <class> +struct A3 +{ + int A3; +}; + +template <class> +struct A4 +{ + static int A4; // { dg-error "same name as" } +}; + + +struct B +{ + B(); + int B; // { dg-error "same name as" } +}; + +struct B2 +{ + B2(); + static int B2; // { dg-error "same name as" } +}; + +template <class> +struct B3 +{ + B3(); + int B3; // { dg-error "same name as" "this error should appear at parsing time" { xfail *-*-* } } +}; + +template <class> +struct B4 +{ + B4(); + static int B4; // { dg-error "same name as" } +}; diff --git a/gcc/testsuite/g++.dg/tc1/dr85.C b/gcc/testsuite/g++.dg/tc1/dr85.C new file mode 100644 index 000000000..31dde8cbb --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr85.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR85: Redeclaration of member class + +struct Base { + struct Data {}; + struct Data; // { dg-error "" "redeclaration of nested class is invalid" { xfail *-*-* } } +}; diff --git a/gcc/testsuite/g++.dg/tc1/dr90.C b/gcc/testsuite/g++.dg/tc1/dr90.C new file mode 100644 index 000000000..b6ec24cc8 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr90.C @@ -0,0 +1,20 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR90: Should the enclosing class be an "associated class" too? + +struct A { + union U {}; + friend void f(U); +}; + +struct B { + struct S {}; + friend void f(S); +}; + +int main() { + A::U u; + f(u); + B::S s; + f(s); +} diff --git a/gcc/testsuite/g++.dg/tc1/dr94.C b/gcc/testsuite/g++.dg/tc1/dr94.C new file mode 100644 index 000000000..97cf0c256 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr94.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR94: Inconsistencies in the descriptions of constant expressions + +struct S { + static const int c = 5; +}; +int a[S::c]; + diff --git a/gcc/testsuite/g++.dg/template/access1.C b/gcc/testsuite/g++.dg/template/access1.C new file mode 100644 index 000000000..1622e087d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access1.C @@ -0,0 +1,27 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 19 Jan 2002 <nathan@codesourcery.com> + +// It is legal to specialize a template with a different class-key. + +template<typename T> class X; + +template<typename T> struct X<T *> +{ + int i; +}; +template<> struct X<int> +{ + int i; +}; + +void foo () +{ + X<int *> xip; + X<int> xi; + + xip.i; + xi.i; +} + diff --git a/gcc/testsuite/g++.dg/template/access10.C b/gcc/testsuite/g++.dg/template/access10.C new file mode 100644 index 000000000..8b4883c25 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access10.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Origin: Giovanni Bajo <giovannibajo@libero.it> + +// PR c++/10849: Incorrect access checking on template specialization. + +class X { + private: + template <typename T> struct Y; +}; + +template <> struct X::Y<int> {}; + +template <typename T> struct X::Y {}; + +template struct X::Y<int>; diff --git a/gcc/testsuite/g++.dg/template/access11.C b/gcc/testsuite/g++.dg/template/access11.C new file mode 100644 index 000000000..c9364a823 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access11.C @@ -0,0 +1,24 @@ +// Copyright (C) 2003 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +// Access checking during explicit instantiation. + +class A { + typedef int X; // { dg-error "private" } +}; + +class X { + private: + template <typename T> struct Y; +}; + +template <> struct X::Y<int> { + A::X x; // { dg-error "this context" } +}; + +template <typename T> struct X::Y { + typename T::X x; // { dg-error "this context" } +}; + +template struct X::Y<A>; // { dg-message "instantiated from here" } diff --git a/gcc/testsuite/g++.dg/template/access12.C b/gcc/testsuite/g++.dg/template/access12.C new file mode 100644 index 000000000..9185d5125 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access12.C @@ -0,0 +1,13 @@ +// { dg-do compile } + +// Origin: Giovanni Bajo <giovannibajo@libero.it> + +// PR c++/10849: Incorrect access checking on class template partial +// specialization. + +class X { + private: + template <typename T> struct Y; +}; + +template <typename T> struct X::Y<T*> {}; diff --git a/gcc/testsuite/g++.dg/template/access13.C b/gcc/testsuite/g++.dg/template/access13.C new file mode 100644 index 000000000..3a1442bb0 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access13.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Origin: Francesco Monica <fmonica@ce.unipr.it> + +// PR c++/13262: Access checking during instantiation of static data +// member. + +template <typename T> class Aclass { + private: + Aclass() {} + static Aclass instance; +}; + +template <typename T> Aclass<T> Aclass<T>::instance; + +template class Aclass<int>; diff --git a/gcc/testsuite/g++.dg/template/access14.C b/gcc/testsuite/g++.dg/template/access14.C new file mode 100644 index 000000000..047f9258f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access14.C @@ -0,0 +1,16 @@ +// PR c++/14777 + +template <typename T> +struct B +{ +protected: + typedef int M; +}; + +template <typename T> +struct A : B<T> { + typedef typename B<T>::M N; + A (int = N ()); +}; + +A<int> a = A<int> (); diff --git a/gcc/testsuite/g++.dg/template/access15.C b/gcc/testsuite/g++.dg/template/access15.C new file mode 100644 index 000000000..e28716366 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access15.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 23 Aug 2004 <nathan@codesourcery.com> +// Origin: stefaandr@hotmail.com + +// Bug 17149: ICE with TEMPLATE_TYPE_PARM + + +template <class super, + int (super::tdata::*member)() const = &super::tdata::operator()> +struct x {}; diff --git a/gcc/testsuite/g++.dg/template/access16.C b/gcc/testsuite/g++.dg/template/access16.C new file mode 100644 index 000000000..bb7ebccb8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access16.C @@ -0,0 +1,16 @@ +// PR c++/23842 + +struct S; +extern S *p; +template <class T> int f(T*, int y = ((T*)p)->x) { + return y; +} +struct S { +private: + int x; + template <class U> friend int f(U*, int); +}; +int g() { + return f(p); +} + diff --git a/gcc/testsuite/g++.dg/template/access17.C b/gcc/testsuite/g++.dg/template/access17.C new file mode 100644 index 000000000..0c4510005 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access17.C @@ -0,0 +1,23 @@ +// PR c++/27339 + +class A +{ +private: + enum private_enum {a}; + + template<A::private_enum v> // OK + struct B + { + void bm(); + }; +public: + void am() + { + B<a> instance; //OK + instance.bm(); + } +}; + +template<A::private_enum v> // FAIL +void +A::B<v>::bm(){} diff --git a/gcc/testsuite/g++.dg/template/access18.C b/gcc/testsuite/g++.dg/template/access18.C new file mode 100644 index 000000000..3338bc932 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access18.C @@ -0,0 +1,19 @@ +// DR 401 + +class X { + typedef int a; // { dg-error "private" } + static const int b = 5; // { dg-error "private" } + template <typename> + struct c; // { dg-error "private" } +}; + +template <typename = X::a> // { dg-error "context" } +struct A; + +template <int = X::b> // { dg-error "context" } +struct B; + +template <template <typename> class T = X::c> // { dg-error "context" } +struct C; + + diff --git a/gcc/testsuite/g++.dg/template/access19.C b/gcc/testsuite/g++.dg/template/access19.C new file mode 100644 index 000000000..6420b1cbe --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access19.C @@ -0,0 +1,24 @@ +/* PR c++/29475 The error diagnostic contained "U = U" instead of "U = char" */
+/* { dg-do compile } */
+
+template< class T >
+class explicit_t
+{
+public:
+ explicit_t( const T& c ): value( c ) { }
+ operator T&() { return value; }
+private:
+ template< class U >
+ explicit_t( U t ); /* { dg-error "with U = char, T = int|is private" } */
+ T value;
+};
+
+int foo( int x, explicit_t< int > y )
+{
+ return x + y;
+}
+
+int main()
+{
+ return foo( 5, 'c' ); /* { dg-error "this context" } */
+}
diff --git a/gcc/testsuite/g++.dg/template/access2.C b/gcc/testsuite/g++.dg/template/access2.C new file mode 100644 index 000000000..c5e3f1103 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access2.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +// PR c++/5387 +// Enforcing access of typename type. + +template <class T> struct A { + typename T::X x; // { dg-error "this context" } + int f() { return T::i; } // { dg-error "this context" } +}; + +class B { + typedef int X; // { dg-error "private" } + static int i; // { dg-error "private" } +}; + +int main() +{ + A<B> ab; // { dg-message "instantiated" } + ab.f(); // { dg-message "instantiated" } +} diff --git a/gcc/testsuite/g++.dg/template/access20.C b/gcc/testsuite/g++.dg/template/access20.C new file mode 100644 index 000000000..ebf575e6c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access20.C @@ -0,0 +1,18 @@ +// PR c++/29470 + +template <typename T> struct B +{ + protected: + T v; // { dg-error "protected" } +}; +template <typename T> struct D : B<T> +{ + protected: + using B<T>::v; +}; +int main() +{ + D<int> d; + d.v = 0; // { dg-error "context" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/access21.C b/gcc/testsuite/g++.dg/template/access21.C new file mode 100644 index 000000000..8414c4371 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access21.C @@ -0,0 +1,23 @@ +// PR c++/48884 + +class X +{ + static const int I = 42; + friend struct Y; +}; + +template <int I> struct A { }; + +struct Y +{ + template <typename T> + static A<T::I> f(T t) + { + return A<T::I>(); + } +}; + +int main() +{ + Y::f(X()); +} diff --git a/gcc/testsuite/g++.dg/template/access22.C b/gcc/testsuite/g++.dg/template/access22.C new file mode 100644 index 000000000..9ee28a2a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access22.C @@ -0,0 +1,15 @@ +template <int I> struct B { }; + +template <class T> +B<T::I> f(); + +class A +{ + static const int I = 42; + template <class T> friend B<T::I> f(); +}; + +int main() +{ + f<A>(); +} diff --git a/gcc/testsuite/g++.dg/template/access3.C b/gcc/testsuite/g++.dg/template/access3.C new file mode 100644 index 000000000..c7a155e8b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access3.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +// PR c++/5387 +// Enforcing access of typename type. + +template <class T> struct A { + typename T::template X<int> x; // { dg-error "this context" } +}; + +class B { + template <class T> class X {}; // { dg-error "private" } +}; + +int main() +{ + A<B> ab; // { dg-message "instantiated" } +} diff --git a/gcc/testsuite/g++.dg/template/access4.C b/gcc/testsuite/g++.dg/template/access4.C new file mode 100644 index 000000000..9451ecc22 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access4.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// Origin: Wolfgang Bangerth <wolfgang.bangerth@iwr.uni-heidelberg.de> + +// PR c++/7347 +// Access control for typename during instantiation + +template <int dim> class Base { + protected: + typedef int T; +}; + +template <int dim> class D : public Base<dim> { + public: + typedef typename Base<dim>::T T1; + D (T1 t); +}; + +D<2> d(1); diff --git a/gcc/testsuite/g++.dg/template/access5.C b/gcc/testsuite/g++.dg/template/access5.C new file mode 100644 index 000000000..b2da190ff --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access5.C @@ -0,0 +1,21 @@ +// { dg-do compile } +// Origin: Wolfgang Bangerth <wolfgang.bangerth@iwr.uni-heidelberg.de> + +// PR c++/7348 +// Access control for typename in function return type + +class Outer { + template <int dim> struct Inner { + typedef int T; + T foo (); + }; + public: + Outer(); +}; + +template <int dim> +typename Outer::Inner<dim>::T Outer::Inner<dim>::foo () { + return 1; +} + +template struct Outer::Inner<2>; diff --git a/gcc/testsuite/g++.dg/template/access6.C b/gcc/testsuite/g++.dg/template/access6.C new file mode 100644 index 000000000..cbc8000d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access6.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// Origin: Detlef Vollmann <dv@vollmann.ch> + +// PR c++/8389 +// Access control ICE for typename during instantiation and name mangling + +template <class> class Base { + protected: + typedef int Type; +}; + +template <class T> struct Derived : public Base<T> { + typedef typename Base<T>::Type Type; + template <class Arg> void f(Type = Type()) {} +}; + +template void Derived<char>::f<int> (Type); diff --git a/gcc/testsuite/g++.dg/template/access7.C b/gcc/testsuite/g++.dg/template/access7.C new file mode 100644 index 000000000..412ad00c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access7.C @@ -0,0 +1,18 @@ +// { dg-do compile } + +// PR c++/3663 +// Enforce access of nested type. + +template <typename A> +class S { + class T {}; // { dg-error "private" } +}; + +template <typename A> +typename A::T* f (A) { // { dg-error "this context" } + return 0; +} + +void g () { + f (S<int> ()); // { dg-message "instantiated" } +} diff --git a/gcc/testsuite/g++.dg/template/access8.C b/gcc/testsuite/g++.dg/template/access8.C new file mode 100644 index 000000000..4bdadae3c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access8.C @@ -0,0 +1,16 @@ +// Copyright (C) 2003 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +// Template instantiate during deferred access check + +template <class T> struct C { + typedef typename T::X Y; +}; + +class A { + typedef int X; + template <class T> friend struct C; +}; + +C<A>::Y f(int); diff --git a/gcc/testsuite/g++.dg/template/access9.C b/gcc/testsuite/g++.dg/template/access9.C new file mode 100644 index 000000000..b24c93f8d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access9.C @@ -0,0 +1,19 @@ +// Copyright (C) 2003 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +// Template instantiate during deferred access check + +template <void (*)(int)> struct C { + typedef int Y; +}; + +template <class T> void f(typename T::X) { +} + +class A { + typedef int X; + template <class T> friend void f(typename T::X); +}; + +C<&f<A> >::Y g(int); diff --git a/gcc/testsuite/g++.dg/template/addr1.C b/gcc/testsuite/g++.dg/template/addr1.C new file mode 100644 index 000000000..dd5e3870f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/addr1.C @@ -0,0 +1,12 @@ +// PR c++/15542 + +template <typename> struct S_T { + const char** operator & (); +}; + +template <class T> void foo(T **) {} + +template <typename> void templateTest() { + S_T<const char> s_t; + foo(&s_t); +} diff --git a/gcc/testsuite/g++.dg/template/alignof1.C b/gcc/testsuite/g++.dg/template/alignof1.C new file mode 100644 index 000000000..50a32183c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/alignof1.C @@ -0,0 +1,13 @@ +template<typename T> +int my_alignof() +{ + return __alignof__(T); +} + +template<typename> +struct X { }; + +int main() +{ + return my_alignof<X<void> >(); +} diff --git a/gcc/testsuite/g++.dg/template/anon1.C b/gcc/testsuite/g++.dg/template/anon1.C new file mode 100644 index 000000000..ef73df6b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/anon1.C @@ -0,0 +1,21 @@ +struct x { + int foo () {} +}; + +template <class T> +struct vector { + T& bar () {} +}; + +template <class T> +struct y { + typedef struct { + x t; + } s; + + vector<s> array; + + int foo () + { return array.bar().t.foo(); } +}; +int i = y<x>().foo (); diff --git a/gcc/testsuite/g++.dg/template/anon2.C b/gcc/testsuite/g++.dg/template/anon2.C new file mode 100644 index 000000000..75285ade3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/anon2.C @@ -0,0 +1,15 @@ +// PR c++/28279 +// finish_static_data_member_decl was confused by the anonymous +// namespace causing TREE_PUBLIC to be unset + +template<typename T> +struct is_pointer_impl { + static const bool value = true; +}; + +namespace { + class prefix_name_mapper {}; +} + +static const bool val = is_pointer_impl<prefix_name_mapper>::value; + diff --git a/gcc/testsuite/g++.dg/template/anon3.C b/gcc/testsuite/g++.dg/template/anon3.C new file mode 100644 index 000000000..eee7acd82 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/anon3.C @@ -0,0 +1,20 @@ +// PR c++/28370 +// { dg-do run } + +namespace +{ + template<typename T> struct A { static int *a; }; + template<typename T> int *A<T>::a = 0; +} + +int * +foo () +{ + return A<int>::a; +} + +int +main () +{ + return foo() != 0; +} diff --git a/gcc/testsuite/g++.dg/template/anon4.C b/gcc/testsuite/g++.dg/template/anon4.C new file mode 100644 index 000000000..59bfee1e8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/anon4.C @@ -0,0 +1,10 @@ +// PR c++/28407 +// A declaration in the anonymous namespace still has external linkage. + +template <int *P> class A { }; +namespace +{ + int i; +} + +A<&i> a; diff --git a/gcc/testsuite/g++.dg/template/anon5.C b/gcc/testsuite/g++.dg/template/anon5.C new file mode 100644 index 000000000..34599c061 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/anon5.C @@ -0,0 +1,6 @@ +// PR c++/45651 + +namespace { template <int T> struct A {}; } +template <int T> struct B { void f(A<T>); }; +template struct B<1>; +template<int T> void B<T>::f(A<T>) {} diff --git a/gcc/testsuite/g++.dg/template/anonunion1.C b/gcc/testsuite/g++.dg/template/anonunion1.C new file mode 100644 index 000000000..89a8c5bec --- /dev/null +++ b/gcc/testsuite/g++.dg/template/anonunion1.C @@ -0,0 +1,24 @@ +// PR c++/47303 +// { dg-do compile } +// { dg-options "-fabi-version=1" } + +struct Z +{ + void foo (int); +}; + +struct F +{ + typedef void (Z::*zm) (int); + typedef void (F::*fm) (int); + template <zm> + void bar (int) + { + union + { + Z z; + }; + } +}; + +F::fm m = &F::bar <&Z::foo>; diff --git a/gcc/testsuite/g++.dg/template/anonunion2.C b/gcc/testsuite/g++.dg/template/anonunion2.C new file mode 100644 index 000000000..cb3c12dff --- /dev/null +++ b/gcc/testsuite/g++.dg/template/anonunion2.C @@ -0,0 +1,6 @@ +template <int i> +struct S +{ + S () { union { int a; }; a = 0; } +}; +S<0> s; diff --git a/gcc/testsuite/g++.dg/template/arg1.C b/gcc/testsuite/g++.dg/template/arg1.C new file mode 100644 index 000000000..f7a8b3150 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/arg1.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 21 Mar 2003 <nathan@codesourcery.com> + +// PR 9978. We rejected a constant expression. + +enum { val = 1 }; + +template <class T> +struct Bar +{ + static const int A = val; + static const int B = A + 1; +}; diff --git a/gcc/testsuite/g++.dg/template/arg2.C b/gcc/testsuite/g++.dg/template/arg2.C new file mode 100644 index 000000000..9fb7a68cc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/arg2.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 21 Mar 2003 <nathan@codesourcery.com> + +// PR 9708. We accepted a local class + +template <typename T> class X {}; + +void fn () +{ + class L {}; + X<L> f; // { dg-error "uses local type|trying to instantiate|no type|invalid type" "" } +} diff --git a/gcc/testsuite/g++.dg/template/arg3.C b/gcc/testsuite/g++.dg/template/arg3.C new file mode 100644 index 000000000..050aa33bc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/arg3.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 27 Mar 2003 <nathan@codesourcery.com> + +// PR 10224. Rejected a valid constant argument. + +template <bool B> struct X { + struct I {}; +}; + +template <typename T> struct Y { + static const bool selector = true; + typedef typename X<selector>::I helper; +}; + +Y<int> i; diff --git a/gcc/testsuite/g++.dg/template/arg4.C b/gcc/testsuite/g++.dg/template/arg4.C new file mode 100644 index 000000000..9c9d9ea96 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/arg4.C @@ -0,0 +1,9 @@ +// PR c++/23437 + +template <void (*p)()> struct S { + static const int i = 10; +}; + +void g(); + +int a[S<g>::i]; diff --git a/gcc/testsuite/g++.dg/template/arg5.C b/gcc/testsuite/g++.dg/template/arg5.C new file mode 100644 index 000000000..87cbd0268 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/arg5.C @@ -0,0 +1,9 @@ +// PR c++/30534 +// { dg-do compile } + +template<bool> struct A; + +template<int> void foo() +{ + A<__builtin_constant_p(.)> a; // { dg-error "template argument|invalid" } +} diff --git a/gcc/testsuite/g++.dg/template/arg6.C b/gcc/testsuite/g++.dg/template/arg6.C new file mode 100644 index 000000000..ef05abaee --- /dev/null +++ b/gcc/testsuite/g++.dg/template/arg6.C @@ -0,0 +1,15 @@ +// PR c++/33744 +// { dg-do run } + +template <bool B> struct A { bool b; A() : b(B) {}; }; +A<bool(1)> a; +A<bool(1<2)> b; +A<(bool)(2>1)> c; +A<bool((2>1))> d; +A<bool(2>1)> e; + +int +main () +{ + return (a.b && b.b && c.b && d.b && e.b) ? 0 : 1; +} diff --git a/gcc/testsuite/g++.dg/template/arg7.C b/gcc/testsuite/g++.dg/template/arg7.C new file mode 100644 index 000000000..a9333b26a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/arg7.C @@ -0,0 +1,11 @@ +// PR c++/27425, 34274 + +template<typename T> struct A +{ + template<template<T> class> struct B {}; // { dg-error "void|mismatch|expected" } + // { dg-bogus "not supported" "" { target *-*-* } 5 } + template<T> struct C; // { dg-error "void" } + B<C> b; +}; + +A<void> a; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/array1-1.C b/gcc/testsuite/g++.dg/template/array1-1.C new file mode 100644 index 000000000..97fe7cde2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array1-1.C @@ -0,0 +1,32 @@ +// { dg-do compile } +// { dg-options "-fabi-version=1" } + +// Contributed by Nathan Sidwell 22 Dec 2003 <nathan@codesourcery.com> +// Origin: Roger Sayle <roger@eyesopen.com> + +// PR c++/12774 Array domains compared unequal + +void Foo(double r[3][3]) +{ +} + +void Baz() +{ + double m[3][3]; + Foo(m); +} + +template <class T> +void Bar() +{ + double m[3][3]; + Foo(m); +} + +int main() +{ + Baz(); + Bar<int>(); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/template/array1-2.C b/gcc/testsuite/g++.dg/template/array1-2.C new file mode 100644 index 000000000..7214517b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array1-2.C @@ -0,0 +1,32 @@ +// { dg-do compile } +// { dg-options "-fabi-version=2" } + +// Contributed by Nathan Sidwell 22 Dec 2003 <nathan@codesourcery.com> +// Origin: Roger Sayle <roger@eyesopen.com> + +// PR c++/12774 Array domains compared unequal + +void Foo(double r[3][3]) +{ +} + +void Baz() +{ + double m[3][3]; + Foo(m); +} + +template <class T> +void Bar() +{ + double m[3][3]; + Foo(m); +} + +int main() +{ + Baz(); + Bar<int>(); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/template/array10.C b/gcc/testsuite/g++.dg/template/array10.C new file mode 100644 index 000000000..81aac84b0 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array10.C @@ -0,0 +1,20 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 5 Jan 2005 <nathan@codesourcery.com> + +// PR 19270: ICE +// Origin: Ralf Wildenhues <Ralf.Wildenhues@gmx.de> + +template<class T> struct Vec { + T* data; + T& operator[](int i) const; +}; + +template<class T> inline T& Vec<T>::operator[](int i) const +{ + return (&data[0])[i]; +} + +inline double foo(Vec<double> v) +{ + return v[0]; +} diff --git a/gcc/testsuite/g++.dg/template/array11.C b/gcc/testsuite/g++.dg/template/array11.C new file mode 100644 index 000000000..259c9fabc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array11.C @@ -0,0 +1,14 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// PR c++/19208: Fold dependent array domains + +template <class C> struct if_t { typedef int type; }; +template <class T> struct ffff { static const bool value = true; }; +template <class A> +struct bound_member_action +{ + typedef char f[ffff<A>::value ? 1 : 2]; + template <class CT> + bound_member_action(CT i, typename if_t<f>::type g) {} +}; +bound_member_action<int> a(0, 1); diff --git a/gcc/testsuite/g++.dg/template/array13.C b/gcc/testsuite/g++.dg/template/array13.C new file mode 100644 index 000000000..3bc152ce4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array13.C @@ -0,0 +1,14 @@ +// PR c++/20208 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort(); + +template <typename T> +inline void *Foo (T arg) { return &arg[0]; } + +int main () { + int bry[2]; + if (Foo<int[2]>(bry) != bry) + abort(); +} diff --git a/gcc/testsuite/g++.dg/template/array14.C b/gcc/testsuite/g++.dg/template/array14.C new file mode 100644 index 000000000..71a03f3bf --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array14.C @@ -0,0 +1,10 @@ +// PR c++/23993 + +const int data[2][4] = { + { 0, 1, 2, 3 } +}; + +template <typename T> +void t(int k) { + int candidate = data[1][k]; +} diff --git a/gcc/testsuite/g++.dg/template/array15.C b/gcc/testsuite/g++.dg/template/array15.C new file mode 100644 index 000000000..b1e047d1d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array15.C @@ -0,0 +1,13 @@ +// PR c++/28595 + +template<int> struct A +{ + static const int i; +}; + +template<int N> struct B +{ + char c[A<N>::i], d; // { dg-error "constant" } +}; + +B<0> b; diff --git a/gcc/testsuite/g++.dg/template/array16.C b/gcc/testsuite/g++.dg/template/array16.C new file mode 100644 index 000000000..c51441041 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array16.C @@ -0,0 +1,9 @@ +// PR c++/28886 + +template<typename> struct A; + +template<typename T, int N> struct A<T[N]> {}; + +template<typename T, int N> struct A<const T[N]> {}; + +A<const int[1]> a; diff --git a/gcc/testsuite/g++.dg/template/array17.C b/gcc/testsuite/g++.dg/template/array17.C new file mode 100644 index 000000000..12a5c4720 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array17.C @@ -0,0 +1,23 @@ +// { dg-do compile } + +template <typename T> +struct V { + T& operator[](int); +}; + +struct S { + S operator +(int); + template <typename T> T value(); +}; + +template <typename T> +void R (T v) +{ + v[(S() + 0).template value<int>()][0] = 0; +} + +int +main () +{ + R(V<V<int> >()); +} diff --git a/gcc/testsuite/g++.dg/template/array18.C b/gcc/testsuite/g++.dg/template/array18.C new file mode 100644 index 000000000..b2b1e3502 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array18.C @@ -0,0 +1,13 @@ +// PR c++/30924 + +template<typename T> +struct x {}; + +template<typename T, unsigned N> +struct x<T*[N]> {}; + +int main() { + x<int> a; + x<int*[10]> b; + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/array19.C b/gcc/testsuite/g++.dg/template/array19.C new file mode 100644 index 000000000..79abf47c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array19.C @@ -0,0 +1,22 @@ +// PR c++/33553 +// { dg-do compile } + +template <class T> struct S { static const int sz = 2; }; +template <class T> struct U { enum { sz = 2 }; }; + +template <class R> +struct P +{ + template <class T> void bar (int (&x)[S<T>::sz]); + template <class T> void baz (int (&x)[U<T>::sz]); +}; + +P<int> p; + +void +foo (void) +{ + int x[2]; + p.bar<int> (x); + p.baz<int> (x); +} diff --git a/gcc/testsuite/g++.dg/template/array2-1.C b/gcc/testsuite/g++.dg/template/array2-1.C new file mode 100644 index 000000000..2980a1fd1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array2-1.C @@ -0,0 +1,14 @@ +// { dg-do compile } +// { dg-options "-fabi-version=1" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 29 Dec 2003 <nathan@codesourcery.com> + +// PR c++/13494. ICE + +template<typename T> +int foo(int d[][4]) +{ + return d[0][0]; +} + diff --git a/gcc/testsuite/g++.dg/template/array2-2.C b/gcc/testsuite/g++.dg/template/array2-2.C new file mode 100644 index 000000000..dd3e7f0e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array2-2.C @@ -0,0 +1,14 @@ +// { dg-do compile } +// { dg-options "-fabi-version=2" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 29 Dec 2003 <nathan@codesourcery.com> + +// PR c++/13494. ICE + +template<typename T> +int foo(int d[][4]) +{ + return d[0][0]; +} + diff --git a/gcc/testsuite/g++.dg/template/array20.C b/gcc/testsuite/g++.dg/template/array20.C new file mode 100644 index 000000000..2e5c1e33a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array20.C @@ -0,0 +1,10 @@ +// PR c++/38950 + +template <typename T, T N> void f(T(&)[N]); + +int main() { + int x[2]; + unsigned int y[2]; + f(x); // works + f(y); // ICE +} diff --git a/gcc/testsuite/g++.dg/template/array21.C b/gcc/testsuite/g++.dg/template/array21.C new file mode 100644 index 000000000..5c5f2f65d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array21.C @@ -0,0 +1,50 @@ +// PR c++/42447 + +template<int> + void* get(int); + +template<typename> + struct unique_ptr; + +template<typename _Tp> + struct unique_ptr<_Tp[]> + { + typedef int __tuple_type; + + void* + get() const + { return ::get<0>(_M_t); } + + __tuple_type _M_t; + }; + +template <typename T> class dynamic_dispatch; + +template <typename TC> + struct dynamic_dispatch<void (TC::*)(int&)> + { + struct entry { }; + unique_ptr<entry[]> m_Start; + + template <typename UC> + void attach_handler(void (UC::*m)(int&)) + { + entry* p = 0; + do { + } while(--p != m_Start.get()); + } + }; + +template <typename TC> + class request_dispatcher + : private dynamic_dispatch<void (TC::*)(int&)> + { request_dispatcher(); }; + +struct file_reader +{ + void execute_command(int&); +}; + +template <> + request_dispatcher<file_reader>::request_dispatcher() + { this->attach_handler(&file_reader::execute_command); } diff --git a/gcc/testsuite/g++.dg/template/array22.C b/gcc/testsuite/g++.dg/template/array22.C new file mode 100644 index 000000000..e10158773 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array22.C @@ -0,0 +1,14 @@ +// PR c++/48029 + +template <class T> struct A { }; +template <class T, class U> struct B +{ + struct N { }; + typedef U u; +}; + +typedef B<int, A<int>(*)[2]> btype; +A<int> v1[2]; +btype v2; + + diff --git a/gcc/testsuite/g++.dg/template/array24.C b/gcc/testsuite/g++.dg/template/array24.C new file mode 100644 index 000000000..07879d250 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array24.C @@ -0,0 +1,22 @@ +// PR c++/55032 + +template<typename T> +struct vec3t { + T c[3]; +}; + +typedef vec3t<float> vec3; + +class Bounds { + public: + Bounds(const vec3 bb[2]); + void foo(const vec3 & v) { v.c[0]; } +}; + +template<typename T> +void work(T& value); + +void foo() { + vec3 bb[2]; + work(bb); +} diff --git a/gcc/testsuite/g++.dg/template/array25.C b/gcc/testsuite/g++.dg/template/array25.C new file mode 100644 index 000000000..4f3ccbf70 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array25.C @@ -0,0 +1,18 @@ +// PR c++/55249 + +template <typename _Tp> struct A +{ + _Tp _M_instance[1]; +}; +template <class> struct inner_type +{ + inner_type () {} + inner_type (inner_type &); + inner_type (const inner_type &) {} +}; + +int +main () +{ + A <inner_type <int> > a, b = a; +} diff --git a/gcc/testsuite/g++.dg/template/array3.C b/gcc/testsuite/g++.dg/template/array3.C new file mode 100644 index 000000000..27d72f972 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array3.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// Origin: Graeme Prentice <gprentice at paradise dot net dot nz> +// PR c++/13474: An array domain which is value-dependent must be folded +// in time for deduction. + +template< int X, int Y, int (*array_ptr)[Y] > +class A; + +int array[5]; + +template< int X > +class A<X,5,&array> {}; + +int main() +{ + A<6,5,&array> z1; +} diff --git a/gcc/testsuite/g++.dg/template/array4.C b/gcc/testsuite/g++.dg/template/array4.C new file mode 100644 index 000000000..c72782b10 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array4.C @@ -0,0 +1,11 @@ +// PR c++/14122 + +extern const char str[]; + +template <const char* P> +struct A +{ + template <const char* R> void foo(); +}; + +template class A<str>; diff --git a/gcc/testsuite/g++.dg/template/array5.C b/gcc/testsuite/g++.dg/template/array5.C new file mode 100644 index 000000000..a54358067 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array5.C @@ -0,0 +1,14 @@ +// PR c++/15427 + +template<class T> +struct A +{ + T foo; +}; + +template<class T> +struct B +{ + A<int> _squares[2]; +}; + diff --git a/gcc/testsuite/g++.dg/template/array6.C b/gcc/testsuite/g++.dg/template/array6.C new file mode 100644 index 000000000..0dc5161b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array6.C @@ -0,0 +1,13 @@ +// PR c++/15287 + +struct S {}; + +struct Array { + S operator[](int); +} array; + +void (S::*mem_fun_ptr)(); + +template <int> void foo() { + (array[0].*mem_fun_ptr)(); +} diff --git a/gcc/testsuite/g++.dg/template/array7.C b/gcc/testsuite/g++.dg/template/array7.C new file mode 100644 index 000000000..1fb130f99 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array7.C @@ -0,0 +1,11 @@ +// PR c++/16246 + +template <typename T> void foo (T, T); + +template <unsigned N, unsigned M> +int bar( const char(&val)[M] ) +{ + foo (N,M); +} + +int i = bar<10>("1234"); diff --git a/gcc/testsuite/g++.dg/template/array8.C b/gcc/testsuite/g++.dg/template/array8.C new file mode 100644 index 000000000..9fd33a4aa --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array8.C @@ -0,0 +1,16 @@ +// PR c++/18121 + +// We were trying to layout the array +// type but since the type/value of A<N>::i +// was not known at template declation type, +// we were crashing + +template<int> struct A +{ + static int const i = 1; +}; + +template<int N> struct B +{ + typedef int (*p)[A<N>::i]; +}; diff --git a/gcc/testsuite/g++.dg/template/array9.C b/gcc/testsuite/g++.dg/template/array9.C new file mode 100644 index 000000000..f3e8335c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array9.C @@ -0,0 +1,18 @@ +// PR c++/18429 + +int subtrees = 4; +template< class T > +struct Tree { + Tree* L[subtrees]; // { dg-error "" } + Tree* R[subtrees]; // { dg-error "" } + ~Tree() + { + delete [] L[0]; // { dg-error "" } + delete [] R[0]; // { dg-error "" } + } +}; + +void f() +{ + Tree<int> t; +} diff --git a/gcc/testsuite/g++.dg/template/asm1.C b/gcc/testsuite/g++.dg/template/asm1.C new file mode 100644 index 000000000..741759fd2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/asm1.C @@ -0,0 +1,14 @@ +// PR c++/24761 +// { dg-do compile } + +template <int> +int f (int i) +{ + asm ("# %0 %1" : "+r" (i)); + return i; +} + +int main () +{ + return f<0> (0) + f<1> (0); +} diff --git a/gcc/testsuite/g++.dg/template/asmgoto1.C b/gcc/testsuite/g++.dg/template/asmgoto1.C new file mode 100644 index 000000000..6a3cbcef4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/asmgoto1.C @@ -0,0 +1,18 @@ +// PR c++/52247 +// { dg-do compile } + +template <int N> +bool +bar () +{ + __asm goto ("" : : : : lab); + return true; +lab: + return false; +} + +bool +foo () +{ + return bar<0> (); +} diff --git a/gcc/testsuite/g++.dg/template/assign1.C b/gcc/testsuite/g++.dg/template/assign1.C new file mode 100644 index 000000000..d0e134a47 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/assign1.C @@ -0,0 +1,15 @@ +// PR c++/16623 + +template <int N> +struct C +{ + C& operator= (int); +}; + +template <int N> +C<N>& C<N>::operator= (int) +{ + return *this; +} + +C<0> a; diff --git a/gcc/testsuite/g++.dg/template/builtin1.C b/gcc/testsuite/g++.dg/template/builtin1.C new file mode 100644 index 000000000..a5b7271cb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/builtin1.C @@ -0,0 +1,11 @@ +// PR c++/26559 + +template<bool> struct cond; + +template<int> struct S { + void f(int i) { + cond<__builtin_constant_p(i)>(); + } +}; + +S<1> s; diff --git a/gcc/testsuite/g++.dg/template/call1.C b/gcc/testsuite/g++.dg/template/call1.C new file mode 100644 index 000000000..3b6e367af --- /dev/null +++ b/gcc/testsuite/g++.dg/template/call1.C @@ -0,0 +1,17 @@ +//Origin: harinath@cs.umn.edu +//PR c++/10804 +// G++ was not emiting the function foo. + +// { dg-do run } + + +template<class T> +struct A +{ + A() { const void (*a)() = foo; } + static const void foo() {} +}; +int main(int argc, char *argv[]) +{ + A<int> a; +} diff --git a/gcc/testsuite/g++.dg/template/call2.C b/gcc/testsuite/g++.dg/template/call2.C new file mode 100644 index 000000000..86d5c2e82 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/call2.C @@ -0,0 +1,14 @@ +// PR c++/13592 + +struct S { + void operator()(int); +}; + +struct A { + template <typename> void foo(); + S s; +}; + +template <typename> void A::foo() { + s(0); +} diff --git a/gcc/testsuite/g++.dg/template/call3.C b/gcc/testsuite/g++.dg/template/call3.C new file mode 100644 index 000000000..bbb6c7b3a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/call3.C @@ -0,0 +1,15 @@ +// PR c++/18436 + +void foo(int); + +struct A +{ + static void foo(A); +}; + +template <typename T> struct B : T +{ + B() { foo(T()); } // { dg-error "cannot convert" } +}; + +B<A> b; diff --git a/gcc/testsuite/g++.dg/template/call4.C b/gcc/testsuite/g++.dg/template/call4.C new file mode 100644 index 000000000..1f7eb4c82 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/call4.C @@ -0,0 +1,21 @@ +// PR c++/25364 + +class OFX_PropertySuiteV1 +{ + static int propGetDouble (); +}; +template<int dimension, + class T, + int (*PROPGET)() + > +struct OFX_AnimatedNumberParam +{ + virtual int paramSetValueAtTime() + { + return PROPGET(); + } +}; +void f() +{ + new OFX_AnimatedNumberParam<2,double,OFX_PropertySuiteV1::propGetDouble>(); +} diff --git a/gcc/testsuite/g++.dg/template/call5.C b/gcc/testsuite/g++.dg/template/call5.C new file mode 100644 index 000000000..55cf2ddac --- /dev/null +++ b/gcc/testsuite/g++.dg/template/call5.C @@ -0,0 +1,17 @@ +// PR c++/36631 +// { dg-options "-O0" } + +template <typename T> struct B +{ + struct C + { + __attribute__ ((always_inline)) C (C const &c) {} + }; + void __attribute__ ((always_inline)) g (C c) {} +}; + +void +trigger (B <int> b, B <int>::C c) +{ + b.g (c); +} diff --git a/gcc/testsuite/g++.dg/template/call6.C b/gcc/testsuite/g++.dg/template/call6.C new file mode 100644 index 000000000..b79d624a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/call6.C @@ -0,0 +1,24 @@ +// PR c++/38577 +// { dg-do compile } + +struct A +{ + static A *bar (); +}; + +struct B : public A +{ + static void baz (); +}; + +template <class T> +void foo () +{ + (static_cast<B *> (A::bar ()))->baz (); +} + +void +bar () +{ + foo<int> (); +} diff --git a/gcc/testsuite/g++.dg/template/call7.C b/gcc/testsuite/g++.dg/template/call7.C new file mode 100644 index 000000000..0e9a4b7ae --- /dev/null +++ b/gcc/testsuite/g++.dg/template/call7.C @@ -0,0 +1,19 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/17395 +// { dg-do compile } + +template<int> struct X { }; + +void fu(int a, X<sizeof(a)>) { } + +template<class T> +void bhar(T a, X<sizeof(a)>) { } + +int +main() +{ + int x; + X<sizeof(int)> y; + fu(x, y); + bhar(x, y); +} diff --git a/gcc/testsuite/g++.dg/template/canon-type-1.C b/gcc/testsuite/g++.dg/template/canon-type-1.C new file mode 100644 index 000000000..b467dffef --- /dev/null +++ b/gcc/testsuite/g++.dg/template/canon-type-1.C @@ -0,0 +1,18 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/39754 +// { dg-do compile } + +template < typename > struct A ; +template < typename T , typename = A < T > > struct B { } ; +template < class W , class > struct D +{ + typedef W X ; + A<X*> a ; +}; + +template < class Y > struct E +{ + B<Y*> b ; +} ; +E<int> e ; + diff --git a/gcc/testsuite/g++.dg/template/canon-type-10.C b/gcc/testsuite/g++.dg/template/canon-type-10.C new file mode 100644 index 000000000..0ff45e7af --- /dev/null +++ b/gcc/testsuite/g++.dg/template/canon-type-10.C @@ -0,0 +1,23 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// { dg-do compile } + +template<class T> +struct C +{ +}; + +template<class T, + template<class TT_T0, template<class TT_T1> class TT_TT> class TT, + class U = TT<int, C> > +struct S +{ + void foo(TT<T, C>); +}; + +template<class T, + template<class TT_T0, template<class TT_T1> class TT_TT> class TT, + class U> +void +S<T, TT, U>::foo(TT<T, C>) +{ +} diff --git a/gcc/testsuite/g++.dg/template/canon-type-11.C b/gcc/testsuite/g++.dg/template/canon-type-11.C new file mode 100644 index 000000000..0fe99511e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/canon-type-11.C @@ -0,0 +1,39 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// { dg-do compile } + +template<class T> +struct C +{ + void bar(); +}; + +template<class T> +void +C<T>::bar() +{ +} + + +template<class U, + template<class TT0_T0> class TT0 = C, + template<class TT1_T0> class TT1 = TT0> +struct S +{ + C<U> s; + + void foo(TT1<U>); + + void bar() + { + foo(s); + } +}; + +template<class T, + template<class TT0_T0> class TT0, + template<class TT1_T0> class TT1> +void +S<T, TT0, TT1>::foo(TT1<T>) +{ + C<T> c; +} diff --git a/gcc/testsuite/g++.dg/template/canon-type-12.C b/gcc/testsuite/g++.dg/template/canon-type-12.C new file mode 100644 index 000000000..08c86f0a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/canon-type-12.C @@ -0,0 +1,21 @@ +// { dg-options "-std=c++0x" } + +template<class T, T t = (T)0> +struct S +{ + void + foo(decltype(t) = t); +}; + +template<class T, T t> +void +S<T, t>::foo(decltype(t)) +{ +} + +void +bar() +{ + S<int> s; + s.foo(); +} diff --git a/gcc/testsuite/g++.dg/template/canon-type-13.C b/gcc/testsuite/g++.dg/template/canon-type-13.C new file mode 100644 index 000000000..4f3702b84 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/canon-type-13.C @@ -0,0 +1,27 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// { dg-do compile } + +template<class T> +struct S0 +{ +}; + +template<class T> +struct S1 +{ +}; + +template<class T, template<class T> class A, template<class T> class B = A> +struct C +{ + B<T> m; +}; + +void +foo() +{ + C<int, S0> s; + S0<int> s0; + + s.m = s0; +} diff --git a/gcc/testsuite/g++.dg/template/canon-type-2.C b/gcc/testsuite/g++.dg/template/canon-type-2.C new file mode 100644 index 000000000..a3f3f1b83 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/canon-type-2.C @@ -0,0 +1,18 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/39754 +// { dg-do compile } + +template < typename > struct A ; +template < typename T , typename = A < T > > struct B { } ; +template < class W , class > struct D +{ + typedef W X ; + A< X()> a ; +}; + +template < class Y > struct E +{ + B< Y()> b ; +}; +E<int> e ; + diff --git a/gcc/testsuite/g++.dg/template/canon-type-3.C b/gcc/testsuite/g++.dg/template/canon-type-3.C new file mode 100644 index 000000000..e47c7d350 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/canon-type-3.C @@ -0,0 +1,20 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/39754 +// { dg-do compile } + +template<typename> struct A ; +template<typename T , typename = A<T> > struct B { } ; +template<class W , class > struct D +{ + typedef W X ; + typedef X (FP) (); + A<FP&> a ; +} ; + +template < class Y > struct E +{ + typedef Y (FP) (); + B<FP&> b ; +} ; +E < int > e ; + diff --git a/gcc/testsuite/g++.dg/template/canon-type-4.C b/gcc/testsuite/g++.dg/template/canon-type-4.C new file mode 100644 index 000000000..673121bd2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/canon-type-4.C @@ -0,0 +1,22 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/39754 +// { dg-do compile } + +template<typename> struct A ; +template<typename T ,typename = A<T> > struct B { } ; + +template<class W, class> +struct D +{ + typedef W X; + A<X[2]> a; +} ; + +template<class Y> +struct E +{ + B<Y[2]> b; +}; + +E < int > e; + diff --git a/gcc/testsuite/g++.dg/template/canon-type-5.C b/gcc/testsuite/g++.dg/template/canon-type-5.C new file mode 100644 index 000000000..5f783df9b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/canon-type-5.C @@ -0,0 +1,22 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/39754 +// { dg-do compile } + +struct Foo {}; +template<typename> struct A ; +template<typename T ,typename = A<T> > struct B { } ; + +template<class W, class> +struct D +{ + typedef W X ; + A<X Foo::*> a ; +} ; + +template<class Y> +struct E +{ + B<Y Foo::*> b ; +} ; +E < int > e ; + diff --git a/gcc/testsuite/g++.dg/template/canon-type-6.C b/gcc/testsuite/g++.dg/template/canon-type-6.C new file mode 100644 index 000000000..951708747 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/canon-type-6.C @@ -0,0 +1,22 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/39754 +// { dg-do compile } + +struct Foo {}; +template<typename> struct A ; +template<typename T ,typename = A<T> > struct B { } ; + +template<class W, class> +struct D +{ + typedef W X; + A<void (Foo::*) (X)> a; +} ; + +template<class Y> +struct E +{ + B<void (Foo::*) (Y)> b; +}; +E < int > e ; + diff --git a/gcc/testsuite/g++.dg/template/canon-type-7.C b/gcc/testsuite/g++.dg/template/canon-type-7.C new file mode 100644 index 000000000..51c15342c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/canon-type-7.C @@ -0,0 +1,21 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/39754 +// { dg-do compile } + +struct Foo {}; +template<typename> struct A ; +template<typename T ,typename = A<T> > struct B { } ; + +template<class W, class> +struct D +{ + typedef W X; + A<X (Foo::*) (X)> a ; +}; + +template<class Y> +struct E +{ + B<Y (Foo::*) (Y)> b ; +}; +E<int> e ; diff --git a/gcc/testsuite/g++.dg/template/canon-type-8.C b/gcc/testsuite/g++.dg/template/canon-type-8.C new file mode 100644 index 000000000..fd1fe3ce3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/canon-type-8.C @@ -0,0 +1,38 @@ +// PR c++/45984 +// We were getting different canonical types for matching types because +// TYPE_ALIGN wasn't propagated to all the variants fast enough. +// { dg-options "" } + +typedef __SIZE_TYPE__ size_t; +enum { chunk_size = 16 }; +typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__)); +typedef float __v4sf __attribute__ ((__vector_size__ (16))); +struct __attribute__((aligned((16)))) float4_t { + typedef float scalar_t; + typedef __m128 type_t; + typedef float4_t return_type_t; + type_t m; + inline __attribute__((artificial, gnu_inline, always_inline)) explicit + float4_t(scalar_t a) : m(((__m128) (__v4sf) { (a), (a), (a), (a) })) { } + inline __attribute__((artificial, gnu_inline, always_inline, pure)) friend + return_type_t operator+(float4_t lhs, float4_t rhs) { } +}; +template<size_t NumChans> class __attribute__((aligned((16)))) chunk_array_t { +public: + typedef float4_t value_type_t; + typedef value_type_t value_array_t[chunk_size/4]; + enum { num_scalars = chunk_size, num_values = num_scalars/4 }; + const value_array_t &chan(size_t c) const { } + value_type_t operator[](size_t i) const { } +}; +typedef chunk_array_t<1> chunk_array_mono_t; +typedef chunk_array_t<2> chunk_array_stereo_t; +class freeverb_stereo_t { + void process(const chunk_array_stereo_t & __restrict__ src, + chunk_array_stereo_t & __restrict__ dst) { + enum { chunk_size = chunk_array_t<1>::num_values }; + chunk_array_mono_t mix; + for (size_t i=0; i<chunk_size; ++i) + mix[i] = src.chan(0)[i] + src.chan(1)[i]; + } +}; diff --git a/gcc/testsuite/g++.dg/template/canon-type-9.C b/gcc/testsuite/g++.dg/template/canon-type-9.C new file mode 100644 index 000000000..4fcd52435 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/canon-type-9.C @@ -0,0 +1,18 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// { dg-options "-std=c++0x" } +// { dg-do compile } + +struct F { F(int) {}}; + +template<class T, T* u> +struct S +{ + decltype(u) foo(T); +}; + +template<class T, T *u> +decltype(u) S<T, u>::foo(T) +{ + T t; + return t; +} diff --git a/gcc/testsuite/g++.dg/template/cast1.C b/gcc/testsuite/g++.dg/template/cast1.C new file mode 100644 index 000000000..fca3511e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/cast1.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 14 Dec 2004 <nathan@codesourcery.com> + +// PR 18949. Forgot to convert from reference. +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +struct A +{ + void foo(); +}; + +template<int> void bar(A& a) +{ + const_cast<A&>(a).foo(); + static_cast<A&>(a).foo(); + reinterpret_cast<A&>(a).foo(); + ((A&)a).foo(); +} + +template void bar<0>(A& a); diff --git a/gcc/testsuite/g++.dg/template/char1.C b/gcc/testsuite/g++.dg/template/char1.C new file mode 100644 index 000000000..51e72e7ad --- /dev/null +++ b/gcc/testsuite/g++.dg/template/char1.C @@ -0,0 +1,4 @@ +template <class CharType, CharType line_terminator = 0> +class String {}; + +String<signed char, 255> s; // { dg-warning "overflow" } diff --git a/gcc/testsuite/g++.dg/template/class1.C b/gcc/testsuite/g++.dg/template/class1.C new file mode 100644 index 000000000..96415fbc2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/class1.C @@ -0,0 +1,9 @@ +extern const int a; + +template <const int&> class X {}; + +template <typename> struct Y { + X<a> x; +}; + +template struct Y<int>; diff --git a/gcc/testsuite/g++.dg/template/class2.C b/gcc/testsuite/g++.dg/template/class2.C new file mode 100644 index 000000000..4144997fe --- /dev/null +++ b/gcc/testsuite/g++.dg/template/class2.C @@ -0,0 +1,7 @@ +// PR c++/13451 + +template <class T> +struct A { + struct B; + struct A::B { }; // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/template/class3.C b/gcc/testsuite/g++.dg/template/class3.C new file mode 100644 index 000000000..44a02a60b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/class3.C @@ -0,0 +1,2 @@ +// PR c++/25634 +template<int> template<int> struct A; // { dg-error "too many" } diff --git a/gcc/testsuite/g++.dg/template/complit1.C b/gcc/testsuite/g++.dg/template/complit1.C new file mode 100644 index 000000000..218a7c929 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/complit1.C @@ -0,0 +1,11 @@ +// { dg-options "" } + +template <int D> struct C { + int d[3]; + C(); +}; + +template<int D> +C<D>::C() : d((int[]){1,2,3}) {} // { dg-error "array" } + +template class C<1>; diff --git a/gcc/testsuite/g++.dg/template/complit2.C b/gcc/testsuite/g++.dg/template/complit2.C new file mode 100644 index 000000000..cf3856d47 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/complit2.C @@ -0,0 +1,17 @@ +// PR c++/31038 +// { dg-options "" } + +template<int> void foo() +{ + int i = (int) { 0 }; +} + +template void foo<0>(); +int f(); + +template<int> void bar() +{ + int i = (int) { f() }; +} + +template void bar<0>(); diff --git a/gcc/testsuite/g++.dg/template/cond.C b/gcc/testsuite/g++.dg/template/cond.C new file mode 100644 index 000000000..394a21c9a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/cond.C @@ -0,0 +1,23 @@ +// PR c++/8080 + +// Bug: the transformation in finish_while_stmt_cond produced something +// that tsubst_expr handled badly. Fixed by not doing the transformation +// while parsing a template. + +class TObject {}; + +struct TIter { + TObject *operator()(); +}; + + +template<class T> +void get_root_object(TIter& iobj) { + while ( TObject* pnew_obj = iobj() ) + ; +} + +void foo(TIter& iobj) +{ + get_root_object<int>(iobj); +} diff --git a/gcc/testsuite/g++.dg/template/cond2.C b/gcc/testsuite/g++.dg/template/cond2.C new file mode 100644 index 000000000..cf8df8cd9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/cond2.C @@ -0,0 +1,10 @@ +// PR c++/11962 +// { dg-options "" } + +template<int X> class c; + +template<int X, int Y> int test(c<X ? : Y>&); // { dg-error "omitted" } + +void test(c<2>*c2) { + test<0, 2>(*c2); // { dg-message "instantiated" } +} diff --git a/gcc/testsuite/g++.dg/template/cond3.C b/gcc/testsuite/g++.dg/template/cond3.C new file mode 100644 index 000000000..788b3754a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/cond3.C @@ -0,0 +1,15 @@ +// PR c++/13833 + +struct X { + template <typename T> + X & operator << (const T &t); + X & operator<< (int& (*p) (int&)); +}; + +X x; + +template <int> void foo () { + x << (1 ? "ok" : "failed"); +} + +template void foo<1>(); diff --git a/gcc/testsuite/g++.dg/template/cond4.C b/gcc/testsuite/g++.dg/template/cond4.C new file mode 100644 index 000000000..35416ba79 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/cond4.C @@ -0,0 +1,20 @@ +// PR c++/14369 + +struct A { }; + +template<class T> +struct X : A { + const A* bar() const + { return this; } + + const A& foo() const; +}; + +template<class T> +const A& X<T>::foo() const +{ + const A* t = bar(); + return *(t ? t : throw 0); +} + + diff --git a/gcc/testsuite/g++.dg/template/cond5.C b/gcc/testsuite/g++.dg/template/cond5.C new file mode 100644 index 000000000..bba31e6af --- /dev/null +++ b/gcc/testsuite/g++.dg/template/cond5.C @@ -0,0 +1,9 @@ +// PR c++/18464 + +struct A +{ + A(int); + operator void*() const; +}; + +template<int> void foo(const A& x) { 0 ? x : (x ? x : 0); } diff --git a/gcc/testsuite/g++.dg/template/cond6.C b/gcc/testsuite/g++.dg/template/cond6.C new file mode 100644 index 000000000..e4cede35b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/cond6.C @@ -0,0 +1,6 @@ +// PR c++/27801 + +template<int> int foo(int i) +{ + return !( (1 && i) ? 0 : 1 ); +} diff --git a/gcc/testsuite/g++.dg/template/cond7.C b/gcc/testsuite/g++.dg/template/cond7.C new file mode 100644 index 000000000..ce1c77e59 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/cond7.C @@ -0,0 +1,15 @@ +// PR c++/34270 +// { dg-do compile } +// { dg-options "" } + +void foo () +{ + __typeof__ (0 ?: 0) x; + __decltype (0 ?: 0) y; +} + +template<int> void bar () +{ + __typeof__ (0 ?: 0) x; + __decltype (0 ?: 0) y; +} diff --git a/gcc/testsuite/g++.dg/template/const1.C b/gcc/testsuite/g++.dg/template/const1.C new file mode 100644 index 000000000..629c4d4a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/const1.C @@ -0,0 +1,30 @@ +// PR c++/28385 +// instantiating op() with void()() was making the compiler think that 'fcn' +// was const, so it could eliminate the call. + +// { dg-do run } + +extern "C" void abort (void); + +int barcnt = 0; + +class Foo { + public: + template<typename T> + void operator()(const T& fcn) { + fcn(); + } +}; + +void bar() { + barcnt++; +} + +int main() { + Foo myFoo; + myFoo(bar); + myFoo(&bar); + if (barcnt != 2) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/const2.C b/gcc/testsuite/g++.dg/template/const2.C new file mode 100644 index 000000000..5188fe29d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/const2.C @@ -0,0 +1,16 @@ +// PR c++/39608 +// We were improperly considering dependent members of the current +// instantiation to be non-constant (and therefore invalid template +// non-type arguments). + +template <int I> +struct C {}; + +template <class T> +struct A +{ + static const T x = 1; + C<A<T>::x> c; // { dg-bogus "invalid" } +}; + +A<int> a; diff --git a/gcc/testsuite/g++.dg/template/const3.C b/gcc/testsuite/g++.dg/template/const3.C new file mode 100644 index 000000000..998b6976e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/const3.C @@ -0,0 +1,20 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/42251 +// { dg-do compile } + +struct foo +{ + static const bool b = false; +}; + +template<bool x> +struct S1 +{ +}; + +template<bool x> +struct S2 + : S1<foo::b> +{ +}; + diff --git a/gcc/testsuite/g++.dg/template/const4.C b/gcc/testsuite/g++.dg/template/const4.C new file mode 100644 index 000000000..6552ec6e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/const4.C @@ -0,0 +1,9 @@ +// PR c++/48657 + +template<unsigned> struct A { typedef int T; }; + +template<unsigned> void f() +{ + const unsigned D = 4; + A<D>::T t; +} diff --git a/gcc/testsuite/g++.dg/template/const5.C b/gcc/testsuite/g++.dg/template/const5.C new file mode 100644 index 000000000..5d3ec5b1c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/const5.C @@ -0,0 +1,12 @@ +// PR c++/49176 +// { dg-options -std=c++0x } + +struct A { static int a(); }; + +template<int> +struct B { static int const b; }; + +int f() { return B<0>::b; } + +template<int I> +int const B<I>::b=A::a(); diff --git a/gcc/testsuite/g++.dg/template/constant1.C b/gcc/testsuite/g++.dg/template/constant1.C new file mode 100644 index 000000000..a2c5a08d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/constant1.C @@ -0,0 +1,13 @@ +// PR c++/49855 + +extern void foo(int); + +template <class Key, class Value> void Basic() { + const int kT = 1.5e6; // <--- causes ICE + int size = kT*2/3; + do { + foo(size); + size = size * 0.5 - 1; + } while (size >= 0 ); + +} diff --git a/gcc/testsuite/g++.dg/template/constant2.C b/gcc/testsuite/g++.dg/template/constant2.C new file mode 100644 index 000000000..f71e4f56a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/constant2.C @@ -0,0 +1,22 @@ +// PR c++/49896 + +template<class C> +class test { + protected: + static const int versionConst = 0x80000000; + enum { versionEnum = versionConst }; + public: + int getVersion(); +}; + +template<class C> +int test<C>::getVersion() { + return versionEnum; +} + +class dummy_class {}; + +int main() { + test<dummy_class> t; + return t.getVersion(); +} diff --git a/gcc/testsuite/g++.dg/template/conv1.C b/gcc/testsuite/g++.dg/template/conv1.C new file mode 100644 index 000000000..e0c749203 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/conv1.C @@ -0,0 +1,28 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 29 Dec 2001 <nathan@codesourcery.com> + +// PR 4361. Template conversion operators were not overloaded. + +template <class T> struct Second; + +template<class T> struct First +{ + int Foo (); + + template <class U> operator Second<U>(); + template <class U> operator First<U>(); +}; + +template <class T> int First<T>::Foo () +{} // This is here to make sure we didn't smash Foo's decl in the + // method vector + +struct B { }; +struct D { }; + +void Foo () +{ + First<B> (First<D>::*pf)() = &First<D>::operator First<B>; +} diff --git a/gcc/testsuite/g++.dg/template/conv10.C b/gcc/testsuite/g++.dg/template/conv10.C new file mode 100644 index 000000000..0a001be14 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/conv10.C @@ -0,0 +1,9 @@ +// PR c++/41994 + +template<typename T> struct A +{ + operator T(); + A() { T (A::*f)() = &A::operator T; } +}; + +A<int> a; diff --git a/gcc/testsuite/g++.dg/template/conv11.C b/gcc/testsuite/g++.dg/template/conv11.C new file mode 100644 index 000000000..57d06af3e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/conv11.C @@ -0,0 +1,11 @@ +int i; +struct A +{ + template <class T> operator T&() { return i; } // { dg-message "note" } +}; + +int main() +{ + A().operator int(); // { dg-error "operator int" } + // { dg-message "candidate" "candidate note" { target *-*-* } 9 } +} diff --git a/gcc/testsuite/g++.dg/template/conv2.C b/gcc/testsuite/g++.dg/template/conv2.C new file mode 100644 index 000000000..a0d08df55 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/conv2.C @@ -0,0 +1,39 @@ +// { dg-do run } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 29 Dec 2001 <nathan@codesourcery.com> + +// PR 4361. Template conversion operators were not overloaded. + +class C +{ +public: + + operator float () {return 2;} + + operator int () + { + return 0; + } + + template<typename T> + operator int () + { return 1; + } +}; + +int main () +{ + C p; + int r; + + r = p.operator int (); + if (r) + return r; + r = static_cast <int> (p); + + if (r) + return r + 2; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/conv3.C b/gcc/testsuite/g++.dg/template/conv3.C new file mode 100644 index 000000000..a6b0f639b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/conv3.C @@ -0,0 +1,43 @@ +// { dg-do run } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 29 Dec 2001 <nathan@codesourcery.com> + +// PR 4361. Template conversion operators were not overloaded. + +template <typename T> struct C +{ + operator T () + { + return 0; + } + template <typename T2> operator T2 () + { + return 1; + } + int Foo () + { + return operator T (); + } + template <typename T2> int Baz () + { + return static_cast <int> (operator T2 ()); + } +}; + +int main () +{ + int r; + C<int> c; + + r = c.Foo (); + if (r) + return 1; + r = c.Baz<int> (); + if (r) + return 2; + r = c.Baz<float> (); + if (!r) + return 3; + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/conv4.C b/gcc/testsuite/g++.dg/template/conv4.C new file mode 100644 index 000000000..01f158aef --- /dev/null +++ b/gcc/testsuite/g++.dg/template/conv4.C @@ -0,0 +1,27 @@ +// { dg-do compile } + +// Copyright (C) 2001, 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 29 Dec 2001 <nathan@codesourcery.com> + +// PR 4361. Template conversion operators were not overloaded. + +struct C +{ + template <typename T2> operator T2 () + { + return 1; + } + int Foo () + { + return operator int (); + } +}; + +struct D +{ + int Foo () + { + return operator int (); // { dg-error "not defined" "" } + } +}; + diff --git a/gcc/testsuite/g++.dg/template/conv5.C b/gcc/testsuite/g++.dg/template/conv5.C new file mode 100644 index 000000000..80835437a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/conv5.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Dec 2002 <nathan@codesourcery.com> + +// PR 764. Failed to find friend in overload resolution + +template <class T> +struct S +{ + friend bool operator== (const S&, const S&) { + return true; + } +}; + +int main () +{ + // S<int> s; + + const S<int> *p = 0; + *p == *p; // error +} diff --git a/gcc/testsuite/g++.dg/template/conv6.C b/gcc/testsuite/g++.dg/template/conv6.C new file mode 100644 index 000000000..2a4a29952 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/conv6.C @@ -0,0 +1,24 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 21 Mar 2003 <nathan@codesourcery.com> + +// PR 9898, DR 322. Conversion to reference type. + +template <typename> struct Ref {}; +template <typename> struct Val {}; + +struct Wrapper +{ + template <typename U> operator Ref<U> & (); + template <typename U> operator Val<U> (); +}; + +void Foo (Wrapper l) +{ + static_cast <Ref<int> &> (l); + static_cast <Ref<int> const &> (l); + static_cast <Ref<int> > (l); + static_cast <Val<int> const &> (l); + static_cast <Val<int> > (l); +} diff --git a/gcc/testsuite/g++.dg/template/conv7.C b/gcc/testsuite/g++.dg/template/conv7.C new file mode 100644 index 000000000..86758b362 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/conv7.C @@ -0,0 +1,12 @@ +// { dg-options "-fabi-version=0" } + +template <typename T> struct S { + struct I{}; + operator I* (); +}; + +template <typename T> struct S2 : S<T> { + operator typename S<T>::I* (); +}; + +template struct S2<int>; diff --git a/gcc/testsuite/g++.dg/template/conv8.C b/gcc/testsuite/g++.dg/template/conv8.C new file mode 100644 index 000000000..01d415b3e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/conv8.C @@ -0,0 +1,12 @@ +// { dg-options "-fabi-version=1 -Wno-abi" } + +template <typename T> struct S { + struct I{}; + operator I* (); +}; + +template <typename T> struct S2 : S<T> { + operator typename S<T>::I* (); +}; + +template struct S2<int>; diff --git a/gcc/testsuite/g++.dg/template/conv9.C b/gcc/testsuite/g++.dg/template/conv9.C new file mode 100644 index 000000000..269e338a3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/conv9.C @@ -0,0 +1,16 @@ +// PR c++/28557 + +struct A +{ + template<typename T> operator T() { return T(); } +}; + +template<int> void foo() +{ + A().operator int(); +} + +void bar() +{ + foo<0>(); +} diff --git a/gcc/testsuite/g++.dg/template/copy1.C b/gcc/testsuite/g++.dg/template/copy1.C new file mode 100644 index 000000000..c6b3ff806 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/copy1.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Origin: hkluender@otg.com + +// PR 5189 + +struct A +{ + A(A&); // { dg-message "note" } + template <class T> A(T); // { dg-message "note" } +}; + +A a = 0; // { dg-error "no matching function" } +// { dg-message "candidate" "candidate note" { target *-*-* } 13 } + diff --git a/gcc/testsuite/g++.dg/template/crash1.C b/gcc/testsuite/g++.dg/template/crash1.C new file mode 100644 index 000000000..a500da18b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash1.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 29 Dec 2001 <nathan@codesourcery.com> + +// PR 5125. ICE + +class S +{ + public: + template <class I> void Foo(int (*f)(S& o) ); +}; + +template <class I> +void S::Foo(int (*f)(TYPO&o) ) // { dg-error "Foo|f|TYPO|o" } +{ +} diff --git a/gcc/testsuite/g++.dg/template/crash10.C b/gcc/testsuite/g++.dg/template/crash10.C new file mode 100644 index 000000000..62647ca72 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash10.C @@ -0,0 +1,27 @@ +//Origin: benko@sztaki.hu +//PR c++/11432 +// The mainline ICE on this one between 2003-01-16 and 2003-07-29. + +// { dg-do compile } + + extern "C" void abort(); + + +template <int A> +struct a +{ + static int const value = A - 1; +}; + + +template <int B> +struct b +{ + static int foo() + { + return a<L>::value; + } + + + static int const L = a<B + 1>::value; +}; diff --git a/gcc/testsuite/g++.dg/template/crash100.C b/gcc/testsuite/g++.dg/template/crash100.C new file mode 100644 index 000000000..c67ae2eca --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash100.C @@ -0,0 +1,24 @@ +// PR c++/44628 + +template <typename T> +class Temp +{ + int Val; + public: + operator T&(void) { return Val; } + + virtual T& operator=(T a ) // { dg-error "overriding" } + { + Val = a; + return Val; + } +}; + +class Int : public Temp<int> +{ + public: + Int& operator=(int a) // { dg-error "conflicting return type" } + { + return (*this); + } +}; diff --git a/gcc/testsuite/g++.dg/template/crash101.C b/gcc/testsuite/g++.dg/template/crash101.C new file mode 100644 index 000000000..c59737a89 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash101.C @@ -0,0 +1,12 @@ +// PR c++/44039 + +struct locale { }; + +template<class charT> + void + foo() + { locale::locale(); } // { dg-error "cannot call|function-style" } + +void +bar() +{ foo<char>(); } diff --git a/gcc/testsuite/g++.dg/template/crash102.C b/gcc/testsuite/g++.dg/template/crash102.C new file mode 100644 index 000000000..fd3c36eec --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash102.C @@ -0,0 +1,5 @@ +// PR c++/45043 + +template < typename > class A; +template < typename T > A < T >::B::~B () // { dg-error "type" } +{} diff --git a/gcc/testsuite/g++.dg/template/crash103.C b/gcc/testsuite/g++.dg/template/crash103.C new file mode 100644 index 000000000..9f3e224e7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash103.C @@ -0,0 +1,4 @@ +// PR c++/45665 + +template < typename > struct S; +void (S <0>::*ptr) (); // { dg-error "type" } diff --git a/gcc/testsuite/g++.dg/template/crash104.C b/gcc/testsuite/g++.dg/template/crash104.C new file mode 100644 index 000000000..097c46982 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash104.C @@ -0,0 +1,26 @@ +// PR c++/46046 + +template <class T> + struct foo +{ + template <class U, class V = void> + struct type + {}; + + template <class V> + struct type< + typename T::template some_type<int>, + V + > + {}; +}; + +template <class T> + class bar +{}; + +int main() +{ + typedef foo<bar<int> > cont; + cont::type<char> obj; // { dg-error "cannot be defined" } +} diff --git a/gcc/testsuite/g++.dg/template/crash105.C b/gcc/testsuite/g++.dg/template/crash105.C new file mode 100644 index 000000000..649bf8b77 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash105.C @@ -0,0 +1,14 @@ +// PR c++/44118 + +template < typename > struct S; +template < typename > struct S < int >; // { dg-error "template" } +template < typename > struct S < int > +{ + void f (); +}; + +void +f () +{ + S < int >::f (); // { dg-error "cannot call" } +} diff --git a/gcc/testsuite/g++.dg/template/crash106.C b/gcc/testsuite/g++.dg/template/crash106.C new file mode 100644 index 000000000..c2d117e03 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash106.C @@ -0,0 +1,12 @@ +// PR c++/47974 + +typedef double T; + +struct A +{ + template<T> void foo(); // { dg-error "type" } +}; + +template<T N = 0, void (A::*)() = &A::foo<N> > struct B {}; // { dg-error "type|declared" } + +B<> b; // { dg-error "type|declaration" } diff --git a/gcc/testsuite/g++.dg/template/crash11.C b/gcc/testsuite/g++.dg/template/crash11.C new file mode 100644 index 000000000..3c69514e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash11.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +// Origin: kparz@iastate.edu + +// PR c++/7939: ICE for invalid function parameter after template +// substitution. + +template <class T, class U> void foo(T, U) {} +template <class T> void foo<T,void>(T, void) {} // { dg-error "incomplete|invalid|partial" } diff --git a/gcc/testsuite/g++.dg/template/crash12.C b/gcc/testsuite/g++.dg/template/crash12.C new file mode 100644 index 000000000..e2231e06b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash12.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Origin: rmerkert@alphatech.com +// Volker Reichelt <reichelt@gcc.gnu.org> + +// PR c++/12495: ICE looking up class template in local class. + +template <typename> struct A {}; + +template <typename T> void foo() +{ + struct B + { + B (const A<T>&); + }; +} diff --git a/gcc/testsuite/g++.dg/template/crash13.C b/gcc/testsuite/g++.dg/template/crash13.C new file mode 100644 index 000000000..0518666d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash13.C @@ -0,0 +1,18 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +// PR c++/11076: ICE for invalid access declaration containing typename. + +template<typename, typename T=void> struct A +{ + typedef A<T,T> B; +}; + +template <typename T> struct C +{ + typedef typename A<T>::B X; + X::Y; // { dg-error "not a base type" } +}; + +C<void> c; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/crash14.C b/gcc/testsuite/g++.dg/template/crash14.C new file mode 100644 index 000000000..cf6fffa1a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash14.C @@ -0,0 +1,5 @@ +// { dg-options -std=c++98 } + +template <int T> class foo { public: foo() { } class Z { };}; +template <int I[2]> void dep7(foo<I[0]> *) { } // { dg-error "" } + diff --git a/gcc/testsuite/g++.dg/template/crash15.C b/gcc/testsuite/g++.dg/template/crash15.C new file mode 100644 index 000000000..e0aad73c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash15.C @@ -0,0 +1,9 @@ +// PR c++/13310 + +struct A {}; + +template <typename> void foo() +{ + A a; + a.foo<int>(); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/template/crash16.C b/gcc/testsuite/g++.dg/template/crash16.C new file mode 100644 index 000000000..f80dd1064 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash16.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +// Origin: Alexander Stippler <stip@mathematik.uni-ulm.de> +// PR c++/10079 + +template <bool> struct A {}; + +template <typename> struct B +{ + enum { e }; +}; + +template <typename T> A<(B<T>::e && 0)> foo(T) {} + +template <typename T> void foo(B<T>) {} + +void bar() +{ + B<int> b; + foo(b); +} diff --git a/gcc/testsuite/g++.dg/template/crash17.C b/gcc/testsuite/g++.dg/template/crash17.C new file mode 100644 index 000000000..9fa826b99 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash17.C @@ -0,0 +1,19 @@ +template <int I> +struct A { +}; + +template <typename T> +struct B { + typedef typename T::type type; + static const type j = T::j; + + A<j> b; +}; + +struct C { + typedef int type; + static const int j = 3; +}; + +int i = B<C>::j; + diff --git a/gcc/testsuite/g++.dg/template/crash18.C b/gcc/testsuite/g++.dg/template/crash18.C new file mode 100644 index 000000000..5eb92929c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash18.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// Contributed by: <leif dot lonnblad at thep dot lu dot se> +// PR c++/15064: typeid does not form an integral constant expression + +#include <typeinfo> + +template <typename T> +void dummy() { + const std::type_info& t = typeid(T); + const std::type_info& t2 = typeid(float); +} + +template void dummy<int>(void); diff --git a/gcc/testsuite/g++.dg/template/crash19.C b/gcc/testsuite/g++.dg/template/crash19.C new file mode 100644 index 000000000..a28827f31 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash19.C @@ -0,0 +1,17 @@ +// PR c++/15165 + +struct S +{ + template <class T> S(const T &e); +}; +int operator *(const double, const S &); +template <class T> +struct X { + enum { SIXTY_FOUR=64 }; + struct node { + unsigned char *ptr[sizeof(T)*SIXTY_FOUR]; + void d() {} + }; + node *head; +}; +template struct X<int>; diff --git a/gcc/testsuite/g++.dg/template/crash2.C b/gcc/testsuite/g++.dg/template/crash2.C new file mode 100644 index 000000000..47c95ab06 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash2.C @@ -0,0 +1,31 @@ +// { dg-options "" } + +template <class EnumType> +class A +{ +public: + static const EnumType size = max; // { dg-error "" } + int table[size]; // { dg-error "constant" } +}; +template <class EnumType> +const EnumType A<EnumType>::size; + + +namespace N +{ +enum E { max = 5 }; + +struct B +{ + A<E> a; +}; + +} + +int +main() +{ + N::B b; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/crash20.C b/gcc/testsuite/g++.dg/template/crash20.C new file mode 100644 index 000000000..0492b72e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash20.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 22 Jul 2004 <nathan@codesourcery.com> + +// ICE with incompletable type. + +class INC; + +template <typename T> class B {}; + +template<typename T> void Foo (B<T> &); + +void Foo (INC &); + +void Baz (INC *p) +{ + Foo (*p); +} + diff --git a/gcc/testsuite/g++.dg/template/crash21.C b/gcc/testsuite/g++.dg/template/crash21.C new file mode 100644 index 000000000..8b674910e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash21.C @@ -0,0 +1,40 @@ +// { dg-do compile } + +// Origin: Debian GCC maintainers <debian-gcc@lists.debian.org> +// Wolfgang Bangerth <bangerth@dealii.org> + +// PR c++/16706: Dependent type calculation during access checking + +template <typename> struct B { + B() throw() {} + struct S { }; + static int i; + typedef unsigned short int dummy; +}; + +template <typename _Tp> +struct allocator: B<_Tp> { + template<typename _Tp1> struct rebind + { typedef allocator<_Tp1> other; }; +}; + +template<typename T, typename> +struct X { + typename allocator<T>::template rebind<int>::other i; + typedef int* dummy; +}; + +template <class T> class A { + typedef typename X<T,allocator<T> >::dummy dummy; + template <class TP> class XWrapper; +}; + + +template <class T> +template <class TP> struct A<T>::XWrapper<TP *> +{ + XWrapper() {} + X<int,allocator<int> > x; +}; + +template class A<int>::XWrapper<int *>; diff --git a/gcc/testsuite/g++.dg/template/crash22.C b/gcc/testsuite/g++.dg/template/crash22.C new file mode 100644 index 000000000..4d0cfaa99 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash22.C @@ -0,0 +1,26 @@ +// { dg-do compile } + +// Origin: Debian GCC maintainers <debian-gcc@lists.debian.org> +// Volker Reichelt <reichelt@gcc.gnu.org> + +// PR c++/16706: Dependent type calculation during access checking + +template<typename> struct A +{ + A(); + template<typename> struct X {}; +}; + +template<typename T> struct B +{ + typename A<T>::template X<int> x; + template<typename> struct C; +}; + +template<typename T> template<typename U> struct B<T>::C<U*> +{ + C() {} + A<int> a; +}; + +template struct B<int>::C<int*>; diff --git a/gcc/testsuite/g++.dg/template/crash23.C b/gcc/testsuite/g++.dg/template/crash23.C new file mode 100644 index 000000000..0c3eac1ac --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash23.C @@ -0,0 +1,9 @@ +// PR c++/17642 + +template<int dim> +int f(const int* const lsh, const int* const bbox, const int* const nghostzones, int d) +{ + for (int d=0; d<dim; ++d) + lsh[d] - (bbox[2*d+1] ? 0 : nghostzones[d]); +} + diff --git a/gcc/testsuite/g++.dg/template/crash24.C b/gcc/testsuite/g++.dg/template/crash24.C new file mode 100644 index 000000000..49b8c7e71 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash24.C @@ -0,0 +1,14 @@ +// PR c++/17826 + +struct A +{ + template<typename> static int foo(); +}; + +template<int> struct B {}; + +template<typename T> void bar() +{ + B<sizeof A::foo<T>()> b1; + B<sizeof A::foo<T>()> b2; +} diff --git a/gcc/testsuite/g++.dg/template/crash25.C b/gcc/testsuite/g++.dg/template/crash25.C new file mode 100644 index 000000000..fa77f0d4f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash25.C @@ -0,0 +1,3 @@ +// PR c++/18124 + +template <template <int> class class> class A {}; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/template/crash26.C b/gcc/testsuite/g++.dg/template/crash26.C new file mode 100644 index 000000000..f1bc399a3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash26.C @@ -0,0 +1,8 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +// PR c++/18471: ICE redeclaration of typedef as class template + +typedef int X; // { dg-error "previous" } +template<X> struct X {}; // { dg-error "typedef-name" } diff --git a/gcc/testsuite/g++.dg/template/crash27.C b/gcc/testsuite/g++.dg/template/crash27.C new file mode 100644 index 000000000..d2f6289d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash27.C @@ -0,0 +1,4 @@ +// PR c++/18586 +template <int> struct A { + template <int N> int A<N>::i; // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/template/crash28.C b/gcc/testsuite/g++.dg/template/crash28.C new file mode 100644 index 000000000..e8b2bbb29 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash28.C @@ -0,0 +1,13 @@ +// PR c++/18445 + +struct a +{ + int what(); +}; +void g(void*); +template<class T> +void f() +{ + a ex; + g(ex.what); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/template/crash29.C b/gcc/testsuite/g++.dg/template/crash29.C new file mode 100644 index 000000000..55953ed80 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash29.C @@ -0,0 +1,8 @@ +// PR c++/18512 + +template <int> struct A {}; + +struct B : A<0> +{ + void foo() { this->A<0>; } // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/template/crash3.C b/gcc/testsuite/g++.dg/template/crash3.C new file mode 100644 index 000000000..21aa57b1e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash3.C @@ -0,0 +1,12 @@ +struct S { +}; + +extern S i[]; + +void g (S*); + +template <typename T> +void f () { + g (&i[2]); +} + diff --git a/gcc/testsuite/g++.dg/template/crash30.C b/gcc/testsuite/g++.dg/template/crash30.C new file mode 100644 index 000000000..145b07673 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash30.C @@ -0,0 +1,16 @@ +// PR c++/19034 + +template< bool C > struct B +{ +}; + +template<typename S> int foo(); +template<typename S> int foo1(); + +template<typename T> struct bar : public B <(sizeof(foo<T>()) == 1)> +{ +}; + +template<typename T> struct bar1 : public B <(sizeof(foo1<T>()) == 1)> +{ +}; diff --git a/gcc/testsuite/g++.dg/template/crash31.C b/gcc/testsuite/g++.dg/template/crash31.C new file mode 100644 index 000000000..2269f47ea --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash31.C @@ -0,0 +1,3 @@ +// PR c++/19063 + +template<operator< struct A {}; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/template/crash32.C b/gcc/testsuite/g++.dg/template/crash32.C new file mode 100644 index 000000000..4c7af8a39 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash32.C @@ -0,0 +1,9 @@ +// PR c++/19667 + +struct integral_constant { }; + +template<typename _Tp> +struct is_function : public integral_constant { }; + +template<> +struct is_function : public integral_constant { }; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/template/crash33.C b/gcc/testsuite/g++.dg/template/crash33.C new file mode 100644 index 000000000..059e328f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash33.C @@ -0,0 +1,8 @@ +// PR c++/19253 + +namespace N {} + +template<typename> struct A +{ + A<typename N::X<int> > a; // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/template/crash34.C b/gcc/testsuite/g++.dg/template/crash34.C new file mode 100644 index 000000000..ef4d21b60 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash34.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +// PR c++/20028 + +// We used to crash when referencing TYPE_SIZE_UNIT of the messed-up +// type used for x, because it was not initialized. + +class Foo; + +template <typename T> class Foo { }; // { dg-error "not a template type" } + +Foo<int> x; // { dg-error "not a template|incomplete type" } diff --git a/gcc/testsuite/g++.dg/template/crash35.C b/gcc/testsuite/g++.dg/template/crash35.C new file mode 100644 index 000000000..348d91d0c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash35.C @@ -0,0 +1,9 @@ +// PR c++/20463 +// { dg-do compile } + +template <typename T> struct C; // { dg-error "declaration" } + +template <typename T> void C<T>::f() // { dg-error "invalid|template" } +{ + const foo bar; +} diff --git a/gcc/testsuite/g++.dg/template/crash36.C b/gcc/testsuite/g++.dg/template/crash36.C new file mode 100644 index 000000000..2f0ef921a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash36.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +// Origin: Ivan Godard <igodard@pacbell.net> +// Andrew Pinski <pinskia@gcc.gnu.org> + +// PR c++/20333: ICE parsing typename without nested-name-specifier + +template<class> struct f {}; +f<int> f2[2] = {typename f<int>()}; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/template/crash37.C b/gcc/testsuite/g++.dg/template/crash37.C new file mode 100644 index 000000000..60724231e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash37.C @@ -0,0 +1,27 @@ +// PR c++/21352 + +struct coperator_stack +{ + template<class type> + void push3() + { + } +}; + +struct helper {}; + +template<class F> +void bla(F f) // { dg-message "bla|no known conversion" } +{ +} + +template <typename ScannerT> +struct definition +{ + definition() + { + bla(coperator_stack::push3<helper>); // { dg-error "matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 23 } + } +}; + diff --git a/gcc/testsuite/g++.dg/template/crash38.C b/gcc/testsuite/g++.dg/template/crash38.C new file mode 100644 index 000000000..c652cc86f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash38.C @@ -0,0 +1,8 @@ +// PR c++/23307 + +class A +{ + template<class R> + static void f(X&); // { dg-error "" } + inline void A::f<void>(X&); // { dg-error "f|expected" } +}; diff --git a/gcc/testsuite/g++.dg/template/crash39.C b/gcc/testsuite/g++.dg/template/crash39.C new file mode 100644 index 000000000..ddecc173c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash39.C @@ -0,0 +1,11 @@ +// PR c++/22405 + +template <typename T> void foo(T &arg) { // { dg-error "declared" } + arg+=1; +} + +template <typename T> void foo(T &arg) { // { dg-error "redefinition" } + arg+=2; +} + +template void foo(float &arg); diff --git a/gcc/testsuite/g++.dg/template/crash4.C b/gcc/testsuite/g++.dg/template/crash4.C new file mode 100644 index 000000000..72b2bb18b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash4.C @@ -0,0 +1,12 @@ +namespace NS { + struct C {}; + void foo(); +} + +template <class T> struct X {}; + +template <class T> struct A { + A() { foo (X<T>()); } + void foo(X<T>); +}; +template struct A<NS::C>; diff --git a/gcc/testsuite/g++.dg/template/crash40.C b/gcc/testsuite/g++.dg/template/crash40.C new file mode 100644 index 000000000..45123dd0d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash40.C @@ -0,0 +1,10 @@ +// PR c++/22180 + +struct A {}; + +template<typename T> void foo() +{ + T::~T(); // { dg-error "member" } +} + +template void foo<A>(); // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/crash41.C b/gcc/testsuite/g++.dg/template/crash41.C new file mode 100644 index 000000000..9a440b076 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash41.C @@ -0,0 +1,18 @@ +// PR c++/22464 + +template<typename T> +void do_something(const T* A) // { dg-error "declared" } +{ + struct helper_t{ + helper_t() { + A[0]; // { dg-error "use" } + } + } helper; +} + +void sub1() { + double A[7]; + do_something (A); +} + + diff --git a/gcc/testsuite/g++.dg/template/crash42.C b/gcc/testsuite/g++.dg/template/crash42.C new file mode 100644 index 000000000..d36ced473 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash42.C @@ -0,0 +1,10 @@ +// { dg-do compile } + +// PR c++/22153 + +template<int> void foo(); + +template<int> struct A +{ + template<> friend void foo<0>(); // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/template/crash43.C b/gcc/testsuite/g++.dg/template/crash43.C new file mode 100644 index 000000000..cbb1221b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash43.C @@ -0,0 +1,8 @@ +// PR c++/24687 + +extern "C" { + template<typename _Tp> // { dg-error "C" } + struct ___is_pod { + enum { + __value = (sizeof(__gnu_internal::__test_type<_Tp>(0)))}; // { dg-error "declared|expected" } + diff --git a/gcc/testsuite/g++.dg/template/crash44.C b/gcc/testsuite/g++.dg/template/crash44.C new file mode 100644 index 000000000..d5596c199 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash44.C @@ -0,0 +1,7 @@ +// PR c++/25858 + +namespace N { + template<int> struct A {}; +} + +struct B N::A<0> {}; // { dg-error "invalid" } diff --git a/gcc/testsuite/g++.dg/template/crash45.C b/gcc/testsuite/g++.dg/template/crash45.C new file mode 100644 index 000000000..f138e3d61 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash45.C @@ -0,0 +1,13 @@ +// PR c++/26365 + +struct A {}; + +namespace N +{ + template<int> void foo(); +} + +void bar(A *p) +{ + p->N::foo<0>; // { dg-error "not a member" } +} diff --git a/gcc/testsuite/g++.dg/template/crash46.C b/gcc/testsuite/g++.dg/template/crash46.C new file mode 100644 index 000000000..6fbda7c07 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash46.C @@ -0,0 +1,5 @@ +// PR c++/27102 + +template <class T> +void T::foo() {} // { dg-error "invalid" } + diff --git a/gcc/testsuite/g++.dg/template/crash47.C b/gcc/testsuite/g++.dg/template/crash47.C new file mode 100644 index 000000000..9c2163209 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash47.C @@ -0,0 +1,3 @@ +// PR c++/27102 + +template<typename T> void T::X::foo() {} // { dg-error "invalid|not a type" } diff --git a/gcc/testsuite/g++.dg/template/crash48.C b/gcc/testsuite/g++.dg/template/crash48.C new file mode 100644 index 000000000..6aa3aa3ed --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash48.C @@ -0,0 +1,10 @@ +// PR c++/11471 +// Origin: <bagnara@cs.unipr.it> +// { dg-do compile } + +template<typename T> struct A +{ + typedef typename T::X X; +}; + +template<typename T> A<T>::X::X() {} // { dg-error "no type|invalid use|not a type|dependent" } diff --git a/gcc/testsuite/g++.dg/template/crash49.C b/gcc/testsuite/g++.dg/template/crash49.C new file mode 100644 index 000000000..41fc9be7b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash49.C @@ -0,0 +1,4 @@ +// PR c++/27102 + +template <typename T> +void T::foo; // { dg-error "invalid" } diff --git a/gcc/testsuite/g++.dg/template/crash50.C b/gcc/testsuite/g++.dg/template/crash50.C new file mode 100644 index 000000000..006056128 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash50.C @@ -0,0 +1,7 @@ +// PR c++/27398 +// { dg-do compile } + +struct A +{ + template<int> void* foo(; // { dg-error "primary-expression|initialization|static" } +}; diff --git a/gcc/testsuite/g++.dg/template/crash51.C b/gcc/testsuite/g++.dg/template/crash51.C new file mode 100644 index 000000000..8c2553d10 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash51.C @@ -0,0 +1,11 @@ +// PR c++/26496 + +template< typename _Generator> int generate_n(_Generator __gen); +struct Distribution { }; +typedef double (Distribution::* Pstd_mem)(); +int main(void) +{ + Distribution* rng; + Pstd_mem ptr; + generate_n(rng->*ptr); // { dg-error "non-static member" } +} diff --git a/gcc/testsuite/g++.dg/template/crash52.C b/gcc/testsuite/g++.dg/template/crash52.C new file mode 100644 index 000000000..9fc3f6833 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash52.C @@ -0,0 +1,19 @@ +// PR c++/27665 + +template<int> struct A +{ + struct B + { + struct C {}; + }; +}; + +template<int N> void foo() +{ + class A<N>::B::C X; +} + +void bar() +{ + foo<0>(); +} diff --git a/gcc/testsuite/g++.dg/template/crash53.C b/gcc/testsuite/g++.dg/template/crash53.C new file mode 100644 index 000000000..bbd1e7fc7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash53.C @@ -0,0 +1,11 @@ +// PR c++/28110 +// { dg-do compile } + +template<int> struct A {}; + +template<typename T> struct B +{ + template<T I> B(A<I>); // { dg-error "template constant parameter" } +}; + +B<double> a=A<0>(); // { dg-error "non-scalar type" } diff --git a/gcc/testsuite/g++.dg/template/crash54.C b/gcc/testsuite/g++.dg/template/crash54.C new file mode 100644 index 000000000..26b487571 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash54.C @@ -0,0 +1,5 @@ +//PR c++/28269 + +template<int> struct A; + +struct __attribute__((unused)) A<0<; // { dg-error "template argument|unqualified-id" } diff --git a/gcc/testsuite/g++.dg/template/crash55.C b/gcc/testsuite/g++.dg/template/crash55.C new file mode 100644 index 000000000..7cf9f1eae --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash55.C @@ -0,0 +1,6 @@ +//PR c++/27668 + +template<typename class T, T = T()> // { dg-error "nested-name-specifier|two or more|valid type" } +struct A {}; + +template<int> void foo(A<int>); // { dg-error "mismatch|constant|template argument" } diff --git a/gcc/testsuite/g++.dg/template/crash56.C b/gcc/testsuite/g++.dg/template/crash56.C new file mode 100644 index 000000000..03bddf42a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash56.C @@ -0,0 +1,16 @@ +// Origin: Wolfgang Bangerth <bangerth@dealii.org> + +// PR c++/28705 +// DR 218 is debating whether this is well formed or not. We've never +// accepted it (because we'd crash), so we continue to reject it, but +// without crashing. + +namespace N +{ + struct A { A (A*); }; +} + +template<typename T> void g (N::A *p) +{ + (void) A (p); // { dg-message "" "" } +} diff --git a/gcc/testsuite/g++.dg/template/crash57.C b/gcc/testsuite/g++.dg/template/crash57.C new file mode 100644 index 000000000..cf1c3c296 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash57.C @@ -0,0 +1,10 @@ +//PR c++/27397 + +template<int(> struct A; // { dg-error "token" } + +template<typename> struct B +{ + template<int(> struct C; // { dg-error "token" } +}; + +A<char> a; // { dg-error "type/value mismatch|constant|declaration" } diff --git a/gcc/testsuite/g++.dg/template/crash58.C b/gcc/testsuite/g++.dg/template/crash58.C new file mode 100644 index 000000000..5194ee263 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash58.C @@ -0,0 +1,10 @@ +//PR 26938 + +template<int, int = 0> struct A; // { dg-message "previous declaration" } + +template<int> struct A // { dg-error "template" } +{ + A(); +}; + +A<0> a; // { dg-error "incomplete type" } diff --git a/gcc/testsuite/g++.dg/template/crash59.C b/gcc/testsuite/g++.dg/template/crash59.C new file mode 100644 index 000000000..61d2188fc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash59.C @@ -0,0 +1,19 @@ +//PR c++/27329 + +template<int> struct A // { dg-error "forward declaration" } +! // { dg-error "expected unqualified-id" } + ; + +template<int> struct A { int foo(); }; // { dg-error "not a template" } + +int i = A<0>().foo(); // { dg-error "not a template|invalid use" } + + +template<int> struct B +! // { dg-error "expected unqualified-id" } + ; + +template<int> struct B { static int bar(); }; // { dg-error "not a template" } + +int j = B<0>::bar(); // { dg-error "not a template|incomplete type" } + diff --git a/gcc/testsuite/g++.dg/template/crash6.C b/gcc/testsuite/g++.dg/template/crash6.C new file mode 100644 index 000000000..776e01ebb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash6.C @@ -0,0 +1,8 @@ +template <class> struct A { static const int n = 1; } ; +template <int> struct B; + +template <class S> +struct restype_order { + static const int s = A<S>::n; + typedef typename B<(s > 0)>::t t; +}; diff --git a/gcc/testsuite/g++.dg/template/crash60.C b/gcc/testsuite/g++.dg/template/crash60.C new file mode 100644 index 000000000..c57977591 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash60.C @@ -0,0 +1,9 @@ +//PR c++/27961 + +struct A +{ + template<int> void foo(X); // { dg-error "declared" } +}; + +template<int> void f()(0); // { dg-error "initialize" } + diff --git a/gcc/testsuite/g++.dg/template/crash61.C b/gcc/testsuite/g++.dg/template/crash61.C new file mode 100644 index 000000000..1f70bcb89 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash61.C @@ -0,0 +1,11 @@ +// PR c++/29733 + +template<typename T> void foo() +{ + T t = 0; // { dg-error "function type" } +} + +void bar() +{ + foo<int()>(); +} diff --git a/gcc/testsuite/g++.dg/template/crash62.C b/gcc/testsuite/g++.dg/template/crash62.C new file mode 100644 index 000000000..bd8a0f40e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash62.C @@ -0,0 +1,6 @@ +// PR c++/29728 + +template<int> void foo() +{ + int a[] = { X: 0 }; // { dg-error "designated initializer" } +} diff --git a/gcc/testsuite/g++.dg/template/crash63.C b/gcc/testsuite/g++.dg/template/crash63.C new file mode 100644 index 000000000..b7056e8d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash63.C @@ -0,0 +1,12 @@ +// PR c++/29729 + +template<typename T> void foo(T) +{ + struct A + { + template<int> struct B // { dg-error "local class" } + { + typedef B<0> C; + } + }; +} diff --git a/gcc/testsuite/g++.dg/template/crash64.C b/gcc/testsuite/g++.dg/template/crash64.C new file mode 100644 index 000000000..750e3daf1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash64.C @@ -0,0 +1,6 @@ +// PR c++/29730 + +struct A +{ + template<int> void foo()(0); // { dg-error "initializer" } +}; diff --git a/gcc/testsuite/g++.dg/template/crash65.C b/gcc/testsuite/g++.dg/template/crash65.C new file mode 100644 index 000000000..4d49ecf31 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash65.C @@ -0,0 +1,7 @@ +// PR c++/29732 + +struct A +{ + template<int> template<typename T> friend void foo(T) {} // { dg-error "parameter" } + void bar() { foo(0); } // { dg-error "foo" } +}; diff --git a/gcc/testsuite/g++.dg/template/crash66.C b/gcc/testsuite/g++.dg/template/crash66.C new file mode 100644 index 000000000..3517311b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash66.C @@ -0,0 +1,17 @@ +// PR c++/29535 +// { dg-do compile } + +template <class INDEX> struct SetRegion2D +{ + struct FloodFillControl + { + struct Allocator{}; + }; +}; +template <int DIM, class PIXELINDEX> +struct MotionSearcher +{ + typedef SetRegion2D<PIXELINDEX> Region_t; + MotionSearcher (typename Region_t::FloodFillControl::Allocator &a_rAllocator); +}; +class MotionSearcherY : public MotionSearcher<1, int> {}; diff --git a/gcc/testsuite/g++.dg/template/crash67.C b/gcc/testsuite/g++.dg/template/crash67.C new file mode 100644 index 000000000..c80f4fb93 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash67.C @@ -0,0 +1,3 @@ +// PR c++/32561 + +template<int N, int N> struct A; // { dg-error "redefinition|declared" } diff --git a/gcc/testsuite/g++.dg/template/crash68.C b/gcc/testsuite/g++.dg/template/crash68.C new file mode 100644 index 000000000..9171f8c62 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash68.C @@ -0,0 +1,16 @@ +// PR c++/33035 + +template<class A> +struct a { + template<class B> + struct b { + template<class C> + void f() + { + struct g + { + ~g() {} + }; + } + }; +}; diff --git a/gcc/testsuite/g++.dg/template/crash69.C b/gcc/testsuite/g++.dg/template/crash69.C new file mode 100644 index 000000000..957f1e19b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash69.C @@ -0,0 +1,12 @@ +// PR c++/31132 + +template<typename T> class A +{ + static int i; // { dg-error "is private" } + friend int T::foo(); // { dg-error "does not match" } +}; + +struct B +{ + void foo() { A<B>::i; } // { dg-error "within|candidate" } +}; diff --git a/gcc/testsuite/g++.dg/template/crash7.C b/gcc/testsuite/g++.dg/template/crash7.C new file mode 100644 index 000000000..ae07d91e7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash7.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> + +// PR c++/10108: ICE in tsubst_decl for error due to non-existence +// nested type. + +template <typename> struct A +{ // { not-dg-error "candidates" } + template <typename> A(typename A::X) {} // { dg-error "no type" } +}; + +A<void> a; // { not-dg-error "instantiated|no match" } +// We currently don't give the "no match" error because we don't add the +// invalid constructor template to TYPE_METHODS. diff --git a/gcc/testsuite/g++.dg/template/crash70.C b/gcc/testsuite/g++.dg/template/crash70.C new file mode 100644 index 000000000..742f77b22 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash70.C @@ -0,0 +1,7 @@ +// PR c++/32113 + +template<int> struct A; + +template<typename T> void foo (A<&T::template i>); // { dg-error "not a template" } + +template void foo<A<0> > (A<0>); // { dg-error "does not match" } diff --git a/gcc/testsuite/g++.dg/template/crash71.C b/gcc/testsuite/g++.dg/template/crash71.C new file mode 100644 index 000000000..86aa1521d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash71.C @@ -0,0 +1,3 @@ +// PR c++/30659 + +extern "C" template A<char> foo(); // { dg-error "forbids|static data|expected" } diff --git a/gcc/testsuite/g++.dg/template/crash72.C b/gcc/testsuite/g++.dg/template/crash72.C new file mode 100644 index 000000000..5ab536561 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash72.C @@ -0,0 +1,25 @@ +// PR c++/29225 +// { dg-do compile } + +template <typename L, typename R> bool operator< (L x, R y); +struct T { int t (); }; +class S {}; + +struct U +{ + typedef int (T::* M) (); + M m; + + bool operator() (S &x) + { + T a; + return (a.*m) < x; // { dg-error "invalid use of non-static member" } + } +}; + +void foo (S &x) +{ + U m; + m.m = &T::t; + m (x); +} diff --git a/gcc/testsuite/g++.dg/template/crash73.C b/gcc/testsuite/g++.dg/template/crash73.C new file mode 100644 index 000000000..5c3c87dad --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash73.C @@ -0,0 +1,9 @@ +// PR c++/34100 +// { dg-do compile } + +template<typename T> struct A +{ + typedef typename T::X Y __attribute__((vector_size(8))); // { dg-error "is not a class, struct" } +}; + +A<int> a; diff --git a/gcc/testsuite/g++.dg/template/crash74.C b/gcc/testsuite/g++.dg/template/crash74.C new file mode 100644 index 000000000..9f2e415cf --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash74.C @@ -0,0 +1,6 @@ +// PR c++/34089 +// { dg-do compile } +// { dg-options "" } + +template<typename F> void foo () { } +template<typename F> struct foo<F> { }; // { dg-error "redeclared as" } diff --git a/gcc/testsuite/g++.dg/template/crash75.C b/gcc/testsuite/g++.dg/template/crash75.C new file mode 100644 index 000000000..462be95b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash75.C @@ -0,0 +1,8 @@ +// PR c++/34776 + +template<typename T> struct A +{ + T::X<0> x; // { dg-error "non-template|T::template|base type" } +}; + +A<int*> a; diff --git a/gcc/testsuite/g++.dg/template/crash76.C b/gcc/testsuite/g++.dg/template/crash76.C new file mode 100644 index 000000000..851cdd8c4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash76.C @@ -0,0 +1,13 @@ +// PR c++/34486 + +template<typename> struct A +{ + typedef A* X; +}; + +template<typename T> struct B +{ + using A<T>::X::Y; // { dg-error "not a base type" } +}; + +B<int> b; diff --git a/gcc/testsuite/g++.dg/template/crash77.C b/gcc/testsuite/g++.dg/template/crash77.C new file mode 100644 index 000000000..b4d6e8f4a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash77.C @@ -0,0 +1,5 @@ +// PR c++/34603 + +template<typename> struct A; // { dg-error "declaration" } + +template<typename T> A<T>::A( struct A; // { dg-error "definition|expected|incomplete" } diff --git a/gcc/testsuite/g++.dg/template/crash78.C b/gcc/testsuite/g++.dg/template/crash78.C new file mode 100644 index 000000000..10c36ef8c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash78.C @@ -0,0 +1,3 @@ +// PR c++/35077 + +template<typename=int struct A __attribute((aligned(4))); // { dg-error "declaration|expected" } diff --git a/gcc/testsuite/g++.dg/template/crash79.C b/gcc/testsuite/g++.dg/template/crash79.C new file mode 100644 index 000000000..a18eac336 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash79.C @@ -0,0 +1,9 @@ +// PR c++/36404 + +struct A +{ + A(int); + template<int> enum { e }; // { dg-error "template|expected" } +}; + +A a(A::e); // { dg-error "not a member" } diff --git a/gcc/testsuite/g++.dg/template/crash8.C b/gcc/testsuite/g++.dg/template/crash8.C new file mode 100644 index 000000000..a6f26b306 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash8.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +// Origin: David Robinson <drtr@dial.pipex.com> + +// PR c++/11513: ICE due to incorrect decision whether the tag is template. + +template <typename T> +struct bar +{ + struct foo + { + int a; + }; + + template <typename U> + int wom(U c) + { + struct foo b; + } +}; diff --git a/gcc/testsuite/g++.dg/template/crash80.C b/gcc/testsuite/g++.dg/template/crash80.C new file mode 100644 index 000000000..a12bd8bdd --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash80.C @@ -0,0 +1,9 @@ +// PR c++/37087 + +namespace a { + template <typename T> class Foo; +} + +namespace b { + template <> class ::a::Foo<double> {}; // { dg-error "global qualification of class name is invalid" } +} diff --git a/gcc/testsuite/g++.dg/template/crash81.C b/gcc/testsuite/g++.dg/template/crash81.C new file mode 100644 index 000000000..849470a5e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash81.C @@ -0,0 +1,8 @@ +// PR c++/34485 + +struct A +{ + template<T::X> struct X; // { dg-error "'T' has not been declared" "T" } + // { dg-error "declaration of 'template<int X> struct A::X'" "A::X" { target *-*-* } 5 } + // { dg-error "shadows template parm 'int X'" "shadow" { target *-*-* } 5 } +}; diff --git a/gcc/testsuite/g++.dg/template/crash82.C b/gcc/testsuite/g++.dg/template/crash82.C new file mode 100644 index 000000000..41456918f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash82.C @@ -0,0 +1,6 @@ +// PR c++/37649 + +struct A +{ + template<int> struct {}; // { dg-error "template class without a name" } +}; diff --git a/gcc/testsuite/g++.dg/template/crash83.C b/gcc/testsuite/g++.dg/template/crash83.C new file mode 100644 index 000000000..b83dd2139 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash83.C @@ -0,0 +1,5 @@ +// PR c++/37650 + +template<int> struct A {}; + +template<typename = class A<0>: > struct B {}; // { dg-error "explicit specialization|expected" } diff --git a/gcc/testsuite/g++.dg/template/crash84.C b/gcc/testsuite/g++.dg/template/crash84.C new file mode 100644 index 000000000..f622aaa5e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash84.C @@ -0,0 +1,19 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/35405 +// { dg-do compile } + +template<typename T> struct a +{ + template <template <typename> class C, typename X, C<X>* =0> + struct b // { dg-error "class C' is not a template|is not a valid type" } + { + }; +}; + +void +foo () +{ + a<int> v; // { dg-message "instantiated from here" } +} + + diff --git a/gcc/testsuite/g++.dg/template/crash85.C b/gcc/testsuite/g++.dg/template/crash85.C new file mode 100644 index 000000000..e0b6ee198 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash85.C @@ -0,0 +1,15 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/37142 +// { dg-do compile } + +template<typename T, const T a, template <typename U, U u> class W> struct A {}; + +template<typename T, const T t> struct B {}; + +int +main () +{ + A<long, 0, B> a; + return 0; +} + diff --git a/gcc/testsuite/g++.dg/template/crash87.C b/gcc/testsuite/g++.dg/template/crash87.C new file mode 100644 index 000000000..7b8bf4ada --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash87.C @@ -0,0 +1,27 @@ +// Origin: PR c++/38357 +// { dg-do compile } + +class BUG +{ +public: + bool name() { return true; } +}; + +template <bool T> +struct BUG1_5 +{ + +}; + +template <bool name> +class BUG2 : BUG +{ +public: + typedef BUG1_5<name> ptr; // { dg-error "could not convert template argument" } +}; + +int main() +{ + BUG2<false> b; + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/crash88.C b/gcc/testsuite/g++.dg/template/crash88.C new file mode 100644 index 000000000..438ab90cc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash88.C @@ -0,0 +1,6 @@ +// PR c++/34397 + +template<typename T, int = T()[0]> struct A +{ + typedef A<T> B; +}; diff --git a/gcc/testsuite/g++.dg/template/crash89.C b/gcc/testsuite/g++.dg/template/crash89.C new file mode 100644 index 000000000..e62b57a39 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash89.C @@ -0,0 +1,8 @@ +// PR c++/34397 + +template<typename T, int = T()[0]> struct A +{ + typedef A<T> B; +}; + +A<int> a; // { dg-error "subscripted|template|declaration" } diff --git a/gcc/testsuite/g++.dg/template/crash9.C b/gcc/testsuite/g++.dg/template/crash9.C new file mode 100644 index 000000000..7a568fe05 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash9.C @@ -0,0 +1,12 @@ +struct A { }; +struct B { }; + +A f(const B & b) { + return A(); +} + +template<> +B f(const A & a) { // { dg-error "" } + return B(); +} + diff --git a/gcc/testsuite/g++.dg/template/crash90.C b/gcc/testsuite/g++.dg/template/crash90.C new file mode 100644 index 000000000..6fe247cc3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash90.C @@ -0,0 +1,8 @@ +// PR c++/39750 + +template < unsigned > +struct A ; +template < typename > +struct B ; +template < typename T , A < B < T > // { dg-error "initializer|parse error|valid type|expected" } +{ } diff --git a/gcc/testsuite/g++.dg/template/crash91.C b/gcc/testsuite/g++.dg/template/crash91.C new file mode 100644 index 000000000..39575cd9f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash91.C @@ -0,0 +1,8 @@ +// PR c++/28293 + +template<int> void foo(); + +struct A +{ + typedef void foo<0>(); // { dg-error "explicit template argument list not allowed" } +}; diff --git a/gcc/testsuite/g++.dg/template/crash92.C b/gcc/testsuite/g++.dg/template/crash92.C new file mode 100644 index 000000000..c0219c4a3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash92.C @@ -0,0 +1,7 @@ +// PR c++/42055 + +template<typename T> void foo(T, T); // { dg-error "candidates|template" } + +template<typename T> void foo(T, int); // { dg-error "template" } + +template void foo(int, int); // { dg-error "ambiguous template specialization" } diff --git a/gcc/testsuite/g++.dg/template/crash93.C b/gcc/testsuite/g++.dg/template/crash93.C new file mode 100644 index 000000000..696a04a07 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash93.C @@ -0,0 +1,12 @@ +// PR c++/40371 + +struct A +{ + typedef void (&F)(); + template<int> operator F(); +}; + +void foo() +{ + A()(); // { dg-error "no match" } +} diff --git a/gcc/testsuite/g++.dg/template/crash94.C b/gcc/testsuite/g++.dg/template/crash94.C new file mode 100644 index 000000000..810aed0a6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash94.C @@ -0,0 +1,28 @@ +// Origin: PR c++/42697 +// { dg-do compile } + +template<class Value_t> +class fparser +{ + template<bool Option> + void eval2(Value_t r[2]); +public: + void evaltest(); +}; + +template<> +template<bool Option> +void fparser<int>::eval2(int r[2]) +{ + struct ObjType {}; +} + + +template<class Value_t> +void fparser<Value_t>::evaltest + () +{ + eval2<false>(0); +} + +template class fparser<int>; diff --git a/gcc/testsuite/g++.dg/template/crash95.C b/gcc/testsuite/g++.dg/template/crash95.C new file mode 100644 index 000000000..2ad9e9816 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash95.C @@ -0,0 +1,11 @@ +// PR c++/43705 + +template < typename > struct S +{ + template < > struct S < int > // { dg-error "explicit|specialization|template|parameter" } + { + S(int); + }; +}; + +S < int > s(0); // { dg-error "incomplete type" } diff --git a/gcc/testsuite/g++.dg/template/crash96.C b/gcc/testsuite/g++.dg/template/crash96.C new file mode 100644 index 000000000..5c2aa9954 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash96.C @@ -0,0 +1,6 @@ +// PR c++/40406 + +template<int> struct A +{ + template<int> template<int> void A::foo() {} // { dg-error "extra qualification" } +}; diff --git a/gcc/testsuite/g++.dg/template/crash97.C b/gcc/testsuite/g++.dg/template/crash97.C new file mode 100644 index 000000000..3d177f4e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash97.C @@ -0,0 +1,14 @@ +// PR c++/34272 + +template<typename> struct A {}; + +template<typename> struct A<int> // { dg-error "not used|template\\-parameter" } +{ + template<int> void foo(); +}; + +void bar() +{ + A<int> a; // { dg-error "incomplete type" } + a.foo<0>(); // { dg-error "expected" } +} diff --git a/gcc/testsuite/g++.dg/template/crash98.C b/gcc/testsuite/g++.dg/template/crash98.C new file mode 100644 index 000000000..e3c224df1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash98.C @@ -0,0 +1,14 @@ +// PR c++/43630 + +template < typename > struct A; // { dg-error "declaration" } + +template < typename > struct A < int > // { dg-error "not used|template\\-parameter" } +{ + int i; + int f (); +}; + +int A < int >::f () // { dg-error "incomplete type" } +{ + return i; +} diff --git a/gcc/testsuite/g++.dg/template/crash99.C b/gcc/testsuite/g++.dg/template/crash99.C new file mode 100644 index 000000000..606d3e304 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash99.C @@ -0,0 +1,10 @@ +// PR c++/34491 + +template<typename> struct A; + +template<0> struct A<int> // { dg-error "expected|template|anonymous" } +{ + static const int i = 0; +}; + +int n = A<int>::i; // { dg-error "incomplete type" } diff --git a/gcc/testsuite/g++.dg/template/ctor1.C b/gcc/testsuite/g++.dg/template/ctor1.C new file mode 100644 index 000000000..81caa1fb4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ctor1.C @@ -0,0 +1,31 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 31 Dec 2001 <nathan@codesourcery.com> + +// PR 5132. ICE on struct constructors in templates. + +// snippets from bits/huge_val.h + +#define __HUGE_VAL_bytes { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f } +#define __huge_val_t union { unsigned char __c[8]; double __d; } +#define HUGE_VAL (__extension__ \ + ((__huge_val_t) { __c: __HUGE_VAL_bytes }).__d) + +void foo( const int&) { + HUGE_VAL; // no problem here +} + +template <class F> +void Tfoo( const F&) { + HUGE_VAL; // g++ fails here +} + +template <typename T> struct M { T m; }; + +void Foo () +{ + Tfoo (1.2f); + (__extension__ ((M<int>) {m:3})); + (__extension__ ((M<short> []) {{m:3}})); +} diff --git a/gcc/testsuite/g++.dg/template/ctor2.C b/gcc/testsuite/g++.dg/template/ctor2.C new file mode 100644 index 000000000..1c8d8a65d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ctor2.C @@ -0,0 +1,18 @@ +// { dg-do run } + +int i; + +template <class T> +struct S +{ + S () { i = 1; } +}; + +static S<int> s[1]; + +int main () +{ + if (!i) + return 1; +} + diff --git a/gcc/testsuite/g++.dg/template/ctor3.C b/gcc/testsuite/g++.dg/template/ctor3.C new file mode 100644 index 000000000..d3eb2c3f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ctor3.C @@ -0,0 +1,19 @@ +struct A {}; +struct B; + +template <class TP> struct X: virtual A { + template <class TP2> X(TP2* ptr) {} + template <class TP2> X(const X<TP2>) {} +}; + +struct Y : X<B> { + Y(A* a) : X<B>(a) {} +}; + +void func1(X<B>); + +void func2() { + A a; + Y y(&a); + func1(X<A>(&a)); +} diff --git a/gcc/testsuite/g++.dg/template/ctor4.C b/gcc/testsuite/g++.dg/template/ctor4.C new file mode 100644 index 000000000..18ed628ee --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ctor4.C @@ -0,0 +1,39 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 24 Jun 2004 <nathan@codesourcery.com> + +// Origin Rani Sharoni via giovannibajo@libero.it +// Bug 16174, SFINAE failure. + +template <class T> struct K +{ + K(); + + K(K<T> & rhs); + K(K<T> const& rhs); + template <class U> K(K<U> const& rhs); + +private: + template <class U> struct A; + template <class U> struct A< K<U> const> + { typedef typename K<U>::compile_time_error type; }; + + // This is used to reject calls to the copy constructor + // with objects which are top-level const. If they are + // const, the specialization of A is instantiated and + // causes a compile time error. Otherwise, the general + // template is picked up, it misses definition, so this + // ctor declaration is rejected by SFINAE and everybody + // is happy. + // GCC 3.4.1pre and 3.5.0 always matches A's specialization + // when instantiating from foo(), and this causes the error. + template <class U> + K(U& rhs, typename A<U>::type = 0); +}; + + +K<int> foo(void) +{ + return K<int>(); +} diff --git a/gcc/testsuite/g++.dg/template/ctor5.C b/gcc/testsuite/g++.dg/template/ctor5.C new file mode 100644 index 000000000..6938b36b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ctor5.C @@ -0,0 +1,8 @@ +// PR c++/24278 + +template<typename T> struct A +{ + A() : T(0) {} // { dg-error "base" } +}; + +A<int*> a; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/ctor6.C b/gcc/testsuite/g++.dg/template/ctor6.C new file mode 100644 index 000000000..4f21dc9eb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ctor6.C @@ -0,0 +1,11 @@ +// PR c++/25663 + +template<int> struct A +{ + A(int); +}; + +void foo() +{ + A<0>(A<0>(0)); +} diff --git a/gcc/testsuite/g++.dg/template/ctor7.C b/gcc/testsuite/g++.dg/template/ctor7.C new file mode 100644 index 000000000..ee65172fe --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ctor7.C @@ -0,0 +1,19 @@ +// PR c++/27640 + +template < class T > struct refcounted : +virtual T +{ + template < class A1 > refcounted (const A1 & a1) : T () { } +}; +struct nfsserv {}; +template < class T > +void +sfsserver_cache_alloc (int *ns) +{ + new refcounted < nfsserv > (*ns); +} +void +usage () +{ + sfsserver_cache_alloc < int > ( 0); +} diff --git a/gcc/testsuite/g++.dg/template/ctor8.C b/gcc/testsuite/g++.dg/template/ctor8.C new file mode 100644 index 000000000..859bded41 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ctor8.C @@ -0,0 +1,11 @@ +// PR c++/28711 +// { dg-do compile } +// { dg-options "" } + +template<int> struct A +{ + int x[1][1]; + A() : x((int[1][]){{0}}) {} // { dg-error "except the first" } +}; + +A<0> a; diff --git a/gcc/testsuite/g++.dg/template/ctor9.C b/gcc/testsuite/g++.dg/template/ctor9.C new file mode 100644 index 000000000..819ca1c94 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ctor9.C @@ -0,0 +1,9 @@ +// PR c++/9050, DR 147, 318 + +struct Y +{ + template <typename T> Y (T); + template <typename T> void foo (T); +}; + +template <> Y::Y<int> (int) { } diff --git a/gcc/testsuite/g++.dg/template/debug1.C b/gcc/testsuite/g++.dg/template/debug1.C new file mode 100644 index 000000000..a2c157702 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/debug1.C @@ -0,0 +1,18 @@ +// PR c++/40274 +// { dg-options "-g" } + +template <class T> struct valuelist_types +{ + struct null { }; + template <T V, class next=null> struct list { }; +}; + +template <unsigned D> void foo() +{ + typename valuelist_types<unsigned>::template list<D> v; +} + +void bar() +{ + valuelist_types<unsigned>::list<2> v; +} diff --git a/gcc/testsuite/g++.dg/template/decl1.C b/gcc/testsuite/g++.dg/template/decl1.C new file mode 100644 index 000000000..50eef0866 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/decl1.C @@ -0,0 +1,16 @@ +// PR c++/3882 +// Verify that variable initialization can be +// self-referencing inside a template function. + +int foo(int); + +template <typename T> +void bar(const T&) +{ + int i = foo(i); +} + +void quus() +{ + bar(0); +} diff --git a/gcc/testsuite/g++.dg/template/decl2.C b/gcc/testsuite/g++.dg/template/decl2.C new file mode 100644 index 000000000..3a77777bd --- /dev/null +++ b/gcc/testsuite/g++.dg/template/decl2.C @@ -0,0 +1,13 @@ +// PR c++/16162 + +template <int N> struct O { + struct I { + template <typename T> struct II { + void f(); + }; + }; +}; + +template <int N> +template <typename T> +void O<N>::I::II<T>::f () {} diff --git a/gcc/testsuite/g++.dg/template/decl3.C b/gcc/testsuite/g++.dg/template/decl3.C new file mode 100644 index 000000000..7f9385076 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/decl3.C @@ -0,0 +1,8 @@ +// c++/32560 + +namespace N {} + +template<typename> struct A +{ + int A<typename N::X>; // { dg-error "namespace|argument|before" } +}; diff --git a/gcc/testsuite/g++.dg/template/deduce1.C b/gcc/testsuite/g++.dg/template/deduce1.C new file mode 100644 index 000000000..262c4fe86 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/deduce1.C @@ -0,0 +1,25 @@ +// { dg-do run } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 13 Sep 2002 <nathan@codesourcery.com> + +template <typename T> int Foo (T const *) +{ + return 1; +} +template <typename T> int Foo (T const &) +{ + return 2; +} +template <typename T, __SIZE_TYPE__ I> int Foo (T const (&ref)[I]) +{ + return 0; +} + +int main () +{ + static int array[4] = {}; + + return Foo (array); +} + diff --git a/gcc/testsuite/g++.dg/template/deduce2.C b/gcc/testsuite/g++.dg/template/deduce2.C new file mode 100644 index 000000000..bcf77b30b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/deduce2.C @@ -0,0 +1,30 @@ +template <typename T0> struct tuple { + typedef tuple<int> tail; +}; + +template <> struct tuple<int> { +}; + +template <typename L> +struct length { + static const int i = length<typename tuple<L>::tail>::i; +}; + +template<> +struct length<tuple<int> > { + static const int i = 1; +}; + +template <int> struct M {}; + +template <typename A> +M<length<tuple<A> >::i > foo (A*); + +template <typename A> +M<length<tuple<A> >::i> foo (const A*); + +const int i1 = 3; + +void bar() { + foo (&i1); +} diff --git a/gcc/testsuite/g++.dg/template/deduce3.C b/gcc/testsuite/g++.dg/template/deduce3.C new file mode 100644 index 000000000..e8a1d4e2b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/deduce3.C @@ -0,0 +1,11 @@ +template <typename T> +void f(int, T (*)() = 0); // { dg-message "note" } + +void g() { + typedef int A[2]; + f<A>(0); // { dg-error "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 6 } + typedef void F(); + f<F>(0); // { dg-error "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 9 } +} diff --git a/gcc/testsuite/g++.dg/template/defarg1.C b/gcc/testsuite/g++.dg/template/defarg1.C new file mode 100644 index 000000000..1b0e4a24a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/defarg1.C @@ -0,0 +1,7 @@ +struct Outer { + template <int I, int J=I> struct Inner {}; +}; + +void f() { + Outer::Inner<2> i; +} diff --git a/gcc/testsuite/g++.dg/template/defarg10.C b/gcc/testsuite/g++.dg/template/defarg10.C new file mode 100644 index 000000000..281b10868 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/defarg10.C @@ -0,0 +1,13 @@ +// PR c++/28363 +// { dg-do compile } + +template<typename T, template<int> class = T> // { dg-error "invalid use of type" } +struct A; + +typedef int I; +template<template<int> class = I> // { dg-error "invalid use of type" } +struct B; + +struct S; +template<template<int> class = S> // { dg-error "invalid use of type" } +struct C; diff --git a/gcc/testsuite/g++.dg/template/defarg11.C b/gcc/testsuite/g++.dg/template/defarg11.C new file mode 100644 index 000000000..00c4e658d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/defarg11.C @@ -0,0 +1,18 @@ +// { dg-do compile } + +// We used to reject this code as the extension +// for default arguments being accepted as less the +// needed template arguments. + + +template<typename> struct match { }; + +template<template<typename> class t,typename T> +struct match<t<T> > { typedef int type; }; + +template<template<typename,typename> class t,typename T0,typename T1> +struct match<t<T0,T1> > { typedef int type; }; + +template<typename,typename =void> struct other { }; + +typedef match<other<void,void> >::type type; diff --git a/gcc/testsuite/g++.dg/template/defarg12.C b/gcc/testsuite/g++.dg/template/defarg12.C new file mode 100644 index 000000000..d11848af2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/defarg12.C @@ -0,0 +1,10 @@ +// PR c++/35828 +// { dg-options "-std=c++0x" } + +template < typename > struct A ; +template < template < typename > class = A > +void test () +{ + test (); +} + diff --git a/gcc/testsuite/g++.dg/template/defarg13.C b/gcc/testsuite/g++.dg/template/defarg13.C new file mode 100644 index 000000000..ba2980bfa --- /dev/null +++ b/gcc/testsuite/g++.dg/template/defarg13.C @@ -0,0 +1,19 @@ +// PR c++/14912 +// Bug: We were instantiating A<B> in order to compare it to the matching +// argument for C<B,B>, which fails. + +template <class T> +struct A +{ + typedef typename T::F F; +}; + +struct B { }; + +template <class T, class U = typename A<T>::F > +struct C +{ + typename T::F f; // { dg-error "no type" } +}; + +C<B, B> c; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/defarg14.C b/gcc/testsuite/g++.dg/template/defarg14.C new file mode 100644 index 000000000..1fe87e39d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/defarg14.C @@ -0,0 +1,13 @@ +// PR c++/46129 +// The default argument for A<int>::B::operator() should not be instantiated + +template <class T> +struct A { + struct B { + void operator () (const T& d_ = f(T()) ) { } + }; +}; + +int main() { + A<int>::B b; +} diff --git a/gcc/testsuite/g++.dg/template/defarg2.C b/gcc/testsuite/g++.dg/template/defarg2.C new file mode 100644 index 000000000..3670389c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/defarg2.C @@ -0,0 +1,10 @@ +struct X { + X (); +}; + +template <int> struct O { + struct I { + I (const X & = X()); + }; +}; +template struct O<2>; diff --git a/gcc/testsuite/g++.dg/template/defarg3.C b/gcc/testsuite/g++.dg/template/defarg3.C new file mode 100644 index 000000000..da91cb7b1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/defarg3.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 22 Jul 2003 <nathan@codesourcery.com> + +// PR c++ 11596 + +template <int V, bool F = V < 1> struct A { enum { value }; }; +template <int V> struct B { enum { value = A<1>::value }; }; +int ary[!B<1>::value ? 1 : -1]; + +template <int V, bool F = V < 1> struct A1 { enum { value = 1}; }; +template <int V> struct A1<V,false> { enum { value}; }; +template <int V> struct B1 { enum { value = A1<1>::value }; }; + +int ary1[!B1<1>::value ? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/template/defarg4.C b/gcc/testsuite/g++.dg/template/defarg4.C new file mode 100644 index 000000000..293538adb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/defarg4.C @@ -0,0 +1,14 @@ +// PR c++/14763 + +struct A { + int get() const {} + static A *foo(); +}; + +template<bool> struct S { + S(unsigned int = A::foo()->get()) ; +}; + +void foo() throw() { + S<false> f; +} diff --git a/gcc/testsuite/g++.dg/template/defarg5.C b/gcc/testsuite/g++.dg/template/defarg5.C new file mode 100644 index 000000000..b43637416 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/defarg5.C @@ -0,0 +1,25 @@ +// { dg-do compile } + +// Origin: Ivan Godard <igodard@pacbell.net> +// Wolfgang Bangerth <bangerth@dealii.org> + +// PR c++/17344: Substitution failure is not an error +// for default template argument + +template <class> struct intTraits; + +template<> struct intTraits<int> { + static const int i = 0; +}; + +template<typename E, E i = intTraits<E>::i> struct A {}; + +struct S { + template <template <typename> class X> S(X<void>); +}; + +int bar(S); +int bar(A<int,0>); + +A<int> bed; +int i = bar(bed); diff --git a/gcc/testsuite/g++.dg/template/defarg6.C b/gcc/testsuite/g++.dg/template/defarg6.C new file mode 100644 index 000000000..f4d84685a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/defarg6.C @@ -0,0 +1,25 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 14 Oct 2005 <nathan@codesourcery.com> + +// PR 21353 missing error. +// Origin:Andrew Pinski <pinskia@gcc.gnu.org> + +enum X{ a, b, c }; + +struct C +{ + static void func (X &ref = a); // { dg-error "default argument" "" } +}; + +template <typename T> +struct D +{ + static void func (X &ref = a); // not an error at this point +}; + +void Foo (X & obj) +{ + D<int>::func (obj); + + D<int>::func (); // { dg-error "default argument" "" } +} diff --git a/gcc/testsuite/g++.dg/template/defarg7.C b/gcc/testsuite/g++.dg/template/defarg7.C new file mode 100644 index 000000000..77506d402 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/defarg7.C @@ -0,0 +1,7 @@ +// PR c++/25337 + +template <typename T> T& MakeT(); +template <typename U, int N = sizeof (MakeT<U>().operator[](0))> +struct helper{}; +template <typename U> +static char is_here(helper<U>*); diff --git a/gcc/testsuite/g++.dg/template/defarg8.C b/gcc/testsuite/g++.dg/template/defarg8.C new file mode 100644 index 000000000..61d819c7c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/defarg8.C @@ -0,0 +1,19 @@ +// PR c++/27094 +// { dg-options "--param ggc-min-expand=0 --param ggc-min-heapsize=0" } + +struct A +{ + ~A(); +}; + +struct B : A +{ + B(); +}; + +template<int> struct C +{ + C(const B& = B()); +}; + +C<0> c; diff --git a/gcc/testsuite/g++.dg/template/defarg9.C b/gcc/testsuite/g++.dg/template/defarg9.C new file mode 100644 index 000000000..de7528f61 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/defarg9.C @@ -0,0 +1,16 @@ +// PR c++/28048 + +template<typename T> struct Boom; + +template<typename T, bool D = Boom<T>::Internal::Value> // <--ICE + struct Foo + { + }; + +template<typename T> struct Boom +{ + struct Internal + { + static const bool Value = false; + }; +}; diff --git a/gcc/testsuite/g++.dg/template/delete1.C b/gcc/testsuite/g++.dg/template/delete1.C new file mode 100644 index 000000000..fc5327074 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/delete1.C @@ -0,0 +1,14 @@ +// PR c++/15890 + +template < typename T > +void operator delete ( void* raw ) { // { dg-error "" } + delete raw; +} + +class A { }; + +int main() { + A* a = new A; + delete a; +} + diff --git a/gcc/testsuite/g++.dg/template/dependent-args1.C b/gcc/testsuite/g++.dg/template/dependent-args1.C new file mode 100644 index 000000000..0b197cf55 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-args1.C @@ -0,0 +1,11 @@ +// PR c++/27582 +// { dg-do compile } + +struct A +{ + template<int> void foo(); +}; + +template<int N, void (A::*)() = &A::foo<N> > struct B {}; + +B<int> b; // { dg-error "type/value mismatch|expected a constant|invalid type" } diff --git a/gcc/testsuite/g++.dg/template/dependent-expr1.C b/gcc/testsuite/g++.dg/template/dependent-expr1.C new file mode 100644 index 000000000..79649861b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-expr1.C @@ -0,0 +1,29 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Jun 2003 <nathan@codesourcery.com> + +// PR c++ 9779. ICE + +struct I +{ +}; + +void Foo (int); +namespace std +{ + template <typename X> + void Baz (I *x) + { + Foo (sizeof (I)); + Foo (sizeof (x)); + Foo (__alignof__ (I)); + Foo (__alignof__ (x)); + Foo (x->~I ()); // { dg-error "" } + // Foo (typeid (I)); + Foo (delete x); // { dg-error "" } + Foo (delete[] x); // { dg-error "" } + Foo (throw x); // { dg-error "" } + } + +} diff --git a/gcc/testsuite/g++.dg/template/dependent-expr2.C b/gcc/testsuite/g++.dg/template/dependent-expr2.C new file mode 100644 index 000000000..06f056b41 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-expr2.C @@ -0,0 +1,23 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 2 Aug 2003 <nathan@codesourcery.com> + +// PR 11704. ICE + +struct A +{ + int foo() + { + return 5; + } +}; + +template <class T> // If B is not template it works +struct B +{ + bool bar(A& a) + { + return a.foo == 0; // { dg-error "" "" } + } +}; diff --git a/gcc/testsuite/g++.dg/template/dependent-expr3.C b/gcc/testsuite/g++.dg/template/dependent-expr3.C new file mode 100644 index 000000000..97fddbdd8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-expr3.C @@ -0,0 +1,14 @@ +// { dg-do compile } +// Origin: jbrandmeyer at users dot sourceforge dot net +// PR c++/12573: COMPONENT_REFs must be inspected for dependness. + +template <bool> struct S; + +template <typename K> struct Y : K { + int x; +}; + +template <class T> struct Z { + S< (bool)(&static_cast<Y<T> *>(0)->x == 0) > // { dg-error "" } + s; +}; diff --git a/gcc/testsuite/g++.dg/template/dependent-expr4.C b/gcc/testsuite/g++.dg/template/dependent-expr4.C new file mode 100644 index 000000000..b36c8729b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-expr4.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// Origin: jbrandmeyer at users dot sourceforge dot net +// PR c++/12573: COMPONENT_REFs must be inspected for dependness. +// Or, more specifically OFFSETOF. + +template <bool> struct S; + +template <typename K> struct Y { + int x; +}; + +template <class T> struct Z { + S< (bool)(__builtin_offsetof (Y<T>*, x) == 0) > + s; +}; diff --git a/gcc/testsuite/g++.dg/template/dependent-expr5.C b/gcc/testsuite/g++.dg/template/dependent-expr5.C new file mode 100644 index 000000000..1e850cd54 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-expr5.C @@ -0,0 +1,130 @@ +// { dg-do compile } + +// Copyright 2005 Free Software Foundation +// contributed by Alexandre Oliva <aoliva@redhat.com> +// inspired in the failure reported in Red Hat bugzilla #168260. + +template<class F> void bind(F f) {} // { dg-message "note" } + +template<class F> void bindm(F f) {} // { dg-message "note" } +template<class F, class T> void bindm(F (T::*f)(void)) {} // { dg-message "note" } + +template<class F> void bindn(F f) {} +template<class F, class T> void bindn(F (*f)(T)) {} + +template<class F> void bindb(F f) {} +template<class F, class T> void bindb(F (*f)(T)) {} // { dg-message "note" } +template<class F, class T> void bindb(F (T::*f)(void)) {} // { dg-message "note" } + +struct foo { + static int baist; + int bait; // { dg-error "non-static data member" } + void barf (); + static void barf (int); + + struct bar { + static int baikst; + int baikt; + void bark (); + static void bark (int); + + bar() { + bind (&baist); + bind (&foo::baist); + bind (&bait); // { dg-error "from this location" } + bind (&foo::bait); + + bind (&baikst); + bind (&bar::baikst); + bind (&baikt); // ok, this->baikt + bind (&bar::baikt); + + bind (&barf); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 42 } + bind (&foo::barf); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 44 } + + bindm (&barf); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 47 } + bindm (&foo::barf); + + bindn (&barf); + bindn (&foo::barf); + + bindb (&barf); + bindb (&foo::barf); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 55 } + + bind (&bark); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 58 } + bind (&bar::bark); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 60 } + + bindm (&bark); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 63 } + bindm (&bar::bark); + + bindn (&bark); + bindn (&bar::bark); + + bindb (&bark); + bindb (&bar::bark); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 71 } + } + }; + + template <typename T> + struct barT { + static int baikst; + int baikt; + void bark (); + static void bark (int); + + barT() { + bind (&baist); + bind (&foo::baist); + bind (&bait); // { dg-error "from this location" } + bind (&foo::bait); + + bind (&baikst); + bind (&barT::baikst); + bind (&baikt); // ok, this->baikt + bind (&barT::baikt); + + bind (&barf); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 94 } + bind (&foo::barf); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 96 } + + bindm (&barf); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 99 } + bindm (&foo::barf); + + bindn (&barf); + bindn (&foo::barf); + + bindb (&barf); + bindb (&foo::barf); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 107 } + + bind (&bark); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 110 } + bind (&barT::bark); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 112 } + + bindm (&bark); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 115 } + bindm (&barT::bark); + + bindn (&bark); + bindn (&barT::bark); + + bindb (&bark); + bindb (&barT::bark); // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 123 } + } + }; + + bar bard; + barT<void> bart; +} bad; diff --git a/gcc/testsuite/g++.dg/template/dependent-expr6.C b/gcc/testsuite/g++.dg/template/dependent-expr6.C new file mode 100644 index 000000000..423f1aeec --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-expr6.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +// Copyright 2007 Free Software Foundation +// Contributed by Andreas Krebbel <Andreas.Krebbel@de.ibm.com> + +// PR C++ 34081 ICE + +class Foo; + +template < class Foo > class Bar +{ + enum Status + { OK, NO }; + + enum Status getStatus () + { + return status; + } + + Status status; +}; diff --git a/gcc/testsuite/g++.dg/template/dependent-expr7.C b/gcc/testsuite/g++.dg/template/dependent-expr7.C new file mode 100644 index 000000000..b24682035 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-expr7.C @@ -0,0 +1,22 @@ +// Origin PR c++/48574 +// { dg-do compile } + +struct A +{ + virtual void foo(); +}; + +template <typename T> +void +bar(T x) +{ + A &b = *x; + b.foo (); +} + +void +foo() +{ + A a; + bar(&a); +} diff --git a/gcc/testsuite/g++.dg/template/dependent-expr8.C b/gcc/testsuite/g++.dg/template/dependent-expr8.C new file mode 100644 index 000000000..20014d6e7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-expr8.C @@ -0,0 +1,25 @@ +// Origin PR c++/48574 +// { dg-options "-std=c++0x" } +// { dg-do compile } + +struct A +{ + virtual int foo(); +}; + +void baz (int); + +template <typename T> +void +bar(T x) +{ + A &b = *x; + baz (b.foo ()); +} + +void +foo() +{ + A a; + bar(&a); +} diff --git a/gcc/testsuite/g++.dg/template/dependent-name1.C b/gcc/testsuite/g++.dg/template/dependent-name1.C new file mode 100644 index 000000000..60ab34498 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-name1.C @@ -0,0 +1,11 @@ +// { dg-do compile } + +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/10347: Dependent type checking of array new expression + +void bar (int *); + +template <int> void foo() { + bar(new int[1]); +} diff --git a/gcc/testsuite/g++.dg/template/dependent-name2.C b/gcc/testsuite/g++.dg/template/dependent-name2.C new file mode 100644 index 000000000..9e0cbcee1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-name2.C @@ -0,0 +1,18 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 1 Aug 2003 <nathan@codesourcery.com> + +// PR 10530. Thought a type was dependent. + +template <typename T> +struct Foo { + struct Inner { + typedef int type; + }; +}; + +template <typename A> struct Bar { + typedef typename Foo<int>::Inner::type type; +}; + diff --git a/gcc/testsuite/g++.dg/template/dependent-name3.C b/gcc/testsuite/g++.dg/template/dependent-name3.C new file mode 100644 index 000000000..bbe6fb662 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-name3.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +// Dependent arrays of invalid size generate appropriate error messages + +template<int I> struct A +{ + static const int zero = 0; + static const int minus_one = -1; +}; + +template<int N> struct B +{ + int x[A<N>::zero]; // { dg-error "zero" } + int y[A<N>::minus_one]; // { dg-error "negative" } +}; + +B<0> b; diff --git a/gcc/testsuite/g++.dg/template/dependent-name4.C b/gcc/testsuite/g++.dg/template/dependent-name4.C new file mode 100644 index 000000000..b2b5814be --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-name4.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Dependent arrays of invalid size cause template instantiation failure. + +// We'll get an error message (duplicate matching templates) if the first +// pattern is incorrectly allowed to match. + +template<int M> void foobar (int (*) [M] = 0 ); +template<int M> void foobar ( ); + +void fn (void) +{ + foobar<0>(); + foobar<-1>(); +} diff --git a/gcc/testsuite/g++.dg/template/dependent-name5.C b/gcc/testsuite/g++.dg/template/dependent-name5.C new file mode 100644 index 000000000..681060c70 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-name5.C @@ -0,0 +1,45 @@ +// PR c++/9634, c++/29469, c++/29607 +// Contributed by: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// DR224: Make sure that a name is *truly* semantically dependent. + +struct D { + typedef int K; +}; + +template <typename T> +struct A +{ + typedef int Bar; + + template <typename> + struct N {}; + + typedef Bar type1; + typedef A::Bar type2; + typedef A<T>::Bar type3; + typedef A<T*>::Bar type4; // { dg-error "" } + typedef typename A<T*>::Bar type5; + + typedef N<int> type6; + typedef A::N<int> type7; + typedef A<T>::N<int> type8; + typedef A<T*>::template N<int> type9; // { dg-error "" } + typedef typename A<T*>::template N<int> type10; + + typedef D Bar2; + struct N2 { typedef int K; }; + + // Check that A::N2 is still considered dependent (because it + // could be specialized), while A::Bar2 (being just ::D) is not. + typedef A::Bar2 type11; + typedef type11::K k3; + + typedef A::N2 type12; + typedef typename type12::K k2; + typedef type12::K k1; // { dg-error "" } + + // Check that A::Bar2 is not considered dependent even if we use + // the typename keyword. + typedef typename A::Bar2 type13; + typedef type13::K k4; +}; diff --git a/gcc/testsuite/g++.dg/template/dependent-name6.C b/gcc/testsuite/g++.dg/template/dependent-name6.C new file mode 100644 index 000000000..e08bbe1aa --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-name6.C @@ -0,0 +1,17 @@ +// PR c++/26261 +// { dg-final { scan-assembler "_ZN1YIiE1fIiEE1XILi1EEv" } } + +template <int dim> class X {}; + +template <class T> struct Y { + static const unsigned int dim = 1; + template <class U> X<Y<T>::dim> f(); +}; + +template <class T> template <class U> +X<Y<T>::dim> Y<T>::f() { return X<dim>(); } + +int main() +{ + Y<int>().f<int>(); +} diff --git a/gcc/testsuite/g++.dg/template/dr408.C b/gcc/testsuite/g++.dg/template/dr408.C new file mode 100644 index 000000000..d118ce45c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dr408.C @@ -0,0 +1,45 @@ +// DR 408 +// { dg-do link } + +// Test that a size given in the out-of-class definition isn't used until +// instantiation time. +template<typename T> +struct X +{ + static char s[]; + int c; +}; + +template<typename T> +char X<T>::s[sizeof(X<T>)]; + +#define sassert(EXP) int ar[(EXP)?1:-1] +sassert(sizeof (X<char>::s) == sizeof (int)); + +// Test that a specialization can have a different size. + +template <int> void g(); +template <> void g<2>() { } + +template <typename T> +struct S { + static int i[]; + void f(); +}; + +template <typename T> +int S<T>::i[] = { 1 }; + +template <typename T> +void S<T>::f() { + g<sizeof (i) / sizeof (int)>(); +} + +template <> +int S<int>::i[] = { 1, 2 }; + +int main() +{ + S<int> s; + s.f(); +} diff --git a/gcc/testsuite/g++.dg/template/dtor1.C b/gcc/testsuite/g++.dg/template/dtor1.C new file mode 100644 index 000000000..f5d9d6aad --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dtor1.C @@ -0,0 +1,8 @@ +struct A {}; + +template <typename T> struct B +{ + B() { A().A::~A(); } +}; + +B<void> b; diff --git a/gcc/testsuite/g++.dg/template/dtor2.C b/gcc/testsuite/g++.dg/template/dtor2.C new file mode 100644 index 000000000..04bea9cb6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dtor2.C @@ -0,0 +1,10 @@ +struct Foo +{ + template <int i> + ~Foo() {} // { dg-error "" } +}; + +int main() +{ + Foo f; +} diff --git a/gcc/testsuite/g++.dg/template/dtor3.C b/gcc/testsuite/g++.dg/template/dtor3.C new file mode 100644 index 000000000..98c2ef6c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dtor3.C @@ -0,0 +1,4 @@ +// PR c++/19762 + +template<int> struct A { ~A(){} }; // { dg-error "" } +template A<>::~A(); // { dg-error "template|declaration" } diff --git a/gcc/testsuite/g++.dg/template/dtor4.C b/gcc/testsuite/g++.dg/template/dtor4.C new file mode 100644 index 000000000..4f277b248 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dtor4.C @@ -0,0 +1,9 @@ +// PR c++/19440 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> + +// { dg-do compile } + +template<int> struct A +{ + ~A<0>(); // { dg-error "parse error|declaration" } +}; diff --git a/gcc/testsuite/g++.dg/template/dtor5.C b/gcc/testsuite/g++.dg/template/dtor5.C new file mode 100644 index 000000000..8fa4eeb6f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dtor5.C @@ -0,0 +1,21 @@ +// PR c++/23287 + +template <class T> struct A +{ + int i; + ~A(); +}; + +template <class T> void f(A<T> *ap) { + ap->~A(); +} + +template <class T> void g(A<T> *ap) { + ap->~B(); // { dg-error "destructor name" } +} + +int main() +{ + f(new A<int>); + g(new A<int>); +} diff --git a/gcc/testsuite/g++.dg/template/dtor6.C b/gcc/testsuite/g++.dg/template/dtor6.C new file mode 100644 index 000000000..c44b78029 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dtor6.C @@ -0,0 +1,16 @@ +// PR c++/40139 + +template<int> struct A +{ + static int i; +}; + +template<int N> int A<N>::i = { A::~A }; // { dg-error "non-static member function" } + +template class A<0>; + +struct X { }; + +int i1 = X::~X; // { dg-error "non-static member function" } +int i2 = &X::~X; // { dg-error "address of destructor" } +int i3 = &A<0>::~A; // { dg-error "address of destructor" } diff --git a/gcc/testsuite/g++.dg/template/dtor7.C b/gcc/testsuite/g++.dg/template/dtor7.C new file mode 100644 index 000000000..186b561e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dtor7.C @@ -0,0 +1,22 @@ +// PR c++/40373 +// { dg-do compile } + +struct A; +namespace +{ + struct A; +} + +struct B {}; + +template <typename T> void +foo (T t) +{ + t.~A (); // { dg-error "does not match destructor name" } +} + +void +bar () +{ + foo (B ()); // { dg-bogus "instantiated from here" "" { xfail *-*-* } } +} diff --git a/gcc/testsuite/g++.dg/template/dtor8.C b/gcc/testsuite/g++.dg/template/dtor8.C new file mode 100644 index 000000000..a96b7982f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dtor8.C @@ -0,0 +1,23 @@ +// PR c++/43648 + +namespace dealii +{ + namespace FEValuesViews + { + template <int dim, int spacedim> struct Scalar {}; + } + + template <int dim, int spacedim> + struct X + { + FEValuesViews::Scalar<dim,spacedim> scalars[dim*spacedim]; + + void f() + { + typedef dealii::FEValuesViews::Scalar<dim,spacedim> ScalarView; + scalars[0].ScalarView::~ScalarView (); + } + }; + + template struct X<2,2>; +} diff --git a/gcc/testsuite/g++.dg/template/duplicate1.C b/gcc/testsuite/g++.dg/template/duplicate1.C new file mode 100644 index 000000000..c9cdab4b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/duplicate1.C @@ -0,0 +1,7 @@ +//PR c++/19439 + +template<int> struct A +{ + ~A() {} // { dg-error "with" } + ~A() {} // { dg-error "cannot be overloaded" } +}; diff --git a/gcc/testsuite/g++.dg/template/eh1.C b/gcc/testsuite/g++.dg/template/eh1.C new file mode 100644 index 000000000..134a0e7a6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/eh1.C @@ -0,0 +1,6 @@ +template <class T> +void foo() +{ + try {} + catch(T e) {} +} diff --git a/gcc/testsuite/g++.dg/template/eh2.C b/gcc/testsuite/g++.dg/template/eh2.C new file mode 100644 index 000000000..d2c049c8a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/eh2.C @@ -0,0 +1,10 @@ +// PR c++/23191 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } + +template<typename T> struct A +{ + void foo() throw(typename T::X); // { dg-error "not a class" } +}; + +A<void> a; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/elab1.C b/gcc/testsuite/g++.dg/template/elab1.C new file mode 100644 index 000000000..778150f06 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/elab1.C @@ -0,0 +1,13 @@ +// Copyright (C) 2003 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +// Elaborate type specifier of class template + +template <class T> class A { + class B; +}; + +template <class T> class A<T>::B { + friend class A; +}; diff --git a/gcc/testsuite/g++.dg/template/enum1.C b/gcc/testsuite/g++.dg/template/enum1.C new file mode 100644 index 000000000..eaeb12c9c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/enum1.C @@ -0,0 +1,5 @@ +// PR c++/15554 + +template <int n> struct T1 { enum { N = 3 }; }; +template <int n> struct T2 { enum { N = 3, N1 = T1<N>::N }; }; + diff --git a/gcc/testsuite/g++.dg/template/enum2.C b/gcc/testsuite/g++.dg/template/enum2.C new file mode 100644 index 000000000..7a6c2072a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/enum2.C @@ -0,0 +1,4 @@ +// PR c++/15877 + +template <int n> struct T1 { enum { N = 3 }; }; +template <int n> struct T2 { enum { N = n, N1 = T1<N>::N }; }; diff --git a/gcc/testsuite/g++.dg/template/enum3.C b/gcc/testsuite/g++.dg/template/enum3.C new file mode 100644 index 000000000..b248d788c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/enum3.C @@ -0,0 +1,8 @@ +// PR c++/17327 + +enum E { E0, E1 }; +template <class T,class U> class A {}; +template <class T> void f(A<E,T>) {} +// We used to issue a "sorry" message. By using an explicit error +// message below, we make sure that we will not match "sorry". +template void f(A<int,E>); // { dg-error "template-id" } diff --git a/gcc/testsuite/g++.dg/template/enum4.C b/gcc/testsuite/g++.dg/template/enum4.C new file mode 100644 index 000000000..97e0b848d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/enum4.C @@ -0,0 +1,9 @@ +// PR c++/18020 + +template <typename> struct bar { + enum { + e1 = 1, + e2 = ~e1 + }; +}; +template struct bar<int>; diff --git a/gcc/testsuite/g++.dg/template/enum5.C b/gcc/testsuite/g++.dg/template/enum5.C new file mode 100644 index 000000000..b7a49f45d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/enum5.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Origin: robertk@mathematik.uni-freiburg.de +// Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/14479: Template header check for enum + +template <int dim> +struct X { + enum { dimension = dim }; + template<int d> void bar (); +}; + +template <> +template <> +void X<0>::bar<0> () {} diff --git a/gcc/testsuite/g++.dg/template/enum6.C b/gcc/testsuite/g++.dg/template/enum6.C new file mode 100644 index 000000000..9df6d4106 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/enum6.C @@ -0,0 +1,10 @@ +// PR c++/34774 + +template<int shifts> +struct shift { + enum { + n0 = (unsigned)shifts, + n = n0 ? 0 : n0, + n_comp = -n + } x; +}; diff --git a/gcc/testsuite/g++.dg/template/error-recovery1.C b/gcc/testsuite/g++.dg/template/error-recovery1.C new file mode 100644 index 000000000..ef9dc141b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error-recovery1.C @@ -0,0 +1,9 @@ +// PR c++/43076 + +struct S; +template < typename > struct T +{ + template < typename > + template < bool > struct T < S > // { dg-error "" } + { + void f () { // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/template/error-recovery2.C b/gcc/testsuite/g++.dg/template/error-recovery2.C new file mode 100644 index 000000000..d5ce12311 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error-recovery2.C @@ -0,0 +1,7 @@ +// PR c++/43621 + +template <typename T> +class A { + template <typename> + A<T> A<T>::f(); // { dg-error "extra qualification" } +}; diff --git a/gcc/testsuite/g++.dg/template/error1.C b/gcc/testsuite/g++.dg/template/error1.C new file mode 100644 index 000000000..03a832392 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error1.C @@ -0,0 +1,13 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Jun 2003 <nathan@codesourcery.com> + +// PR c++ 10219. ICE + +template <class T> void make_pair(T x); + +void foo(){ + struct fps_chan_ID fps; // { dg-error "incomplete" "" } + make_pair(fps); // { dg-bogus "no matching function" "" } +} diff --git a/gcc/testsuite/g++.dg/template/error10.C b/gcc/testsuite/g++.dg/template/error10.C new file mode 100644 index 000000000..02ea64b79 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error10.C @@ -0,0 +1,71 @@ +// { dg-do compile } +// { dg-options "-std=gnu++98" } +// Origin: <tilps at hotmail dot com> +// c++/9154: poor error message for ">>" vs "> >" in template argument list + + +/* + * Test that the error message is issued properly + */ +template <class T> +class A {}; + +A<A<int>> blah; // { dg-error "should be '> >' within" } +A<int>> blah2; // { dg-error "spurious '>>'" } + + +/* + * Test that a few valid constructs containing a ">>" token in a + * template argument list are handled correctly. + */ +template <int N> +void B(void) {} + +int Btest() +{ + B<256 >> 4>(); +} + +template <int N = 123>>4> +struct C {}; + +template <int> struct D {}; +template <typename> struct E {}; + +E<D< 1>>2 > > E1; + +const int x = 0; +E<D< 1>>x > > E2; + +template <int> struct F { + typedef int I; +}; + +template <typename T = F< 1>>2 >::I> +struct G {}; + +/* + * In this special case, a valid type-id (H() is a function type) is followed + * by '>>', but the argument should still be parsed as an expression, which + * will then be rejected as non-constant expression. + */ +struct H +{ + int operator >>(int); +}; + +template <int V> struct L {}; +L<H() >> 5> l; // { dg-error "" "non-constant" } + + +/* + * This case used to not emit the nice error message because of a typo + * in the code. + */ +template <void (*)(void)> +struct K {}; + +void KFunc(void); + +A<K<&KFunc>> k1; // { dg-error "" } +K<&KFunc>> k2; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/template/error11.C b/gcc/testsuite/g++.dg/template/error11.C new file mode 100644 index 000000000..3a469fd1a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error11.C @@ -0,0 +1,4 @@ +// PR c++/12132 + +inline template <int> void foo () {} // { dg-error "<" } +void abort (); // { dg-error ";" } diff --git a/gcc/testsuite/g++.dg/template/error12.C b/gcc/testsuite/g++.dg/template/error12.C new file mode 100644 index 000000000..c15961fc3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error12.C @@ -0,0 +1,4 @@ +// PR c++/15044 + +template class <num_t> class a { num_t n; } // { dg-error "" } + diff --git a/gcc/testsuite/g++.dg/template/error13.C b/gcc/testsuite/g++.dg/template/error13.C new file mode 100644 index 000000000..13d8794d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error13.C @@ -0,0 +1,5 @@ +// PR c++/15227 + +template<typename> struct A {}; + +template<typename T> void A<T>::B::foo() {} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/template/error14.C b/gcc/testsuite/g++.dg/template/error14.C new file mode 100644 index 000000000..c5043cfb4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error14.C @@ -0,0 +1,8 @@ +// PR c++/16904 + +template<typename T> struct X +{ + X() { this->T::i; } // { dg-error "" } +}; + +X<int> x; diff --git a/gcc/testsuite/g++.dg/template/error15.C b/gcc/testsuite/g++.dg/template/error15.C new file mode 100644 index 000000000..b7c7bc8ca --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error15.C @@ -0,0 +1,24 @@ +// PR c++/16929 + +template <class T> +class A { + int x; +}; + +template <class T> +class B { +protected: + + A<T> a; // { dg-error "" } + + void f(const A<T> * a1 = &a); // { dg-error "this location" } + + void g(void); +}; + +template <class T> +void B<T>::g(void) { + f(); // { dg-error "default argument" } +} + +template class B<long>; diff --git a/gcc/testsuite/g++.dg/template/error16.C b/gcc/testsuite/g++.dg/template/error16.C new file mode 100644 index 000000000..0da024bc6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error16.C @@ -0,0 +1,16 @@ +// PR c++/18674 + +template <typename I> +static void g() { + enum I::t a; // { dg-error "" } + (void) a; +} + +struct B { + typedef int t; +}; + +void h() +{ + g<B>(); +} diff --git a/gcc/testsuite/g++.dg/template/error17.C b/gcc/testsuite/g++.dg/template/error17.C new file mode 100644 index 000000000..f34234da7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error17.C @@ -0,0 +1,10 @@ +// PR c++/20153 + +template <typename T> +void +foo() +{ + union { struct { }; }; // { dg-error "prohibits anonymous struct" "anon" } + // { dg-error "not inside" "not inside" { target *-*-* } 7 } + // { dg-warning "no members" "no members" { target *-*-* } 7 } +} diff --git a/gcc/testsuite/g++.dg/template/error18.C b/gcc/testsuite/g++.dg/template/error18.C new file mode 100644 index 000000000..7b7151a3b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error18.C @@ -0,0 +1,11 @@ +// PR c++/20157 + +template<typename AT> +struct A{ + template<typename T> + void function(T); +}; + +template<> +template<typename ABC,typename DEF> +void A<int>::function(ABC); // { dg-error "match" } diff --git a/gcc/testsuite/g++.dg/template/error19.C b/gcc/testsuite/g++.dg/template/error19.C new file mode 100644 index 000000000..d533e9a3b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error19.C @@ -0,0 +1,22 @@ +// PR c++/23293 + +template < typename > struct P; +struct S; + +void *unrelated_function() +{ + typedef S K; + P < K > * p; + return p; +} + +template < typename U > +void generate_warning() +{ + U::x(); // { dg-error "P<S>" } +} + +int main() +{ + generate_warning< P < S > >(); +} diff --git a/gcc/testsuite/g++.dg/template/error2.C b/gcc/testsuite/g++.dg/template/error2.C new file mode 100644 index 000000000..5bd9b870e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error2.C @@ -0,0 +1,30 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 14 Aug 2003 <nathan@codesourcery.com> + +// instantiated from did not indicate the nested class + +template<class T> struct X +{ + T m; // { dg-error "as type 'void'" "void" } + // { dg-error "incomplete type" "incomplate" { target *-*-* } 10 } + // { dg-error "invalid" "invalid" { target *-*-* } 10 } +}; + +template<class T > +struct Derived +{ + class Nested : public X<T> // { dg-message "instantiated" "" } + { + }; + + Nested m; // { dg-message "instantiated" "" } + + void Foo (); +}; + +void Foo (Derived<void> &x) +{ + x.Foo (); // { dg-message "instantiated" "" } +} diff --git a/gcc/testsuite/g++.dg/template/error20.C b/gcc/testsuite/g++.dg/template/error20.C new file mode 100644 index 000000000..f81378fdb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error20.C @@ -0,0 +1,4 @@ +// PR c++/25439 + +template<int> struct A; +template<> int A<0>; // { dg-error "invalid" } diff --git a/gcc/testsuite/g++.dg/template/error21.C b/gcc/testsuite/g++.dg/template/error21.C new file mode 100644 index 000000000..c5f04f03e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error21.C @@ -0,0 +1,15 @@ +// PR c++/20173 + +template<typename AT> +struct A{ + template<typename T> + void function(T){} +}; + +template<> +template<typename T> +void A<int>::function(T){} + +template<> +template<typename T> +void A<double>::function(T*){} // { dg-error "match" } diff --git a/gcc/testsuite/g++.dg/template/error22.C b/gcc/testsuite/g++.dg/template/error22.C new file mode 100644 index 000000000..d793fe4df --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error22.C @@ -0,0 +1,9 @@ +//PR c++/27821 + +struct A +{ + template<void (A::*)()> struct B {}; + void ::foo(); // { dg-error "invalid use" } + B<&A::foo> b; // { dg-error "incomplete type|template argument" } +}; + diff --git a/gcc/testsuite/g++.dg/template/error23.C b/gcc/testsuite/g++.dg/template/error23.C new file mode 100644 index 000000000..f21d8d9d0 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error23.C @@ -0,0 +1,17 @@ +// PR c++/29632 + +struct nullptr_type { + + nullptr_type ( void ) {} + + template < typename T > + operator T* ( void ) const { + return ( 0 ); + } +} const nullptr_ob; + +int main ( void ) { + 0 == nullptr_ob; // { dg-error "match" } +} + + diff --git a/gcc/testsuite/g++.dg/template/error24.C b/gcc/testsuite/g++.dg/template/error24.C new file mode 100644 index 000000000..9ce5cbbc2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error24.C @@ -0,0 +1,8 @@ +// PR c++/30863 + +template <typename T> +struct s {}; + +void f() { + unsigned s<int> x; // { dg-error "invalid" } +} diff --git a/gcc/testsuite/g++.dg/template/error25.C b/gcc/testsuite/g++.dg/template/error25.C new file mode 100644 index 000000000..89011576e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error25.C @@ -0,0 +1,16 @@ +// PR c++/31923 + +template<class T> +static void f1 (); + +template<> +static void f1<void> (); // { dg-error "explicit template specialization cannot have a storage class" } + +template<class T> +extern void f2 (); + +template<> +extern void f2<void> (); // { dg-error "explicit template specialization cannot have a storage class" } + +export template<class T> // { dg-warning "keyword 'export' not implemented" } +static void* f3 (); diff --git a/gcc/testsuite/g++.dg/template/error26.C b/gcc/testsuite/g++.dg/template/error26.C new file mode 100644 index 000000000..cd8d46d1e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error26.C @@ -0,0 +1,5 @@ +// PR c++/32112 + +template<typename> struct A; + +template<typename T> void foo (A<&T::template i>); // { dg-error "T:: ?template i|mismatch|& T::i" } diff --git a/gcc/testsuite/g++.dg/template/error27.C b/gcc/testsuite/g++.dg/template/error27.C new file mode 100644 index 000000000..8d41d0248 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error27.C @@ -0,0 +1,5 @@ +// PR c++/27211 + +struct A {}; + +template<int> void A::foo() {} // { dg-error "member function" } diff --git a/gcc/testsuite/g++.dg/template/error28.C b/gcc/testsuite/g++.dg/template/error28.C new file mode 100644 index 000000000..e87d542d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error28.C @@ -0,0 +1,5 @@ +// PR c++/27211 + +struct A {}; + +template<int> void A::foo(); // { dg-error "member function" } diff --git a/gcc/testsuite/g++.dg/template/error29.C b/gcc/testsuite/g++.dg/template/error29.C new file mode 100644 index 000000000..2e2291d7e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error29.C @@ -0,0 +1,5 @@ +// PR c++/33209 + +template<typename T> void foo(int, T::x); // { dg-error "T::x" } + +template<template<typename> class T> void foo2(int, T<int>::x); // { dg-error "T<int>::x" } diff --git a/gcc/testsuite/g++.dg/template/error3.C b/gcc/testsuite/g++.dg/template/error3.C new file mode 100644 index 000000000..d3ee59908 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error3.C @@ -0,0 +1,5 @@ +// PR 12762 + +template <typename> struct A { A() {}}; +typedef A<int> Ac; +Ac<double> a; // { dg-error "template" } diff --git a/gcc/testsuite/g++.dg/template/error30.C b/gcc/testsuite/g++.dg/template/error30.C new file mode 100644 index 000000000..e1138d052 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error30.C @@ -0,0 +1,5 @@ +// PR c++/33210 + +template<int> struct A; + +template<template<typename> class B> A<B<int>::x> operator() (); // { dg-error "A<B<int>::x>" } diff --git a/gcc/testsuite/g++.dg/template/error31.C b/gcc/testsuite/g++.dg/template/error31.C new file mode 100644 index 000000000..4fd702623 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error31.C @@ -0,0 +1,3 @@ +// PR c++/33493 + +template<int> void foo() { delete 0 ? 1 : 0; } // { dg-error "delete 0" } diff --git a/gcc/testsuite/g++.dg/template/error32.C b/gcc/testsuite/g++.dg/template/error32.C new file mode 100644 index 000000000..be3c3a084 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error32.C @@ -0,0 +1,8 @@ +// PR c++/33843 + +struct A {}; + +void foo(A* p()) +{ + p->A::~A(); // { dg-error "A::~A" } +} diff --git a/gcc/testsuite/g++.dg/template/error33.C b/gcc/testsuite/g++.dg/template/error33.C new file mode 100644 index 000000000..b6a2a8ae8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error33.C @@ -0,0 +1,12 @@ +// PR c++/24791 + +template<int> struct A +{ + static int i; + A() { ++i; } +}; + +template<int> int A<0>::i(0); // { dg-error "template" "error" } +// { dg-message "note" "note" { target *-*-* } 9 } + +A<0> a; diff --git a/gcc/testsuite/g++.dg/template/error34.C b/gcc/testsuite/g++.dg/template/error34.C new file mode 100644 index 000000000..d0cbcaef2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error34.C @@ -0,0 +1,29 @@ +// PR c++/33842 +// { dg-do compile } + +template<typename T> struct A +{ + A<__builtin_offsetof(T, x)>(); // { dg-error "type/value mismatch|offsetof\\(T, x\\)" } +}; + +template<typename T> struct B +{ + B<__builtin_offsetof(T, x.y)>(); // { dg-error "type/value mismatch|offsetof\\(T, x.y\\)" } +}; + +template<typename T> struct C +{ + C<__builtin_offsetof(T, x[6])>(); // { dg-error "type/value mismatch|offsetof\\(T, x\\\[6\\\]\\)" } +}; + +template<typename T> struct D +{ + D<__builtin_offsetof(T, x.y[6].z)>(); // { dg-error "type/value mismatch|offsetof\\(T, x.y\\\[6\\\].z\\)" } +}; + +struct E { int x; }; + +template<typename T> struct F +{ + F<__builtin_offsetof(E, x)>(); // { dg-error "type/value mismatch|offsetof\\(E, x\\)" } +}; diff --git a/gcc/testsuite/g++.dg/template/error35.C b/gcc/testsuite/g++.dg/template/error35.C new file mode 100644 index 000000000..d52e59931 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error35.C @@ -0,0 +1,3 @@ +// PR c++/33494 + +template<int> void foo(int(*f=0)()); // { dg-error "declared void|scope|erroneous-expression" } diff --git a/gcc/testsuite/g++.dg/template/error36.C b/gcc/testsuite/g++.dg/template/error36.C new file mode 100644 index 000000000..b16b976e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error36.C @@ -0,0 +1,9 @@ +// PR c++/37719.C + +template <typename T> +class foo { + void bar() throw(int); // { dg-error "throw \\(int\\)" } +}; + +template <> +void foo<int>::bar() throw(float) {} // { dg-error "throw \\(float\\)" } diff --git a/gcc/testsuite/g++.dg/template/error37.C b/gcc/testsuite/g++.dg/template/error37.C new file mode 100644 index 000000000..7f1f9ed78 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error37.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// PR C++/29388 +// We used to ICE in is_ancestor because we would use int as the context of foo +// but that is invalid. + +template<int> struct A +{ + typedef int T; + void foo(); +}; + +template<int N> void A<N>::T::foo() {} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/template/error38.C b/gcc/testsuite/g++.dg/template/error38.C new file mode 100644 index 000000000..14a213299 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error38.C @@ -0,0 +1,43 @@ +// Testcase for printing typename/typedef bindings as well as template args +// in diagnostics (PR c++/25185) + +template <class T> +struct A { + typename T::type f(); // { dg-message "typename T::type = void*" } + void f(int i = 0); // { dg-message "" } + + typedef typename T::type mytype; + mytype g(); // { dg-message "mytype = void*" } + void g(int i = 0); // { dg-message "" } +}; + +struct B +{ + typedef void* type; +}; + +// Also make sure that deduced template arguments get canonicalized. + +template <class T> +void f (T &t); // { dg-message "T = int" } + +template <class T> +void f (T &t, int = 0); // { dg-message "" } + +typedef int myint; +myint i; +myint *p; + +int main() +{ + A<B> a; + a.f(); // { dg-error "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 34 } + a.g(); // { dg-error "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 36 } + + f(i); // { dg-error "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 39 } + f(p); // { dg-error "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 41 } +} diff --git a/gcc/testsuite/g++.dg/template/error39.C b/gcc/testsuite/g++.dg/template/error39.C new file mode 100644 index 000000000..49faa3654 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error39.C @@ -0,0 +1,11 @@ +// PR c++/14912 + +template <class T, int N=0, int X=1> +struct A +{ +}; + +void foo(void) +{ + A<void> a = 0; // { dg-error "A<void>" } +} diff --git a/gcc/testsuite/g++.dg/template/error4.C b/gcc/testsuite/g++.dg/template/error4.C new file mode 100644 index 000000000..12942fcb7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error4.C @@ -0,0 +1,9 @@ +template<class T> struct C1 +{ + template<class U> struct C2 + { class Type { }; }; +}; + +template<class T, class U> +void foo(typename C1<T>::C2<U>::Type *) { } // { dg-error "template" "error " } +// { dg-message "note" "note" { target *-*-* } 8 } diff --git a/gcc/testsuite/g++.dg/template/error40.C b/gcc/testsuite/g++.dg/template/error40.C new file mode 100644 index 000000000..7746ed2ce --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error40.C @@ -0,0 +1,32 @@ +// { dg-options "-fno-pretty-templates" } + +template <class T, int N=0, int X=1> +struct A +{ + struct AN; +}; + +void foo(void) +{ + A<void> a = 0; // { dg-error "A<void, 0, 1>" } +} + +template <class T> T f(T); // { dg-message "int f<int>.int." } +template <class T> T f(T, int = 0); // { dg-message "" } + +template <class T> +struct B +{ + typedef typename T::AN BN; + + BN f(); // { dg-message "AN" } + BN f(int = 0); // { dg-message "" } +}; + +int main() +{ + f(1); // { dg-error "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 28 } + B<A<int> >().f(); // { dg-error "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 30 } +} diff --git a/gcc/testsuite/g++.dg/template/error41.C b/gcc/testsuite/g++.dg/template/error41.C new file mode 100644 index 000000000..c92b8497a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error41.C @@ -0,0 +1,12 @@ +// PR c++/40370 +// { dg-do compile } + +struct A +{ + static int i; +}; + +template <int> struct B +{ + int x[A::i]; // { dg-error "array bound is not an integer constant" } +}; diff --git a/gcc/testsuite/g++.dg/template/error42.C b/gcc/testsuite/g++.dg/template/error42.C new file mode 100644 index 000000000..0d651e316 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error42.C @@ -0,0 +1,20 @@ +// PR c++/40372 +// { dg-do compile } + +template <int> struct A +{ + int i; // { dg-error "invalid use of non-static data member" } + friend void foo () + { + int x[i]; // { dg-error "from this location" } + } +}; + +struct B +{ + int j; // { dg-error "invalid use of non-static data member" } + friend int bar () + { + return j; // { dg-error "from this location" } + } +}; diff --git a/gcc/testsuite/g++.dg/template/error43.C b/gcc/testsuite/g++.dg/template/error43.C new file mode 100644 index 000000000..876e0181a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error43.C @@ -0,0 +1,9 @@ +// PR c++/29363 + +template<int> void foo() +{ + throw A(); // { dg-message "declar" } + struct A {} a; +} + +template void foo<0>(); // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/error44.C b/gcc/testsuite/g++.dg/template/error44.C new file mode 100644 index 000000000..4f732cdd7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error44.C @@ -0,0 +1,7 @@ +// PR c++/32056 + +template <auto int T> struct A {}; // { dg-error "storage class specified" } +template <extern int T> struct B {}; // { dg-error "storage class specified" } +template <static int T> struct C {}; // { dg-error "storage class specified" } +template <register int T> struct D {}; // { dg-error "storage class specified" } +template <mutable int T> struct E {}; // { dg-error "storage class specified" } diff --git a/gcc/testsuite/g++.dg/template/error45.C b/gcc/testsuite/g++.dg/template/error45.C new file mode 100644 index 000000000..454acc631 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error45.C @@ -0,0 +1,22 @@ +// PR c++/47125 + +template < bool, typename > +struct enable_if {}; + +template < typename T > +struct enable_if< true, T > +{ + typedef T type; +}; + +template < typename T > +struct enable_if< true, T >::type +f( T x ); + +void +g( void ) +{ + f< int >( 0 ); // { dg-error "no match" } +} + +// { dg-prune-output "note" } diff --git a/gcc/testsuite/g++.dg/template/error5.C b/gcc/testsuite/g++.dg/template/error5.C new file mode 100644 index 000000000..0c793509d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error5.C @@ -0,0 +1,6 @@ +template <typename T> +struct X<T*> { // { dg-error "not a template" } + typedef int Y; +}; + +extern struct Z<int> s; // { dg-error "not a template" } diff --git a/gcc/testsuite/g++.dg/template/error6.C b/gcc/testsuite/g++.dg/template/error6.C new file mode 100644 index 000000000..7560dcfb5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error6.C @@ -0,0 +1,13 @@ +template<int n> +struct tento { + enum {value = 10*tento<n-1>::value}; +}; + +struct tento<0> { // { dg-error "" } + enum {value=1}; +}; + +int main() { + if (tento<4>::value != 10000) return -1; +} + diff --git a/gcc/testsuite/g++.dg/template/error7.C b/gcc/testsuite/g++.dg/template/error7.C new file mode 100644 index 000000000..3c1a0e1f2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error7.C @@ -0,0 +1,6 @@ +// PR c++/13314 +// { dg-options "-O2" } + +struct A { template <int> struct B; }; +struct A::B {}; // { dg-error "" } +A::B<0> b; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/template/error8.C b/gcc/testsuite/g++.dg/template/error8.C new file mode 100644 index 000000000..30872a2e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error8.C @@ -0,0 +1,7 @@ +// PR c++/11116 + +template <typename T> struct S {}; + +void f() { + throw S (); // { dg-error "template" } +} diff --git a/gcc/testsuite/g++.dg/template/error9.C b/gcc/testsuite/g++.dg/template/error9.C new file mode 100644 index 000000000..60f550a7c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error9.C @@ -0,0 +1,7 @@ +// PR c++/10926 + +struct Foo +{ + template <int i> + ~Foo(); // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/template/explicit-args1.C b/gcc/testsuite/g++.dg/template/explicit-args1.C new file mode 100644 index 000000000..10d59e157 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/explicit-args1.C @@ -0,0 +1,21 @@ +// PR c++/34950 + +template <class T = int> struct policy { + typedef int unnecessary; +}; + +template <class Policy> struct A { + typedef int type; + typedef typename Policy::unnecessary unused; +}; + +template <class T> struct S { + typedef int type; + typedef typename A<T>::type unused; +}; + +template <class, class T> typename S<T>::type foo(); +template <class> S<policy<> >::type foo(); + +template <typename T> int def(T); +const int i = def(foo<int>); diff --git a/gcc/testsuite/g++.dg/template/explicit-args2.C b/gcc/testsuite/g++.dg/template/explicit-args2.C new file mode 100644 index 000000000..d37b73420 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/explicit-args2.C @@ -0,0 +1,44 @@ +// PR c++/37177 +// { dg-options -std=c++0x } + +#include <typeinfo> + +namespace N1 +{ + template<class T> bool foo(); +} + +struct S +{ + template <class T> + static bool foo(); + + template <class T> + bool bar(); +}; + +template<class T> bool foo(); + +int main() +{ + (void)(&S::bar<int>); + decltype(&S::bar<int>) a; + typeid(&S::bar<int>); + + (void*)(&S::foo<int>); + (void)(&S::foo<int>); + decltype(&S::foo<int>) b; + typeid(&S::foo<int>); + + (void*)(&N1::foo<int>); + (void)(&N1::foo<int>); + decltype(&N1::foo<int>) c; + typeid(&N1::foo<int>); + + (void*)(&foo<int>); + (void)(&foo<int>); + decltype(&foo<int>) d; + typeid(&foo<int>); + + &foo<int> == 0; +} diff --git a/gcc/testsuite/g++.dg/template/explicit-args3.C b/gcc/testsuite/g++.dg/template/explicit-args3.C new file mode 100644 index 000000000..c095e6688 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/explicit-args3.C @@ -0,0 +1,12 @@ +// PR c++/37177 + +template <class T> +struct A { }; + +template <class T> +void operator+(T, T); // { dg-error "class or enum" } + +int main() +{ + operator+<int>; // { dg-error "cannot resolve" } +} diff --git a/gcc/testsuite/g++.dg/template/explicit-instantiation.C b/gcc/testsuite/g++.dg/template/explicit-instantiation.C new file mode 100644 index 000000000..67e44c49f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/explicit-instantiation.C @@ -0,0 +1,16 @@ +// Contributed by Gabriel Dos Reis <gdr@codesourcery.com> +// Origin: Jens.Maurer@gmx.net +// { dg-do compile } + +// Fixed: PR 3381 + +namespace N +{ + template<class T> + class A { }; +} + +template class ::N::A<int>; + + + diff --git a/gcc/testsuite/g++.dg/template/explicit-instantiation2.C b/gcc/testsuite/g++.dg/template/explicit-instantiation2.C new file mode 100644 index 000000000..21109a765 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/explicit-instantiation2.C @@ -0,0 +1,6 @@ +// Bug 10968: implicit instantiation overrides explicit instantiation +// { dg-final { scan-assembler "_Z1fIiET_S0_" } } + +template <class T> T f (T t) { return t; } +inline void g () { f (4); } +template int f (int); diff --git a/gcc/testsuite/g++.dg/template/explicit-instantiation3.C b/gcc/testsuite/g++.dg/template/explicit-instantiation3.C new file mode 100644 index 000000000..fac092e6c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/explicit-instantiation3.C @@ -0,0 +1,31 @@ +// { dg-do compile } +// Origin: <sebor at roguewave dot com> +// c++/8266: Explicit instantiation of a template outside its namespace is +// broken + +namespace N +{ + template <class T> T foo (T) + { return T (); } + + struct A + { + template <int N> + struct B {}; + }; + + template <int M> + struct C {}; + + template double foo(double); + template float foo<float>(float); + template struct A::B<0>; + template struct C<0>; +} + +template int N::foo(int); +template char N::foo<char>(char); +template struct N::A::B<1>; +template struct N::C<1>; + + diff --git a/gcc/testsuite/g++.dg/template/explicit1.C b/gcc/testsuite/g++.dg/template/explicit1.C new file mode 100644 index 000000000..64f581e58 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/explicit1.C @@ -0,0 +1,17 @@ +// { dg-do link } +// { dg-options "-fno-implicit-templates" } + +template <class T> struct C { + ~C(); +}; +template <class T> C<T>::~C() {} + +struct X { + C<X> *p; + ~X() { delete p; } +}; + +template class C<X>; +C<X> x; + +int main () {} diff --git a/gcc/testsuite/g++.dg/template/explicit2.C b/gcc/testsuite/g++.dg/template/explicit2.C new file mode 100644 index 000000000..79941cd8e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/explicit2.C @@ -0,0 +1,10 @@ +struct X { + template <class B> void foo(B); +}; + +template <class D> +void bar() { + X().foo<D>(1); +} + +template void bar<int> (); diff --git a/gcc/testsuite/g++.dg/template/explicit3.C b/gcc/testsuite/g++.dg/template/explicit3.C new file mode 100644 index 000000000..49d0689a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/explicit3.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 27 Jul 2003 <nathan@codesourcery.com> + +// Failed to spot specialization using a template-id expr + +template <int n> class A {}; +template <int m> class R {}; + +template <int n, int x> struct Trait { enum {m = n}; }; + +template <int n, int x> R<Trait<n,x>::m> f(A<x>); +template <> R<Trait<1,1>::m> f<1>(A<1>) {return R<1>();} + +void Baz () +{ + R<Trait<1,1>::m> (*ptr) (A<1>); + + ptr = &f<1>; + +} diff --git a/gcc/testsuite/g++.dg/template/explicit4.C b/gcc/testsuite/g++.dg/template/explicit4.C new file mode 100644 index 000000000..3953f8fc7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/explicit4.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 27 Jul 2003 <nathan@codesourcery.com> + +// Failed to spot specialization using a template-id expr + +template <typename n> class A {}; +template <int m> class R {}; + +template <int n, int x> struct Trait { enum {m = n}; }; + +template <typename n, typename x> R<Trait<1,1>::m> f(A<x>); +template <> R<Trait<1,1>::m> f<int>(A<int>) {return R<1>();} diff --git a/gcc/testsuite/g++.dg/template/explicit5.C b/gcc/testsuite/g++.dg/template/explicit5.C new file mode 100644 index 000000000..a0e313354 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/explicit5.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 27 Jul 2003 <nathan@codesourcery.com> + +// Failed to spot specialization using a template-id expr + +template <typename n> class A {}; +template <int m> class R {}; + +template <typename n, typename x> struct Trait { enum {m = sizeof (n)}; }; + +template <typename n, typename x> R<Trait<n,x>::m> f(A<x>); +template <> R<Trait<char,char>::m> f<char>(A<char>) {return R<1>();} diff --git a/gcc/testsuite/g++.dg/template/explicit6.C b/gcc/testsuite/g++.dg/template/explicit6.C new file mode 100644 index 000000000..f740269bb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/explicit6.C @@ -0,0 +1,8 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 14 Feb 2005 <nathan@codesourcery.com> + +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> +// Bug 19895: ICE on invalid + +struct A; +template A<>::A(); // { dg-error "(not a template)|(explicit qualification)" "" } diff --git a/gcc/testsuite/g++.dg/template/explicit7.C b/gcc/testsuite/g++.dg/template/explicit7.C new file mode 100644 index 000000000..742467718 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/explicit7.C @@ -0,0 +1,13 @@ +// PR c++/22263 +// { dg-do link } + +template <class T> struct S { T foo (); T bar (); }; +template <class T> T S<T>::foo () { return bar (); } +template struct S<int>; +template <class T> T S<T>::bar () { return T (); } + +#if !__GXX_WEAK__ +template int S<int>::bar (); +#endif + +int main () { return S<int>().foo (); } diff --git a/gcc/testsuite/g++.dg/template/explicit8.C b/gcc/testsuite/g++.dg/template/explicit8.C new file mode 100644 index 000000000..4b92dbe39 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/explicit8.C @@ -0,0 +1,13 @@ +namespace N { + template <typename T> + struct S { + void f() {} + }; + namespace I { + template void S<double>::f(); // { dg-error "namespace" } + } +} + +namespace K { + template void N::S<int>::f(); // { dg-error "namespace" } +} diff --git a/gcc/testsuite/g++.dg/template/expr1.C b/gcc/testsuite/g++.dg/template/expr1.C new file mode 100644 index 000000000..079865d4e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/expr1.C @@ -0,0 +1,8 @@ +// PR c++/18161 +// { dg-options "" } + +template <class T> struct Y; +template <> struct Y<bool> {}; + +template <typename T = typeof (1 == 1)> struct X { Y<T> a; }; +template struct X <>; diff --git a/gcc/testsuite/g++.dg/template/field1.C b/gcc/testsuite/g++.dg/template/field1.C new file mode 100644 index 000000000..c61437b28 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/field1.C @@ -0,0 +1,12 @@ +struct A { + void (*f)(void); +}; + +template< typename R > +struct B : public A { + void g() + { + A::f(); + } +}; +template class B<bool>; diff --git a/gcc/testsuite/g++.dg/template/fnspec1.C b/gcc/testsuite/g++.dg/template/fnspec1.C new file mode 100644 index 000000000..5d5324475 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/fnspec1.C @@ -0,0 +1,16 @@ +// PR c++/35146 + +template <typename T> struct S {}; + +template <typename R> struct ref; +template <> struct ref<double> { typedef double result; }; + +template <typename T> +void foo(typename ref<T>::result, S<T>*); +template <> +void foo(S<double>, S<double>*); // { dg-error "does not match" } +template <> +void foo(double alpha, S<double>* x) +{ + alpha; x; +} diff --git a/gcc/testsuite/g++.dg/template/fntry1.C b/gcc/testsuite/g++.dg/template/fntry1.C new file mode 100644 index 000000000..494be5ab0 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/fntry1.C @@ -0,0 +1,43 @@ +// PR c++/26433 +// { dg-do link } + +int get_int() +{ + throw 1; + + return 0; +} + +template <class _T> class Test +{ +public: + Test() + try + : i(get_int()) + { + i++; + } + catch(...) + { + // Syntax error caused by undefined __FUNCTION__. + const char* ptr = __FUNCTION__; + } + +private: + int i; + _T t; +}; + +int main() +{ + try + { + Test<int> test; + } + catch(...) + { + return 1; + } + + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/fntype1.C b/gcc/testsuite/g++.dg/template/fntype1.C new file mode 100644 index 000000000..d7be273aa --- /dev/null +++ b/gcc/testsuite/g++.dg/template/fntype1.C @@ -0,0 +1,26 @@ +bool f(int i) { return i != 5; } + +template <class X, class P = bool(X)> +struct Traits +{ + typedef P type; +}; + +template <class X, class P = typename Traits<X>::type> +struct S +{ + const P& p_; + S( const P& p ) : p_(p) {} // const reference +}; + +template <class X> +S<X> make_s(const typename Traits<X>::type & p) // const reference +{ + return S<X>(p); // << HERE +} + + +int main() +{ + make_s<int>(f); +} diff --git a/gcc/testsuite/g++.dg/template/for1.C b/gcc/testsuite/g++.dg/template/for1.C new file mode 100644 index 000000000..dc33afcda --- /dev/null +++ b/gcc/testsuite/g++.dg/template/for1.C @@ -0,0 +1,23 @@ +// PR c++/47388 +// { dg-do compile } +// { dg-options "-fno-for-scope" } + +template <int> +void +foo () +{ + int i; + for (i = 0; i < 16; i++) + ; + for (int j = 0; j < 16; j++) + ; + if (j != 16) + for (;;) + ; +} + +void +bar () +{ + foo <0> (); +} diff --git a/gcc/testsuite/g++.dg/template/friend.C b/gcc/testsuite/g++.dg/template/friend.C new file mode 100644 index 000000000..44cbce938 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend.C @@ -0,0 +1,30 @@ +// Contribued by Gabriel Dos Reis <gdr@codesourcery.com> +// Origin: iskey@i100.ryd.student.liu.se + +class ostream; +extern ostream& cout; + +template <class T> struct s; + +template <class T> +ostream& operator<<(ostream &o, const typename s<T>::t &x) // { dg-message "note" } +{ + return o; +} + +template <class T> +struct s { + struct t + { + friend ostream& + operator<<<T>(ostream&, const typename s<T>::t &); + }; + t x; +}; + +int main() +{ + s<int>::t y; + cout << y; // { dg-error "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 28 } +} diff --git a/gcc/testsuite/g++.dg/template/friend10.C b/gcc/testsuite/g++.dg/template/friend10.C new file mode 100644 index 000000000..cab5e346f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend10.C @@ -0,0 +1,45 @@ +// { dg-do run } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 24 Dec 2002 <nathan@codesourcery.com> + +// PR 5116. template instantiation can add a friend into a namespace, +// and thus change overload resolution. + +#include <iostream> + +static int right; +static int wrong; + +struct Buggy {}; + +template <typename T>struct Handle +{ + Handle(T* p) {} + + operator bool() const { wrong++; return true; } + + friend std::ostream& operator<<(std::ostream& ostr, const Handle& r) + { + right++; + + return ostr << "in operator<<(ostream&, const Handle&)"; + } +}; + +typedef Handle<Buggy> Buggy_h; + +bool cmp (const Buggy_h& b1, const Buggy_h& b2) +{ + std::cout << b1 << " " << b2 << std::endl; + return false; +} + +int main() +{ + Buggy o; + + cmp (&o, &o); + + return !(right == 2 && !wrong); +} diff --git a/gcc/testsuite/g++.dg/template/friend11.C b/gcc/testsuite/g++.dg/template/friend11.C new file mode 100644 index 000000000..343b52752 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend11.C @@ -0,0 +1,18 @@ +/* PR c++/53 */ +/* { dg-do compile } */ + +template <class T> +struct A { + template <class U> class B; + + // Did not compile with gcc-2.95.2 (linux i686) :-( + template <class S> template <class U> friend class A<S>::B; +}; + +template <class S> template <class U> class A<S>::B { +}; + +int main(){ + A<double>::B<double> ab; + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/friend12.C b/gcc/testsuite/g++.dg/template/friend12.C new file mode 100644 index 000000000..0cd561b5a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend12.C @@ -0,0 +1,24 @@ +// { dg-do compile } + +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR 9030. Perform access checking to parameter and return type of +// function template correctly when the template is friend. + +template <class T> class Outer { + private: + struct Inner {}; + + template <class T_> + friend typename Outer<T_>::Inner foo (); +}; + +template <class T> +typename Outer<T>::Inner +foo () { + return typename Outer<T>::Inner(); +} + +void f() { + foo<int>(); +} diff --git a/gcc/testsuite/g++.dg/template/friend13.C b/gcc/testsuite/g++.dg/template/friend13.C new file mode 100644 index 000000000..6eebf6b95 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend13.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +// Perform access checking to parameter and return type of +// function template correctly when only specialization is friend. + +template <class T> +typename T::Inner +foo () { + return typename T::Inner(); +} + +class Outer { + private: + struct Inner {}; + + friend Outer::Inner foo<Outer> (); +}; + +void f() { + foo<Outer>(); +} diff --git a/gcc/testsuite/g++.dg/template/friend14.C b/gcc/testsuite/g++.dg/template/friend14.C new file mode 100644 index 000000000..6e07b9893 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend14.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// Perform access checking to parameter and return type of +// function template correctly when the template is friend. + +template <class T> class O { + struct I { I (int); }; + + template <class T_> + friend typename O<T_>::I f (); +}; + +template <class T_> +typename O<T_>::I f () { return 1; } + +struct X { + void g() { f<int>(); } +}; diff --git a/gcc/testsuite/g++.dg/template/friend15.C b/gcc/testsuite/g++.dg/template/friend15.C new file mode 100644 index 000000000..4acbf2d1a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend15.C @@ -0,0 +1,19 @@ +// { dg-do compile } + +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/9453 +// Access checking when template friend is defined in class. + +template <typename> class X { + private: + struct Inner; + + template <typename R> + friend typename X<R>::Inner * foo () { return 0; } +}; +template class X<void>; + +struct U { + void bar () { foo<void> (); } +}; diff --git a/gcc/testsuite/g++.dg/template/friend16.C b/gcc/testsuite/g++.dg/template/friend16.C new file mode 100644 index 000000000..3165ed2b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend16.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/9602: Inline friend/pure virtual tree data sharing in +// class template. + +template <typename T> struct X { + void foo (X); + friend void bar () {} +}; + +template <typename T> +void X<T>::foo (X x) {} + +template struct X<int>; diff --git a/gcc/testsuite/g++.dg/template/friend17.C b/gcc/testsuite/g++.dg/template/friend17.C new file mode 100644 index 000000000..50d602441 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend17.C @@ -0,0 +1,12 @@ +template <class T> +struct X { + template <class U> void operator+=(U); + + template <class V> + template <class U> + friend void X<V>::operator+=(U); +}; + +int main() { + X<int>() += 1.0; +} diff --git a/gcc/testsuite/g++.dg/template/friend18.C b/gcc/testsuite/g++.dg/template/friend18.C new file mode 100644 index 000000000..04ba26e98 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend18.C @@ -0,0 +1,19 @@ +// { dg-do run } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Mar 2003 <nathan@codesourcery.com> + +// PR 10158. implicit inline template friends ICE'd + +template <int N> struct X +{ + template <int M> friend int foo(X const &) + { + return N * 10000 + M; + } +}; +X<1234> bring; + +int main() { + return foo<5678> (bring) != 12345678; +} diff --git a/gcc/testsuite/g++.dg/template/friend19.C b/gcc/testsuite/g++.dg/template/friend19.C new file mode 100644 index 000000000..73883b2a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend19.C @@ -0,0 +1,28 @@ +// { dg-do compile } + +// Origin: Benjamin Li <benxbli@yahoo.com> + +// PR c++/11030: Template substitution of friend class that is +// a specialization. + +template <int S> +struct A +{ + void func(void); +}; + +template <class T> +class C +{ + static void private_func(void) {} +public: + friend class A<512>; +}; + +template <int S> +void A<S>::func(void) +{ + C<void>::private_func(); +} + +template class A<512>; diff --git a/gcc/testsuite/g++.dg/template/friend20.C b/gcc/testsuite/g++.dg/template/friend20.C new file mode 100644 index 000000000..496d52f5e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend20.C @@ -0,0 +1,15 @@ +template <class T> +struct A +{ + friend void bar(A<T> a) {} +}; + +void bar(A<int>); + +int main() +{ + A<int> a; + + bar(a); +} + diff --git a/gcc/testsuite/g++.dg/template/friend21.C b/gcc/testsuite/g++.dg/template/friend21.C new file mode 100644 index 000000000..854ed67d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend21.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Origin: ajl13@bellatlantic.net + +// PR c++/5421: ICE for specialization of member function template +// as friend. + +struct B { + template <class T> void b(); +}; + +template <class T> class A { + friend void B::b<T>(); +}; + +static A<int> a; diff --git a/gcc/testsuite/g++.dg/template/friend22.C b/gcc/testsuite/g++.dg/template/friend22.C new file mode 100644 index 000000000..41a73bbb4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend22.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Origin: Benoit Hudson <bh@techhouse.brown.edu> + +// PR c++/641: Duplicate friend diagnostics + +template <class T> class iterator { }; +template <class T> class item { + friend class iterator<T>; + friend class iterator<const T>; +}; + +class A { }; + +item<const A> i; diff --git a/gcc/testsuite/g++.dg/template/friend23.C b/gcc/testsuite/g++.dg/template/friend23.C new file mode 100644 index 000000000..96f8125b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend23.C @@ -0,0 +1,38 @@ +// { dg-do compile } + +// Origin: Alexandre Tolmos <ktulu@free.fr> + +// PR c++/11876: Friend of its own class diagnostics + +template <typename T> +class A +{ + friend class A<int>; + friend class A<float>; +protected: + T _data; + inline A() : _data(0) {} + template <typename U> + inline A(const A<U>& r) : _data(r._data) {} +}; + +class B : public A<int> +{ +public: + inline B() {} + inline B(const B& r) : A<int>(r) {} +}; + +class C : public A<float> +{ +public: + inline C() {} + inline C(const B& r) : A<float>(r) {} +}; + +int main(int, char*[]) +{ + B b1, b2(b1); + C c(b1); + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/friend24.C b/gcc/testsuite/g++.dg/template/friend24.C new file mode 100644 index 000000000..5db4d31e7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend24.C @@ -0,0 +1,27 @@ +// { dg-do compile } + +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/495: Fail to locate primary class template that is +// injected by friend declaration. + +template <int N> struct X +{ + template <int dim> friend struct Y; +}; + +X<2> x; + +template <int dim> struct Y +{ + void f (Y); + void g (Y); +}; + +template <int dim> void Y<dim>::f (Y) +{ +} + +template <int dim> void Y<dim>::g (Y<dim>) +{ +} diff --git a/gcc/testsuite/g++.dg/template/friend25.C b/gcc/testsuite/g++.dg/template/friend25.C new file mode 100644 index 000000000..fa11defc2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend25.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Origin: Jiangbin Zhao <zhaojiangbin@yahoo.com> + +// PR c++/12369: ICE for specialization of member function template +// as friend in ordinary class. + +struct A { + template<class T> T* make() { return new T(); } +}; + +struct B { + friend B* A::make< B >(); // (1) +}; diff --git a/gcc/testsuite/g++.dg/template/friend26.C b/gcc/testsuite/g++.dg/template/friend26.C new file mode 100644 index 000000000..3cf659df4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend26.C @@ -0,0 +1,15 @@ +// PR c++/14359 + +template<typename> struct A {}; + +template<typename> struct B +{ + template<typename T> friend void foo(const A<T>& a, const B&) { a; } +}; + +void bar() +{ + A<void> a; + B<void> b; + foo(a,b); +} diff --git a/gcc/testsuite/g++.dg/template/friend27.C b/gcc/testsuite/g++.dg/template/friend27.C new file mode 100644 index 000000000..6317da577 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend27.C @@ -0,0 +1,22 @@ +// PR c++/15265 + +enum Relation {equalOp}; +template<typename B> +class A { +public: + static + bool Relop(const A&, const A&, Relation); + + friend + bool operator==(const A& a1, const A& a2) { + return Relop(a1, a2, equalOp); + } + B* b; +}; + +int main() { + A<int> a; a == a; + return 0; +} + + diff --git a/gcc/testsuite/g++.dg/template/friend28.C b/gcc/testsuite/g++.dg/template/friend28.C new file mode 100644 index 000000000..a7d160d5f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend28.C @@ -0,0 +1,23 @@ +// PR c++/15629 +// { dg-do link } + +template<int a, int b> class T; + +template<int a, int b> void func(T<a, b> * t); +template<int a> void func(T<a, 3> * t) {} +template void func<2>(T<2, 3>*); + +template<int a, int b> struct T { + friend void func<a, b>(T<a, b> * t); + friend void func<a> (T<a, 3> * t); + + void foo(); +}; + +template<int a, int b> void T<a, b>::foo() { + func((T<2,3>*)0); +} + +int main() { + T<2,3>().foo(); +} diff --git a/gcc/testsuite/g++.dg/template/friend29.C b/gcc/testsuite/g++.dg/template/friend29.C new file mode 100644 index 000000000..1c0c6f0f7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend29.C @@ -0,0 +1,11 @@ +// PR c++/15701 + +template<template<int> class T> struct A : T<0> +{ + void foo(); + template<template<int> class U> friend void A<U>::foo(); +}; + +template<int> struct B {}; + +A<B> a; diff --git a/gcc/testsuite/g++.dg/template/friend3.C b/gcc/testsuite/g++.dg/template/friend3.C new file mode 100644 index 000000000..7400534ac --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend3.C @@ -0,0 +1,31 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 28 Dec 2001 <nathan@codesourcery.com> + +// PR 775 friend classes with qualified names inside template classes. + +struct A +{ + struct B { + B () { } + }; +}; + +template <class T> +struct C: A { + friend A::B::B (); // 2.95.2 ICE + friend struct A; + friend struct A::B; // 2.97 error +}; + +template class C<char>; + +template <typename T> class TPL +{ + class nested; +}; + +template <typename T> class TPL<T>::nested +{ +}; diff --git a/gcc/testsuite/g++.dg/template/friend30.C b/gcc/testsuite/g++.dg/template/friend30.C new file mode 100644 index 000000000..055fc8d89 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend30.C @@ -0,0 +1,15 @@ +// PR c++/14930 + +template<typename T> class Point; + +template<> class Point<double> { + friend class Plane; + double v; +}; + +struct Plane { + double get(const Point<double>& p); +}; + +double Plane::get(const Point<double> &p) { return p.v; } + diff --git a/gcc/testsuite/g++.dg/template/friend31.C b/gcc/testsuite/g++.dg/template/friend31.C new file mode 100644 index 000000000..5e60540b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend31.C @@ -0,0 +1,27 @@ +// { dg-do compile } + +// Origin: Ivan Godard <igodard@pacbell.net> + +// PR c++/15410: Declaration of friend class template with wrong +// template parameter. + +template <typename T, typename U> struct F; // { dg-message "previous declaration" } + +class W +{ + template<int i> friend class F; // { dg-error "template parameter" } + int x; // { dg-error "private" } +}; + +template <typename T, typename U> struct F +{ + void Look(W& w) { w.x = 3; } // { dg-error "within this context" } +}; + +int main() +{ + W w; + F<char, bool> f; + f.Look(w); + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/friend32.C b/gcc/testsuite/g++.dg/template/friend32.C new file mode 100644 index 000000000..81e6390d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend32.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +// Origin: Steven Bosscher <steven@gcc.gnu.org> +// Serge Belyshev <belyshev@lubercy.com> + +// PR c++/18825: ICE member as friend + +template<class T> class A +{ + void f (); // { dg-error "private" } +}; + +template<class T> class B +{ + friend void A<T>::f (); // { dg-error "this context" } +}; + +int f () +{ + B<int> b; // { dg-message "instantiated" } +} diff --git a/gcc/testsuite/g++.dg/template/friend33.C b/gcc/testsuite/g++.dg/template/friend33.C new file mode 100644 index 000000000..f1b5cb26a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend33.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// PR c++/18733: Validation of template headers in friends + +template<int> struct A +{ + void foo(); +}; + +struct B +{ + friend void A<0>::foo(); +}; diff --git a/gcc/testsuite/g++.dg/template/friend34.C b/gcc/testsuite/g++.dg/template/friend34.C new file mode 100644 index 000000000..555cf358a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend34.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Origin: mleone@pixar.com +// Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/9783: Forward declaration of class in template. + +template <typename T> +struct C { + void foo (struct X *); +}; + +struct X {}; + +template <typename T> +void C<T>::foo(struct X *) {} diff --git a/gcc/testsuite/g++.dg/template/friend35.C b/gcc/testsuite/g++.dg/template/friend35.C new file mode 100644 index 000000000..b150ccdab --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend35.C @@ -0,0 +1,28 @@ +// { dg-do compile } + +// Origin: Giovanni Bajo <giovannibajo@libero.it> + +// PR c++/4403: Incorrect friend class chosen during instantiation. + +template <typename T> +struct A +{ + struct F; +}; + +template <typename T> +struct B : A<T> +{ + friend struct F; +private: + int priv; +}; + +struct F +{ + void func(void) + { + B<int> b; + b.priv = 0; + } +}; diff --git a/gcc/testsuite/g++.dg/template/friend36.C b/gcc/testsuite/g++.dg/template/friend36.C new file mode 100644 index 000000000..5f07db486 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend36.C @@ -0,0 +1,10 @@ +// PR c++/22139 +// { dg-options "--param ggc-min-expand=0 --param ggc-min-heapsize=0" } + +template <int rank, int dim> class Tensor; +template <int rank, int dim> struct SymmetricTensor { + SymmetricTensor (const Tensor<2,dim> &t); + friend void foo(); +}; +template <> SymmetricTensor<2,2>::SymmetricTensor (const Tensor<2,2> &t) {} +template <> SymmetricTensor<2,3>::SymmetricTensor (const Tensor<2,3> &t) {} diff --git a/gcc/testsuite/g++.dg/template/friend37.C b/gcc/testsuite/g++.dg/template/friend37.C new file mode 100644 index 000000000..7c8682906 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend37.C @@ -0,0 +1,15 @@ +// PR c++/22147 + +template<typename> struct A; + +template<typename T> void foo(A<T>* p) { *p; } + +template<typename> struct A +{ + friend void foo<class X>(A<X>*); +}; + +void bar() +{ + foo<int>(0); +} diff --git a/gcc/testsuite/g++.dg/template/friend38.C b/gcc/testsuite/g++.dg/template/friend38.C new file mode 100644 index 000000000..41faf7911 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend38.C @@ -0,0 +1,12 @@ +// PR c++/22352 + +template <class A> +class s +{ + typedef int d; + template <class s, typename s::d> + friend class t; +}; + +s<int> t1; + diff --git a/gcc/testsuite/g++.dg/template/friend39.C b/gcc/testsuite/g++.dg/template/friend39.C new file mode 100644 index 000000000..9ebe226eb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend39.C @@ -0,0 +1,7 @@ +// PR c++/8355 + +namespace Foo { template <typename T> void foo();} +struct Bar +{ + friend void Foo::foo<int>(); +}; diff --git a/gcc/testsuite/g++.dg/template/friend4.C b/gcc/testsuite/g++.dg/template/friend4.C new file mode 100644 index 000000000..fabf3375b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend4.C @@ -0,0 +1,46 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 18 Dec 2001 <nathan@codesourcery.com> + +// PR 109, dependent member friends + +struct B +{ + static int foo (); + struct N + { + static int bar (); + }; +}; + + +template <class T> +class A +{ + friend int T::foo (); + friend int T::N::bar (); + + private: + static int m; +}; + +template <class T> +class C +{ + friend struct T::N; + + private: + static int m; +}; + + +int B::foo () +{ + return A<B>::m; +} + +int B::N::bar () +{ + return A<B>::m + C<B>::m; +} diff --git a/gcc/testsuite/g++.dg/template/friend40.C b/gcc/testsuite/g++.dg/template/friend40.C new file mode 100644 index 000000000..39dd994e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend40.C @@ -0,0 +1,16 @@ +// PR c++/24173 +// { dg-options "--param ggc-min-expand=0 --param ggc-min-heapsize=0" } + +template <int> struct A; + +void foo(A<0>); + +template<int> struct A +{ + friend void foo(A<0>); +}; + +void bar() +{ + foo(A<0>()); +} diff --git a/gcc/testsuite/g++.dg/template/friend41.C b/gcc/testsuite/g++.dg/template/friend41.C new file mode 100644 index 000000000..6d686019d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend41.C @@ -0,0 +1,11 @@ +// PR c++/26912 + +struct Foo { + template<class T> int func() const; +}; + +class Bar { + friend int Foo::func<int>() const; +}; + + diff --git a/gcc/testsuite/g++.dg/template/friend42.C b/gcc/testsuite/g++.dg/template/friend42.C new file mode 100644 index 000000000..73d10df01 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend42.C @@ -0,0 +1,8 @@ +// { dg-do compile } + +template <class T> void foo (int); + +template <class T> +class Q { + friend void foo<T> (int = 3); // { dg-error "default argument" } +}; diff --git a/gcc/testsuite/g++.dg/template/friend43.C b/gcc/testsuite/g++.dg/template/friend43.C new file mode 100644 index 000000000..edbed8420 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend43.C @@ -0,0 +1,11 @@ +// PR c++/28111 +// { dg-do compile } + +template<typename> void foo(); + +template<typename T> struct A +{ + friend void foo<>(typename T::X); // { dg-error "not a class" } +}; + +A<int> a; diff --git a/gcc/testsuite/g++.dg/template/friend44.C b/gcc/testsuite/g++.dg/template/friend44.C new file mode 100644 index 000000000..814fec1d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend44.C @@ -0,0 +1,9 @@ +// { dg-options "-fshow-column" } +//PR c++/28260 + +template<int> struct A +{ + friend int foo(); // { dg-error "14:new declaration" } +}; + +void foo() { A<0> a; } // { dg-error "6:ambiguates old declaration" } diff --git a/gcc/testsuite/g++.dg/template/friend45.C b/gcc/testsuite/g++.dg/template/friend45.C new file mode 100644 index 000000000..61c365617 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend45.C @@ -0,0 +1,17 @@ +// PR c++/28025 + +class BaseSubmit +{ + template<class T> friend class PeriodicSubmit; +}; + +template<class ID> +class ValuesSubmit +{ + template<class T> friend class PeriodicSubmit; +}; + +class A; +class MultiSubmit : public ValuesSubmit<A> +{ +}; diff --git a/gcc/testsuite/g++.dg/template/friend46.C b/gcc/testsuite/g++.dg/template/friend46.C new file mode 100644 index 000000000..17dc0db94 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend46.C @@ -0,0 +1,9 @@ +// PR c++/27714 + +template<typename> struct A +{ + static void* operator new(__SIZE_TYPE__); + template <typename T> friend void* A<T>::operator new(__SIZE_TYPE__); +}; + +A<int> a; diff --git a/gcc/testsuite/g++.dg/template/friend47.C b/gcc/testsuite/g++.dg/template/friend47.C new file mode 100644 index 000000000..612173950 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend47.C @@ -0,0 +1,11 @@ +// PR c++/19809 + +template<int i> +struct n{ + friend void foo(){ } // { dg-error "defin" } +}; + +int main(){ + n<1> n1; + n<2> n2; +} diff --git a/gcc/testsuite/g++.dg/template/friend48.C b/gcc/testsuite/g++.dg/template/friend48.C new file mode 100644 index 000000000..604697dae --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend48.C @@ -0,0 +1,12 @@ +// PR c++/29020 + +template<int> struct A +{ + void foo(); +}; + +struct B +{ + template<int N> friend void A<N>::A::foo(); +}; + diff --git a/gcc/testsuite/g++.dg/template/friend49.C b/gcc/testsuite/g++.dg/template/friend49.C new file mode 100644 index 000000000..b4d717f57 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend49.C @@ -0,0 +1,18 @@ +// PR c++/29054 +// { dg-do compile } + +struct A +{ + template <typename T, typename U> static void create (U) {} +}; + +struct B +{ + friend void A::create <B, const char *> (const char *); +}; + +int +main () +{ + A::create<B>("test"); +} diff --git a/gcc/testsuite/g++.dg/template/friend5.C b/gcc/testsuite/g++.dg/template/friend5.C new file mode 100644 index 000000000..1a63e71e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend5.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +namespace NS { template <typename number> class C; } + +template <typename T> class X { + template <typename N> friend class NS::C; +}; + +template class X<int>; diff --git a/gcc/testsuite/g++.dg/template/friend50.C b/gcc/testsuite/g++.dg/template/friend50.C new file mode 100644 index 000000000..93c429ab1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend50.C @@ -0,0 +1,9 @@ +// PR c++/34399 +template<int> struct X +{ + void foo(); +}; + +struct Y { + template<long N> friend void X<N>::X::foo(); // { dg-error "declared as friend" } +}; diff --git a/gcc/testsuite/g++.dg/template/friend51.C b/gcc/testsuite/g++.dg/template/friend51.C new file mode 100644 index 000000000..d2d1ad799 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend51.C @@ -0,0 +1,17 @@ +// PR c++/38392 +// { dg-do link } + +void Function(); + +int main() +{ + Function(); +} + +template <typename T> +struct Test +{ + friend void Function() { } +}; + +template class Test<int>; diff --git a/gcc/testsuite/g++.dg/template/friend6.C b/gcc/testsuite/g++.dg/template/friend6.C new file mode 100644 index 000000000..e330d9818 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend6.C @@ -0,0 +1,53 @@ +// { dg-do compile } + +namespace boost_no_member_template_friends{ + +template <class T> +class foobar; + +template <class T> +class foo +{ +private: + template<typename Y> friend class foobar; + template<typename Y> friend class foo; + template<typename Y> friend bool must_be_friend_proc(const foo<Y>& f); + int i; +public: + foo(){ i = 0; } + template <class U> + foo(const foo<U>& f){ i = f.i; } +}; + +template <class T> +class foo; + +template <class T> +bool must_be_friend_proc(const foo<T>& f); + +template <class T> +bool must_be_friend_proc(const foo<T>& f) +{ return f.i != 0; } + +template <class T> +class foobar +{ + int i; +public: + template <class U> + foobar(const foo<U>& f) + { i = f.i; } +}; + + +int test() +{ + foo<int> fi; + foo<double> fd(fi); + (void) &fd; // avoid "unused variable" warning + foobar<long> fb(fi); + (void) &fb; // avoid "unused variable" warning + return 0; +} + +} diff --git a/gcc/testsuite/g++.dg/template/friend7.C b/gcc/testsuite/g++.dg/template/friend7.C new file mode 100644 index 000000000..a954f8990 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend7.C @@ -0,0 +1,33 @@ +// { dg-do compile } + +template <typename V> +struct b +{ + template <typename T> + class a + { + template <typename> + friend class a; + + T t_; + + public: + a() {} + a(a<T *> const &); + }; +}; + +template <typename V> +template <typename T> +b<V>::a<T>::a(a<T *> const &rhs): t_(*rhs.t_) +{} + + +int +f () +{ + b<void *>::a<char *> q; + b<void *>::a<char> w(q); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/friend8.C b/gcc/testsuite/g++.dg/template/friend8.C new file mode 100644 index 000000000..21fd242f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend8.C @@ -0,0 +1,18 @@ +template <int N> struct ivector +{ + template <int r, int c> friend void + mult_mv (); +}; + +template struct ivector<3>; + +template <int r, int c> void +mult_mv () +{ + c; +} + +void get_local_point_pos () +{ + mult_mv<7, 3> (); +} diff --git a/gcc/testsuite/g++.dg/template/friend9.C b/gcc/testsuite/g++.dg/template/friend9.C new file mode 100644 index 000000000..add5fb0d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend9.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/8099 +// Partial specialization as friend class + +template <int N, typename T> struct X; +template <typename T> struct X<1,T>; + +template <typename P> class Y { + static int i; + template <int N, typename T> friend struct X; + friend struct X<1,P>; +}; + +template <typename T> struct X<1,T> { + X () { Y<T>::i; } // access private field +}; diff --git a/gcc/testsuite/g++.dg/template/func1.C b/gcc/testsuite/g++.dg/template/func1.C new file mode 100644 index 000000000..0d1677060 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/func1.C @@ -0,0 +1,13 @@ +template <typename T1,typename T2> +inline void f(const T1&,const T2&) { } + +template <typename T1,typename T2,void F(const T1&,const T2&)> +struct A { + template <typename T> void g(T& i) { } +}; + +int main() { + int i; + A<int,int,f> a; + a.g(i); +} diff --git a/gcc/testsuite/g++.dg/template/func2.C b/gcc/testsuite/g++.dg/template/func2.C new file mode 100644 index 000000000..b0f691d24 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/func2.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +typedef void (*fptr)(); +fptr zeroptr = 0; +template<typename T, fptr F> struct foo { }; +template<typename T> struct foo<T,zeroptr> { }; +// { dg-error "not a valid template argument" "not valid" { target *-*-* } 6 } +// { dg-error "must be the address" "must be the address " { target *-*-* } 6 } + +// The rest is needed to trigger the ICE in 4.0 to 4.3: +void f() { } +foo<int,&f> m_foo; diff --git a/gcc/testsuite/g++.dg/template/function1.C b/gcc/testsuite/g++.dg/template/function1.C new file mode 100644 index 000000000..bceed9d68 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/function1.C @@ -0,0 +1,28 @@ +// PR c++/38647 +// { dg-do compile } +// { dg-prune-output "note" } + +template<const char *, int> struct A {}; +const char func[] = "abc"; +template<int N> struct A<func, N> {}; // { dg-error "cannot appear|is invalid|not a valid|constant expression" } + +char a1[1]; +A<a1, 0> a; + +template<const char *, int> struct B {}; +template<int N> struct B<__FUNCTION__, N> {}; // { dg-error "cannot appear|is invalid|is not a valid|constant expression" } + +char b1[1]; +B<b1, 0> b; + +template<const char *, int> struct C {}; +template<int N> struct C<__PRETTY_FUNCTION__, N> {}; // { dg-error "cannot appear|is invalid|is not a valid|constant expression" } + +char c1[1]; +C<c1, 0> c; + +template<const char *, int> struct D {}; +template<int N> struct D<__func__, N> {}; // { dg-error "cannot appear|is invalid|is not a valid|function scope|constant expression" } + +char d1[1]; +D<d1, 0> d; diff --git a/gcc/testsuite/g++.dg/template/incomplete1.C b/gcc/testsuite/g++.dg/template/incomplete1.C new file mode 100644 index 000000000..e4997ef01 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/incomplete1.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// Origin: Ivan Godard <igodard at pacbell dot net> +// PR c++/17447: Detect parameters of dependent types even in templates + +struct B; // { dg-error "forward declaration" } +template<typename T> struct A { + + friend A& operator <<(A& a, B b) { return a; } // { dg-error "incomplete" } + friend A& operator <<(A& a, T b) { return a; } + + void foo1(B b) {} // { dg-error "incomplete" } + void foo1a(T b) {} + + B foo2(void) {} // { dg-error "incomplete" } + T foo2a(void) {} + + void foo3(B b); +}; diff --git a/gcc/testsuite/g++.dg/template/incomplete2.C b/gcc/testsuite/g++.dg/template/incomplete2.C new file mode 100644 index 000000000..d86ea06bc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/incomplete2.C @@ -0,0 +1,14 @@ +// PR c++/27427 +// { dg-do compile } + +struct A; + +template<A&> void foo(); // { dg-message "note" } + +A a; // { dg-error "incomplete type" } + +void bar() +{ + foo<a>(); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 12 } +} diff --git a/gcc/testsuite/g++.dg/template/incomplete3.C b/gcc/testsuite/g++.dg/template/incomplete3.C new file mode 100644 index 000000000..8a20bba74 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/incomplete3.C @@ -0,0 +1,5 @@ +// PR c++/27315 +// { dg-do compile } + +struct A; // { dg-error "forward declaration" } +template void A::foo<0>(); // { dg-error "before|incomplete" } diff --git a/gcc/testsuite/g++.dg/template/incomplete4.C b/gcc/testsuite/g++.dg/template/incomplete4.C new file mode 100644 index 000000000..f2832a73c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/incomplete4.C @@ -0,0 +1,16 @@ +// PR c++/33501 +// { dg-do compile } + +class A; // { dg-error "forward declaration" } + +template <typename T> struct X +{ + static int f (T); // { dg-error "initializing" } + static const T &make (); +}; + +int +main () +{ + return X<A>::f (X<A>::make ()); // { dg-error "invalid use of incomplete type" } +} diff --git a/gcc/testsuite/g++.dg/template/incomplete5.C b/gcc/testsuite/g++.dg/template/incomplete5.C new file mode 100644 index 000000000..f7802825f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/incomplete5.C @@ -0,0 +1,17 @@ +// PR c++/33501 +// { dg-do compile } + +class A; // { dg-error "forward declaration" } + +template <typename T> struct X +{ + static int f (T); // { dg-error "initializing" } + static const T &make (); + static const bool value = sizeof (f (make ())) == sizeof (int); // { dg-error "invalid use of incomplete type" } +}; + +int +main () +{ + return X <A>::value; +} diff --git a/gcc/testsuite/g++.dg/template/incomplete6.C b/gcc/testsuite/g++.dg/template/incomplete6.C new file mode 100644 index 000000000..7138b6a3b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/incomplete6.C @@ -0,0 +1,22 @@ +// PR c++/48115 + +template<typename> struct templ { }; + +template<typename T> T declval(); + +typedef int (*F2)(...); + +template<int> struct Int { }; + +template<typename F, typename T> +struct S +{ + template<typename A> + Int<sizeof( declval<F>()(T()) )> + f(A); +}; + +int main() +{ + S<F2, templ<int> >().f(0); +} diff --git a/gcc/testsuite/g++.dg/template/inherit.C b/gcc/testsuite/g++.dg/template/inherit.C new file mode 100644 index 000000000..43af3cfc5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/inherit.C @@ -0,0 +1,13 @@ +// Contributed by Gabriel Dos Reis <gdr@codesourcery.com> +// { dg-do compile } + +template<typename T> +struct X { void f() { } }; + +struct Z : X<int> { }; + +int main() +{ + Z z; + z.X::f(); +} diff --git a/gcc/testsuite/g++.dg/template/inherit2.C b/gcc/testsuite/g++.dg/template/inherit2.C new file mode 100644 index 000000000..4fd7ec063 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/inherit2.C @@ -0,0 +1,19 @@ +// PR c++/5658 + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Theodore.Papadopoulo 11 Feb 2002 <Theodore.Papadopoulo@sophia.inria.fr> + +struct A { + typedef int iterator; +}; +template <typename T> +struct B: public A { + template <typename U> + struct iterator { + }; + B() { } +}; +int main() +{ + B<int> a; +} diff --git a/gcc/testsuite/g++.dg/template/inherit3.C b/gcc/testsuite/g++.dg/template/inherit3.C new file mode 100644 index 000000000..97b9e5b3e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/inherit3.C @@ -0,0 +1,12 @@ +template <typename T> +struct set { + void insert (const T&); + template <class X> + void insert (X, X); +}; + +struct C : public set<int> { + void f (const int i) { + insert (i); + } +}; diff --git a/gcc/testsuite/g++.dg/template/inherit4.C b/gcc/testsuite/g++.dg/template/inherit4.C new file mode 100644 index 000000000..511c9e605 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/inherit4.C @@ -0,0 +1,14 @@ +// PR c++/21008, DR 515 + +struct A { + int foo_; +}; +template <typename T> struct B: public A { }; +template <typename T> struct C: B<T> { + int foo() { + return A::foo_; // #1 + } +}; +int f(C<int>* p) { + return p->foo(); +} diff --git a/gcc/testsuite/g++.dg/template/inherit5.C b/gcc/testsuite/g++.dg/template/inherit5.C new file mode 100644 index 000000000..cd22f5b10 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/inherit5.C @@ -0,0 +1,11 @@ +struct A +{ + template<int> void foo(); +}; + +template<int N> struct B : A +{ + B() { foo<N>(); } +}; + +B<0> b; diff --git a/gcc/testsuite/g++.dg/template/inherit6.C b/gcc/testsuite/g++.dg/template/inherit6.C new file mode 100644 index 000000000..241a68e5e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/inherit6.C @@ -0,0 +1,23 @@ +// Origin PR c++/47172 +// { dg-options "-std=c++0x" } +// { dg-do compile } + +struct A +{ + int f() const; +}; + +template <class T> +struct B : A { }; + +template <class T> +struct C : B<T> +{ + void g(); +}; + +template <class T> +void C<T>::g() +{ + A::f(); +} diff --git a/gcc/testsuite/g++.dg/template/inherit7.C b/gcc/testsuite/g++.dg/template/inherit7.C new file mode 100644 index 000000000..67afbca6b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/inherit7.C @@ -0,0 +1,21 @@ +// Origin: PR c++/48656 +// { dg-options "-std=c++0x" } +// { dg-do compile } + +struct A { + int f(); + int f(int); +}; + +template <typename> struct B : A +{ +}; + +template <typename T> struct C : B<T> +{ + void + g() + { + A::f(); + } +}; diff --git a/gcc/testsuite/g++.dg/template/init-list.C b/gcc/testsuite/g++.dg/template/init-list.C new file mode 100644 index 000000000..6a868b25e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/init-list.C @@ -0,0 +1,17 @@ +// Contributed by Gabriel Dos Reis <gdr@codesourcery.com> +// { dg-do compile } + +template<typename T> +struct Base { + Base(int) { } +}; + +template<typename T> +struct Derived : Base<T> { + Derived(); +}; + +template<typename T> +Derived<T>::Derived() : Base(4) { } // { dg-error "have any field" "" } + + diff --git a/gcc/testsuite/g++.dg/template/init1.C b/gcc/testsuite/g++.dg/template/init1.C new file mode 100644 index 000000000..fdbff8d3c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/init1.C @@ -0,0 +1,10 @@ +// { dg-do compile } + +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/9457: ICE tsubst'ing initializers in templates. + +template <typename> void foo (int count) { + int i = {count}; +} +template void foo<int> (int); diff --git a/gcc/testsuite/g++.dg/template/init2.C b/gcc/testsuite/g++.dg/template/init2.C new file mode 100644 index 000000000..b81e4be94 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/init2.C @@ -0,0 +1,10 @@ +// PR c++/9820 + +template <typename T> struct X { + template<typename> static int test(...); + template<typename> static int test(int *); + + static const int i = sizeof(X<T>::template test<int>(0)); +}; + +template class X<int>; diff --git a/gcc/testsuite/g++.dg/template/init3.C b/gcc/testsuite/g++.dg/template/init3.C new file mode 100644 index 000000000..9799a206d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/init3.C @@ -0,0 +1,11 @@ +// PR c++/11027 + +template <class T> +struct X { + typedef void (X::*pfun)(); + static pfun p[]; +}; + +template <class T> +typename X<T>::pfun X<T>::p[] = {}; + diff --git a/gcc/testsuite/g++.dg/template/init4.C b/gcc/testsuite/g++.dg/template/init4.C new file mode 100644 index 000000000..78c7c3088 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/init4.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Dec 2004 <nathan@codesourcery.com> + +// PR 18905. bogus error +// Origin: Andrew Pinski <pinskia@gcc.gnu.org> + +int f1(char); +template <int t> +void f(void) +{ + const char* const suffixes = "plpv"; + f1(suffixes[t]); +} diff --git a/gcc/testsuite/g++.dg/template/init5.C b/gcc/testsuite/g++.dg/template/init5.C new file mode 100644 index 000000000..ab529beb9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/init5.C @@ -0,0 +1,11 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 31 May 2005 <nathan@codesourcery.com> + +// PR 21165. ICE on valid +// Origin:Volker Reichelt reichelt@gcc.gnu.org + +template<typename T> bool foo() +{ + const int i = T(); + return i > 0; +} diff --git a/gcc/testsuite/g++.dg/template/init6.C b/gcc/testsuite/g++.dg/template/init6.C new file mode 100644 index 000000000..143746642 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/init6.C @@ -0,0 +1,31 @@ +// PR c++/25836 + +template <class T> +class Iter {}; + +template <class T> +class SubIter : public Iter<T> { + void insert(T); +}; + +class GraphBase { +public: + class Node; +}; + +template<class T> +class Graph : public GraphBase { + class Inner { + Iter<typename Graph<T>::Node*> *get(); + }; +}; + +template<class T> +Iter<typename Graph<T>::Node*> *Graph<T>::Inner::get() { + SubIter<typename Graph<T>::Node*> *iter; + iter->insert(0); +} + +int main() { + Iter<Graph<int>::Node*> *n2_iter = new SubIter<Graph<int>::Node*>(); +} diff --git a/gcc/testsuite/g++.dg/template/init7.C b/gcc/testsuite/g++.dg/template/init7.C new file mode 100644 index 000000000..bb26c8f92 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/init7.C @@ -0,0 +1,9 @@ +/* PR c++/31517. This used to ICE. */ +/* { dg-do compile } */ + +template<typename> struct A +{ + static const int i=0; +}; + +template<typename T> const int A<T>::i = 0=0; /* { dg-error "duplicate initialization" } */ diff --git a/gcc/testsuite/g++.dg/template/init8.C b/gcc/testsuite/g++.dg/template/init8.C new file mode 100644 index 000000000..1bcda1253 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/init8.C @@ -0,0 +1,68 @@ +// PR c++/36089 +// { dg-do run } + +extern "C" void abort (); + +int f () +{ + const int c(2); + int d[c] = { 0, 0 }; + return d[0] + sizeof d; +} + +struct A +{ + static int f () + { + const int c(2); + int d[c] = { 0, 0 }; + return d[0] + sizeof d; + } +}; + +template <int> struct B +{ + static int f () + { + const int c = 2; + int d[c] = { 0, 0 }; + return d[0] + sizeof d; + } +}; + +template <int> struct C +{ + static int f () + { + const int c(2); + int d[c] = { 0, 0 }; + return d[0] + sizeof d; + } +}; + +template <int> struct D +{ + static int f () + { + const int e(2); + const int c(e); + int d[c] = { 0, 0 }; + return d[0] + sizeof d; + } +}; + +int +main (void) +{ + int v = f (); + if (v != 2 * sizeof (int)) + abort (); + if (v != A::f ()) + abort (); + if (v != B<6>::f ()) + abort (); + if (v != C<0>::f ()) + abort (); + if (v != D<1>::f ()) + abort (); +} diff --git a/gcc/testsuite/g++.dg/template/injected1.C b/gcc/testsuite/g++.dg/template/injected1.C new file mode 100644 index 000000000..81873b498 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/injected1.C @@ -0,0 +1,33 @@ +// PR c++/13950, DR 176 + +template <class T> struct Base { }; // { dg-error "" } candidate + +struct D1: Base<void> +{ + D1::Base* p1; + D1::Base<double>* p2; + Base *p3; + Base<double>* p4; +}; + +struct D2: Base<void>, Base<void*> +{ + D2::Base* p1; // { dg-error "" } + D2::Base<double>* p2; + Base *p3; // { dg-error "" } + Base<double>* p4; +}; + +template <class T> +struct D3: Base<T> { + typename D3::Base* p1; + typename D3::template Base<double>* p2; +}; +template struct D3<void>; + +template <class T> +struct D4: Base<T>, Base<T*> { + typename D4::Base* p1; // { dg-error "" } + typename D4::template Base<double>* p2; +}; +template struct D4<void>; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/injected2.C b/gcc/testsuite/g++.dg/template/injected2.C new file mode 100644 index 000000000..bd09ccc35 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/injected2.C @@ -0,0 +1,9 @@ +// DR 1004 + +template <class T, template<class>class U = T::template B> struct A { }; + +template <class T> struct B { + template <class U> friend struct B; +}; + +A<B<int> > a; diff --git a/gcc/testsuite/g++.dg/template/inline1.C b/gcc/testsuite/g++.dg/template/inline1.C new file mode 100644 index 000000000..c7ae1f5ca --- /dev/null +++ b/gcc/testsuite/g++.dg/template/inline1.C @@ -0,0 +1,20 @@ +// { dg-do compile } +// { dg-options "-fno-default-inline -O0" } +// { dg-final { scan-assembler-not "\n_?_ZN1X3FooIiEEvT_\[: \t\n\]" } } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 27 Mar 2003 <nathan@codesourcery.com> + +// PR 10047. bogus warning. + +struct X +{ + template <typename T> static void Foo (T) {} +}; + +extern template void X::Foo<int> (int); // extern, so don't emit it + +int main () { + X::Foo (1); // ok, we've seen the defn +} + diff --git a/gcc/testsuite/g++.dg/template/instantiate1.C b/gcc/testsuite/g++.dg/template/instantiate1.C new file mode 100644 index 000000000..828f2e9c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/instantiate1.C @@ -0,0 +1,21 @@ +// { dg-do compile } +// Origin: + +// PR c++/6716 +// ICE in complex class structure when components are incomplete + +template <class T> struct X { + T t; // { dg-error "incomplete" } +}; + +template <class T> struct Y { + X<T> x; // { dg-message "instantiated" } +}; + +template <class T> struct Z { // { dg-error "declaration" } + Y<Z<T> > y; // { dg-message "instantiated" } +}; + +struct ZZ : Z<int> +{ +}; diff --git a/gcc/testsuite/g++.dg/template/instantiate10.C b/gcc/testsuite/g++.dg/template/instantiate10.C new file mode 100644 index 000000000..678e0194a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/instantiate10.C @@ -0,0 +1,37 @@ +/* PR c++/39242, xplicit instantiation declaration prohibits implicit + instantiation of non-inline functions. */ +/* { dg-do compile } */ +/* { dg-options "-O" } */ + +class Rep { +public: + void unref() const { } + static void unref (const Rep * obj_r) { obj_r->unref(); } +}; +template<typename _Tp, typename _Bt = _Tp> +class RepPtrStore { + _Tp * _obj; + void _assign( _Tp * new_r ); +public: + ~RepPtrStore() { _assign( 0 ); } +}; +template<typename _Tp,typename _Bt> +void RepPtrStore<_Tp,_Bt>::_assign( _Tp * new_r ) +{ + Rep::unref( _obj ); +} +class RepPtrBase { }; +template<typename _Bt> class PtrBase : public RepPtrBase { }; +template<typename _Tp, typename _Bt = _Tp> +class Ptr : public PtrBase<_Bt> { + RepPtrStore<_Tp,_Bt> _ptr; +}; +class YCode; +class YStatement; +typedef Ptr<YStatement,YCode> YStatementPtr; +extern template class RepPtrStore<YStatement,YCode>; +class ExecutionEnvironment { + YStatementPtr m_statement; + ~ExecutionEnvironment() { }; +}; + diff --git a/gcc/testsuite/g++.dg/template/instantiate11.C b/gcc/testsuite/g++.dg/template/instantiate11.C new file mode 100644 index 000000000..3598d5890 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/instantiate11.C @@ -0,0 +1,25 @@ +// PR c++/42608 +// { dg-do compile } + +template <class U, class V> +struct A; + +template <class V> +struct A<int, V> +{ + void f (); +}; + +template struct A<int, int>; + +int +main () +{ + A<int, int> a; + a.f (); + return 0; +} + +// Make sure we get undefined reference error if +// A<int, int>::f () isn't instantiated elsewhere. +// { dg-final { scan-assembler-not "weak\[\n\t\]*_ZN1AIiiE1fEv" } } diff --git a/gcc/testsuite/g++.dg/template/instantiate2.C b/gcc/testsuite/g++.dg/template/instantiate2.C new file mode 100644 index 000000000..a6faf17ae --- /dev/null +++ b/gcc/testsuite/g++.dg/template/instantiate2.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// Origin: Wolfgang Bangerth <wolfgang.bangerth@iwr.uni-heidelberg.de> + +// PR c++/2862 +// Default function argument and template instantiation. + +template <int dim> void f (int=0) {} +template void f<1> (); // { dg-error "not match" } diff --git a/gcc/testsuite/g++.dg/template/instantiate3.C b/gcc/testsuite/g++.dg/template/instantiate3.C new file mode 100644 index 000000000..de3d3a084 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/instantiate3.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// Origin: Scott Snyder <snyder@fnal.gov> + +// PR c++/7639 +// ICE when accessing member with incomplete type. + +class ACE_Null_Mutex; // { dg-error "forward declaration" } + +template <class TYPE> +struct ACE_Cleanup_Adapter +{ + TYPE &object () + { return object_; } // { dg-error "invalid" } + TYPE object_; // { dg-error "incomplete type" } +}; + +template class ACE_Cleanup_Adapter<ACE_Null_Mutex>; // { dg-message "instantiated from here" } diff --git a/gcc/testsuite/g++.dg/template/instantiate4.C b/gcc/testsuite/g++.dg/template/instantiate4.C new file mode 100644 index 000000000..732b8529d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/instantiate4.C @@ -0,0 +1,13 @@ +// { dg-do compile } + +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/10682: Typedef to enum template instantiation logic. + +template <typename T> +struct Foo { + enum E {a,b,c}; + typedef E EE; +}; + +void Baz(Foo<int>::EE x); diff --git a/gcc/testsuite/g++.dg/template/instantiate5.C b/gcc/testsuite/g++.dg/template/instantiate5.C new file mode 100644 index 000000000..e592c65d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/instantiate5.C @@ -0,0 +1,25 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +// PR c++/11616: Incorrect line number in diagnostics + +template <int> struct A +{ + static const int i=0; +}; + +int baz() { return A<0>::i; } + +struct B +{ + static void foo (int); // { dg-message "B::foo|candidate expects" } +}; + +template <typename T> struct C +{ + virtual void bar() const { T::foo(); } // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 21 } +}; + +C<B> c; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/instantiate6.C b/gcc/testsuite/g++.dg/template/instantiate6.C new file mode 100644 index 000000000..d5d712ee0 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/instantiate6.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Origin: gianni@mariani.ws +// Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/13289: ICE recursively instantiate static member data. + +template <int N> struct S { + static const int C; +}; + +template <int N> +const int S<N>::C = S<(N+1)%2>::C; + +template struct S<1>; + diff --git a/gcc/testsuite/g++.dg/template/instantiate7.C b/gcc/testsuite/g++.dg/template/instantiate7.C new file mode 100644 index 000000000..2e54106ff --- /dev/null +++ b/gcc/testsuite/g++.dg/template/instantiate7.C @@ -0,0 +1,10 @@ +// PR c++/19498 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } + +template<typename T> struct A +{ + template<T&> struct B; // { dg-error "reference to void" } +}; + +A<void> a; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/instantiate8.C b/gcc/testsuite/g++.dg/template/instantiate8.C new file mode 100644 index 000000000..9004a86d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/instantiate8.C @@ -0,0 +1,17 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 18 Aug 2005 <nathan@codesourcery.com> + +// PR 22044: ICE +// Origin: Andrew Pinski <pinskia@gcc.gnu.org> + +struct no_context { + template< class Event > void no_function( const Event & ); +}; +template< class Event, class TransitionContext = no_context, +void ( TransitionContext::*pTransitionAction )( const Event & ) = &no_context::no_function< Event > > +struct transition +{ + struct EvFlipBit {}; + typedef transition<EvFlipBit> type; +}; + diff --git a/gcc/testsuite/g++.dg/template/instantiate9.C b/gcc/testsuite/g++.dg/template/instantiate9.C new file mode 100644 index 000000000..33f1d6018 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/instantiate9.C @@ -0,0 +1,15 @@ +/* PR c++/14622. The invalid explicit instantiation was not reported. */ +/* { dg-do compile } */ +template<class T> +class A +{ + static T a; +}; + +template<class T> +T A<T>::a; + +struct B {}; + +template B A<int>::a; /* { dg-error "does not match declared type" } */ +template float A<float>::a; diff --git a/gcc/testsuite/g++.dg/template/invalid1.C b/gcc/testsuite/g++.dg/template/invalid1.C new file mode 100644 index 000000000..d2fcca6d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/invalid1.C @@ -0,0 +1,8 @@ +// PR c++/14883 +// { dg-options "-std=gnu++98" } + +template < class T > struct DomainTraits {}; +template < int Dim > class Interval; +template < class DT > class Domain {}; +template <> class Interval < 1 >:public Domain < DomainTraits < Interval < 1 > +>> {}; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/template/koenig1.C b/gcc/testsuite/g++.dg/template/koenig1.C new file mode 100644 index 000000000..850d38828 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/koenig1.C @@ -0,0 +1,8 @@ +namespace NS { + struct C {}; + void foo(C); +} + +template <class T> void bar() { T t; foo (t); } + +template void bar<NS::C> (); diff --git a/gcc/testsuite/g++.dg/template/koenig2.C b/gcc/testsuite/g++.dg/template/koenig2.C new file mode 100644 index 000000000..be072a4a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/koenig2.C @@ -0,0 +1,25 @@ +namespace nsp_foo { + + struct A {}; + + struct foo {}; + +} + +namespace nsp_bar { + + void foo(nsp_foo::A) {} + + template <class T> + void bar(T t) + { + nsp_bar::foo(t); // line 16 + } + +} + +int main() +{ + nsp_bar::bar(nsp_foo::A()); +} + diff --git a/gcc/testsuite/g++.dg/template/koenig3.C b/gcc/testsuite/g++.dg/template/koenig3.C new file mode 100644 index 000000000..f90059d65 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/koenig3.C @@ -0,0 +1,28 @@ +// PR c++/13157 + +namespace aa +{ + double abs(double); + long double abs(long double); +} + +namespace fu +{ + template <class T> + struct X + {}; + + template <class T> + X<T> test(X<T> x) + { + using ::aa::abs; + return abs(x); + } + + template <class T> + X<T> abs(X<T>); + + X<int> x; + X<int> z = test(x); +} + diff --git a/gcc/testsuite/g++.dg/template/koenig4.C b/gcc/testsuite/g++.dg/template/koenig4.C new file mode 100644 index 000000000..31e41fcf9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/koenig4.C @@ -0,0 +1,12 @@ +// PR c++/13978 + +namespace ns { + template <class TP> void func1(TP* t); + struct A {}; +} + +template < class TP > +void func2() { + func1( new ns::A() ); +} + diff --git a/gcc/testsuite/g++.dg/template/koenig5.C b/gcc/testsuite/g++.dg/template/koenig5.C new file mode 100644 index 000000000..d54bb7543 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/koenig5.C @@ -0,0 +1,32 @@ +// { dg-do compile } +// Contributed by David Abrahams <dave at boost-consulting dot com> +// PR c++/14143: Koenig lookup should only look into template arguments only +// if the argument is a template-id. + +namespace fu +{ + template <class T> + struct bar + { + struct baz {}; + }; +} + +namespace axe +{ + struct handle {}; + + template <class T> + char* f(T&); +} + +namespace test +{ + template <class T> + int f(T const&); + + template <class T> + int g(T x) { return f(x); } + + int x = g(fu::bar<axe::handle>::baz()); +} diff --git a/gcc/testsuite/g++.dg/template/koenig6.C b/gcc/testsuite/g++.dg/template/koenig6.C new file mode 100644 index 000000000..8f93a653a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/koenig6.C @@ -0,0 +1,29 @@ +// PR c++/38850 + +template <typename VType> +class Vector2 { + private: + VType c_[2]; + public: + typedef Vector2<VType> Self; + + Vector2(const VType x, const VType y) { + c_[0] = x; + c_[1] = y; + } + + friend inline Self Max(const Self &v1, const Self &v2) { + return Self(v1.c_[0], v1.c_[1]); + } +}; + +template <class T> +Vector2<float> foo(T x) { + Vector2<float> y(0,0); + return Max(y, y); +} + +int main() { + foo(3); + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/koenig7.C b/gcc/testsuite/g++.dg/template/koenig7.C new file mode 100644 index 000000000..07f2fcad3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/koenig7.C @@ -0,0 +1,11 @@ +// PR c++/13549 +// We need to do arg-dep lookup for g<T>(j) at instantiation time because +// g<T> is dependent, even though (j) is not; at that point we can find +// g(h). + +template <typename T> int g(int); +class h{}; +template <typename T> int l(){h j; return g<T>(j);} +template <typename T> int g(const h&); +class j{}; +int jj(){return l<j>();} diff --git a/gcc/testsuite/g++.dg/template/koenig8.C b/gcc/testsuite/g++.dg/template/koenig8.C new file mode 100644 index 000000000..5a49a7066 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/koenig8.C @@ -0,0 +1,20 @@ +// PR c++/40740 + +template<class T> +T addsome(T v) { + return v+1; +} + +int addsome(int v) { + return v+2; +} + +int main() { + int i = 0; + if (addsome(i) != 2) + return 1; + if (addsome<>(i) != 1) + return 2; + return 0; +} + diff --git a/gcc/testsuite/g++.dg/template/local1.C b/gcc/testsuite/g++.dg/template/local1.C new file mode 100644 index 000000000..4293aca24 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/local1.C @@ -0,0 +1,25 @@ +// PR c++/4286: We were crashing when trying to set up the class bindings in +// g(), because xref wanted the mangled name, which breaks inside a template. + +// Of course, the offending code is actually ill-formed anyway, so check +// for the error. Also check that it's formatted properly. + +struct A +{ + template<class T> void f(); +}; + +template<class T> void A::f() +{ + struct B + { + void g() {} + static int x; // { dg-error "static.*int A::f\\(\\)::B::x" "" } + }; +} + +int main () +{ + A a; + a.f<int> (); +} diff --git a/gcc/testsuite/g++.dg/template/local2.C b/gcc/testsuite/g++.dg/template/local2.C new file mode 100644 index 000000000..51c946a5a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/local2.C @@ -0,0 +1,61 @@ +template<typename T> +struct X { + double & f (const unsigned int i, + const unsigned int j); + void g (X &M); +}; + +template <typename T> +void X<T>::g (X &x) { + double t14 = x.f(0,0)*x.f(1,1); + double t15 = x.f(2,2)*x.f(3,3); + double t17 = x.f(2,3)*x.f(3,2); + double t19 = x.f(0,0)*x.f(2,1); + double t20 = x.f(1,2)*x.f(3,3); + double t22 = x.f(1,3)*x.f(3,2); + double t24 = x.f(0,0)*x.f(3,1); + double t25 = x.f(1,2)*x.f(2,3); + double t27 = x.f(1,3)*x.f(2,2); + double t29 = x.f(1,0)*x.f(0,1); + double t32 = x.f(1,0)*x.f(2,1); + double t33 = x.f(0,2)*x.f(3,3); + double t35 = x.f(0,3)*x.f(3,2); + double t37 = x.f(1,0)*x.f(3,1); + double t38 = x.f(0,2)*x.f(2,3); + double t40 = x.f(0,3)*x.f(2,2); + double t42 = t14*t15-t14*t17-t19*t20+t19*t22+ + t24*t25-t24*t27-t29*t15+t29*t17+ + t32*t33-t32*t35-t37*t38+t37*t40; + double t43 = x.f(2,0)*x.f(0,1); + double t46 = x.f(2,0)*x.f(1,1); + double t49 = x.f(2,0)*x.f(3,1); + double t50 = x.f(0,2)*x.f(1,3); + double t52 = x.f(0,3)*x.f(1,2); + double t54 = x.f(3,0)*x.f(0,1); + double t57 = x.f(3,0)*x.f(1,1); + double t60 = x.f(3,0)*x.f(2,1); + double t63 = t43*t20-t43*t22-t46*t33+t46*t35+ + t49*t50-t49*t52-t54*t25+t54*t27+ + t57*t38-t57*t40-t60*t50+t60*t52; + double t65 = 1/(t42+t63); + double t71 = x.f(0,2)*x.f(2,1); + double t73 = x.f(0,3)*x.f(2,1); + double t75 = x.f(0,2)*x.f(3,1); + double t77 = x.f(0,3)*x.f(3,1); + double t81 = x.f(0,1)*x.f(1,2); + double t83 = x.f(0,1)*x.f(1,3); + double t85 = x.f(0,2)*x.f(1,1); + double t87 = x.f(0,3)*x.f(1,1); + double t101 = x.f(1,0)*x.f(2,2); + double t103 = x.f(1,0)*x.f(2,3); + double t105 = x.f(2,0)*x.f(1,2); + double t107 = x.f(2,0)*x.f(1,3); + double t109 = x.f(3,0)*x.f(1,2); + double t111 = x.f(3,0)*x.f(1,3); + double t115 = x.f(0,0)*x.f(2,2); + double t117 = x.f(0,0)*x.f(2,3); + double t119 = x.f(2,0)*x.f(0,2); + double t121 = x.f(2,0)*x.f(0,3); +} + +template void X<double>::g (X<double>&); diff --git a/gcc/testsuite/g++.dg/template/local3.C b/gcc/testsuite/g++.dg/template/local3.C new file mode 100644 index 000000000..5a01a4495 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/local3.C @@ -0,0 +1,14 @@ + template<class T> + void f(const T&) + { + struct B { + + void g (T); + }; + B b; + } + void g() + { + f(42); + } + diff --git a/gcc/testsuite/g++.dg/template/local4.C b/gcc/testsuite/g++.dg/template/local4.C new file mode 100644 index 000000000..9a03c9a7b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/local4.C @@ -0,0 +1,10 @@ +// PR c++/17413 +// { dg-options -std=c++98 } + +template <typename T> void foo() {} // { dg-message "note" } + +int main () { + struct S {}; + foo<S> (); // { dg-error "match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 8 } +} diff --git a/gcc/testsuite/g++.dg/template/local5.C b/gcc/testsuite/g++.dg/template/local5.C new file mode 100644 index 000000000..705dca39e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/local5.C @@ -0,0 +1,12 @@ +struct Attribute { }; + +template <class T> bool operator == (const Attribute &attr, const T &value); + +enum { + anon = 123 +}; + +void test(int foo) +{ + if (foo == anon) ; /* { dg-bogus "anonymous type" } */ +} diff --git a/gcc/testsuite/g++.dg/template/local6.C b/gcc/testsuite/g++.dg/template/local6.C new file mode 100644 index 000000000..4a87177c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/local6.C @@ -0,0 +1,20 @@ +template <class T> struct PCVector2 // { dg-message "note" } +{ + template <class T2> PCVector2(const PCVector2<T> &cv) ; // { dg-message "note" } + + PCVector2<T> operator- (const PCVector2<T> &ov) const + { + return PCVector2<T>(ov.xFIELD, ov.yFIELD); // { dg-error "matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 7 } + } + + T xFIELD, yFIELD; +}; + +void findIntersection( PCVector2<double>& p0, PCVector2<double>& p1); + + +void findIntersection( PCVector2<double>& p0, PCVector2<double>& p1) +{ + PCVector2<double> e = p1 - p0; // { dg-message "instantiated" } +} diff --git a/gcc/testsuite/g++.dg/template/lookup1.C b/gcc/testsuite/g++.dg/template/lookup1.C new file mode 100644 index 000000000..0df77bac1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/lookup1.C @@ -0,0 +1,17 @@ +template <class T0> +class A { +public: + class B; +}; + +template <class T0> +class A<T0>::B { +public: + class C; +}; + +template <class T0> +class A<T0>::B::C { +public: + A<T0> &a; +}; diff --git a/gcc/testsuite/g++.dg/template/lookup2.C b/gcc/testsuite/g++.dg/template/lookup2.C new file mode 100644 index 000000000..15ab35268 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/lookup2.C @@ -0,0 +1,18 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 27 Mar 2003 <nathan@codesourcery.com> + +// PR 11617: Failed to diagnose missing function. + +struct B {}; + +template <typename T> void Bar () +{ + T::foo (); // { dg-error "is not a member of" "" } +} + +void Foo () +{ + Bar<B> (); // { dg-message "instantiated" "" } +} diff --git a/gcc/testsuite/g++.dg/template/lookup3.C b/gcc/testsuite/g++.dg/template/lookup3.C new file mode 100644 index 000000000..c96a0b0b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/lookup3.C @@ -0,0 +1,16 @@ +// PR c++/12397 + +struct foo { }; + +template <typename T> struct bar +{ + bar(){} + int i; + bar (const bar<T>& foo) : i (foo.i) {} +}; + +int main() +{ + bar<int> b1; + bar<int> b2(b1); +} diff --git a/gcc/testsuite/g++.dg/template/lookup4.C b/gcc/testsuite/g++.dg/template/lookup4.C new file mode 100644 index 000000000..3bd73a34e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/lookup4.C @@ -0,0 +1,6 @@ +// PR c++/13950 + +template <class T> struct Base {}; +template <class T> struct Derived: public Base<T> { + typename Derived::template Base<double>* p1; +}; diff --git a/gcc/testsuite/g++.dg/template/lookup5.C b/gcc/testsuite/g++.dg/template/lookup5.C new file mode 100644 index 000000000..022202a71 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/lookup5.C @@ -0,0 +1,17 @@ +// PR c++/13925 + +namespace N { + template <class T> void f(T); + + namespace M { + class A { + friend void f<int>(int); + }; + } + + template <class T> void f(T) {} + template <> void f<int>(int ) + { + f<long>(0); + } +} diff --git a/gcc/testsuite/g++.dg/template/lookup6.C b/gcc/testsuite/g++.dg/template/lookup6.C new file mode 100644 index 000000000..2ca6dcc75 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/lookup6.C @@ -0,0 +1,11 @@ +struct S +{ + template<typename T> static void g(); +}; + +template<typename T> +void f() { return S::template g<T>(); } + +void g() { + f<int>(); +} diff --git a/gcc/testsuite/g++.dg/template/lookup7.C b/gcc/testsuite/g++.dg/template/lookup7.C new file mode 100644 index 000000000..0e05c5f75 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/lookup7.C @@ -0,0 +1,9 @@ +class S; + +template<class T> +int f(T, S); + +class S { + template<class T> + friend int f(T t, S) { t; return 0; } +}; diff --git a/gcc/testsuite/g++.dg/template/lookup8.C b/gcc/testsuite/g++.dg/template/lookup8.C new file mode 100644 index 000000000..981c283e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/lookup8.C @@ -0,0 +1,19 @@ +// PR c++/38030 +// The call to f should be resolved at template definition time. +// { dg-do link } + +struct B { }; +struct D : public B { }; +D d; +void f (B &) { } +template < class T > +void g () +{ + return f (d); +} +void f (D &); +int main () +{ + g<int> (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/lvalue1.C b/gcc/testsuite/g++.dg/template/lvalue1.C new file mode 100644 index 000000000..9def2a18c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/lvalue1.C @@ -0,0 +1,31 @@ +// PR c++/38877 + +template<class _T1, class _T2> +struct pair +{ + typedef _T1 first_type; + typedef _T2 second_type; + _T1 first; + _T2 second; + pair () : first(), second() { } + pair(const _T1& __a, const _T2& __b) + : first(__a), second(__b) { } +}; + +template<class _T1, class _T2> +inline pair<_T1, _T2> +make_pair(_T1 __x, _T2 __y) +{ + return pair<_T1, _T2>(__x, __y); +} + +template <int dim> class bar; + +template <int dim> +pair<bar<dim> *, unsigned int> +foo (unsigned int position) +{ + const pair<int,unsigned int> tmp; + return make_pair (new bar<dim>(tmp.first), + position); + } diff --git a/gcc/testsuite/g++.dg/template/mangle1.C b/gcc/testsuite/g++.dg/template/mangle1.C new file mode 100644 index 000000000..96d064723 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/mangle1.C @@ -0,0 +1,16 @@ +// PR c++/17324 +// { dg-do assemble } + +template<int, typename T> struct A +{ + template<int I> void foo(const A<I,T>&) {} +}; + +template<typename> struct B +{ + template<int J> void bar(const A<J,B>&); + void baz() { A<0,B>().foo(A<0,B>()); } +}; + +template struct B<void>; +template struct B<int>; diff --git a/gcc/testsuite/g++.dg/template/mem-partial1.C b/gcc/testsuite/g++.dg/template/mem-partial1.C new file mode 100644 index 000000000..60cb36aea --- /dev/null +++ b/gcc/testsuite/g++.dg/template/mem-partial1.C @@ -0,0 +1,15 @@ +// PR c++/14032 + +template <typename T> struct outer { + template <typename T2, typename U> + struct inner { + static int f() { return inner<T,int>::N; }; + }; + + template <typename U> + struct inner<T,U> { + static const int N = 1; + }; +}; + +int i = outer<int>::inner<double,int>::f(); diff --git a/gcc/testsuite/g++.dg/template/mem-partial2.C b/gcc/testsuite/g++.dg/template/mem-partial2.C new file mode 100644 index 000000000..fba325519 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/mem-partial2.C @@ -0,0 +1,29 @@ +// PR c++/14032 +// { dg-do run } + +template <bool compare> +struct outer +{ + template <bool compare_with,bool second> + struct inner // unspecialized compare != compare_with + { + static inline bool test() + { + return false; + } + }; + template <bool second> // specialization compare == compare_with + struct inner<compare,second> + { + static inline bool test() + { + return true; + } + }; +}; +int main () +{ + bool b = outer<true>::inner<true,false>::test(); + + return b != true; +} diff --git a/gcc/testsuite/g++.dg/template/mem-partial3.C b/gcc/testsuite/g++.dg/template/mem-partial3.C new file mode 100644 index 000000000..bea6cd396 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/mem-partial3.C @@ -0,0 +1,29 @@ +// PR c++/33342 + +template <bool B, class T = void> +struct enable_if_c { + typedef T type; +}; + +template <class T> +struct A +{ + template <class U, class V> + struct B; + + template <class U> + struct B<U, typename enable_if_c<U::sub::value==0>::type> + { }; +}; + +struct C +{ + struct sub + { + static const int value = 0; + }; +}; + + +A<int> a; +A<int>::B<C, void> b; diff --git a/gcc/testsuite/g++.dg/template/mem_func_ptr.C b/gcc/testsuite/g++.dg/template/mem_func_ptr.C new file mode 100644 index 000000000..7d912e2ad --- /dev/null +++ b/gcc/testsuite/g++.dg/template/mem_func_ptr.C @@ -0,0 +1,57 @@ +// { dg-do compile } +template<typename T> struct takes_member_ptr; +template<typename T, typename Klasse> struct takes_member_ptr<T Klasse::*> {}; + +template<typename T, typename Klasse> +void fun_takes_member_ptr(T Klasse::*) {} + + +template<typename T> struct order_member_ptrs; +template<typename T, typename Klasse> struct order_member_ptrs<T Klasse::*> {}; +template<typename R, typename T1, typename Klasse> + struct order_member_ptrs<R (Klasse::*)(T1)> + { + typedef int type; + }; + +template<typename R, typename T1, typename Klasse> + struct order_member_ptrs<R (Klasse::*)(T1) const> + { + typedef int c_type; + }; + +template<typename R, typename T1, typename Klasse> + struct order_member_ptrs<R (Klasse::*)(T1) volatile> + { + typedef int v_type; + }; + +template<typename R, typename T1, typename Klasse> + struct order_member_ptrs<R (Klasse::*)(T1) const volatile> + { + typedef int cv_type; + }; + + +struct X { + void bar(float) {} + void bar_c(float) const {} + void bar_v(float) volatile {} + void bar_cv(float) const volatile {} +}; + +void foo() +{ + sizeof(takes_member_ptr<void (X::*)(float)>); + sizeof(takes_member_ptr<void (X::*)(float) const>); + sizeof(takes_member_ptr<void (X::*)(float) volatile>); + sizeof(takes_member_ptr<void (X::*)(float) const volatile>); + sizeof(order_member_ptrs<void (X::*)(float)>::type); + sizeof(order_member_ptrs<void (X::*)(float) const>::c_type); + sizeof(order_member_ptrs<void (X::*)(float) volatile>::v_type); + sizeof(order_member_ptrs<void (X::*)(float) const volatile>::cv_type); + fun_takes_member_ptr(&X::bar); + fun_takes_member_ptr(&X::bar_c); + fun_takes_member_ptr(&X::bar_v); + fun_takes_member_ptr(&X::bar_cv); +} diff --git a/gcc/testsuite/g++.dg/template/member.C b/gcc/testsuite/g++.dg/template/member.C new file mode 100644 index 000000000..69228334f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/member.C @@ -0,0 +1,28 @@ +// { dg-do compile } + + +class BIXSet{ +int z[4]; +public: +void f(BIXSet &other){ +z[0]=other.z[0]; +} + +}; + +class TestCase2{ +public: +BIXSet a,b; + +public: +void run(void){ +BIXSet x,y; +process(0,x,y); +} + +protected: +template<class BS> void process(const int d,BS &en,BS &lb){ +a.f(en);b.f(lb); +} + +}; diff --git a/gcc/testsuite/g++.dg/template/member2.C b/gcc/testsuite/g++.dg/template/member2.C new file mode 100644 index 000000000..372c778a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/member2.C @@ -0,0 +1,13 @@ +// PR c++/8660 +// Bug: we were treating the definition of the non-template as a definition +// of the template, which broke. + +struct BadgerBuf +{ + void ReadPod(); + template<class B> + void ReadPod(); +}; + +void BadgerBuf::ReadPod () + { ReadPod<int> (); } diff --git a/gcc/testsuite/g++.dg/template/member3.C b/gcc/testsuite/g++.dg/template/member3.C new file mode 100644 index 000000000..4f87e57bc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/member3.C @@ -0,0 +1,19 @@ +template<typename T> +struct A { + template<typename L> struct SubA { }; + + template<typename T1,typename L> void f(T1 & t1, SubA<L> & t2) { } + template<typename U> void g(SubA<U> & suba) { } + template<typename U> void h(SubA<U> & suba) { } +}; + +int main(void) { + int i; + A<int> a; + A<int>::SubA<int> suba; + + a.f(i,suba); + a.g(suba); + a.h(suba); +} + diff --git a/gcc/testsuite/g++.dg/template/member4.C b/gcc/testsuite/g++.dg/template/member4.C new file mode 100644 index 000000000..290fbb566 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/member4.C @@ -0,0 +1,20 @@ +// { dg-do compile } +// Contributed by Matty T. <mattyt-bugzilla at tpg dot com dot au> +// PR c++/13813 [DR206]: Check semantic constraints of members of +// non-dependent type at instantiation time. + + +// DR206 explains that this is ill-formed, no diagnostic required. We emit +// a diagnostic instead. +class E; +template < class A > class Z { + A a; + E e; // { dg-error "incomplete type" } +}; + + +// Nested classes are always dependent names. +template < class A > class Y { + class F; + F e; // { dg-bogus "" "nested classes are always dependent, see DR108 and DR224" } +}; diff --git a/gcc/testsuite/g++.dg/template/member5.C b/gcc/testsuite/g++.dg/template/member5.C new file mode 100644 index 000000000..ba6a9705b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/member5.C @@ -0,0 +1,33 @@ +// { dg-do compile } +// Contributed by: <fasbjx at free dot fr> +// PR c++/14389: Disambiguate overloaded member templates which differ only +// in the template argument list. + +namespace N1 { + +struct S { + template< typename B, typename A > void foo(); + template< typename A > void foo(); +}; + +template< typename A > void S::foo() {} +template< typename B, typename A > void S::foo() {} + +template void S::foo<void> (); +template void S::foo<void,void> (); + +} + +namespace N2 { + +struct S { + template< typename _A > void foo(); + template< int _i > void foo(); +}; + +template< typename _A > void S::foo() {} + +template void S::foo< 0 >(); // { dg-error "no definition available" "no def" } + // { dg-message "instantiated" "instantiated" { target *-*-* } 30 } + +} diff --git a/gcc/testsuite/g++.dg/template/member6.C b/gcc/testsuite/g++.dg/template/member6.C new file mode 100644 index 000000000..7d66e7bda --- /dev/null +++ b/gcc/testsuite/g++.dg/template/member6.C @@ -0,0 +1,16 @@ +// PR c++/29105 + +struct Observer +{ + template < typename T > void observeComponent (); +}; + +template < typename T > +struct TagFilter : Observer +{ + TagFilter () + { + observeComponent < int > (); + } +}; + diff --git a/gcc/testsuite/g++.dg/template/member7.C b/gcc/testsuite/g++.dg/template/member7.C new file mode 100644 index 000000000..1c75e4956 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/member7.C @@ -0,0 +1,15 @@ +// PR c++/29080 + +struct Base { + template<class C> void method() { } +}; + +struct Left : public Base { }; +struct Right : public Base { }; +struct Join : public Left, public Right { }; + +void function() +{ + Join join; + join.Left::method<int>(); +} diff --git a/gcc/testsuite/g++.dg/template/member8.C b/gcc/testsuite/g++.dg/template/member8.C new file mode 100644 index 000000000..074c65543 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/member8.C @@ -0,0 +1,25 @@ +// PR c++/35138 +// { dg-do compile } + +namespace N1 { struct A { }; } +namespace N2 { struct A { }; } +using namespace N1; +using namespace N2; + +template <typename T> int +foo (T const &t) +{ + return t.A; +} + +struct B +{ + int A; +}; + +int +main () +{ + B b; + foo (b); +} diff --git a/gcc/testsuite/g++.dg/template/member9.C b/gcc/testsuite/g++.dg/template/member9.C new file mode 100644 index 000000000..f15272db7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/member9.C @@ -0,0 +1,21 @@ +// Origin PR c++/48838 +// { dg-do compile } + +class DUChainItemSystem +{ +public: + + template<class T> + void registerTypeClass(); + + static DUChainItemSystem& self(); +}; + +template<class T> +struct DUChainItemRegistrator +{ + DUChainItemRegistrator() + { + DUChainItemSystem::self().registerTypeClass<T>(); + } +}; diff --git a/gcc/testsuite/g++.dg/template/memclass1.C b/gcc/testsuite/g++.dg/template/memclass1.C new file mode 100644 index 000000000..c49ed724d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memclass1.C @@ -0,0 +1,18 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> + +// PR c++/10555: ICE for member class template when one of the +// template argument levels contains errors. + +template <typename> struct A +{ + template <typename> struct B; +}; + +template <typename T> struct C +{ + typedef typename A<T>::template B<U> X; // { dg-error "declared|invalid" } +}; + +C<void> c; diff --git a/gcc/testsuite/g++.dg/template/memclass2.C b/gcc/testsuite/g++.dg/template/memclass2.C new file mode 100644 index 000000000..da79d6afe --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memclass2.C @@ -0,0 +1,20 @@ +namespace ns { + template<typename T> + struct Foo { + template<typename U> struct Bar; + }; + + template<typename T> + template<typename U> + struct Foo<T>::Bar { + template<typename V> struct Baz; + }; + + template<typename T> + template<typename U> + template<typename V> + struct Foo<T>::Bar<U>::Baz { + Foo<T> chokes; + ns::Foo<T> works; + }; +} diff --git a/gcc/testsuite/g++.dg/template/memclass3.C b/gcc/testsuite/g++.dg/template/memclass3.C new file mode 100644 index 000000000..8230b94e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memclass3.C @@ -0,0 +1,39 @@ +// PR c++/17132 + +template <typename T> +struct has_deref +{ + struct impl + { + template < + typename Type, + typename Type::reference (Type::*Func)(void) const> + struct func_tag; + + template <typename Type> + static char (& test( + Type *, + func_tag<Type, &Type::operator*> * = 0 + ))[2]; + static char test(void *); + }; + + static const bool value = (sizeof(impl::test((T *) 0)) == 2); +}; + +template <typename T> +struct container +{ + struct iterator + { + typedef T & reference; + reference operator*() const; + }; +}; + +int main() +{ + typedef container<int>::iterator iter; + int result = has_deref<iter>::value; + return result; +} diff --git a/gcc/testsuite/g++.dg/template/memclass4.C b/gcc/testsuite/g++.dg/template/memclass4.C new file mode 100644 index 000000000..65a42a4c2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memclass4.C @@ -0,0 +1,70 @@ +// Origin: PR c++/42824 +// { dg-do compile } + +template<int T> +class int_ { +}; + +template<int T, int T2> +class Unit { +public: + Unit(const Unit<T, T2>& other) {} +}; + +template<int T> +class Quan { +public: + Quan(void) {} + + template<int T2> + Quan(double value, Unit<T, T2> unit) {} +}; +typedef Quan<0> Scalar; + +template<int T> +class hlp { +public: + typedef Quan<T> type; +}; + +class Mtrl { +public: + template<int T> + struct AssoType { + typedef typename hlp<T>::type type; + }; +}; + +template<class T> +class Eval { +public: + Eval(const T& object){} + + template<int V> + void eval() { + eval<V> (int_<0>()); + } +private: + template<typename U> struct Wrap {}; + + template<int V, int V2> + void value(Wrap<Quan<V2> >) {} + + template<int V> + void value(Wrap<Scalar>) {} + + template<int V> + void eval(int_<0>) { + typedef typename T::template AssoType<V>::type Type; + value<V>(Wrap<Type>()); + } +}; + +class Foo { +public: + static void eval(const Mtrl& mtrl) { + Eval<Mtrl> h(mtrl); + h.eval<0> (); + } +}; + diff --git a/gcc/testsuite/g++.dg/template/memfriend1.C b/gcc/testsuite/g++.dg/template/memfriend1.C new file mode 100644 index 000000000..f4541279c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memfriend1.C @@ -0,0 +1,54 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + +// Member function of class template as friend + +template<class T> struct A +{ + void f(); +}; + +class C { + int i; + template<class T> friend void A<T>::f(); +}; + +template<class T> struct A<T*> +{ + void f(); +}; + +template<> struct A<char> +{ + void f(); +}; + +template<class T> void A<T>::f() +{ + C c; + c.i = 0; +} + +template<class T> void A<T*>::f() +{ + C c; + c.i = 0; +} + +void A<char>::f() +{ + C c; + c.i = 0; +} + +int main() +{ + A<int> a1; + a1.f(); + A<int *> a2; + a2.f(); + A<char> a3; + a3.f(); +} diff --git a/gcc/testsuite/g++.dg/template/memfriend10.C b/gcc/testsuite/g++.dg/template/memfriend10.C new file mode 100644 index 000000000..4fe760af2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memfriend10.C @@ -0,0 +1,71 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + +// Nested class template of class template as friend + +template <class T> struct A +{ + template <class U> struct B + { + void f(); + }; +}; + +class C { + int i; + template <class T> template <class U> friend struct A<T>::B; +}; + +template <class T> struct A<T*> +{ + template <class U> struct B + { + void f(); + }; +}; + +template <> struct A<char> +{ + template <class U> struct B + { + void f(); + }; +}; + +template <class T> template <class U> void A<T>::B<U>::f() +{ + C c; + c.i = 0; +} + +template <class T> template <class U> void A<T*>::B<U>::f() +{ + C c; + c.i = 0; +} + +template <class U> void A<char>::B<U>::f() +{ + C c; + c.i = 0; +} + +template <> void A<char>::B<int>::f() +{ + C c; + c.i = 0; +} + +int main() +{ + A<int>::B<int> b1; + b1.f(); + A<int *>::B<int> b2; + b2.f(); + A<char>::B<char> b3; + b3.f(); + A<char>::B<int> b4; + b4.f(); +} diff --git a/gcc/testsuite/g++.dg/template/memfriend11.C b/gcc/testsuite/g++.dg/template/memfriend11.C new file mode 100644 index 000000000..e33e99bdc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memfriend11.C @@ -0,0 +1,73 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + +// Nested class template of class template as friend + +template<class T> struct A +{ + template <T t> struct B + { + void f(); + }; +}; + +class C { + int i; + template<class T> template <T t> friend struct A<T>::B; +}; + +template<class T> struct A<T*> +{ + template <T* t> struct B + { + void f(); + }; +}; + +template<> struct A<char> +{ + template <char t> struct B + { + void f(); + }; +}; + +template<class T> template <T t> void A<T>::B<t>::f() +{ + C c; + c.i = 0; +} + +template<class T> template <T* t> void A<T*>::B<t>::f() +{ + C c; + c.i = 0; +} + +template <char t> void A<char>::B<t>::f() +{ + C c; + c.i = 0; +} + +template <> void A<char>::B<'b'>::f() +{ + C c; + c.i = 0; +} + +int d2 = 0; + +int main() +{ + A<int>::B<0> b1; + b1.f(); + A<int *>::B<&d2> b2; + b2.f(); + A<char>::B<'a'> b3; + b3.f(); + A<char>::B<'b'> b4; + b4.f(); +} diff --git a/gcc/testsuite/g++.dg/template/memfriend12.C b/gcc/testsuite/g++.dg/template/memfriend12.C new file mode 100644 index 000000000..77f821400 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memfriend12.C @@ -0,0 +1,63 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + +// Nested class of class template as friend + +template<class T> struct A +{ + struct B + { + void f(); + }; +}; + +template <class U> class C { + int i; + template<class T> friend struct A<T>::B; +}; + +template<class T> struct A<T*> +{ + struct B + { + void f(); + }; +}; + +template<> struct A<char> +{ + struct B + { + void f(); + }; +}; + +template<class T> void A<T>::B::f() +{ + C<int> c; + c.i = 0; +} + +template<class T> void A<T*>::B::f() +{ + C<int> c; + c.i = 0; +} + +void A<char>::B::f() +{ + C<int> c; + c.i = 0; +} + +int main() +{ + A<int>::B b1; + b1.f(); + A<int *>::B b2; + b2.f(); + A<char>::B b3; + b3.f(); +} diff --git a/gcc/testsuite/g++.dg/template/memfriend13.C b/gcc/testsuite/g++.dg/template/memfriend13.C new file mode 100644 index 000000000..7faed22a2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memfriend13.C @@ -0,0 +1,71 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + +// Nested class template of class template as friend + +template <class T> struct A +{ + template <class U> struct B + { + void f(); + }; +}; + +template <class V> class C { + int i; + template <class T> template <class U> friend struct A<T>::B; +}; + +template <class T> struct A<T*> +{ + template <class U> struct B + { + void f(); + }; +}; + +template <> struct A<char> +{ + template <class U> struct B + { + void f(); + }; +}; + +template <class T> template <class U> void A<T>::B<U>::f() +{ + C<int> c; + c.i = 0; +} + +template <class T> template <class U> void A<T*>::B<U>::f() +{ + C<int> c; + c.i = 0; +} + +template <class U> void A<char>::B<U>::f() +{ + C<int> c; + c.i = 0; +} + +template <> void A<char>::B<int>::f() +{ + C<int> c; + c.i = 0; +} + +int main() +{ + A<int>::B<int> b1; + b1.f(); + A<int *>::B<int> b2; + b2.f(); + A<char>::B<char> b3; + b3.f(); + A<char>::B<int> b4; + b4.f(); +} diff --git a/gcc/testsuite/g++.dg/template/memfriend14.C b/gcc/testsuite/g++.dg/template/memfriend14.C new file mode 100644 index 000000000..298c55811 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memfriend14.C @@ -0,0 +1,73 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + +// Nested class template of class template as friend + +template<class T> struct A +{ + template <T t> struct B + { + void f(); + }; +}; + +template <class U> class C { + int i; + template<class T> template <T t> friend struct A<T>::B; +}; + +template<class T> struct A<T*> +{ + template <T* t> struct B + { + void f(); + }; +}; + +template<> struct A<char> +{ + template <char t> struct B + { + void f(); + }; +}; + +template<class T> template <T t> void A<T>::B<t>::f() +{ + C<int> c; + c.i = 0; +} + +template<class T> template <T* t> void A<T*>::B<t>::f() +{ + C<int> c; + c.i = 0; +} + +template <char t> void A<char>::B<t>::f() +{ + C<int> c; + c.i = 0; +} + +template <> void A<char>::B<'b'>::f() +{ + C<int> c; + c.i = 0; +} + +int d2 = 0; + +int main() +{ + A<int>::B<0> b1; + b1.f(); + A<int *>::B<&d2> b2; + b2.f(); + A<char>::B<'a'> b3; + b3.f(); + A<char>::B<'b'> b4; + b4.f(); +} diff --git a/gcc/testsuite/g++.dg/template/memfriend15.C b/gcc/testsuite/g++.dg/template/memfriend15.C new file mode 100644 index 000000000..c12ec4b5a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memfriend15.C @@ -0,0 +1,34 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + +// Nested class of class template as friend + +template<class T> struct A +{ + struct B1 + { + }; + struct B2 + { + void f(); + }; +}; + +class C { + int i; // { dg-error "private" } + template<class T> friend struct A<T>::B1; +}; + +template<class T> void A<T>::B2::f() +{ + C c; + c.i = 0; // { dg-error "context" } +} + +int main() +{ + A<int>::B2 b1; + b1.f(); // { dg-message "instantiated" } +} diff --git a/gcc/testsuite/g++.dg/template/memfriend16.C b/gcc/testsuite/g++.dg/template/memfriend16.C new file mode 100644 index 000000000..2827ef3f7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memfriend16.C @@ -0,0 +1,34 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + +// Nested class of class template as friend + +template<class T> struct A +{ + template <class U> struct B1 + { + }; + template <class U> struct B2 + { + void f(); + }; +}; + +class C { + int i; // { dg-error "private" } + template<class T> template <class U> friend struct A<T>::B1; +}; + +template<class T> template <class U> void A<T>::B2<U>::f() +{ + C c; + c.i = 0; // { dg-error "context" } +} + +int main() +{ + A<int>::B2<int> b1; + b1.f(); // { dg-message "instantiated" } +} diff --git a/gcc/testsuite/g++.dg/template/memfriend17.C b/gcc/testsuite/g++.dg/template/memfriend17.C new file mode 100644 index 000000000..5e163fa47 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memfriend17.C @@ -0,0 +1,46 @@ +// { dg-do compile } + +// Origin: Giovanni Bajo <giovannibajo@libero.it> + +// PR c++/13495: Nested class as template friend. + +template<typename T> +class A{ +public: + class B + { + void func1(void); + void func2(void); + }; +}; + +template<typename Q> +class F1 +{ + friend class A<Q>::B; + enum { foo = 0 }; // { dg-error "private" } +}; + +template<typename Q> +class F2 +{ + template<typename T> + friend class A<T>::B; + enum { foo = 0 }; +}; + +template <typename T> +void A<T>::B::func1(void) +{ + (void)F1<T>::foo; + (void)F2<T>::foo; +} + +template <typename T> +void A<T>::B::func2(void) +{ + (void)F1<T*>::foo; // { dg-error "context" } + (void)F2<T*>::foo; +} + +template class A<int>; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/memfriend2.C b/gcc/testsuite/g++.dg/template/memfriend2.C new file mode 100644 index 000000000..364ad7d78 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memfriend2.C @@ -0,0 +1,61 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + +// Member function template of class template as friend + +template <class T> struct A +{ + template <class U> void f(); +}; + +class C { + int i; + template <class T> template <class U> friend void A<T>::f(); +}; + +template <class T> struct A<T*> +{ + template <class U> void f(); +}; + +template <> struct A<char> +{ + template <class U> void f(); +}; + +template <class T> template <class U> void A<T>::f() +{ + C c; + c.i = 0; +} + +template <class T> template <class U> void A<T*>::f() +{ + C c; + c.i = 0; +} + +template <class U> void A<char>::f() +{ + C c; + c.i = 0; +} + +template <> void A<char>::f<int>() +{ + C c; + c.i = 0; +} + +int main() +{ + A<int> a1; + a1.f<char>(); + A<int *> a2; + a2.f<char>(); + A<char> a3; + a3.f<char>(); + a3.f<int>(); +} diff --git a/gcc/testsuite/g++.dg/template/memfriend3.C b/gcc/testsuite/g++.dg/template/memfriend3.C new file mode 100644 index 000000000..3ea8c84cf --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memfriend3.C @@ -0,0 +1,55 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + +// Member function of class template as friend + +template<class T> struct A +{ + void f(T); +}; + +class C { + int i; + template<class T> friend void A<T>::f(T); +}; + +template<class T> struct A<T*> +{ + void f(T*); +}; + +template<> struct A<char> +{ + void f(char); +}; + +template<class T> void A<T>::f(T) +{ + C c; + c.i = 0; +} + +template<class T> void A<T*>::f(T*) +{ + C c; + c.i = 0; +} + +void A<char>::f(char) +{ + C c; + c.i = 0; +} + +int main() +{ + A<int> a1; + a1.f(0); + A<int *> a2; + int *p = 0; + a2.f(p); + A<char> a3; + a3.f('a'); +} diff --git a/gcc/testsuite/g++.dg/template/memfriend4.C b/gcc/testsuite/g++.dg/template/memfriend4.C new file mode 100644 index 000000000..5c006fe84 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memfriend4.C @@ -0,0 +1,63 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + +// Member function of class template as friend + +template<class T> struct A +{ + template <T t> void f(); +}; + +class C { + int i; + template<class T> template <T t> friend void A<T>::f(); +}; + +template<class T> struct A<T*> +{ + template <T* t> void f(); +}; + +template<> struct A<char> +{ + template <char t> void f(); +}; + +template<class T> template <T t> void A<T>::f() +{ + C c; + c.i = 0; +} + +template<class T> template <T* t> void A<T*>::f() +{ + C c; + c.i = 0; +} + +template <char t> void A<char>::f() +{ + C c; + c.i = 0; +} + +template <> void A<char>::f<'b'>() +{ + C c; + c.i = 0; +} + +int d2 = 0; + +int main() +{ + A<int> a1; + a1.f<0>(); + A<int *> a2; + a2.f<&d2>(); + A<char> a3; + a3.f<'a'>(); + a3.f<'b'>(); +} diff --git a/gcc/testsuite/g++.dg/template/memfriend5.C b/gcc/testsuite/g++.dg/template/memfriend5.C new file mode 100644 index 000000000..38c2fb93f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memfriend5.C @@ -0,0 +1,31 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + +// Member template function of member class template as friend + +template <class T> struct A { + template <class U> struct B { + template <class V> void f(V); + }; +}; + +class X { + int i; + template <class T> template <class U> template <class V> + friend void A<T>::B<U>::f(V); +}; + +template <class T> template <class U> template <class V> + void A<T>::B<U>::f(V) +{ + X x; + x.i = 0; +} + +int main() +{ + A<char>::B<char> a1; + a1.f(0); +} diff --git a/gcc/testsuite/g++.dg/template/memfriend6.C b/gcc/testsuite/g++.dg/template/memfriend6.C new file mode 100644 index 000000000..5f82339af --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memfriend6.C @@ -0,0 +1,23 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + +// Member function of class template as friend +// Erroneous case: mismatch during declaration + +template <class T> struct A { + template <class U> void f(U); // { dg-error "candidate" } + void g(); // { dg-error "candidate|with" } + void h(); // { dg-error "candidate|with" } + void i(int); // { dg-error "candidate" } +}; + +class C { + int ii; + template <class U> friend void A<U>::f(U); // { dg-error "not match" } + template <class U> template <class V> + friend void A<U>::g(); // { dg-error "not match|cannot be overloaded" } + template <class U> friend int A<U>::h(); // { dg-error "not match|cannot be overloaded" } + template <class U> friend void A<U>::i(char); // { dg-error "not match" } +}; diff --git a/gcc/testsuite/g++.dg/template/memfriend7.C b/gcc/testsuite/g++.dg/template/memfriend7.C new file mode 100644 index 000000000..1583646c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memfriend7.C @@ -0,0 +1,133 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + +// Member function of class template as friend +// Erroneous case: mismatch during specialization + +template <class T> struct A { + template <class U> void f(U); + void g(); + void h(); + void i(int); + template <T t> void j(); +}; + +class C { + int ii; // { dg-error "private" } + template <class U> template <class V> + friend void A<U>::f(V); + template <class U> friend void A<U>::g(); + template <class U> friend void A<U>::h(); + template <class U> friend void A<U>::i(int); + template <class U> template <U t> + friend void A<U>::j(); +}; + +template <class T> struct A<T*> { + void f(int); + template <class U> void g(); + int h(); + void i(char); + template <int> void j(); +}; + +template <class T> void A<T*>::f(int) +{ + C c; + c.ii = 0; // { dg-error "context" } +} + +template <class T> template <class U> void A<T*>::g() +{ + C c; + c.ii = 0; // { dg-error "context" } +} + +template <class T> int A<T*>::h() +{ + C c; + c.ii = 0; // { dg-error "context" } +} + +template <class T> void A<T*>::i(char) +{ + C c; + c.ii = 0; // { dg-error "context" } +} + +template <class T> template <int> void A<T*>::j() +{ + C c; + c.ii = 0; // { dg-error "context" } +} + +template <> struct A<char> { + void f(int); + template <class U> void g(); + int h(); + void i(char); + template <int> void j(); +}; + +void A<char>::f(int) +{ + C c; + c.ii = 0; // { dg-error "context" } +} + +template <class U> void A<char>::g() +{ + C c; + c.ii = 0; // { dg-error "context" } +} + +template <> void A<char>::g<int>() +{ + C c; + c.ii = 0; // { dg-error "context" } +} + +int A<char>::h() +{ + C c; + c.ii = 0; // { dg-error "context" } +} + +void A<char>::i(char) +{ + C c; + c.ii = 0; // { dg-error "context" } +} + +template <int> void A<char>::j() +{ + C c; + c.ii = 0; // { dg-error "context" } +} + +template <> void A<char>::j<0>() +{ + C c; + c.ii = 0; // { dg-error "context" } +} + +int main() +{ + A<int *> a1; + a1.f(0); // { dg-message "instantiated" } + a1.g<char>(); // { dg-message "instantiated" } + a1.g<int>(); // { dg-message "instantiated" } + a1.h(); // { dg-message "instantiated" } + a1.i('a'); // { dg-message "instantiated" } + a1.j<1>(); // { dg-message "instantiated" } + A<char> a2; + a2.f(0); + a2.g<char>(); // { dg-message "instantiated" } + a2.g<int>(); + a2.h(); + a2.i('a'); + a2.j<1>(); // { dg-message "instantiated" } + a2.j<0>(); +} diff --git a/gcc/testsuite/g++.dg/template/memfriend8.C b/gcc/testsuite/g++.dg/template/memfriend8.C new file mode 100644 index 000000000..886096b9d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memfriend8.C @@ -0,0 +1,25 @@ +// { dg-do compile } + +// Origin: Martin Sebor <sebor@roguewave.com> + +// PR c++/5369: Member function of class template as friend + +template <class T> +struct S +{ + int foo () { + return S<int>::bar (); + } + +private: + + template <class U> + friend int S<U>::foo (); + + static int bar () { return 0; } +}; + +int main () +{ + S<char>().foo (); +} diff --git a/gcc/testsuite/g++.dg/template/memfriend9.C b/gcc/testsuite/g++.dg/template/memfriend9.C new file mode 100644 index 000000000..9c926013b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memfriend9.C @@ -0,0 +1,63 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + +// Nested class of class template as friend + +template<class T> struct A +{ + struct B + { + void f(); + }; +}; + +class C { + int i; + template<class T> friend struct A<T>::B; +}; + +template<class T> struct A<T*> +{ + struct B + { + void f(); + }; +}; + +template<> struct A<char> +{ + struct B + { + void f(); + }; +}; + +template<class T> void A<T>::B::f() +{ + C c; + c.i = 0; +} + +template<class T> void A<T*>::B::f() +{ + C c; + c.i = 0; +} + +void A<char>::B::f() +{ + C c; + c.i = 0; +} + +int main() +{ + A<int>::B b1; + b1.f(); + A<int *>::B b2; + b2.f(); + A<char>::B b3; + b3.f(); +} diff --git a/gcc/testsuite/g++.dg/template/meminit1.C b/gcc/testsuite/g++.dg/template/meminit1.C new file mode 100644 index 000000000..6fd024a26 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/meminit1.C @@ -0,0 +1,8 @@ +// { dg-options "-std=gnu++98" } +template <class T > +struct S +{ + S() : S() {} // { dg-error "base" } +}; + +S<int> s; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/meminit2.C b/gcc/testsuite/g++.dg/template/meminit2.C new file mode 100644 index 000000000..f6afa0151 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/meminit2.C @@ -0,0 +1,21 @@ +// { dg-do compile } +// Origin: Mark Anders <mark dot a dot anders at intel dot com> +// PR c++/15503: disambiguators in base classes and mem-initializers + +template <typename K1> struct O { + template <typename K2> struct I {}; +}; + +template <typename T> +struct A : typename O<T>::template I<int> { // { dg-error "keyword 'typename' not allowed" } + A() : typename O<T>::template I<int>() // { dg-error "keyword 'typename' not allowed" } + {} +}; + +template <typename T> +struct B : O<T>::template I<int> { + B() : O<T>::I<int>() // { dg-error "used as template|it is a template" "" } + {} +}; + +// { dg-bogus "end of input" "bogus token skipping in the parser" { xfail *-*-* } 17 } diff --git a/gcc/testsuite/g++.dg/template/memtmpl1.C b/gcc/testsuite/g++.dg/template/memtmpl1.C new file mode 100644 index 000000000..260dbf8dc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memtmpl1.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Jul 2003 <nathan@codesourcery.com> + +// PR 11347. ICE in tsubst + +template <class T> struct T1 { + enum {N}; +}; + +template<class T> struct T2 { + template <class S, bool Z = T1<S>::N + 1> struct B {}; + struct C {}; +}; + +T2<int> t; + +T2<int>::B<int> s; + diff --git a/gcc/testsuite/g++.dg/template/memtmpl2.C b/gcc/testsuite/g++.dg/template/memtmpl2.C new file mode 100644 index 000000000..0c9dad647 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memtmpl2.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 18 Sep 2003 <nathan@codesourcery.com> + +// PR c++/12332. ICE + +template <unsigned D> class TPL; + +template <typename T> struct X { + template <template <typename> class V> + V<TPL<V<int>::d> > operator () (); +}; + +void Foo (X<int> x) {} diff --git a/gcc/testsuite/g++.dg/template/memtmpl3.C b/gcc/testsuite/g++.dg/template/memtmpl3.C new file mode 100644 index 000000000..583155ea7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/memtmpl3.C @@ -0,0 +1,24 @@ +// PR c++/33239 + +struct null_type; + +template<typename T1, typename T2> +struct tuple_impl +{ + template<typename U> + struct append + { + typedef tuple_impl<U, null_type> type; + }; + + int data; +}; + +template<typename T1> +class tuple +: public tuple_impl<T1, null_type>::template append<T1>::type +{ + using tuple_impl<T1, null_type>::template append<T1>::type::data; +}; + +tuple<int> my_tuple; diff --git a/gcc/testsuite/g++.dg/template/nested1.C b/gcc/testsuite/g++.dg/template/nested1.C new file mode 100644 index 000000000..ed2028b3c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nested1.C @@ -0,0 +1,15 @@ +/* PR c++/4633 */ +/* { dg-do compile } */ + +// The 'class X' inside the template used to escape (somehow), +// so that the typedef claimed that it was redefining X. + +template <typename T> struct S ; + +template <> struct S<float> +{ + template <class, class> struct R; + template <class X> struct R<X, X> { }; + + typedef int X; +}; diff --git a/gcc/testsuite/g++.dg/template/nested2.C b/gcc/testsuite/g++.dg/template/nested2.C new file mode 100644 index 000000000..be4f95f71 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nested2.C @@ -0,0 +1,9 @@ +template <class T> class CO { + class CI1 { + class CI2; + }; +}; + +template <class T> +class CO<T>::CI1::CI2 {}; + diff --git a/gcc/testsuite/g++.dg/template/nested3.C b/gcc/testsuite/g++.dg/template/nested3.C new file mode 100644 index 000000000..5652e178a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nested3.C @@ -0,0 +1,30 @@ +template <class T1, class T2> +class A { + template <class S> + class SubA { + int _k; + }; + T1 _t1; + T2 _t2; +}; + +template <class U> +class B { + class SubB1 { + B _i; + }; + + class SubB2 { + int _j; + }; + A<U,SubB1>::SubA<SubB2> _a; // { dg-error "not a base type" "not base" } + // { dg-message "note" "note" { target *-*-* } 20 } + // { dg-error "non-template" "non-template" { target *-*-* } 20 } +}; + + +int main() { + B<char> objB; // { dg-message "instantiated" } + + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/nested4.C b/gcc/testsuite/g++.dg/template/nested4.C new file mode 100644 index 000000000..6e5b99b46 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nested4.C @@ -0,0 +1,10 @@ +template <typename T> struct A { + template<typename S> struct B { typedef A<S> X; }; + +}; + +template<typename> void f() { + typedef A<int>::B<double>::X X; +} + +template void f<int> (); diff --git a/gcc/testsuite/g++.dg/template/nested5.C b/gcc/testsuite/g++.dg/template/nested5.C new file mode 100644 index 000000000..3850fdace --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nested5.C @@ -0,0 +1,19 @@ +// PR c++/33959 + +template <typename T> struct A +{ + struct C + { + template <typename U> struct D {}; + }; + template <typename S> static C::D<S> bar (S const &); +}; + +struct E {}; + +int +main () +{ + E e; + A<E>::bar (e); +} diff --git a/gcc/testsuite/g++.dg/template/new1.C b/gcc/testsuite/g++.dg/template/new1.C new file mode 100644 index 000000000..63ee2f924 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/new1.C @@ -0,0 +1,45 @@ +// { dg-do run } +// { dg-options "-O2" } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 2 Dec 2004 <nathan@codesourcery.com> + +// PR 18318. ICE with template new[] +// Origin:Elliot Hughes <enh@jessies.org> +// Andrew Pinski <pinskia@gcc.gnu.org> + +struct Aint +{ + ~Aint (); + Aint (); +}; + +Aint::Aint () {} +Aint::~Aint () {} + +static int count; + +template <class T> +struct A +{ + unsigned Blksize() const; + + void f() + { + new T[Blksize()]; + } +}; + +template <class T> unsigned A<T>::Blksize () const +{ + count++; + return 1; +} + +int main () +{ + A<Aint> a; + a.f(); + + return count != 1; +} diff --git a/gcc/testsuite/g++.dg/template/new10.C b/gcc/testsuite/g++.dg/template/new10.C new file mode 100644 index 000000000..98293ba5b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/new10.C @@ -0,0 +1,23 @@ +// PR c++/46658 + +typedef unsigned short int uint16_t; +typedef unsigned int uint32_t; +template<class T> class scoped_array { + void reset(T * p = 0) { } +}; +typedef uint16_t SequenceIndex; +typedef uint32_t SequenceMapIndex; +class Analyzer { + template <typename READER> + bool ReadDictionary( READER& reader ); + scoped_array<SequenceIndex> map_from_2_hints_to_composite_sequence; + SequenceMapIndex number_of_composite_sequences; +}; +template <typename READER> +bool Analyzer::ReadDictionary( READER &reader ) +{ + const SequenceMapIndex ntt + = ( number_of_composite_sequences + SequenceMapIndex( 1 ) ) + * ( number_of_composite_sequences + 1 ); + map_from_2_hints_to_composite_sequence.reset(new SequenceIndex[ntt]()); +} diff --git a/gcc/testsuite/g++.dg/template/new2.C b/gcc/testsuite/g++.dg/template/new2.C new file mode 100644 index 000000000..682ca6e18 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/new2.C @@ -0,0 +1,14 @@ +// PR c++/21336 + +typedef __SIZE_TYPE__ size_t; +template<class _T> void* operator new( size_t Size, _T&); +struct B { + int a; + int* m() { + return new(a) int; + } +}; +B* n() { + return new B(); +} + diff --git a/gcc/testsuite/g++.dg/template/new3.C b/gcc/testsuite/g++.dg/template/new3.C new file mode 100644 index 000000000..230330ec6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/new3.C @@ -0,0 +1,18 @@ +extern void *operator new(__SIZE_TYPE__); // { dg-message "note" } + +template <class T > +struct C +{ + void f() { + int* node; + new (&node) int(0); // { dg-error "new" } + // { dg-message "candidate" "candidate note" { target *-*-* } 8 } + } +}; + +void* operator new(__SIZE_TYPE__, void* __p); + +void g() { + C<int> c; + c.f(); +} diff --git a/gcc/testsuite/g++.dg/template/new4.C b/gcc/testsuite/g++.dg/template/new4.C new file mode 100644 index 000000000..bf6f06100 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/new4.C @@ -0,0 +1,8 @@ +// PR c++/27559 +// { dg-do compile } + +struct A +{ + template<typename T> + static void* operator new(T) {} // { dg-error "first parameter|invalid template" } +}; diff --git a/gcc/testsuite/g++.dg/template/new5.C b/gcc/testsuite/g++.dg/template/new5.C new file mode 100644 index 000000000..a2c560181 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/new5.C @@ -0,0 +1,9 @@ +// PR c++/27210 + +template <class foo> class junk { + void bar(int a) + { + unsigned char *c = new unsigned char[a*sizeof(foo)]; + } +}; + diff --git a/gcc/testsuite/g++.dg/template/new6.C b/gcc/testsuite/g++.dg/template/new6.C new file mode 100644 index 000000000..4db068512 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/new6.C @@ -0,0 +1,7 @@ +// PR c++/27713 +// { dg-do compile } + +struct A +{ + template<int> friend void* operator new(__SIZE_TYPE__); // { dg-error "invalid template" } +}; diff --git a/gcc/testsuite/g++.dg/template/new7.C b/gcc/testsuite/g++.dg/template/new7.C new file mode 100644 index 000000000..dcf8a8e59 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/new7.C @@ -0,0 +1,9 @@ +// PR c++/27714 + +template<typename> struct A +{ + static void* operator new(__SIZE_TYPE__); + template<typename T> friend void* A<T>::operator new(__SIZE_TYPE__); +}; + +A<int> a; diff --git a/gcc/testsuite/g++.dg/template/new8.C b/gcc/testsuite/g++.dg/template/new8.C new file mode 100644 index 000000000..b8f3f97e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/new8.C @@ -0,0 +1,29 @@ +// PR c++/34336 +// { dg-do compile } + +struct A; + +template <class T> +struct S +{ + T *m; + T &operator* () { return *m; } +}; + +struct B +{ + B (const A &); +}; + +template <class T> +struct C +{ + C (); + S<A> c; +}; + +template <class T> +C<T>::C () +{ + B *b = new B (*c); +} diff --git a/gcc/testsuite/g++.dg/template/new9.C b/gcc/testsuite/g++.dg/template/new9.C new file mode 100644 index 000000000..24e40ee23 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/new9.C @@ -0,0 +1,16 @@ +// PR c++/46277 + +class ggRGBE { +public: + ggRGBE(); +}; +template <class T> class ggIO +{ + void readbody(int); + ggRGBE *scanline; +}; +template <class T> void +ggIO<T>::readbody(int width) +{ + scanline = new ggRGBE[width]; +} diff --git a/gcc/testsuite/g++.dg/template/non-dependent1.C b/gcc/testsuite/g++.dg/template/non-dependent1.C new file mode 100644 index 000000000..3fe5c33d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-dependent1.C @@ -0,0 +1,21 @@ +//PR c++/8222 +// Origin: giovannibajo@libero.it and setzersn@gmx.de + +// { dg-do run } + +struct Foo +{ + template <class> + void func() {} +}; +template <class> +void Bar(Foo* p) +{ + p->func<int>(); +} + +int main() +{ + Foo c; + Bar<int>(&c); +} diff --git a/gcc/testsuite/g++.dg/template/non-dependent10.C b/gcc/testsuite/g++.dg/template/non-dependent10.C new file mode 100644 index 000000000..1891cad30 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-dependent10.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Origin: Giovanni Bajo <giovannibajo@libero.it> + +// Two-phase name lookup for address of member: +// Detecting overloading function error during parsing + +struct S +{ + int f(char); + int f(int); +}; + +template<int (S::*p)()> +struct X +{}; + +template <class T> +struct Foo +{ + X<&S::f> x; // { dg-error "convert|no matches" } +}; diff --git a/gcc/testsuite/g++.dg/template/non-dependent11.C b/gcc/testsuite/g++.dg/template/non-dependent11.C new file mode 100644 index 000000000..dff5b909d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-dependent11.C @@ -0,0 +1,18 @@ +// { dg-do compile } + +// Origin: Jakub Jelinek <jakub@gcc.gnu.org> +// Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/19311: Non-dependent address to member as function argument. + +template <class R, class T> void foo (R (T::*x) ()); +template <class R, class T, class C> void foo (R (T::*x) (C)); + +template<int> struct I { + int o (); + int o () const; +}; + +template <int> void bar (void) { + foo <int, I<1> > (&I<1>::o); +} diff --git a/gcc/testsuite/g++.dg/template/non-dependent12.C b/gcc/testsuite/g++.dg/template/non-dependent12.C new file mode 100644 index 000000000..73d7e9497 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-dependent12.C @@ -0,0 +1,10 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 8 Mar 2005 <nathan@codesourcery.com> + +// PR 20186: ICE +// Origin: Jan Dvorak <jan.dvorak@kraxnet.cz> + +template<typename T> void foo(T &t) +{ + int i = static_cast<int>(t); +} diff --git a/gcc/testsuite/g++.dg/template/non-dependent13.C b/gcc/testsuite/g++.dg/template/non-dependent13.C new file mode 100644 index 000000000..9e69948ac --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-dependent13.C @@ -0,0 +1,11 @@ +// PR c++/26266 + +template <int I> +struct S; + +template <int I> +void f() { + if (const int i = 3) { + S<i>::j; // { dg-error "incomplete" } + } +} diff --git a/gcc/testsuite/g++.dg/template/non-dependent2.C b/gcc/testsuite/g++.dg/template/non-dependent2.C new file mode 100644 index 000000000..3b073b47a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-dependent2.C @@ -0,0 +1,16 @@ +//PR c++/11070 +// Used to ICE +// Origin: bangerth@dealii.org and rwgk@yahoo.com + +template <bool b> struct X { + template <typename T> + static int* execute(int* x) { return x; } +}; + +template <typename T> void foo() { + static bool const same = true; + X<same>::execute<int> (0); +} + +template void foo<int> (); + diff --git a/gcc/testsuite/g++.dg/template/non-dependent3.C b/gcc/testsuite/g++.dg/template/non-dependent3.C new file mode 100644 index 000000000..ce18bf243 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-dependent3.C @@ -0,0 +1,15 @@ +//PR c++/11071 +// Used to ICE +// Origin: bangerth@dealii.org and rwgk@yahoo.com + +template <bool b> struct X { + template <typename T> + static int* execute(T* x) { return x; } +}; + +template <typename T> void foo() { + static bool const same = true; + X<same>::execute ((int*)0); +} + +template void foo<int> (); diff --git a/gcc/testsuite/g++.dg/template/non-dependent4.C b/gcc/testsuite/g++.dg/template/non-dependent4.C new file mode 100644 index 000000000..ff3a6eb2c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-dependent4.C @@ -0,0 +1,4 @@ +int temp(const char *temp); + +template <int> int g() { return temp("Hi"); } +int g1() { return temp("Hi"); } diff --git a/gcc/testsuite/g++.dg/template/non-dependent5.C b/gcc/testsuite/g++.dg/template/non-dependent5.C new file mode 100644 index 000000000..bd6ce6b47 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-dependent5.C @@ -0,0 +1,8 @@ +// PR c++/15299 + +template <class T> void fun_ptr(T (*)()); +template <class T> T bar(); + +template <class> void foo () { + fun_ptr(bar<int>); +} diff --git a/gcc/testsuite/g++.dg/template/non-dependent6.C b/gcc/testsuite/g++.dg/template/non-dependent6.C new file mode 100644 index 000000000..0959a3de9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-dependent6.C @@ -0,0 +1,13 @@ +// PR c++/15285 + +void foo(void (*func)()) {} + +template<typename T> +void bar() +{} + +template<typename T> +void baz() +{ + foo(&bar<long>); +} diff --git a/gcc/testsuite/g++.dg/template/non-dependent7.C b/gcc/testsuite/g++.dg/template/non-dependent7.C new file mode 100644 index 000000000..ee34327ad --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-dependent7.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Origin: Giovanni Bajo <giovannibajo@libero.it> + +// PR c++/13092: ICE taking address of member which is non-dependent + +struct S +{ + int i; +}; + +template<int S::*p> +struct X +{}; + +template <class T> +struct Foo +{ + X<&S::i> x; +}; + +template struct Foo<void>; diff --git a/gcc/testsuite/g++.dg/template/non-dependent8.C b/gcc/testsuite/g++.dg/template/non-dependent8.C new file mode 100644 index 000000000..369e13731 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-dependent8.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +// Origin: Giovanni Bajo <giovannibajo@libero.it> + +// Two-phase name lookup for address of member: +// Detecting error during parsing + +struct S +{ + char i; +}; + +template<int S::*p> +struct X +{}; + +template <class T> +struct Foo +{ + X<&S::i> x; // { dg-error "convert|no type" } +}; diff --git a/gcc/testsuite/g++.dg/template/non-dependent9.C b/gcc/testsuite/g++.dg/template/non-dependent9.C new file mode 100644 index 000000000..c046312d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-dependent9.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Origin: Giovanni Bajo <giovannibajo@libero.it> + +// Two-phase name lookup for address of member: +// Overloading function + +struct S +{ + int f(); + int f(int); +}; + +template<int (S::*p)()> +struct X +{}; + +template <class T> +struct Foo +{ + X<&S::f> x; +}; diff --git a/gcc/testsuite/g++.dg/template/non-type-template-argument-1.C b/gcc/testsuite/g++.dg/template/non-type-template-argument-1.C new file mode 100644 index 000000000..41243649a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-type-template-argument-1.C @@ -0,0 +1,12 @@ +struct A { static const bool b=false; }; + +struct B { typedef A X; }; + +template <bool> struct C {}; + +template <typename T> struct D +{ + C<T::X> c; // { dg-error "parsed as a non-type|if a type is meant" } +}; + +D<B> d; // { dg-message "instantiated from here" } diff --git a/gcc/testsuite/g++.dg/template/non-type1.C b/gcc/testsuite/g++.dg/template/non-type1.C new file mode 100644 index 000000000..70e81d362 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-type1.C @@ -0,0 +1,49 @@ +// PR c++/4377 + +template < int I1, int I2 > +class unit +{ +public: + typedef unit<I1,I2> my_type; + + unit() {} + unit( const unit<I1,I2>& ) {} + + template< int Q1, int Q2 > + unit< I1 + Q1, I2 + Q2 > operator * ( const unit< Q1, Q2 >& rhs ) const { + return unit< I1 + Q1, I2 + Q2 >(); + } + + template< int Q1, int Q2 > + unit< I1 - Q1, I2 - Q2 > operator / ( const unit< Q1, Q2 >& rhs ) const { + return unit< I1 - Q1, I2 - Q2 >(); + } +}; + +// specialization added to first test +// +template <> +class unit<0,0> { +public: + typedef unit<0,0> my_type; + + unit() {} + + friend unit<0,0> operator*( const unit<0,0>& lhs, const unit<0,0>& rhs ) { + return unit<0,0>(); + } + friend unit<0,0> operator/( const unit<0,0>& lhs, const unit<0,0>& rhs ) { + return unit<0,0>(); + } + +}; + + +int main() +{ + const unit<1,0> u1; + const unit<2,0> u2; + + unit<-1,0> u3( u1 / u2 ); + unit< 3,0> u4( u1 * u2 ); +} diff --git a/gcc/testsuite/g++.dg/template/nontype1.C b/gcc/testsuite/g++.dg/template/nontype1.C new file mode 100644 index 000000000..834a36a26 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype1.C @@ -0,0 +1,5 @@ +// PR c++/4934 +// dump_expr didn't know how to deal with a CONVERT_EXPR with no type. + +template<unsigned> struct A {}; +template<typename T> struct B { A<sizeof(+int())> a; }; diff --git a/gcc/testsuite/g++.dg/template/nontype10.C b/gcc/testsuite/g++.dg/template/nontype10.C new file mode 100644 index 000000000..83ac8e302 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype10.C @@ -0,0 +1,10 @@ +// { dg-do compile } +// Contributed by: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +#include <cstddef> + +template <int T> struct A {}; +template <void* T> struct B {}; + +A<NULL> a; // { dg-warning "NULL" } +B<NULL> b; // { dg-error "" } + diff --git a/gcc/testsuite/g++.dg/template/nontype11.C b/gcc/testsuite/g++.dg/template/nontype11.C new file mode 100644 index 000000000..d52eb9a38 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype11.C @@ -0,0 +1,22 @@ +// { dg-do compile } +// Origin: <fsm at robots dot ox dot ac dot uk> +// PR c++/18354: Unary plus should not be wrapped in NON_LVALUE_EXPR + +template <int N> +struct X { }; + +const int n = 1; + +void f() +{ + X< 1> a; + X<-1> b; + X<+1> c; +} + +void g() +{ + X< n> a; + X<-n> b; + X<+n> c; +} diff --git a/gcc/testsuite/g++.dg/template/nontype12.C b/gcc/testsuite/g++.dg/template/nontype12.C new file mode 100644 index 000000000..a290ec337 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype12.C @@ -0,0 +1,35 @@ +// PR c++/20172 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> + +template<typename T> struct A +{ + template<T> int foo(); // { dg-error "double" } + template<template<T> class> int bar(); // { dg-error "double" } + template<T> struct X; // { dg-error "double" } +}; + +A<char> a1; +A<double> a2; // { dg-message "instantiated" } + +template<typename T> struct B +{ + template<double> int foo(); // { dg-error "double" } + template<template<double> class> int bar(); // { dg-error "double" } + template<double> struct X; // { dg-error "double" } +}; + +template<void> int foo(); // { dg-error "void" } +template<template<void> class> int bar(); // { dg-error "void" } +template<void> struct X; // { dg-error "void" } + +template<typename T> struct C +{ + template<T> int foo(); // { dg-error "double" } +}; + +template<typename T> int baz(T) { C<T> c; } // { dg-message "instantiated" } + +void foobar() +{ + baz(1.2); // { dg-message "instantiated" } +} diff --git a/gcc/testsuite/g++.dg/template/nontype13.C b/gcc/testsuite/g++.dg/template/nontype13.C new file mode 100644 index 000000000..6fffb8d8e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype13.C @@ -0,0 +1,29 @@ +// PR c++/19004 + +template<typename T> +struct Dummy +{ + void evil() + { + this->template tester<true>(); + } + + template<bool B> + void tester() + { + bar<evil>()(); // { dg-error "constant" } + } + template<bool B> + struct bar + { + void operator()() + { } + }; +}; + +int main() +{ + Dummy<int> d; + d.tester<true> (); // { dg-message "instantiated" } +} + diff --git a/gcc/testsuite/g++.dg/template/nontype14.C b/gcc/testsuite/g++.dg/template/nontype14.C new file mode 100644 index 000000000..93338512b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype14.C @@ -0,0 +1,13 @@ +// PR c++/23789 + +template <int W> struct X { + template <int W2> + X< (W+(W&&W) > 1 ? W+(W&&W) : 1)+1> + operator + (const X<W2>&) const; +}; + +template <int dummy> void foo() +{ + X<6> A,B; + A + B; +} diff --git a/gcc/testsuite/g++.dg/template/nontype15.C b/gcc/testsuite/g++.dg/template/nontype15.C new file mode 100644 index 000000000..dd5f4e78a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype15.C @@ -0,0 +1,20 @@ +struct foo { + typedef int (*fun)(int); + + static int f(int); // overload between static & non-static + int f(); + + static int g(int); // non-overloaded static +}; + +template<foo::fun> +struct f_obj { + // something .. +}; + +int foo::f() { + f_obj<f> f1; + f_obj<g> f2; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/nontype16.C b/gcc/testsuite/g++.dg/template/nontype16.C new file mode 100644 index 000000000..36d1e9564 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype16.C @@ -0,0 +1,9 @@ +//PR c++/27962 + +template<int> struct A +{ + template<typename> void foo(); +}; + +template<> template<struct T> void A<0>::foo() {} // { dg-error "not a valid type" } + diff --git a/gcc/testsuite/g++.dg/template/nontype17.C b/gcc/testsuite/g++.dg/template/nontype17.C new file mode 100644 index 000000000..f3a4480c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype17.C @@ -0,0 +1,8 @@ +// PR c++/35282 + +template<int> struct A +{ + template<int> void foo(); +}; + +template<> template<int> void A<0>::foo() {} diff --git a/gcc/testsuite/g++.dg/template/nontype18.C b/gcc/testsuite/g++.dg/template/nontype18.C new file mode 100644 index 000000000..cbe0a1b5a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype18.C @@ -0,0 +1,8 @@ +// PR c++/28743 + +template<int I> struct A +{ + template<typename T> void foo(); +}; + +template<int I> template<typename T> void A<0>::foo() {} // { dg-error "template parameter" } diff --git a/gcc/testsuite/g++.dg/template/nontype19.C b/gcc/testsuite/g++.dg/template/nontype19.C new file mode 100644 index 000000000..1df78b3b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype19.C @@ -0,0 +1,19 @@ +// PR c++/42466 + +template<class IntT, IntT X> +struct A +{ + A(); + + template<IntT X2> + A(const A<IntT, X2>& other); +}; + +int main(int argc, char** argv) +{ + A<int, 42> a; + A<int, 100> b = a; + + A<unsigned, 42u> c; + A<unsigned, 100u> d = c; +} diff --git a/gcc/testsuite/g++.dg/template/nontype2.C b/gcc/testsuite/g++.dg/template/nontype2.C new file mode 100644 index 000000000..fe7e71537 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype2.C @@ -0,0 +1,11 @@ +template <bool> struct A {}; + +template <bool> struct B +{ + void foo() + { + const int i=0; + typedef A< i<=1 > C; + typedef A< i<=2 > C; + } +}; diff --git a/gcc/testsuite/g++.dg/template/nontype20.C b/gcc/testsuite/g++.dg/template/nontype20.C new file mode 100644 index 000000000..e4aba3227 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype20.C @@ -0,0 +1,11 @@ +// PR c++/48003 +// { dg-options "-fpermissive -w" } +// Test that we allow integer overflow in constant exprs with -fpermissive + +template<int N> +struct test +{ + typedef test<N - 1> prior; +}; + +test<-2147483647-1> f; diff --git a/gcc/testsuite/g++.dg/template/nontype21.C b/gcc/testsuite/g++.dg/template/nontype21.C new file mode 100644 index 000000000..69cab54f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype21.C @@ -0,0 +1,7 @@ +// PR c++/47705 + +template<char const * const x> class Something { }; + +extern char const xyz; + +class SomethingElse:public Something<xyz> { }; // { dg-error "xyz. is a variable" } diff --git a/gcc/testsuite/g++.dg/template/nontype22.C b/gcc/testsuite/g++.dg/template/nontype22.C new file mode 100644 index 000000000..f2c8c46e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype22.C @@ -0,0 +1,11 @@ +// PR c++/44629 +// The proper mangling is unclear. + +template<typename T> int cmp1(T a, T b); +template<typename T, int (*cmp)(T, T) = cmp1> struct A { }; +template <typename T> void f (A<T> &); // { dg-bogus "" "" { xfail *-*-* } } +void g() +{ + A<char> a; + f(a); +} diff --git a/gcc/testsuite/g++.dg/template/nontype3.C b/gcc/testsuite/g++.dg/template/nontype3.C new file mode 100644 index 000000000..d0c6b72a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype3.C @@ -0,0 +1,38 @@ +// { dg-do compile } +// { dg-options -std=c++98 } +// Origin: <drow at gcc dot gnu dot org>, +// <giovannibajo at gcc dot gnu dot org> +// c++/13243: Template parameters of non integral or enumeration type can't be +// used for integral constant expressions. ADDR_EXPR and INDIRECT_REF are +// invalid too. + +template <int T> class foo {}; +template <int *T> class bar {}; + +template <int *PI> +void dep5(bar<PI> *); + +template <int *PI> +void dep6(bar<PI+1> *); // { dg-error "" "integral or enumeration" } + +template <int I> +void dep7(bar<I+1> *); + +template <int *PI> +void dep8(foo< *PI > *); // { dg-error "" "integral or enumeration" } + +template <int PI[1]> +void dep9(foo< *PI > *); // { dg-error "" "integral or enumeration" } + +template <int PI[1]> +void dep9a(foo< sizeof(*PI) > *); + +template <int PI[1]> +void dep10(foo< PI[0] > *); // { dg-error "" "integral or enumeration" } + +template <int I> +void dep11(foo< *&I > *); // { dg-error "" "constant-expression" } + +template <int I> +void dep12(foo< (&I)[4] > *); // { dg-error "" "constant-expression" } + diff --git a/gcc/testsuite/g++.dg/template/nontype4.C b/gcc/testsuite/g++.dg/template/nontype4.C new file mode 100644 index 000000000..ab39ed443 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype4.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Origin: Ivan Godard <igodard@pacbell.net> +// Volker Reichelt <reichelt@gcc.gnu.org> + +// PR c++/13797: ICE invalid nontype template parameter + +template <int> struct A +{ + typedef A<0> B; // { dg-error "previous declaration" } + template <B> struct B {}; // { dg-error "not a valid type|typedef" } +}; + +A<0> a; diff --git a/gcc/testsuite/g++.dg/template/nontype5.C b/gcc/testsuite/g++.dg/template/nontype5.C new file mode 100644 index 000000000..f7b76259b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype5.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Origin: Ivan Godard <igodard@pacbell.net> +// Volker Reichelt <reichelt@gcc.gnu.org> + +// PR c++/13797: ICE invalid nontype template parameter + +template <int> struct A +{ + typedef A<0> B; + template <B> struct C {}; // { dg-error "not a valid type" } +}; + +A<0> a; diff --git a/gcc/testsuite/g++.dg/template/nontype6.C b/gcc/testsuite/g++.dg/template/nontype6.C new file mode 100644 index 000000000..97b093ae5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype6.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// Origin: <v dot haisman at sh dot cvut dot cz> +// PR c++/13957: Improved error message for type in template (when non-type +// is expected). + +template <class T> +struct A +{ + typedef int type; +}; + +template <class T> +void func(void) +{ + (void)A<T>::type(); // { dg-error "non-type" "non-type" } +// { dg-message "if a type" "note" { target *-*-* } 15 } +} + +template void func<float>(void); // { dg-message "instantiated from here" } diff --git a/gcc/testsuite/g++.dg/template/nontype7.C b/gcc/testsuite/g++.dg/template/nontype7.C new file mode 100644 index 000000000..5eac558e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype7.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// Origin: C++ standard, [temp.arg.nontype]/2 + +template<class T, char* p> struct X { + X(); + X(const char* q) { /* ... */ } +}; + +char p[] = "Vivisectionist"; + +X<int,"Studebaker"> x1; // { dg-error "string literal" } +X<int, p> x2; + +// { dg-bogus "" "additional errors" { xfail *-*-* } 11 } + diff --git a/gcc/testsuite/g++.dg/template/nontype8.C b/gcc/testsuite/g++.dg/template/nontype8.C new file mode 100644 index 000000000..d2976dfc0 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype8.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// Origin: C++ standard, [temp.arg.nontype]/3 + +template<int* p> class X { }; + +int a[10]; +struct S { int m; static int s; } s; + +X<&a[2]> x3; // { dg-error "" } address of array element +X<&s.m> x4; // { dg-error "" } address of non-static member +X<&s.s> x5; // { dg-error "" } &S::s must be used +X<&S::s> x6; // OK: address of static member + diff --git a/gcc/testsuite/g++.dg/template/nontype9.C b/gcc/testsuite/g++.dg/template/nontype9.C new file mode 100644 index 000000000..e16eef601 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype9.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// { dg-prune-output "mangled name" } +// Contributed by: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +int i; + +template <void (&FN)()> +struct g { + void foo(void) { + FN (); + } +}; + +void h () +{ + i = 7; +} + +template struct g<h>; + diff --git a/gcc/testsuite/g++.dg/template/ntp1.C b/gcc/testsuite/g++.dg/template/ntp1.C new file mode 100644 index 000000000..98698e932 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ntp1.C @@ -0,0 +1,24 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Dec 2001 <nathan@codesourcery.com> + +// PR 35. We were default promoting template PARM_DECLs + +template <short B> class R {}; + +template <class T> class A +{ + public: + template <short B> + void operator() (R<B> const &); +}; + +int main() { + A<int> a; + R<1> r; + + a (r); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/ntp2.C b/gcc/testsuite/g++.dg/template/ntp2.C new file mode 100644 index 000000000..42219e0fc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ntp2.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Dec 2002 <nathan@codesourcery.com> + +// PR 3784: We were confusing non-type template parms. + +template <unsigned N> class X { }; + +template <short N> void foo1(X<N>); +template <unsigned N> void foo2(X<N>); + +int main() { + X<2> x; + foo2(x); +} diff --git a/gcc/testsuite/g++.dg/template/offsetof1.C b/gcc/testsuite/g++.dg/template/offsetof1.C new file mode 100644 index 000000000..1ee9be1e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/offsetof1.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// PR c++/17221 + +#include <cstddef> + +template <int N> struct Bar; +template <> struct Bar<3> {}; + +template <class T> +struct Foo { + Bar<offsetof(T, a) + 3> k; +}; + +struct A { int a; }; + +template struct Foo<A>; diff --git a/gcc/testsuite/g++.dg/template/op1.C b/gcc/testsuite/g++.dg/template/op1.C new file mode 100644 index 000000000..7cc9c9e91 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/op1.C @@ -0,0 +1,12 @@ +template <class T> struct X { + typedef int type; +}; + +template <class T> struct O { + struct I { + operator typename X<T>::type (); + }; +}; + +template <class T> +O<T>::I::operator typename X<T>::type () {} diff --git a/gcc/testsuite/g++.dg/template/operator1.C b/gcc/testsuite/g++.dg/template/operator1.C new file mode 100644 index 000000000..402e607d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator1.C @@ -0,0 +1,49 @@ +class test +{ +public: + float operator[]( int index ) + { + return testFloat[index]; + } +private: + float testFloat[3]; +}; + +template < class typeA > float +operator*( + typeA a, + float b +) +{ + return a[0] * b; +} + +template < class typeB > float +operator*( + float a, + typeB b +) +{ + return a * b[0]; +} + +template < class typeA, class typeB > float +operator*( + typeA a, + typeB b +) +{ + return a[0] * b[0]; +} + +int main( void ) +{ + test aTest; + float bTest; + float result; + + result = aTest * bTest; + result = bTest * aTest; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/operator10.C b/gcc/testsuite/g++.dg/template/operator10.C new file mode 100644 index 000000000..448b02290 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator10.C @@ -0,0 +1,8 @@ +// PR c++/30535 +// { dg-prune-output "note" } + +struct A {}; + +template<A, typename T> int operator-(A, T); // { dg-error "not a valid type" } + +int i = A() - 0; // { dg-error "no match" } diff --git a/gcc/testsuite/g++.dg/template/operator11.C b/gcc/testsuite/g++.dg/template/operator11.C new file mode 100644 index 000000000..8d6b77ab4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator11.C @@ -0,0 +1,25 @@ +// PR c++/48594 +// Test for uses of (X->*Y)() that don't actually involve a +// pointer to member function. + +struct A { } a; +struct B { } b; +struct C * cp; + +struct Func { void operator()(); }; +Func operator->* (A, int); + +typedef void (*pfn)(); +pfn operator->* (B, int); + +pfn C::*cpfn; +Func C::*cfunc; + +template <class T> +void f() +{ + (a->*1)(); + (b->*1)(); + (cp->*cpfn)(); + (cp->*cfunc)(); +} diff --git a/gcc/testsuite/g++.dg/template/operator2.C b/gcc/testsuite/g++.dg/template/operator2.C new file mode 100644 index 000000000..89f428d5f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator2.C @@ -0,0 +1,8 @@ +template <typename T> struct A {}; + +struct B { + operator A<B>(); +}; + +template <typename T> +void f() { B::operator A<T>; } diff --git a/gcc/testsuite/g++.dg/template/operator3.C b/gcc/testsuite/g++.dg/template/operator3.C new file mode 100644 index 000000000..45292cd95 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator3.C @@ -0,0 +1,10 @@ +// PR c++/15640 + +struct A { + void foo(void); +}; + +template <int> void bar() { + A a; + a + a.foo; // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/template/operator4.C b/gcc/testsuite/g++.dg/template/operator4.C new file mode 100644 index 000000000..972d52fc1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator4.C @@ -0,0 +1,11 @@ +// PR c++/17068 + +struct A +{ + template<int> void operator()() {} +}; + +template<typename> void foo() +{ + A().template operator()<0>(); +} diff --git a/gcc/testsuite/g++.dg/template/operator5.C b/gcc/testsuite/g++.dg/template/operator5.C new file mode 100644 index 000000000..1c0c29231 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator5.C @@ -0,0 +1,14 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 7 Dec 2004 <nathan@codesourcery.com> + +// PR 18803: reject legal +// Origin: Wolfgang Bangerth <bangerth@dealii.org> + +struct A { + int operator() (); +}; + +template <int> void foo () { + A &a = *new A(); + const int i = a(); +} diff --git a/gcc/testsuite/g++.dg/template/operator6.C b/gcc/testsuite/g++.dg/template/operator6.C new file mode 100644 index 000000000..94a869bcc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator6.C @@ -0,0 +1,4 @@ +// PR c++/27315 +// { dg-do compile } + +template void operator+; // { dg-error "non-function" } diff --git a/gcc/testsuite/g++.dg/template/operator7.C b/gcc/testsuite/g++.dg/template/operator7.C new file mode 100644 index 000000000..59c8b356c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator7.C @@ -0,0 +1,7 @@ +//PR c++/27493 +// { dg-options "-std=gnu++98" } + +template<operator T> void foo() // { dg-error "before|template" } +{ + struct A {}; +} diff --git a/gcc/testsuite/g++.dg/template/operator8.C b/gcc/testsuite/g++.dg/template/operator8.C new file mode 100644 index 000000000..29d17b84b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator8.C @@ -0,0 +1,6 @@ +//PR c++/27494 + +struct A +{ + template<operator+> void foo() {} // { dg-error "identifier|non-function|template arguments" } +}; diff --git a/gcc/testsuite/g++.dg/template/operator9.C b/gcc/testsuite/g++.dg/template/operator9.C new file mode 100644 index 000000000..35be77876 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator9.C @@ -0,0 +1,10 @@ +//PR c++/27670 + +template<operator+> void foo(); // { dg-error "before|non-function|template" } + +void bar() +{ + foo(); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 7 } +} + diff --git a/gcc/testsuite/g++.dg/template/overload1.C b/gcc/testsuite/g++.dg/template/overload1.C new file mode 100644 index 000000000..2225fecf7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/overload1.C @@ -0,0 +1,24 @@ +// { dg-options "-w" } +// PR c++/9420 +// Bug: We were instantiating B<int> during overload resolution for E<0. +// This is wrong; the contents of B<int> are not relevant, since we can't +// use its constructors (because we'd already be using a constructor for +// C). + +enum { E }; + +template <typename T> struct A { + static const int a = (E < 0); +}; + +template <typename T> class B { + A<int> b; +}; + +struct C { + C(B<int>); +}; + +int operator<(C, C); + +A<int> c; diff --git a/gcc/testsuite/g++.dg/template/overload10.C b/gcc/testsuite/g++.dg/template/overload10.C new file mode 100644 index 000000000..088b9d291 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/overload10.C @@ -0,0 +1,6 @@ +// PR c++40342 + +template <typename T1, typename T2> int f(T1 *, const T2 *); // { dg-error "" } +template <typename T1, typename T2> int f(const T1 *, T2 *); // { dg-error "" } + +int (*p)(const int *, const int *) = f; // { dg-error "ambiguous" } diff --git a/gcc/testsuite/g++.dg/template/overload11.C b/gcc/testsuite/g++.dg/template/overload11.C new file mode 100644 index 000000000..d7b0a7c9f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/overload11.C @@ -0,0 +1,27 @@ +// PR c++/39413 +// We don't need to instantiate Wrapper<int> to check the +// foo(const Thingy&) overload. + +template <class T> struct Incomplete; + +template <typename T> class Wrapper +{ + Incomplete<T> i; +}; + +template <typename T> struct Thingy +{ + Thingy(); + Thingy(const Wrapper<T>& v); + + template <typename X> void foo(const Thingy<X>&); + void foo(const Thingy&); +}; + +int main() +{ + Thingy<int> ap1; + Thingy<float> bp1; + + ap1.foo(bp1); +} diff --git a/gcc/testsuite/g++.dg/template/overload2.C b/gcc/testsuite/g++.dg/template/overload2.C new file mode 100644 index 000000000..253d055cd --- /dev/null +++ b/gcc/testsuite/g++.dg/template/overload2.C @@ -0,0 +1,15 @@ +template <class T, int (T::*)> struct foo; + +template <class T> +int f(foo<T,&T::ob_type>*); + +template <class T> +char* f(...); + +struct X { int ob_type; }; +struct Y { char* ob_type; }; + int x = f<X>(0); +char* y = f<Y>(0); +char* z = f<int>(0); + +int main() { return 0; } diff --git a/gcc/testsuite/g++.dg/template/overload3.C b/gcc/testsuite/g++.dg/template/overload3.C new file mode 100644 index 000000000..ec48fbb90 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/overload3.C @@ -0,0 +1,14 @@ +// PR c++/16870 + +struct A +{ + int operator[](int) const; +}; + +template<int> A foo(); + +A bar(A(*)()); + +template<int> int baz() { return (bar(&foo<0>))[0]; } + +template int baz<0>(); diff --git a/gcc/testsuite/g++.dg/template/overload4.C b/gcc/testsuite/g++.dg/template/overload4.C new file mode 100644 index 000000000..1a294eb3c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/overload4.C @@ -0,0 +1,20 @@ +// PR c++/20679 + +template <class T> +struct foo +{ + struct bar + { + int m; + }; + + void m() const {} + void m() {} + + bool n() const { return b->m < 42; } + + bar *b; +}; + + + diff --git a/gcc/testsuite/g++.dg/template/overload5.C b/gcc/testsuite/g++.dg/template/overload5.C new file mode 100644 index 000000000..8e520e929 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/overload5.C @@ -0,0 +1,28 @@ +// PR c++/22621 + +struct foo { + typedef int (*fun)(int); + + static int f(int); // overload between static & non-static + int f(); + + static int g(int); // non-overloaded static +}; + +template<foo::fun> +struct f_obj { + // something .. +}; + +f_obj<&foo::f> a; // OK +f_obj<foo::f> b; // OK (note: a and b are of the same type) + +int foo::f() +{ + f_obj<&foo::f> a; // OK + f_obj<foo::f> b; // ERROR: foo::f cannot be a constant expression + + f_obj<&foo::g> c; // OK + f_obj<foo::g> d; // OK +} + diff --git a/gcc/testsuite/g++.dg/template/overload6.C b/gcc/testsuite/g++.dg/template/overload6.C new file mode 100644 index 000000000..5e26c448b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/overload6.C @@ -0,0 +1,18 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 12 Oct 2005 <nathan@codesourcery.com> + +// PR 21592:ICE +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +template<typename T> void unique(T,T); // { dg-message "note" } + +struct A +{ + int begin(); +}; + +template<int> void foo() +{ + unique(A().begin); // { dg-error "no matching function" "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 16 } +} diff --git a/gcc/testsuite/g++.dg/template/overload7.C b/gcc/testsuite/g++.dg/template/overload7.C new file mode 100644 index 000000000..28bd16c4e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/overload7.C @@ -0,0 +1,31 @@ +// { dg-do run } + +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 17 Oct 2005 <nathan@codesourcery.com> + +// PR 24386:Wrong virtual function called +// Origin: Scott Snyder snyder@fnal.gov + +struct A +{ + virtual int Foo () { return 1; } +}; +struct B : public A +{ + virtual int Foo () { return 2; } +}; + +template <class T> +int Bar (T *a) +{ + if (static_cast<A*>(a)->A::Foo () != 1) + return 1; + if (static_cast<A*>(a)->Foo () != 2) + return 2; + return 0; +} + +int main () +{ + return Bar (new B); +} diff --git a/gcc/testsuite/g++.dg/template/overload8.C b/gcc/testsuite/g++.dg/template/overload8.C new file mode 100644 index 000000000..cc6a05b70 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/overload8.C @@ -0,0 +1,7 @@ +// PR c++/24915 + +struct A +{ + template<int> void foo() {} + template<int> int foo() {} +}; diff --git a/gcc/testsuite/g++.dg/template/overload9.C b/gcc/testsuite/g++.dg/template/overload9.C new file mode 100644 index 000000000..8aeab9eaa --- /dev/null +++ b/gcc/testsuite/g++.dg/template/overload9.C @@ -0,0 +1,18 @@ +// PR c++/32232 + +template <typename T> struct A; +template <typename T> struct B {}; +template <typename T> A<T>& operator<<(A<T>&, const B<T>&); + +template <typename T> +struct A +{ + A<T>& operator<<(A<T>& (*)(A<T>&)); +}; + +template <typename T> A<T>& foo(A<T>&); +extern A<char> c; + +int main () { + c << (1, foo); // { dg-error "no context" } +} diff --git a/gcc/testsuite/g++.dg/template/param1.C b/gcc/testsuite/g++.dg/template/param1.C new file mode 100644 index 000000000..a8c379125 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/param1.C @@ -0,0 +1,12 @@ +// PR c++/22233 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } + +template<int> struct A // { dg-error "declaration" } +{ + A(); +}; + +template<int N, char> A<N>::A() {} // { dg-error "invalid use of incomplete type" } + +A<0> a; diff --git a/gcc/testsuite/g++.dg/template/param2.C b/gcc/testsuite/g++.dg/template/param2.C new file mode 100644 index 000000000..d25b85565 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/param2.C @@ -0,0 +1,8 @@ +// Origin PR c++/47311 +// { dg-do compile } + +template < typename > class A0; +template <class Key, class T, template < typename TF = T> class TC = A0> class B0; + +template <int> class A1; +template <class Key, class T, template <T p> class TC = A1> class B1; diff --git a/gcc/testsuite/g++.dg/template/param3.C b/gcc/testsuite/g++.dg/template/param3.C new file mode 100644 index 000000000..0c1e70326 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/param3.C @@ -0,0 +1,12 @@ +// PR c++/49418 + +template <class T> +void f (const T t) +{ + t = 1; // { dg-error "" } +} + +int main() +{ + f(1); +} diff --git a/gcc/testsuite/g++.dg/template/partial-specialization.C b/gcc/testsuite/g++.dg/template/partial-specialization.C new file mode 100644 index 000000000..feaeb2fbf --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial-specialization.C @@ -0,0 +1,22 @@ +// Contributed by Gabriel Dos Reis <gdr@codesourcery.com> +// Origin: philippeb@videotron.ca +// { dg-do compile } + +struct B +{ + int i; +}; + +template <class _T, class _M, _M _T::* _V> + struct A; + +template <class _T, int _T::* _V> + struct A<_T, int, _V> + { + }; + +int main() +{ + A<B, int, & B::i> a; +} + diff --git a/gcc/testsuite/g++.dg/template/partial1.C b/gcc/testsuite/g++.dg/template/partial1.C new file mode 100644 index 000000000..41ea53039 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial1.C @@ -0,0 +1,36 @@ +// { dg-do run } +// Origin: Jo Totland <jototland@hotmail.com> + +// PR c++/6620 +// Partial specialization involving expression of non-type template +// parameter causes ICE. + +extern "C" void abort(); + +template <int N> struct HoldInt +{ +}; + +template <class A, class B> struct Add +{ +}; + +template <int N> struct Add<HoldInt<N>, HoldInt<-N> > +{ + typedef int type; + int f() { return 0; } +}; + +template <int N, int M> +struct Add<HoldInt<N>, HoldInt<M> > +{ + typedef HoldInt<N+M> type; + int f() { return 1; } +}; + +int main() { + Add<HoldInt<1>, HoldInt<-1> > a; + Add<HoldInt<1>, HoldInt<-2> > b; + if (a.f() != 0 || b.f() != 1) + abort(); +} diff --git a/gcc/testsuite/g++.dg/template/partial12.C b/gcc/testsuite/g++.dg/template/partial12.C new file mode 100644 index 000000000..05a3eca97 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial12.C @@ -0,0 +1,27 @@ +// PR c++/46105 + +template< typename T > +struct empty { // support class is like stripped-down enable_if + typedef void type; +}; + +template< class T, typename v = void > // v is always void! +struct element { + typedef typename T::value_type type; +}; + +template< class T > // T in deduced context, T::element_type is SFINAE: +struct element< T, typename empty< typename T::element_type >::type > { + typedef typename T::element_type type; +}; + +template< class T > +struct element< T const, typename empty< typename T::element_type >::type > { + typedef typename T::element_type const type; +}; + +struct has_et { + typedef int element_type; +}; + +element<has_et const>::type ip = 0; diff --git a/gcc/testsuite/g++.dg/template/partial2.C b/gcc/testsuite/g++.dg/template/partial2.C new file mode 100644 index 000000000..ebfdce278 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial2.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Origin: lorgon1@yahoo.com + +// PR c++/11154: Multi-level template argument in partial ordering of +// class template + +template <class A> struct Outer { + template <class T, class U = void, class V = void> struct Foo {}; + template <class T, class U> struct Foo<T,U,void> {}; + template <class T> struct Foo<T,void,void> {}; +}; + +Outer<int>::Foo<int,void,void> f; diff --git a/gcc/testsuite/g++.dg/template/partial3.C b/gcc/testsuite/g++.dg/template/partial3.C new file mode 100644 index 000000000..986267514 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial3.C @@ -0,0 +1,14 @@ +// { dg-do compile } +// Origin: John Maddock <john at johnmaddock dot co dot uk> +// PR c++/13997: Error while matching partial specialization of array type + +template <typename T> +struct is_array; + +template <typename T, unsigned int N> +struct is_array<T[N]>; + +template <typename T, unsigned int N> +struct is_array<const T[N]> {}; + +template struct is_array<int const[2]>; diff --git a/gcc/testsuite/g++.dg/template/partial4.C b/gcc/testsuite/g++.dg/template/partial4.C new file mode 100644 index 000000000..8ea202cdf --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial4.C @@ -0,0 +1,16 @@ +// PR c++/25342 + +template < typename eval > +struct tpl_seq_search { + typedef typename eval::enum_type Enum; + template < Enum first, Enum last > + struct range { + }; + template < Enum val > + struct range<val,val> { + }; +}; +struct xxx { + typedef int enum_type; + tpl_seq_search<xxx>::range<0, 1> a; +}; diff --git a/gcc/testsuite/g++.dg/template/partial5.C b/gcc/testsuite/g++.dg/template/partial5.C new file mode 100644 index 000000000..aa32e3b8a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial5.C @@ -0,0 +1,24 @@ +// PR c++/33964 + +template<typename T> +struct X { }; + +template<typename T> +struct X<typename T::foo> { }; // { dg-error "not used|T" } + +template<int N> +struct X<int[N]> {}; // okay + + +template<typename T, typename T::foo V> +struct Y { }; + +template<typename T, typename U, U v> +struct Y<T, v> { }; // { dg-error "not used|U" } + + +template<typename T, T V> +struct Z { }; + +template<typename T> +struct Z<T, (T)0> { }; // { dg-error "involves template parameter" } diff --git a/gcc/testsuite/g++.dg/template/partial6.C b/gcc/testsuite/g++.dg/template/partial6.C new file mode 100644 index 000000000..80bbfe3c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial6.C @@ -0,0 +1,31 @@ +// PR c++/41703 +// The second GetAllSize template is more specialized because even though +// deduction on each parameter type succeeds, we never get a template +// argument for its X to make it match the first template. + +template <typename T, int (T::*)() const> +struct TSizeEnabler +{ + typedef T TClass; +}; + +template <typename X> +int +GetAllSize(const X &Var) +{ return sizeof(Var); } + +template <typename X> +int +GetAllSize(const typename TSizeEnabler<X, &X::func>::TClass &Var) +{ return Var.func(); } + +struct H +{ + int func() const; +}; + +int main() +{ + H b; + return GetAllSize< H >(b); +} diff --git a/gcc/testsuite/g++.dg/template/partial7.C b/gcc/testsuite/g++.dg/template/partial7.C new file mode 100644 index 000000000..0fd157fdc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial7.C @@ -0,0 +1,10 @@ +// PR c++/43559 + +template<typename T, typename U> void f(U&) { } +template<typename T, typename U> void f(T const&) { } + +int main() +{ + int a; + f<int, int const>(a); +} diff --git a/gcc/testsuite/g++.dg/template/partial8.C b/gcc/testsuite/g++.dg/template/partial8.C new file mode 100644 index 000000000..4db7e1868 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial8.C @@ -0,0 +1,4 @@ +// PR c++/32505 +template <class T> struct A { }; +A<int*> a; +template <class T> struct A<T*> { }; // { dg-error "A<int\\*>" } diff --git a/gcc/testsuite/g++.dg/template/pr23510.C b/gcc/testsuite/g++.dg/template/pr23510.C new file mode 100644 index 000000000..1c3180f83 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr23510.C @@ -0,0 +1,23 @@ +// { dg-do compile } +// { dg-options "-ftemplate-depth-15" } +template<unsigned int nFactor> +struct Factorial +{ + enum { nValue = nFactor * Factorial<nFactor - 1>::nValue }; // { dg-error "depth exceeds maximum" } + // { dg-message "recursively instantiated" "" { target *-*-* } 6 } + // { dg-error "incomplete type" "" { target *-*-* } 6 } +} // { dg-error "expected ';' after" } + + template<> + struct Factorial<0> + { + enum { nValue = 1 }; + }; + + static const unsigned int FACTOR = 20; + +int main() +{ + Factorial<FACTOR>::nValue; + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/pr28284.C b/gcc/testsuite/g++.dg/template/pr28284.C new file mode 100644 index 000000000..7ef9aa12b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr28284.C @@ -0,0 +1,12 @@ +/* { dg-do compile } */ + +template<int> struct A +{ + static const int i=x; /* { dg-error "was not declared in this scope" } */ + static const int j, k; +}; + +template<int N> const int A<N>::j = i; +template<int N> const int A<N>::k = j; + +A<0> a; diff --git a/gcc/testsuite/g++.dg/template/pr28301.C b/gcc/testsuite/g++.dg/template/pr28301.C new file mode 100644 index 000000000..a7a008478 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr28301.C @@ -0,0 +1,18 @@ +// PR c++/28301 +// { dg-do compile } + +template<typename> struct A +{ + template<int> void foo() +}; // { dg-error "initializer" } + +template<> struct A<void> +{ + template<int> void foo(); +}; + +void bar() +{ + A<void> a; + a.foo<0>(); +} diff --git a/gcc/testsuite/g++.dg/template/pr32519.C b/gcc/testsuite/g++.dg/template/pr32519.C new file mode 100644 index 000000000..e93c7b476 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr32519.C @@ -0,0 +1,16 @@ +// PR 32519 +// { dg-do compile } + +struct B +{ +protected: + template <class T> void f (); // { dg-error "protected" } +}; + +struct D : public B +{ + void g (B* b) + { + b->f<int> (); // { dg-error "context" } + } +}; diff --git a/gcc/testsuite/g++.dg/template/pr35240.C b/gcc/testsuite/g++.dg/template/pr35240.C new file mode 100644 index 000000000..47455b658 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr35240.C @@ -0,0 +1,12 @@ +// PR c++/35240 +// { dg-do compile } + + +template<int> struct A {}; + +template<int N> A<sizeof(new int[N][N])> foo(); // { dg-message "unimplemented" } + +void bar() +{ + foo<1>(); // { dg-message "instantiated" } +} diff --git a/gcc/testsuite/g++.dg/template/pr39425.C b/gcc/testsuite/g++.dg/template/pr39425.C new file mode 100644 index 000000000..d55f547e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr39425.C @@ -0,0 +1,18 @@ +// PR c++/39425 +// { dg-do compile } + +class a { + + template<unsigned int s> + struct _rec { + static const char size = _rec< (s >> 1) >::size; + }; + + template<> // { dg-error "explicit" } + struct _rec <0> { + static const char size = 0; + }; + + static const unsigned int value = _rec < 1 >::size; + +} // { dg-error "after class definition" } diff --git a/gcc/testsuite/g++.dg/template/pr4926-1.C b/gcc/testsuite/g++.dg/template/pr4926-1.C new file mode 100644 index 000000000..ec2b226fe --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr4926-1.C @@ -0,0 +1,18 @@ +// PR c++/4926 +// { dg-do compile } + +template <unsigned> struct X { typedef int Type; }; +template <typename T> struct Y { char array[1]; }; + +template<typename T> Y<T> P(T); // acts as "Y<typeof(T)>" + +struct F { int operator()() const; }; + +template <typename T> +typename X<sizeof(P( T()() ).array)>::Type foo(); + +void +bar () +{ + foo<F>(); +} diff --git a/gcc/testsuite/g++.dg/template/pr54858.C b/gcc/testsuite/g++.dg/template/pr54858.C new file mode 100644 index 000000000..51610ad68 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr54858.C @@ -0,0 +1,21 @@ +// PR c++/54858 +// { dg-do compile } + +template <int> struct A {}; +template <typename T, T *> struct B {}; +template <typename D> struct C +{ + A<0> c0; B<A<0>, &C::c0> d0; // { dg-error "could not convert template argument" } + A<0> c1; B<A<0>, &C::c1> d1; // { dg-error "could not convert template argument" } + A<0> c2; B<A<0>, &C::c2> d2; // { dg-error "could not convert template argument" } + A<0> c3; B<A<0>, &C::c3> d3; // { dg-error "could not convert template argument" } + A<0> c4; B<A<0>, &C::c4> d4; // { dg-error "could not convert template argument" } + A<0> c5; B<A<0>, &C::c5> d5; // { dg-error "could not convert template argument" } + A<0> c6; B<A<0>, &C::c6> d6; // { dg-error "could not convert template argument" } + A<0> c7; B<A<0>, &C::c7> d7; // { dg-error "could not convert template argument" } + A<0> c8; B<A<0>, &C::c8> d8; // { dg-error "could not convert template argument" } + A<0> c9; B<A<0>, &C::c9> d9; // { dg-error "could not convert template argument" } + A<0> ca; B<A<0>, &C::ca> da; // { dg-error "could not convert template argument" } + A<0> cb; B<A<0>, &C::cb> db; // { dg-error "could not convert template argument" } +}; +C<int> e; diff --git a/gcc/testsuite/g++.dg/template/pretty1.C b/gcc/testsuite/g++.dg/template/pretty1.C new file mode 100644 index 000000000..99cbcd64a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pretty1.C @@ -0,0 +1,43 @@ +// { dg-do run } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 14 Sep 2002 <nathan@codesourcery.com> + +// PR 7768 template dtor pretty function wrong + +#include <string.h> + +static size_t current = 0; +static bool error = false; + +static char const *names[] = +{ + "X<T>::X() [with T = void]", + "X<T>::~X() [with T = void]", + 0 +}; + +void Verify (char const *ptr) +{ + error = strcmp (ptr, names[current++]); +} + +template <typename T> +struct X +{ + X() { Verify (__PRETTY_FUNCTION__); } + ~X() { Verify (__PRETTY_FUNCTION__); } +}; + +int main() +{ + { + X<void> x; + + if (error) + return current; + } + if (error) + return current; + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/pseudodtor1.C b/gcc/testsuite/g++.dg/template/pseudodtor1.C new file mode 100644 index 000000000..cf7c254d6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pseudodtor1.C @@ -0,0 +1,44 @@ +// PR c++/32384 +// { dg-do compile } + +struct A +{ + typedef int T; + T foo (); + + A () { foo ().~T (); } +}; + +template<typename> struct B +{ + typedef int T; + T foo (); + + B () { foo ().~T (); } +}; + +template<typename T> struct C +{ + T t; + C () { t.~T (); } +}; + +template<typename S> struct D +{ + typedef int T; + S foo (); + + D () { foo ().~T(); } +}; + +struct Z +{ + Z () {} + ~Z () {} +}; + +A a; +B<int> b; +C<int> c1; +C<Z> c2; +D<int> d; diff --git a/gcc/testsuite/g++.dg/template/pseudodtor2.C b/gcc/testsuite/g++.dg/template/pseudodtor2.C new file mode 100644 index 000000000..796aff078 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pseudodtor2.C @@ -0,0 +1,18 @@ +// PR c++/32384 +// { dg-do compile } + +template<typename S> struct D +{ + typedef int T; + S foo (); + + D () { foo ().~T(); } // { dg-error "is not of type" } +}; + +struct Z +{ + Z () {} + ~Z () {} +}; + +D<Z> d; diff --git a/gcc/testsuite/g++.dg/template/pseudodtor3.C b/gcc/testsuite/g++.dg/template/pseudodtor3.C new file mode 100644 index 000000000..5f392f4e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pseudodtor3.C @@ -0,0 +1,43 @@ +// PR c++/32241 +// { dg-do compile } + +struct A +{ + typedef int T; + T &foo (); + A () { foo.~T (); } // { dg-error "does not have class type|expected" } +}; + +template <typename T> struct B +{ + T &foo (); + B () { foo.~T (); } // { dg-error "invalid use of member" } +}; + +B<int> b; + +template <typename T, typename S> struct C +{ + T t; + C () { t.~S (); } // { dg-error "is not of type" } +}; + +C<int, long int> c; + +template <typename T> struct D +{ + T t; + typedef long int U; + D () { t.~U (); } // { dg-error "is not of type" } +}; + +D<int> d; + +template <typename T> struct E +{ + T &foo (); + typedef long int U; + E () { foo.~U (); } // { dg-error "is not of type" } +}; + +E<int> e; diff --git a/gcc/testsuite/g++.dg/template/pseudodtor4.C b/gcc/testsuite/g++.dg/template/pseudodtor4.C new file mode 100644 index 000000000..40178bf48 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pseudodtor4.C @@ -0,0 +1,10 @@ +// PR c++/34068 +// { dg-do compile } + +template <typename> struct A +{ + typedef int X; + A () { T (). ~X (); } // { dg-error "there are no arguments to|fpermissive|was not declared in this scope" } +}; + +A <int> a; diff --git a/gcc/testsuite/g++.dg/template/pseudodtor5.C b/gcc/testsuite/g++.dg/template/pseudodtor5.C new file mode 100644 index 000000000..751e662ad --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pseudodtor5.C @@ -0,0 +1,23 @@ +// PR c++/37563 + +struct A {}; + +template<int> struct Traits +{ + typedef void X; +}; + +template<> struct Traits<0> +{ + typedef A X; +}; + +template<int N> struct B +{ + typedef typename Traits<N>::X Y; + + void foo(Y y) + { + y.Y::A::~A(); + } +}; diff --git a/gcc/testsuite/g++.dg/template/pseudodtor6.C b/gcc/testsuite/g++.dg/template/pseudodtor6.C new file mode 100644 index 000000000..4438b6ffb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pseudodtor6.C @@ -0,0 +1,9 @@ +// PR c++/47971 + +template <typename> struct S +{ + typedef double T; + S () { T ().~T (); } +}; + +S<double> s; diff --git a/gcc/testsuite/g++.dg/template/ptrmem1.C b/gcc/testsuite/g++.dg/template/ptrmem1.C new file mode 100644 index 000000000..ebd6a201a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem1.C @@ -0,0 +1,33 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 31 Dec 2001 <nathan@codesourcery.com> + +// PR 3716 tsubsting a pointer to member function did not create a +// pointer to member function. + +template <class C, class T, T C::*M> +struct Closure +{ + T operator() (C & c) const { return (c.*M); } +}; + +template <class C, class T, T (C::* M)()> +struct Closure<C, T (), M> +{ + T operator()(C & c) const { return (c.*M)(); } +}; + +struct A +{ + int get(); +}; + +static Closure<A, int (), & A::get> get_closure; + + +void Foo () +{ + A a; + get_closure (a); +} diff --git a/gcc/testsuite/g++.dg/template/ptrmem10.C b/gcc/testsuite/g++.dg/template/ptrmem10.C new file mode 100644 index 000000000..b76d5e80a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem10.C @@ -0,0 +1,21 @@ +// PR c++/15096 + +template <typename T_> +class C1 +{ +public: + C1 (); + ~C1 (); + const int C1<T_>::* getPtr () const; + +private: + int x; + T_ y; +}; + + +template <typename T_> +const int C1<T_>::* C1<T_>::getPtr () const +{ return &C1<T_>::x; } + + diff --git a/gcc/testsuite/g++.dg/template/ptrmem11.C b/gcc/testsuite/g++.dg/template/ptrmem11.C new file mode 100644 index 000000000..a88b70660 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem11.C @@ -0,0 +1,19 @@ +// PR c++/18407 + +template <typename Klasse> +struct the_base{ + template <void (Klasse::*Fn)()> void foo() { } +}; + +template <typename T> +struct derivedT: the_base<derivedT<T> > { + typedef the_base<derivedT<T> > parent; + void ice(){ + this->parent::template foo< &derivedT<T>::ice>(); + } +}; + +int main() { + derivedT<int> dT; + dT.ice(); +} diff --git a/gcc/testsuite/g++.dg/template/ptrmem12.C b/gcc/testsuite/g++.dg/template/ptrmem12.C new file mode 100644 index 000000000..717b86988 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem12.C @@ -0,0 +1,29 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 17 Mar 2005 <nathan@codesourcery.com> + +// PR 20465 +// Origin: Matthias Klose <doko@debian.org> +// Andrew Pinski <pinskia@gcc.gnu.org> + +template <class _Ret, class _Tp> +void mem_fun_ref(_Ret (_Tp::*__f)()); + +struct A { + double f(); +}; + +void h () +{ + mem_fun_ref(&A::f); +} + +template <class T> +void f() +{ + mem_fun_ref(&A::f); +} + +void g() +{ + f<int>(); +} diff --git a/gcc/testsuite/g++.dg/template/ptrmem13.C b/gcc/testsuite/g++.dg/template/ptrmem13.C new file mode 100644 index 000000000..84374ea05 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem13.C @@ -0,0 +1,11 @@ +// PR c++/20734 + +struct A; +void blah(int A::*); +struct A{ + int a; +}; +template<typename T> +void hoho(){ + blah(&A::a); +} diff --git a/gcc/testsuite/g++.dg/template/ptrmem14.C b/gcc/testsuite/g++.dg/template/ptrmem14.C new file mode 100644 index 000000000..30eb1ebcc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem14.C @@ -0,0 +1,12 @@ +// PR c++/15875 + +struct A +{ + void foo(); +}; + +template<int> void bar() +{ + typedef void (A::*fptr)(); + fptr ptr = &A::foo; +} diff --git a/gcc/testsuite/g++.dg/template/ptrmem15.C b/gcc/testsuite/g++.dg/template/ptrmem15.C new file mode 100644 index 000000000..b52ff8917 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem15.C @@ -0,0 +1,9 @@ +// PR c++/19894 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> + +template<typename T> struct A +{ + T A::* p; // { dg-error "void" } +}; + +A<void> a; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/ptrmem16.C b/gcc/testsuite/g++.dg/template/ptrmem16.C new file mode 100644 index 000000000..770581db8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem16.C @@ -0,0 +1,20 @@ +// PR c++/25369 +// { dg-do link } + +template <typename> struct A +{ + void foo() {} +}; + +void bar(void (A<int>::*)()) {} + +template <int> void baz() +{ + bar(&A<int>::foo); +} + +int main() +{ + baz<0>(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/ptrmem17.C b/gcc/testsuite/g++.dg/template/ptrmem17.C new file mode 100644 index 000000000..5c5ee3fc3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem17.C @@ -0,0 +1,10 @@ +// PR c++/28346 + +template<int> struct A +{ + int& i; + A(); + ~A() { &A::i; } // { dg-error "reference" } +}; + +A<0> a; diff --git a/gcc/testsuite/g++.dg/template/ptrmem18.C b/gcc/testsuite/g++.dg/template/ptrmem18.C new file mode 100644 index 000000000..c3124cd81 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem18.C @@ -0,0 +1,49 @@ +// PR c++/33616 +// { dg-do run } +// { dg-options "-O2" } + +extern "C" void abort (); + +struct S { + int c; + S () : c (0) {} + virtual void f1 () { c += 1; } + virtual void f2 () { c += 16; } +}; + +struct T { + S s; +}; + +typedef void (S::*Q) (); + +template <Q P> +void test1 (T *t) +{ + (t->s.*P)(); +} + +template <Q P> +void test2 (T *t) +{ + S &s = t->s; + (s.*P)(); +} + +int +main () +{ + T t; + test1 <&S::f1> (&t); + if (t.s.c != 1) + abort (); + test1 <&S::f2> (&t); + if (t.s.c != 17) + abort (); + test2 <&S::f1> (&t); + if (t.s.c != 18) + abort (); + test2 <&S::f2> (&t); + if (t.s.c != 34) + abort (); +} diff --git a/gcc/testsuite/g++.dg/template/ptrmem19.C b/gcc/testsuite/g++.dg/template/ptrmem19.C new file mode 100644 index 000000000..52711c6cb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem19.C @@ -0,0 +1,19 @@ +// PR c++/40780 +// { dg-do compile } + +template <class T1, typename T2, typename T3> +struct A +{ + typedef T2 (T1::*m) (T3); + A (m) {} +}; +struct B; +struct C +{ + void foo (B *); +}; +typedef A <C, void, B *> D; +typedef void (C::*E) (B *); +struct F; +typedef void (C::*G) (F); +D d ((E) (G) & C::foo); diff --git a/gcc/testsuite/g++.dg/template/ptrmem2.C b/gcc/testsuite/g++.dg/template/ptrmem2.C new file mode 100644 index 000000000..191904736 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem2.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 31 Dec 2001 <nathan@codesourcery.com> + +// We'd tsubst a pointer to member reference + +struct A {}; + +template <typename T> T A::* Foo (); // { dg-message "note" } + +void Baz () +{ + Foo <int &> (); // { dg-error "no matching function" "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 14 } +} diff --git a/gcc/testsuite/g++.dg/template/ptrmem20.C b/gcc/testsuite/g++.dg/template/ptrmem20.C new file mode 100644 index 000000000..dee3c629a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem20.C @@ -0,0 +1,17 @@ +// PR c++/43079 + +struct A {}; + +struct B +{ + void foo() const; + void foo(); +}; + +template<void (A::*)()> void bar(); // { dg-message "note" } + +void baz() +{ + bar<&B::foo>(); // { dg-error "not a valid template argument|no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 15 } +} diff --git a/gcc/testsuite/g++.dg/template/ptrmem21.C b/gcc/testsuite/g++.dg/template/ptrmem21.C new file mode 100644 index 000000000..c30fa38fc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem21.C @@ -0,0 +1,37 @@ +// PR c++/43868 +// { dg-options "-g" } + +struct Foo +{ + virtual void do_something() = 0; +}; + +template <typename T> +struct Foo_impl; + +template <typename R, typename O> +struct Foo_impl<R (O::*)() const> : public Foo +{ + struct Helper + { + typedef int Some_type; + operator Some_type () const { return 0; } + Helper( R (O::*)() const) {} + }; + + void do_something() { Helper( 0); }; +}; + +void register_foo_internal( Foo*) {}; + +template <typename TT> +void register_foo( TT) { register_foo_internal( new Foo_impl<TT>()); } + +struct Bar +{ +}; + +void setup() +{ + register_foo( (int (Bar::*) () const) 0); +} diff --git a/gcc/testsuite/g++.dg/template/ptrmem22.C b/gcc/testsuite/g++.dg/template/ptrmem22.C new file mode 100644 index 000000000..762f377f5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem22.C @@ -0,0 +1,29 @@ +// PR c++/44778 + +enum Healpix_Ordering_Scheme { RING, NEST }; + +class Healpix_Base + { + protected: + Healpix_Ordering_Scheme scheme_; + int nest2ring (int pix) const; + int ring2nest (int pix) const; + + typedef int (Healpix_Base::*swapfunc)(int pix) const; + }; + +template<typename T> class Healpix_Map: public Healpix_Base + { + public: + void Import_nograde (const Healpix_Map<T> &orig) + { + swapfunc swapper = (scheme_ == NEST) ? + &Healpix_Map::ring2nest : &Healpix_Map::nest2ring; + } + }; + +int main() + { + Healpix_Map<double> a,b; + a.Import_nograde(b); + } diff --git a/gcc/testsuite/g++.dg/template/ptrmem23.C b/gcc/testsuite/g++.dg/template/ptrmem23.C new file mode 100644 index 000000000..28c0a63e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem23.C @@ -0,0 +1,22 @@ +// PR c++/56247 + +struct Base { + void method() {} +}; + +typedef void (Base::*MemPtr)(); + +// Template with a member function pointer "non-type parameter". +template<MemPtr func> +struct Wrapper {}; + +template<class C> +struct Child : public Base { + // Templated derived class instantiates the Wrapper with the same parameter + // in two different virtual methods. + void foo() { typedef Wrapper<&Base::method> W; } + void bar() { typedef Wrapper<&Base::method> W; } +}; + +// Instantiate Child with some type. +template class Child<int>; diff --git a/gcc/testsuite/g++.dg/template/ptrmem3.C b/gcc/testsuite/g++.dg/template/ptrmem3.C new file mode 100644 index 000000000..fda7bf10a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem3.C @@ -0,0 +1,22 @@ +// Origin: Theo Papadopoulo <Theodore.Papadopoulo@sophia.inria.fr> + +template <typename T,double (T::*fun)() const> +struct I { +}; + +struct R { + R() { } +}; + +class H: public R { +public: + H(): R() { } + double& f() { return a; } + double f() const { return 1.0; } + double a; +}; + +struct A { + typedef I<H,&H::f> F; + A() { } +}; diff --git a/gcc/testsuite/g++.dg/template/ptrmem4.C b/gcc/testsuite/g++.dg/template/ptrmem4.C new file mode 100644 index 000000000..62262c4b8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem4.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +// Origin: Scott Snyder <snyder@fnal.gov> + +// PR c++/8849 +// Pointer to member function template argument deduction ICE. + + +template <class CONT> void queryAliases(CONT& fill_me); // { dg-message "queryAliases|no known conversion" } + +struct SpyExample +{ + void ready(); + void inputs(); +}; + +void SpyExample::ready() +{ + queryAliases(inputs); // { dg-error "matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 19 } +} diff --git a/gcc/testsuite/g++.dg/template/ptrmem5.C b/gcc/testsuite/g++.dg/template/ptrmem5.C new file mode 100644 index 000000000..50a7e77f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem5.C @@ -0,0 +1,25 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 24 Mar 2003 <nathan@codesourcery.com> + +// PR 10119 (part). We failed to tsubst the args of a template-id-expr + +template <class T, void (T::* const U)()> struct Good +{ + static int const value = 0; +}; + +struct A +{ + template <typename U> void good () + { + int s_id = Good<A, &A::good<U> >::value; + } +}; + + +int main() +{ + A().good<int>(); +} diff --git a/gcc/testsuite/g++.dg/template/ptrmem6.C b/gcc/testsuite/g++.dg/template/ptrmem6.C new file mode 100644 index 000000000..a355cfe89 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem6.C @@ -0,0 +1,10 @@ +struct S {}; + +void g(int S::**); + +template <typename T> +void f (int T::* volatile *p) { + g(p); // { dg-error "conversion" } +} + +template void f(int S::* volatile *); // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/ptrmem7.C b/gcc/testsuite/g++.dg/template/ptrmem7.C new file mode 100644 index 000000000..cd907f212 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem7.C @@ -0,0 +1,29 @@ +// { dg-do compile } +// Origin: <togawa at acm dot arg> +// c++/2094: unsupported 'ptrmem_cst' in type unification + +struct R +{ + int i; +}; + +struct S +{ + int i; + int j; +}; + +struct S2 : S +{}; + +template<int S::*p, typename> +struct X +{ + X (); + template<typename U> X(const X<p,U> &); +}; + +X<&S::i,S> x = X<&S::i,S>(); +X<&S::i,S> x2 = X<&S2::i,S>(); +X<&S::i,S> y = X<&S::j,S>(); // { dg-error "" } +X<&S::i,S> z = X<&R::i,S>(); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/template/ptrmem8.C b/gcc/testsuite/g++.dg/template/ptrmem8.C new file mode 100644 index 000000000..d0473f5cc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem8.C @@ -0,0 +1,24 @@ +// { dg-do compile } +// Origin: <marco dot franzen at bigfoot dot com> +// PR c++/10126: Handle ptmf default conversions while matching a template +// argument + +struct B +{ + int I () const; + int I (); +}; + +struct D : B {}; + +template <int (D::*fun)() const> int Get(); // { dg-message "note" } + +int main () +{ + Get<&B::I>(); // { dg-error "not a valid template argument" "not valid" } + // { dg-error "no match" "no match" { target *-*-* } 18 } + // { dg-message "note" "note" { target *-*-* } 18 } + Get<&D::I>(); // { dg-error "not a valid template argument" "not valid" } + // { dg-error "no match" "no match" { target *-*-* } 21 } + // { dg-message "note" "note" { target *-*-* } 21 } +} diff --git a/gcc/testsuite/g++.dg/template/ptrmem9.C b/gcc/testsuite/g++.dg/template/ptrmem9.C new file mode 100644 index 000000000..55e881599 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem9.C @@ -0,0 +1,9 @@ +// PR c++/15329 + +struct S {}; + +template <typename> struct X { + S s; + void foo (void (S::*p)()) + { (s.*p)(); } +}; diff --git a/gcc/testsuite/g++.dg/template/pure1.C b/gcc/testsuite/g++.dg/template/pure1.C new file mode 100644 index 000000000..68dbe6bf0 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pure1.C @@ -0,0 +1,6 @@ +// PR c++/26122 + +struct A +{ + template<int> void foo() = 1; // { dg-error "pure|non-virtual" } +}; diff --git a/gcc/testsuite/g++.dg/template/qual1.C b/gcc/testsuite/g++.dg/template/qual1.C new file mode 100644 index 000000000..8fa79b3d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qual1.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +template<class T> +class Link_array +{ +public: + void sort (int (*compare) (T *const&,T *const&)); +}; + +int shift_compare (int *const &, int *const &) {} + +template<class T> void +Link_array<T>::sort (int (*compare) (T *const&,T *const&)) +{ +} + +void f () +{ + Link_array<int> clashes; + clashes.sort (shift_compare); +} diff --git a/gcc/testsuite/g++.dg/template/qual2.C b/gcc/testsuite/g++.dg/template/qual2.C new file mode 100644 index 000000000..aa6b10ea4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qual2.C @@ -0,0 +1,29 @@ +// { dg-do run } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 23 Jan 2003 <nathan@codesourcery.com> + +// PR9415. Forgot a lookup was scoped + +int here; +int there; + +struct B +{ + virtual int activate() {return !here++;} +}; + +template <class K> +struct TPL : public B +{ + int activate() + { + return !there++ && B::activate(); + } +}; + +int main () +{ + TPL<int> i; + return !i.activate (); +} diff --git a/gcc/testsuite/g++.dg/template/qualified-id1.C b/gcc/testsuite/g++.dg/template/qualified-id1.C new file mode 100644 index 000000000..602be5bf1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualified-id1.C @@ -0,0 +1,27 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 4 Sep 2003 <nathan@codesourcery.com> +// Origin Volker Reichelt reichelt@igpm.rwth-aachen.de + +// PR 11922 + +struct A +{ + template <bool> struct B; + struct C; +}; + +template <> struct A::B<false> {}; + +template <typename T> void foo() +{ + T::C (); // { dg-error "parsed as a non-type|if a type is meant" } + T::template B<false>(); // { dg-error "parsed as a non-type" "non-type" } + // { dg-message "if a type" "if a type" { target *-*-* } 20 } +} + +void bar() +{ + foo<A>(); // { dg-message "instantiated" } +} diff --git a/gcc/testsuite/g++.dg/template/qualified-id2.C b/gcc/testsuite/g++.dg/template/qualified-id2.C new file mode 100644 index 000000000..e88e85474 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualified-id2.C @@ -0,0 +1,27 @@ +// PR c++/44587 +// { dg-do run } + +template <const char *N> struct A { static const char *p; }; +template <const char *N> const char *A<N>::p = N; +template <class T> struct B { static const char c[1]; typedef A<B<T>::c> C; }; +template <class T> const char B<T>::c[1] = ""; +template <class T> struct D { static const char c[1]; typedef A<c> C; }; +template <class T> const char D<T>::c[1] = ""; + +template <int& I> struct E { static int *ip; }; +template <int& I> int* E<I>::ip = &I; +template <class T> struct F { static int i; typedef E<F<T>::i> C; }; +template <class T> int F<T>::i; +template <class T> struct G { static int i; typedef E<i> C; }; +template <class T> int G<T>::i; + +#define AS(X) if (!(X)) return 1; +int main() +{ + AS(B<int>::C::p == B<int>::c); + AS(B<float>::C::p == B<float>::c); + AS(B<float>::C::p != B<int>::c); + AS(D<int>::C::p == D<int>::c); + AS(D<float>::C::p == D<float>::c); + AS(D<float>::C::p != D<int>::c); +} diff --git a/gcc/testsuite/g++.dg/template/qualified-id3.C b/gcc/testsuite/g++.dg/template/qualified-id3.C new file mode 100644 index 000000000..c769a529c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualified-id3.C @@ -0,0 +1,14 @@ +// PR c++/44587 + +template <const int N> struct A { }; +template <class T> struct B { + static const int c; // { dg-message "not initialized with a constant expression" } + typedef A<B<T>::c> C; // { dg-error "constant expression|template argument" } +}; +template <class T> const int B<T>::c = sizeof (T); + +template <const int N> struct D { }; +template <class T> struct E { + static const int c = sizeof (T); + typedef D<E<T>::c> F; // OK +}; diff --git a/gcc/testsuite/g++.dg/template/qualttp1.C b/gcc/testsuite/g++.dg/template/qualttp1.C new file mode 100644 index 000000000..b97ef4275 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp1.C @@ -0,0 +1,22 @@ +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +struct A +{ + template <class T> class B {}; +}; + +template <class T> struct X +{ +}; + +template <class T> struct C +{ + X<T::template B> x; // { dg-error "type" } +}; + +int main() +{ + C<A> c; +} diff --git a/gcc/testsuite/g++.dg/template/qualttp10.C b/gcc/testsuite/g++.dg/template/qualttp10.C new file mode 100644 index 000000000..8734ddc67 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp10.C @@ -0,0 +1,13 @@ +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +template <template <class> class TT> class C { +}; + +template <class T> struct D { + template <class U> class B {}; + C<D<T>::template B> c; +}; + +D<int> d; diff --git a/gcc/testsuite/g++.dg/template/qualttp11.C b/gcc/testsuite/g++.dg/template/qualttp11.C new file mode 100644 index 000000000..fa5c860c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp11.C @@ -0,0 +1,23 @@ +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do link } + +struct A +{ + template <class T> class B {}; +}; + +template <template <class> class TT> struct X +{ + TT<int> y; +}; + +template <class T> struct C +{ + X<T::template B> x; +}; + +int main() +{ + C<A> c; +} diff --git a/gcc/testsuite/g++.dg/template/qualttp12.C b/gcc/testsuite/g++.dg/template/qualttp12.C new file mode 100644 index 000000000..ebd4b645c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp12.C @@ -0,0 +1,24 @@ +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do link } + +struct A +{ + template <class T> class B {}; +}; + +template <template <class> class TT> void f() +{ + TT<int> y; +} + +template <class T> struct C +{ + void g() { f<T::template B>(); } +}; + +int main() +{ + C<A> c; + c.g(); +} diff --git a/gcc/testsuite/g++.dg/template/qualttp13.C b/gcc/testsuite/g++.dg/template/qualttp13.C new file mode 100644 index 000000000..eefc60493 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp13.C @@ -0,0 +1,27 @@ +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + +template <class U> struct A +{ + template <class V> struct AA { + template <class T> struct B { + int i; + B() : i(1) {} + }; + }; +}; + +template <template <class> class TT> struct X +{ + TT<int> y; +}; + +template <class T, class U> struct C +{ + X<T::template AA<U>::template B> x; +}; + +int main() +{ + C<A<char>, int> c; +} diff --git a/gcc/testsuite/g++.dg/template/qualttp14.C b/gcc/testsuite/g++.dg/template/qualttp14.C new file mode 100644 index 000000000..055855759 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp14.C @@ -0,0 +1,30 @@ +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do link } + +struct A +{ + template <class T> class B {}; +}; + +template <template <class> class TT, class T> struct X +{ + TT<int> y; + T z; +}; + +template <class T> struct X<T::template B, T> +{ + typename T::template B<int> y; + T z; +}; + +template <class T> struct C +{ + X<T::template B, A> x; +}; + +int main() +{ + C<A> c; +} diff --git a/gcc/testsuite/g++.dg/template/qualttp15.C b/gcc/testsuite/g++.dg/template/qualttp15.C new file mode 100644 index 000000000..b1c61195d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp15.C @@ -0,0 +1,33 @@ +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +struct A +{ + template <class T> class B {}; +}; + +template <template <class> class TT> struct X +{ + TT<int> y; +}; + +template <class T> struct X<T::template B> // { dg-error "previous" } +{ + T z; +}; + +template <class T> struct X<T::template B> // { dg-error "redefinition" } +{ + T z; +}; + +template <class T> struct C +{ + X<T::template B> x; +}; + +int main() +{ + C<A> c; +} diff --git a/gcc/testsuite/g++.dg/template/qualttp16.C b/gcc/testsuite/g++.dg/template/qualttp16.C new file mode 100644 index 000000000..1fd0e1f35 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp16.C @@ -0,0 +1,40 @@ +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do run } + +extern "C" void abort(); + +struct A +{ + template <class T> class B {}; +}; + +template <template <class> class TT, class T> struct X +{ + TT<int> y; + T z; + int f() { return 0; } +}; + +template <class T> struct X<T::template B, T> +{ + typename T::template B<int> y; + T z; + int f() { return 1; } +}; + +template <class T> struct C +{ + X<T::template B, A> x; +}; + +int main() +{ + C<A> c; + X<A::B, A> x1; + X<A::B, int> x2; + if (x1.f() != 1) + abort(); + if (x2.f() != 0) + abort(); +} diff --git a/gcc/testsuite/g++.dg/template/qualttp17.C b/gcc/testsuite/g++.dg/template/qualttp17.C new file mode 100644 index 000000000..f492ced8c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp17.C @@ -0,0 +1,25 @@ +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } +// { dg-options "-fno-inline -fabi-version=1 -Wno-abi" } + +struct A +{ + template <class T> class B {}; +}; + +template <template <class> class TT> struct X +{ +}; + +template <class T> void f(X<T::template B>) +{ +} + +int main() +{ + X<A::B> x; + f<A>(x); +} + +// { dg-final { scan-assembler "\n_?_Z1fI1AEv1XIN1T1BEE\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/template/qualttp18.C b/gcc/testsuite/g++.dg/template/qualttp18.C new file mode 100644 index 000000000..31dfa6a83 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp18.C @@ -0,0 +1,23 @@ +// Copyright (C) 2001, 2002 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +struct A +{ + template <class T> class B {}; +}; + +template <template <class> class TT> struct X +{ + TT<int> y; +}; + +struct C +{ + X<A::template B> x; // { dg-error "" } +}; + +int main() +{ + C c; +} diff --git a/gcc/testsuite/g++.dg/template/qualttp19.C b/gcc/testsuite/g++.dg/template/qualttp19.C new file mode 100644 index 000000000..be6676cc5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp19.C @@ -0,0 +1,41 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Dec 2001 <nathan@codesourcery.com> + +// PR 2645 + +template <typename T> +struct call_traits +{ + public: + typedef T type_less_spec; +}; + +template <typename T> +struct call_traits<T&> +{ + typedef T type_more_spec; +}; + + +int main() +{ + int num; + + // Two typedefs lead to the instant. of the less spec. ("wrong") template + typedef int& r_type; + typedef const r_type cr_type; + call_traits<cr_type>::type_less_spec var = num; // { dg-error "" "" } + + // The explicit type leads to the instantiation of the "correct" one + call_traits<const int&>::type_more_spec var2 = num; + + // As happen with a single typedef! + typedef const int& std_cr_type; + call_traits<std_cr_type>::type_more_spec var3 = num; + + + // As happen, indeed, without the cv-qualifier + call_traits<r_type>::type_more_spec var4; +} diff --git a/gcc/testsuite/g++.dg/template/qualttp2.C b/gcc/testsuite/g++.dg/template/qualttp2.C new file mode 100644 index 000000000..b25e15f5c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp2.C @@ -0,0 +1,22 @@ +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +struct A +{ + template <class T> class B {}; +}; + +template <int i> struct X +{ +}; + +template <class T> struct C +{ + X<T::template B> x; // { dg-error "type" } +}; + +int main() +{ + C<A> c; +} diff --git a/gcc/testsuite/g++.dg/template/qualttp20.C b/gcc/testsuite/g++.dg/template/qualttp20.C new file mode 100644 index 000000000..f42981b52 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp20.C @@ -0,0 +1,36 @@ +// { dg-do compile } +// { dg-options "-pedantic -pedantic-errors" } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Dec 2001 <nathan@codesourcery.com> + +// PR 2645 + +struct AS +{ + typedef void (myT) (); + struct L {}; + +}; + + +template <typename T> struct B1 : T +{ + typedef typename T::L __restrict__ r;// { dg-error "'__restrict__' qualifiers cannot" "" } + typedef typename T::myT __restrict__ p; + + // The following are DR 295 dependent + typedef typename T::myT volatile *myvolatile; + typename T::myT volatile *a; + myvolatile b; +}; +template <typename T> struct B2 : T +{ + // The following are DR 295 dependent + typedef typename T::myT const *myconst; + typename T::myT const *a; + myconst b; +}; + +B1<AS> b1; // { dg-message "instantiated" "" } +B2<AS> b2; diff --git a/gcc/testsuite/g++.dg/template/qualttp21.C b/gcc/testsuite/g++.dg/template/qualttp21.C new file mode 100644 index 000000000..00fcf40c4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp21.C @@ -0,0 +1,17 @@ +// Copyright (C) 2002 Free Software Foundation +// Contributed by Roger Sayle <roger@eyesopen.com> +// { dg-do compile } + +template <class A> +class foo { + int _foo; +public: + foo() {} +protected: + ~foo() {} // { dg-error "~foo" } +}; + +int main() +{ + foo<int> a; // { dg-error "context" } +} diff --git a/gcc/testsuite/g++.dg/template/qualttp22.C b/gcc/testsuite/g++.dg/template/qualttp22.C new file mode 100644 index 000000000..21aa7568d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp22.C @@ -0,0 +1,28 @@ +// { dg-do compile } + +// Origin: Philippe Van Deyck <hetadres@email.com> + +// PR c++/13520: Default template template argument that is a qualified id +// with dependent scope. + +template<typename regular_type> class Policy {}; + +template <typename regular_type, template<typename> class OriginalPolicy> +class ChangedPolicy_impl {}; + +template <template<typename> class OriginalPolicy > class ChangedPolicy { +public: + template<typename regular_type> class Type : public + ChangedPolicy_impl<regular_type,OriginalPolicy> { }; +}; + +template <typename regular_type, template<typename> class Policy1, + template<typename> class Policy2 + = ChangedPolicy<Policy1>::template Type> +class Host : public Policy1<regular_type>, public Policy2<regular_type> { }; + +int main() +{ + Host<void, Policy> h; + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/qualttp3.C b/gcc/testsuite/g++.dg/template/qualttp3.C new file mode 100644 index 000000000..4b9ffe34e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp3.C @@ -0,0 +1,23 @@ +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +struct A +{ + template <class T, class U> class B {}; +}; + +template <template <class> class TT> struct X +{ + TT<int> y; +}; + +template <class T> struct C +{ + X<T::template B> x; // { dg-error "type" } +}; + +int main() +{ + C<A> c; // { dg-message "instantiated" } +} diff --git a/gcc/testsuite/g++.dg/template/qualttp4.C b/gcc/testsuite/g++.dg/template/qualttp4.C new file mode 100644 index 000000000..c55ce2d37 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp4.C @@ -0,0 +1,24 @@ +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +struct A +{ + template <class T> struct B {}; +}; + +template <template <class, class> class TT> // { dg-error "provided" } +struct X +{ + TT<int> y; // { dg-error "number" } +}; + +template <class T> struct C +{ + X<T::template B> x; // { dg-error "type" } +}; + +int main() +{ + C<A> c; // { dg-message "instantiated" } +} diff --git a/gcc/testsuite/g++.dg/template/qualttp5.C b/gcc/testsuite/g++.dg/template/qualttp5.C new file mode 100644 index 000000000..8bca7f696 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp5.C @@ -0,0 +1,26 @@ +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +template <class U> struct A +{ + template <class T> class B {}; // { dg-message "operator=|no known conversion" } +}; + +template <template <class> class TT> void f() +{ + TT<int> y; + y = 0; // { dg-error "no match" } + // { dg-message "candidate" "candidate note" { target *-*-* } 13 } +} + +template <class T> struct C +{ + void g() { f<A<T>::template B>(); } // { dg-message "instantiated" } +}; + +int main() +{ + C<int> c; + c.g(); // { dg-message "instantiated" } +} diff --git a/gcc/testsuite/g++.dg/template/qualttp6.C b/gcc/testsuite/g++.dg/template/qualttp6.C new file mode 100644 index 000000000..aa1a46700 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp6.C @@ -0,0 +1,15 @@ +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +template <template <class> class TT> class C { +}; + +template <class T> struct D { + C<T::template B> c; // { dg-error "no class template" } +}; + +struct E { +}; + +D<E> d; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/qualttp7.C b/gcc/testsuite/g++.dg/template/qualttp7.C new file mode 100644 index 000000000..f37123e77 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp7.C @@ -0,0 +1,12 @@ +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +template <template <class> class TT> class C { +}; + +template <class T> struct D { + C<T::template B> c; // { dg-error "no class template" } +}; + +D<int> d; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/qualttp8.C b/gcc/testsuite/g++.dg/template/qualttp8.C new file mode 100644 index 000000000..5f55e60b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp8.C @@ -0,0 +1,17 @@ +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +template <template <class> class TT> class C { +}; + +template <class T> struct D { + C<T::template B> c; // { dg-error "context" } +}; + +struct E { + private: + template <class T> class B {}; // { dg-error "private" } +}; + +D<E> d; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/qualttp9.C b/gcc/testsuite/g++.dg/template/qualttp9.C new file mode 100644 index 000000000..8d90dabde --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualttp9.C @@ -0,0 +1,17 @@ +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +template <template <class> class TT> class C { +}; + +template <class T> struct D : T { + C<T::template B> c; +}; + +struct E { + protected: + template <class T> class B {}; +}; + +D<E> d; diff --git a/gcc/testsuite/g++.dg/template/recurse.C b/gcc/testsuite/g++.dg/template/recurse.C new file mode 100644 index 000000000..448c34721 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/recurse.C @@ -0,0 +1,27 @@ +// Test for handling of excessive template recursion. +// { dg-options "-ftemplate-depth-50 -O" } + +template <int I> struct F +{ + int operator()() + { + F<I+1> f; // { dg-error "incomplete type" "incomplete" } + // { dg-bogus "exceeds maximum.*exceeds maximum" "exceeds" { xfail *-*-* } 8 } + // { dg-error "exceeds maximum" "exceeds" { xfail *-*-* } 8 } + return f()*I; // { dg-message "recursively instantiated" "recurse" } + } +}; + +template <> struct F<52> +{ + int operator()() { return 0; } +}; + +int main () +{ + F<1> f; + return f(); // { dg-message "instantiated from here" "excessive recursion" } +} + +// Ignore excess messages from recursion. +// { dg-prune-output "instantiated from 'int" } diff --git a/gcc/testsuite/g++.dg/template/recurse1.C b/gcc/testsuite/g++.dg/template/recurse1.C new file mode 100644 index 000000000..4789983af --- /dev/null +++ b/gcc/testsuite/g++.dg/template/recurse1.C @@ -0,0 +1,16 @@ +// PR c++/5050 +// Origin: georg.wild@gmx.de +// Reduced by: tbagot@bluearc.com and Nathanael C. Nerode <neroden@twcny.rr.com> +// Test for that excessive template recursion does not occur +// because of optimization. +// { dg-options "-ftemplate-depth-1 -O" } + + struct ostream { + template<class T> ostream& foo( const T & ) + { return *this; } + }; + + void foo() { + ostream os; + (os.foo(1)).foo(2); + } diff --git a/gcc/testsuite/g++.dg/template/recurse2.C b/gcc/testsuite/g++.dg/template/recurse2.C new file mode 100644 index 000000000..b9767dfb6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/recurse2.C @@ -0,0 +1,8 @@ +// PR c++/9335 +// We should not see an error about non-constant initialization. + +template <int N> struct X { + static const int value = X<N-1>::value; // { dg-error "instantiation|incomplete" } + // { dg-message "recursively instantiated" "" { target *-*-* } 5 } +}; +template struct X<1000>; diff --git a/gcc/testsuite/g++.dg/template/redecl1.C b/gcc/testsuite/g++.dg/template/redecl1.C new file mode 100644 index 000000000..1bbf20ec7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/redecl1.C @@ -0,0 +1,4 @@ +// PR c++/15025 + +template <int> struct X; +struct X {}; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/template/redecl2.C b/gcc/testsuite/g++.dg/template/redecl2.C new file mode 100644 index 000000000..4dd432e6f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/redecl2.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +// Origin: heinlein@informatik.uni-ulm.de + +// PR c++/14428: Redeclaration of class template with wrong +// non-type template parameter. + +template <int i> struct X; // { dg-error "template parameter" } +template <int* p> struct X; // { dg-error "redeclared here" } diff --git a/gcc/testsuite/g++.dg/template/redecl3.C b/gcc/testsuite/g++.dg/template/redecl3.C new file mode 100644 index 000000000..029f9e69a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/redecl3.C @@ -0,0 +1,7 @@ +// PR c++/19980 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> + +// { dg-do compile } + +int foo; // { dg-error "previous declaration" } +template<int> void foo() {} // { dg-error "redeclared" } diff --git a/gcc/testsuite/g++.dg/template/redecl4.C b/gcc/testsuite/g++.dg/template/redecl4.C new file mode 100644 index 000000000..9a4a9f366 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/redecl4.C @@ -0,0 +1,5 @@ +// PR c++/28710 +// { dg-do compile } + +template<int> union A; // { dg-error "previous" } +struct A; // { dg-error "non-template" } diff --git a/gcc/testsuite/g++.dg/template/ref1.C b/gcc/testsuite/g++.dg/template/ref1.C new file mode 100644 index 000000000..5ac4329d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ref1.C @@ -0,0 +1,4 @@ +// { dg-prune-output "mangled name" } +class a {} a1; +template <a & p> class b { public: b() { static_cast <a &> (p); } }; +int main() { b <a1> b1; } diff --git a/gcc/testsuite/g++.dg/template/ref2.C b/gcc/testsuite/g++.dg/template/ref2.C new file mode 100644 index 000000000..9feb19d2f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ref2.C @@ -0,0 +1,27 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 7 Jan 2005 <nathan@codesourcery.com> + +// PR 19298: Rejects legal +// Origin: Andrew Pinski <pinskia@gcc.gnu.org> + +struct t +{ + void f() const; +}; + +template <typename _Tp> +struct A +{ + static t const& c; +}; + +template <typename _Tp> +void g(void) +{ + A<_Tp>::c.f(); +} + +void h(void) +{ + g<int>(); +} diff --git a/gcc/testsuite/g++.dg/template/ref3.C b/gcc/testsuite/g++.dg/template/ref3.C new file mode 100644 index 000000000..976c093a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ref3.C @@ -0,0 +1,11 @@ +// PR c++/28341 + +template<const int&> struct A {}; + +template<typename T> struct B +{ + A<(T)0> b; // { dg-error "constant|not a valid" } + A<T(0)> a; // { dg-error "constant|not a valid" } +}; + +B<const int&> b; diff --git a/gcc/testsuite/g++.dg/template/ref4.C b/gcc/testsuite/g++.dg/template/ref4.C new file mode 100644 index 000000000..6d89fa80a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ref4.C @@ -0,0 +1,12 @@ +// PR c++/41972 + +struct X { + static const double x; +}; +template <const double& _test_> + class Foo { }; +template <typename _ignore_> +struct Y { + typedef Foo<X::x> type; +}; + diff --git a/gcc/testsuite/g++.dg/template/ref5.C b/gcc/testsuite/g++.dg/template/ref5.C new file mode 100644 index 000000000..efefbef9c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ref5.C @@ -0,0 +1,11 @@ +// PR c++/35075 + +template<int&> struct A {}; + +template<typename T> struct B +{ + static const T t; + A<t> a; // { dg-error "reference variable" } +}; + +B<int&> b; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/repo1.C b/gcc/testsuite/g++.dg/template/repo1.C new file mode 100644 index 000000000..342993eca --- /dev/null +++ b/gcc/testsuite/g++.dg/template/repo1.C @@ -0,0 +1,20 @@ +// { dg-options "-frepo" } +// { dg-require-host-local "" } +// { dg-skip-if "dkms are not final links" { vxworks_kernel } } + +struct A { + A(); +}; + +A::A() {} + +template <typename T> +struct B : public A { + B() {} // { dg-bogus "" } +}; + +B<int> b; + +int main () {} + +// { dg-final { cleanup-repo-files } } diff --git a/gcc/testsuite/g++.dg/template/repo2.C b/gcc/testsuite/g++.dg/template/repo2.C new file mode 100644 index 000000000..e3224155e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/repo2.C @@ -0,0 +1,18 @@ +// PR c++/17163 +// { dg-options "-frepo" } +// { dg-require-host-local "" } +// { dg-skip-if "dkms are not final links" { vxworks_kernel } } + +template <int __inst> +struct __Atomicity_lock +{ + static unsigned char _S_atomicity_lock; +}; +template <int __inst> +unsigned char __Atomicity_lock<__inst>::_S_atomicity_lock = 0; +template unsigned char __Atomicity_lock<0>::_S_atomicity_lock; + +int main () { +} + +// { dg-final { cleanup-repo-files } } diff --git a/gcc/testsuite/g++.dg/template/repo3.C b/gcc/testsuite/g++.dg/template/repo3.C new file mode 100644 index 000000000..cfa38a9e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/repo3.C @@ -0,0 +1,11 @@ +// { dg-options "-frepo -DF='a'" } +// { dg-require-host-local "" } +// { dg-skip-if "dkms are not final links" { vxworks_kernel } } + +template <typename A, typename B> void f () {} +template <typename A, typename B> void g () { f<int,int>(); } +int main () { g<int,int>(); } + +char c = F; + +// { dg-final { cleanup-repo-files } } diff --git a/gcc/testsuite/g++.dg/template/repo4.C b/gcc/testsuite/g++.dg/template/repo4.C new file mode 100644 index 000000000..64882a8c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/repo4.C @@ -0,0 +1,18 @@ +// PR c++/17775 +// { dg-options "-frepo" } +// { dg-final { cleanup-repo-files } } +// { dg-require-host-local "" } +// { dg-skip-if "dkms are not final links" { vxworks_kernel } } + +namespace { + struct Foo {}; +} + +template <typename Tp> +void foo(Tp) {} + +int +main() +{ + foo(Foo()); +} diff --git a/gcc/testsuite/g++.dg/template/repo5.C b/gcc/testsuite/g++.dg/template/repo5.C new file mode 100644 index 000000000..e45ade7df --- /dev/null +++ b/gcc/testsuite/g++.dg/template/repo5.C @@ -0,0 +1,14 @@ +// PR c++/25625 +// { dg-options "-frepo" } +// { dg-final { cleanup-repo-files } } +// { dg-require-host-local "" } +// { dg-skip-if "dkms are not final links" { vxworks_kernel } } + +template< typename T, T N > struct integral_c { + static const T value = N; + typedef integral_c< T, value + 1 > next; +}; +template< typename T, T N > T const integral_c< T, N >::value; +integral_c<int,0> a; + +int main () {} diff --git a/gcc/testsuite/g++.dg/template/repo6.C b/gcc/testsuite/g++.dg/template/repo6.C new file mode 100644 index 000000000..4b7178e2a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/repo6.C @@ -0,0 +1,26 @@ +// PR c++/34178 +// { dg-options "-frepo" } +// { dg-final { cleanup-repo-files } } +// { dg-require-host-local "" } +// { dg-skip-if "dkms are not final links" { vxworks_kernel } } + +template<typename T> +class A +{ +private: + static const int x; + static int y; + +public: + int getX () { return x + y; } +}; + +template<typename T> const int A<T>::x = 0; +template<typename T> int A<T>::y = 0; + +int +main () +{ + A<int> a; + return a.getX(); +} diff --git a/gcc/testsuite/g++.dg/template/repo7.C b/gcc/testsuite/g++.dg/template/repo7.C new file mode 100644 index 000000000..dafb3f559 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/repo7.C @@ -0,0 +1,25 @@ +// PR c++/34340 +// { dg-options "-frepo" } +// { dg-final { cleanup-repo-files } } +// { dg-require-host-local "" } +// { dg-skip-if "dkms are not final links" { vxworks_kernel } } + +struct A +{ + int a; +}; + +template <typename T> struct D +{ + static const A b; +}; + +template<typename T> const A D<T>::b = { 2 }; +template class D<A>; + +const A *x = &D<A>::b; + +int +main () +{ +} diff --git a/gcc/testsuite/g++.dg/template/repo8.C b/gcc/testsuite/g++.dg/template/repo8.C new file mode 100644 index 000000000..c51592c93 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/repo8.C @@ -0,0 +1,24 @@ +// PR c++/34340 +// { dg-options "-frepo" } +// { dg-final { cleanup-repo-files } } +// { dg-require-host-local "" } +// { dg-skip-if "dkms are not final links" { vxworks_kernel } } + +struct A +{ + int a; +}; + +template <typename T> struct D +{ + static const A b; +}; + +template<typename T> const A D<T>::b = { 2 }; + +const A *x = &D<A>::b; + +int +main () +{ +} diff --git a/gcc/testsuite/g++.dg/template/repo9.C b/gcc/testsuite/g++.dg/template/repo9.C new file mode 100644 index 000000000..7ddc6bf56 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/repo9.C @@ -0,0 +1,49 @@ +// PR c++/36364 +// { dg-options "-frepo" } +// { dg-final { cleanup-repo-files } } +// { dg-require-host-local "" } +// { dg-skip-if "dkms are not final links" { vxworks_kernel } } + +template <typename C> struct A +{ + static void assign (C &c1, const C &c2) { c1 = c2; } +}; + +template <typename C, typename T> struct B +{ + struct D + { + static const C terminal; + static unsigned long stor[]; + static D &empty_rep () + { + void *p = reinterpret_cast <void *>(&stor); + return *reinterpret_cast <D *>(p); + } + void test (unsigned long n) + { + T::assign (this->refdata ()[n], terminal); + } + C *refdata () throw () + { + return reinterpret_cast <C *>(this + 1); + } + }; + C *dataplus; + C *data () const { return dataplus; } + D *rep () const { return &((reinterpret_cast < D * >(data ()))[-1]); } + static D & empty_rep () { return D::empty_rep (); } + B () : dataplus (empty_rep ().refdata ()) { } + ~B () { } + void push_back (C c) { rep ()->test (10); } +}; + +template <typename C, typename T> const C B <C, T>::D::terminal = C (); +template <typename C, typename T> unsigned long B <C, T>::D::stor[64]; + +int +main () +{ + B <char, A <char> > s; + s.push_back ('a'); +} diff --git a/gcc/testsuite/g++.dg/template/restrict1.C b/gcc/testsuite/g++.dg/template/restrict1.C new file mode 100644 index 000000000..4452298eb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/restrict1.C @@ -0,0 +1,8 @@ +// PR c++/6392 +// Bug: We tried to make the array restricted, which doesn't make sense. + +template <class T> +class bob +{ + T * __restrict a[50]; +}; diff --git a/gcc/testsuite/g++.dg/template/scope1.C b/gcc/testsuite/g++.dg/template/scope1.C new file mode 100644 index 000000000..b017b0bdb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/scope1.C @@ -0,0 +1,12 @@ +// PR 8327 + +template <class T> +class X +{ + static const int a = 5; + + static T b[a]; +}; + +template <class T> T X<T>::b[X::a]; + diff --git a/gcc/testsuite/g++.dg/template/scope2.C b/gcc/testsuite/g++.dg/template/scope2.C new file mode 100644 index 000000000..79b520cbe --- /dev/null +++ b/gcc/testsuite/g++.dg/template/scope2.C @@ -0,0 +1,34 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Aug 2003 <nathan@codesourcery.com> + +// checked instantiated bases in wrong scope. + +class Helper {}; + +template<class T> struct X { }; + +template<class T> class Base +{ + protected: + typedef Helper H; +}; + +template<class T > +struct Derived : Base<T> +{ + typedef Base<T> Parent; + typedef typename Parent::H H; + + class Nested : public X<H> {}; + + Nested m; + + void Foo (); +}; + +void Foo (Derived<char> &x) +{ + x.Foo (); +} diff --git a/gcc/testsuite/g++.dg/template/scope3.C b/gcc/testsuite/g++.dg/template/scope3.C new file mode 100644 index 000000000..c191c79c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/scope3.C @@ -0,0 +1,15 @@ +// PR c++/41038 + +struct S +{ + int size() const; +}; + +template<typename T> +struct Packer +{ + int foo() { + return Packer::var.size(); + } + const S& var; +}; diff --git a/gcc/testsuite/g++.dg/template/scope4.C b/gcc/testsuite/g++.dg/template/scope4.C new file mode 100644 index 000000000..a4ae074c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/scope4.C @@ -0,0 +1,15 @@ +// PR c++/46058 + +class StringLiterals { +public: + static const char dec[]; +}; + +template<class St, class Base, const char* name> +class NoValueCommand : public Base { +public: +}; + +template<class St, class Base> +class DecBasic : public NoValueCommand<St,Base,StringLiterals::dec> { +}; diff --git a/gcc/testsuite/g++.dg/template/sfinae1.C b/gcc/testsuite/g++.dg/template/sfinae1.C new file mode 100644 index 000000000..47db41154 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae1.C @@ -0,0 +1,21 @@ +// PR c++/14337 + +template <bool> struct Constraint; +template <> struct Constraint<true> { typedef int Result; }; + +template <typename T> +struct IsInt { static const bool value = false; }; + +template <> +struct IsInt<int> { static const bool value = true; }; + +template <typename T> +typename Constraint<IsInt<T>::value>::Result foo(T); + +template <typename T> +typename Constraint<!IsInt<T>::value>::Result foo(T); + +template <typename> +void bar() { + foo(1); +} diff --git a/gcc/testsuite/g++.dg/template/sfinae10.C b/gcc/testsuite/g++.dg/template/sfinae10.C new file mode 100644 index 000000000..f44c4458f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae10.C @@ -0,0 +1,181 @@ +// DR 339 +// +// Test of the use of various unary operators with SFINAE + +// Boilerplate helpers +typedef char yes_type; +struct no_type { char data[2]; }; + +template<typename T> T create_a(); +template<typename T> struct type { }; + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +#define JOIN( X, Y ) DO_JOIN( X, Y ) +#define DO_JOIN( X, Y ) DO_JOIN2(X,Y) +#define DO_JOIN2( X, Y ) X##Y + +#define DEFINE_PREFIX_UNARY_TRAIT(Name,Op) \ +template<typename T> \ + typename enable_if<(sizeof(Op create_a<T>(), 1) > 0), \ + yes_type>::type \ + JOIN(check_,Name)(int); \ + \ +template<typename T> \ + no_type JOIN(check_,Name)(...); \ + \ +template<typename T> \ +struct Name \ +{ \ + static const bool value = \ + (sizeof(JOIN(check_,Name)<T&>(0)) == sizeof(yes_type)); \ +} + +#define DEFINE_POSTFIX_UNARY_TRAIT(Name,Op) \ +template<typename T> \ + typename enable_if<(sizeof(create_a<T>() Op, 1) > 0), \ + yes_type>::type \ + JOIN(check_,Name)(int); \ + \ +template<typename T> \ + no_type JOIN(check_,Name)(...); \ + \ +template<typename T> \ +struct Name \ +{ \ + static const bool value = \ + (sizeof(JOIN(check_,Name)<T&>(0)) == sizeof(yes_type)); \ +} + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr) +#else +# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1] +#endif + +struct W { + W operator+(); + W operator-(); + int operator*(); + W operator~(); + bool operator!(); + W& operator++(); + W& operator--(); + W& operator++(int); + W& operator--(int); +}; + +struct X { }; +X operator+(X); +X operator-(X); +int operator*(X); +X operator~(X); +bool operator!(X); +X& operator++(X&); +X& operator--(X&); +X& operator++(X&, int); +X& operator--(X&, int); + +struct Y { }; + +struct Z { +private: + Z operator+(); // { dg-error "is private" } + Z operator-(); // { dg-error "is private" } + int operator*(); // { dg-error "is private" } + Z operator~(); // { dg-error "is private" } + bool operator!(); // { dg-error "is private" } + Z& operator++(); // { dg-error "is private" } + Z& operator--(); // { dg-error "is private" } + Z& operator++(int); // { dg-error "is private" } + Z& operator--(int); // { dg-error "is private" } +}; + +// has_unary_plus +DEFINE_PREFIX_UNARY_TRAIT(has_unary_plus, +); // { dg-error "within this context" } +STATIC_ASSERT((has_unary_plus<int>::value)); +STATIC_ASSERT((!has_unary_plus<int X::*>::value)); +STATIC_ASSERT((has_unary_plus<W>::value)); +STATIC_ASSERT((has_unary_plus<X>::value)); +STATIC_ASSERT((!has_unary_plus<Y>::value)); + +// is_negatable +DEFINE_PREFIX_UNARY_TRAIT(is_negatable, -); // { dg-error "within this context" } +STATIC_ASSERT((is_negatable<int>::value)); +STATIC_ASSERT((!is_negatable<int X::*>::value)); +STATIC_ASSERT((is_negatable<W>::value)); +STATIC_ASSERT((is_negatable<X>::value)); +STATIC_ASSERT((!is_negatable<Y>::value)); + +// is_dereferenceable +DEFINE_PREFIX_UNARY_TRAIT(is_dereferenceable, *); // { dg-error "within this context" } +STATIC_ASSERT((!is_dereferenceable<int>::value)); +STATIC_ASSERT((is_dereferenceable<int*>::value)); +STATIC_ASSERT((is_dereferenceable<W>::value)); +STATIC_ASSERT((is_dereferenceable<X>::value)); +STATIC_ASSERT((!is_dereferenceable<Y>::value)); + +// has_bitwise_not +DEFINE_PREFIX_UNARY_TRAIT(has_bitwise_not, ~); // { dg-error "within this context" } +STATIC_ASSERT((has_bitwise_not<int>::value)); +STATIC_ASSERT((!has_bitwise_not<int*>::value)); +STATIC_ASSERT((has_bitwise_not<W>::value)); +STATIC_ASSERT((has_bitwise_not<X>::value)); +STATIC_ASSERT((!has_bitwise_not<Y>::value)); + +// has_truth_not +DEFINE_PREFIX_UNARY_TRAIT(has_truth_not, !); // { dg-error "within this context" } +STATIC_ASSERT((has_truth_not<int>::value)); +STATIC_ASSERT((has_truth_not<int*>::value)); +STATIC_ASSERT((has_truth_not<W>::value)); +STATIC_ASSERT((has_truth_not<X>::value)); +STATIC_ASSERT((!has_truth_not<Y>::value)); + +// has_preincrement +DEFINE_PREFIX_UNARY_TRAIT(has_preincrement, ++); // { dg-error "within this context" } +STATIC_ASSERT((has_preincrement<int>::value)); +STATIC_ASSERT((has_preincrement<int*>::value)); +STATIC_ASSERT((!has_preincrement<int X::*>::value)); +STATIC_ASSERT((has_preincrement<W>::value)); +STATIC_ASSERT((has_preincrement<X>::value)); +STATIC_ASSERT((!has_preincrement<Y>::value)); + +// has_predecrement +DEFINE_PREFIX_UNARY_TRAIT(has_predecrement, --); // { dg-error "within this context" } +STATIC_ASSERT((has_predecrement<int>::value)); +STATIC_ASSERT((has_predecrement<int*>::value)); +STATIC_ASSERT((!has_predecrement<int X::*>::value)); +STATIC_ASSERT((has_predecrement<W>::value)); +STATIC_ASSERT((has_predecrement<X>::value)); +STATIC_ASSERT((!has_predecrement<Y>::value)); + +// has_postincrement +DEFINE_POSTFIX_UNARY_TRAIT(has_postincrement, ++); // { dg-error "within this context" } +STATIC_ASSERT((has_postincrement<int>::value)); +STATIC_ASSERT((has_postincrement<int*>::value)); +STATIC_ASSERT((!has_postincrement<int X::*>::value)); +STATIC_ASSERT((has_postincrement<W>::value)); +STATIC_ASSERT((has_postincrement<X>::value)); +STATIC_ASSERT((!has_postincrement<Y>::value)); + +// has_postdecrement +DEFINE_POSTFIX_UNARY_TRAIT(has_postdecrement, --); // { dg-error "within this context" } +STATIC_ASSERT((has_postdecrement<int>::value)); +STATIC_ASSERT((has_postdecrement<int*>::value)); +STATIC_ASSERT((!has_postdecrement<int X::*>::value)); +STATIC_ASSERT((has_postdecrement<W>::value)); +STATIC_ASSERT((has_postdecrement<X>::value)); +STATIC_ASSERT((!has_postdecrement<Y>::value)); + +// Check for private members +STATIC_ASSERT((has_unary_plus<Z>::value)); // { dg-message "instantiated from here" } +STATIC_ASSERT((is_negatable<Z>::value)); // { dg-message "instantiated from here" } +STATIC_ASSERT((is_dereferenceable<Z>::value)); // { dg-message "instantiated from here" } +STATIC_ASSERT((has_bitwise_not<Z>::value)); // { dg-message "instantiated from here" } +STATIC_ASSERT((has_truth_not<Z>::value)); // { dg-message "instantiated from here" } +STATIC_ASSERT((has_preincrement<Z>::value)); // { dg-message "instantiated from here" } +STATIC_ASSERT((has_predecrement<Z>::value)); // { dg-message "instantiated from here" } +STATIC_ASSERT((has_postincrement<Z>::value)); // { dg-message "instantiated from here" } +STATIC_ASSERT((has_postdecrement<Z>::value)); // { dg-message "instantiated from here" } + diff --git a/gcc/testsuite/g++.dg/template/sfinae11.C b/gcc/testsuite/g++.dg/template/sfinae11.C new file mode 100644 index 000000000..a813055ea --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae11.C @@ -0,0 +1,53 @@ +// DR 339 +// +// Test of the use of the comma operator with SFINAE + +// Boilerplate helpers +typedef char yes_type; +struct no_type { char data[2]; }; + +template<typename T> T create_a(); +template<typename T> struct type { }; + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +#define JOIN( X, Y ) DO_JOIN( X, Y ) +#define DO_JOIN( X, Y ) DO_JOIN2(X,Y) +#define DO_JOIN2( X, Y ) X##Y + +template<typename T, typename U> + typename enable_if<(sizeof(create_a<T>(), create_a<U>()) > 0), + yes_type>::type + check_comma(int); + +template<typename T, typename U> no_type check_comma(...); + +template<typename T, typename U> +struct has_comma +{ + static const bool value = + (sizeof(check_comma<T, U>(0)) == sizeof(yes_type)); +}; + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr) +#else +# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1] +#endif + +struct X { }; +struct Y { }; +struct Z { }; + +bool operator,(X&, Y); +bool operator,(X, Z); +void operator,(const Y&, const Z&); + +STATIC_ASSERT((has_comma<int, float>::value)); +STATIC_ASSERT((has_comma<int, X>::value)); +STATIC_ASSERT((has_comma<X, X>::value)); +STATIC_ASSERT((has_comma<X, Y>::value)); +STATIC_ASSERT((has_comma<X&, Y>::value)); +STATIC_ASSERT((has_comma<X, Z>::value)); +STATIC_ASSERT((!has_comma<Y, Z>::value)); diff --git a/gcc/testsuite/g++.dg/template/sfinae12.C b/gcc/testsuite/g++.dg/template/sfinae12.C new file mode 100644 index 000000000..c51211be2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae12.C @@ -0,0 +1,47 @@ +// DR 339 +// +// Test of the use of the ternary operator with SFINAE + +// Boilerplate helpers +typedef char yes_type; +struct no_type { char data[2]; }; + +template<typename T> T create_a(); +template<typename T> struct type { }; + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +#define JOIN( X, Y ) DO_JOIN( X, Y ) +#define DO_JOIN( X, Y ) DO_JOIN2(X,Y) +#define DO_JOIN2( X, Y ) X##Y + +template<typename T, typename U, typename V> +typename enable_if< + (sizeof((create_a<T>()? create_a<U>() : create_a<V>()), 0) > 0), + yes_type>::type + check_ternary(int); + +template<typename T, typename U, typename V> no_type check_ternary(...); + +template<typename T, typename U, typename V> +struct has_ternary +{ + static const bool value = + (sizeof(check_ternary<T, U, V>(0)) == sizeof(yes_type)); +}; + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr) +#else +# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1] +#endif + +struct X { }; +struct Y { operator bool(); }; + +STATIC_ASSERT((has_ternary<int, float, double>::value)); +STATIC_ASSERT((has_ternary<bool, double, double>::value)); +STATIC_ASSERT((!has_ternary<int, float*, double>::value)); +STATIC_ASSERT((!has_ternary<X, double, double>::value)); +STATIC_ASSERT((has_ternary<Y, double, double>::value)); diff --git a/gcc/testsuite/g++.dg/template/sfinae13.C b/gcc/testsuite/g++.dg/template/sfinae13.C new file mode 100644 index 000000000..b659685d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae13.C @@ -0,0 +1,86 @@ +// DR 339 +// +// Test of the use of casts with SFINAE + +// Boilerplate helpers +typedef char yes_type; +struct no_type { char data[2]; }; + +template<typename T> T create_a(); +template<typename T> struct type { }; + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +#define JOIN( X, Y ) DO_JOIN( X, Y ) +#define DO_JOIN( X, Y ) DO_JOIN2(X,Y) +#define DO_JOIN2( X, Y ) X##Y + +#define CHECK_CAST(CastKind) \ +template<typename T, typename U> \ + typename enable_if<(sizeof((JOIN(CastKind,_cast)<U>(create_a<T>())), 0) > 0), \ + yes_type>::type \ + JOIN(check_,JOIN(CastKind,_cast))(int); \ + \ +template<typename T, typename U> \ + no_type JOIN(check_,JOIN(CastKind,_cast))(...); \ + \ +template<typename T, typename U> \ +struct JOIN(has_,JOIN(CastKind,_cast)) \ +{ \ + static const bool value = \ + (sizeof(JOIN(check_,JOIN(CastKind,_cast))<T, U>(0)) == sizeof(yes_type)); \ +} + +template<typename T, typename U> +typename enable_if<(sizeof(((U)create_a<T>()), 0) > 0), yes_type>::type + check_c_cast(int); + +template<typename T, typename U> no_type check_c_cast(...); + +template<typename T, typename U> +struct has_c_cast +{ + static const bool value = + (sizeof(check_c_cast<T, U>(0)) == sizeof(yes_type)); +}; + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr) +#else +# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1] +#endif + +CHECK_CAST(static); +CHECK_CAST(dynamic); +CHECK_CAST(const); +CHECK_CAST(reinterpret); + +struct X { virtual void f(); }; +struct Y { operator bool(); }; +struct Z : public X { }; + +STATIC_ASSERT((has_static_cast<int, float>::value)); +STATIC_ASSERT((!has_static_cast<X, Y>::value)); +STATIC_ASSERT((has_static_cast<Z, X>::value)); + +STATIC_ASSERT(!(has_dynamic_cast<int, float>::value)); +STATIC_ASSERT(!(has_dynamic_cast<X, Y>::value)); +STATIC_ASSERT(!(has_dynamic_cast<X, Z>::value)); +STATIC_ASSERT(!(has_dynamic_cast<Y, Z>::value)); +STATIC_ASSERT((has_dynamic_cast<X*, Z*>::value)); +STATIC_ASSERT((has_dynamic_cast<X*, Y*>::value)); +STATIC_ASSERT(!(has_dynamic_cast<Y*, Z*>::value)); + +STATIC_ASSERT(!(has_const_cast<int, float>::value)); +STATIC_ASSERT((has_const_cast<const int*, int*>::value)); +STATIC_ASSERT((has_const_cast<int*, const int*>::value)); +STATIC_ASSERT(!(has_const_cast<const int*, float*>::value)); + +STATIC_ASSERT((has_reinterpret_cast<int*, float*>::value)); +STATIC_ASSERT(!(has_reinterpret_cast<void*, char>::value)); +STATIC_ASSERT(!(has_reinterpret_cast<const X, X>::value)); + +STATIC_ASSERT((has_c_cast<int, float>::value)); +STATIC_ASSERT(!(has_c_cast<X, Y>::value)); +STATIC_ASSERT(!(has_c_cast<void*, char>::value)); diff --git a/gcc/testsuite/g++.dg/template/sfinae14.C b/gcc/testsuite/g++.dg/template/sfinae14.C new file mode 100644 index 000000000..93eba43a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae14.C @@ -0,0 +1,79 @@ +// DR 339 +// +// Test of the use of the new and new[] operators with SFINAE + +// Boilerplate helpers +typedef char yes_type; +struct no_type { char data[2]; }; + +template<typename T> T create_a(); +template<typename T> struct type { }; + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +#define JOIN( X, Y ) DO_JOIN( X, Y ) +#define DO_JOIN( X, Y ) DO_JOIN2(X,Y) +#define DO_JOIN2( X, Y ) X##Y + +template<typename T> +typename enable_if<(sizeof(new T, 0) > 0), yes_type>::type + check_new(int); + +template<typename T> no_type check_new(...); + +template<typename T> +struct has_new +{ + static const bool value = + (sizeof(check_new<T>(0)) == sizeof(yes_type)); +}; + +template<typename T, typename U> +typename enable_if<(sizeof((new T(create_a<U>())), 0) > 0), + yes_type>::type + check_new_one_arg(int); + +template<typename T, typename U> no_type check_new_one_arg(...); + +template<typename T, typename U> +struct has_new_one_arg +{ + static const bool value = + (sizeof(check_new_one_arg<T, U>(0)) == sizeof(yes_type)); +}; + +template<typename T, typename U, U N> +typename enable_if<(sizeof(new T[N], 0) > 0), yes_type>::type + check_array_new(int); + +template<typename T, typename U, U N> no_type check_array_new(...); + +template<typename T, typename U, U N> +struct has_array_new +{ + static const bool value = + (sizeof(check_array_new<T, U, N>(0)) == sizeof(yes_type)); +}; + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr) +#else +# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1] +#endif + +struct X { + X(int); +}; + +struct Y { int foo; }; + +STATIC_ASSERT((has_new<Y>::value)); +STATIC_ASSERT(!(has_new<X>::value)); +STATIC_ASSERT((has_new_one_arg<Y, Y>::value)); +STATIC_ASSERT((has_new_one_arg<X, float>::value)); +STATIC_ASSERT(!(has_new_one_arg<X, int X::*>::value)); + +STATIC_ASSERT((has_array_new<Y, int, 5>::value)); +STATIC_ASSERT(!(has_array_new<X, int Y::*, &Y::foo>::value)); +STATIC_ASSERT((has_array_new<X, int, 5>::value)); diff --git a/gcc/testsuite/g++.dg/template/sfinae15.C b/gcc/testsuite/g++.dg/template/sfinae15.C new file mode 100644 index 000000000..27bce255d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae15.C @@ -0,0 +1,23 @@ +// PR c++/40944 +// { dg-options -std=c++0x } +// { dg-do run } + +template<typename T> +struct make { static T&& it(); }; + +void (*pf)(int&) = 0; + +template< typename T > +int bar(T const& x, + decltype( pf(make<T const&>::it()) )* = 0 // SFINAE! + ) { + return 1; +} + +int bar(...) { + return 0; +} + +int main() { + return bar(42); +} diff --git a/gcc/testsuite/g++.dg/template/sfinae16.C b/gcc/testsuite/g++.dg/template/sfinae16.C new file mode 100644 index 000000000..28a06d280 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae16.C @@ -0,0 +1,34 @@ +// PR c++/41927 +// { dg-options "-std=c++0x -Wall" } + +// We were getting a spurious ||/&& warning about the enable_if with the +// source position of d1. + +template<typename Tp> + struct is_int + { static const bool value = true; }; + +template<bool, typename Tp = void> + struct enable_if + { }; + +template<typename Tp> + struct enable_if<true, Tp> + { typedef Tp type; }; + +template<typename Rep> + struct duration + { + duration() { } + + template<typename Rep2, typename = typename + enable_if<false || (true && is_int<Rep2>::value)>::type> + duration(const duration<Rep2>&) { } + }; + +int main() +{ + duration<int> d0; + duration<int> d1 = d0; // { dg-warning "set but not used" } +} + diff --git a/gcc/testsuite/g++.dg/template/sfinae17.C b/gcc/testsuite/g++.dg/template/sfinae17.C new file mode 100644 index 000000000..eb043cbdd --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae17.C @@ -0,0 +1,28 @@ +// The conversion from D* to B* is ambiguous, but that should not produce +// an error, it should remove the first f overload by SFINAE. + +#define static_assert(TEST,STR) \ + do { int ar[(TEST)?1:-1]; } while (0); + +struct B {}; + +struct B1 : B {}; +struct B2 : B {}; + +struct D : B1, B2 {}; + +template <class T> T create(); + +typedef char one[1]; +typedef char two[2]; + +template <class T> + one &f(char (*)[sizeof static_cast<T>(create<D *>())]); +template <class T> + two &f(...); + +int main() +{ + static_assert(sizeof f<int>(0) == sizeof(two), ""); + static_assert(sizeof f<B *>(0) == sizeof(two), ""); +} diff --git a/gcc/testsuite/g++.dg/template/sfinae18.C b/gcc/testsuite/g++.dg/template/sfinae18.C new file mode 100644 index 000000000..bbc39cb3a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae18.C @@ -0,0 +1,10 @@ +// PR c++/41468 + +typedef int Ft(int); +struct A { operator Ft*(); }; +struct B { operator Ft*(); }; +struct C : A, B { }; + +template<typename C> void f(int (*a)[sizeof(C()(0))]); +template<typename C> void f(...); +int main() { f<C>(0); } diff --git a/gcc/testsuite/g++.dg/template/sfinae19.C b/gcc/testsuite/g++.dg/template/sfinae19.C new file mode 100644 index 000000000..59be183fe --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae19.C @@ -0,0 +1,44 @@ +// PR c++/44907 + +struct A { }; + +struct B +: public A { }; + +struct C +: public A { }; + +struct D +: public B, public C { }; + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +template<typename From, typename To> + class mini_is_convertible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template<typename To1> + static void test_aux(To1); + + template<typename To1, typename From1> + static typename + enable_if<(sizeof(test_aux<To1>(From1()), 1) > 0), one>::type + test(int); + + template<typename, typename> + static two test(...); + + public: + static const bool value = sizeof(test<To, From>(0)) == 1; + }; + +template<typename From, typename To> + const bool mini_is_convertible<From, To>::value; + +int Test1[mini_is_convertible<D*, A*>::value ? -1 : 1]; +int Test2[mini_is_convertible<A*, D*>::value ? -1 : 1]; +int Test3[mini_is_convertible<D, A>::value ? -1 : 1]; +int Test4[mini_is_convertible<A, D>::value ? -1 : 1]; diff --git a/gcc/testsuite/g++.dg/template/sfinae2.C b/gcc/testsuite/g++.dg/template/sfinae2.C new file mode 100644 index 000000000..e39ca6b76 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae2.C @@ -0,0 +1,18 @@ +// PR c++/19989 +// Don't instantiate a function template if it would generate an +// array of size zero. + +// { dg-do compile } + +template<int T> struct cl { + const static int value = T; +}; + +template<int I> void fn (char (*) [cl<I>::value] = 0 ); // { dg-message "note" } + +void foo (void) +{ + fn<0> (); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 15 } +} + diff --git a/gcc/testsuite/g++.dg/template/sfinae20.C b/gcc/testsuite/g++.dg/template/sfinae20.C new file mode 100644 index 000000000..9767bc029 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae20.C @@ -0,0 +1,45 @@ +// PR c++/44907 +// { dg-options "-std=c++0x" } + +#include <utility> + +struct A { }; + +struct B +: public A { }; + +struct C +: public A { }; + +struct D +: public B, public C { }; + +template<typename From, typename To> + class mini_is_convertible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template<typename To1> + static void test_aux(To1); + + template<typename To1, typename From1> + static decltype(test_aux<To1>(std::declval<From1>()), one()) + test(int); + + template<typename, typename> + static two test(...); + + public: + static const bool value = sizeof(test<To, From>(0)) == 1; + }; + +template<typename From, typename To> + const bool mini_is_convertible<From, To>::value; + +static_assert (!mini_is_convertible<D*, A*>::value, ""); +static_assert (!mini_is_convertible<A*, D*>::value, ""); +static_assert (!mini_is_convertible<D&, A&>::value, ""); +static_assert (!mini_is_convertible<A&, D&>::value, ""); +static_assert (!mini_is_convertible<D, A>::value, ""); +static_assert (!mini_is_convertible<A, D>::value, ""); diff --git a/gcc/testsuite/g++.dg/template/sfinae21.C b/gcc/testsuite/g++.dg/template/sfinae21.C new file mode 100644 index 000000000..6086f2f9e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae21.C @@ -0,0 +1,40 @@ +// PR c++/44908 + +struct A { }; + +struct B +: public virtual A { }; + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +template<typename From, typename To> + class mini_is_convertible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template<typename To1> + static void test_aux(To1); + + template<typename To1, typename From1> + static typename + enable_if<(sizeof(test_aux<To1>(From1()), 1) > 0), one>::type + test(int); + + template<typename, typename> + static two test(...); + + public: + static const bool value = sizeof(test<To, From>(0)) == 1; + }; + +template<typename From, typename To> + const bool mini_is_convertible<From, To>::value; + +int Test1[mini_is_convertible<int (B::*) (int), + int (A::*) (int)>::value ? -1 : 1]; +int Test2[mini_is_convertible<int (B::*), int (A::*)>::value ? -1 : 1]; +int Test3[mini_is_convertible<int (A::*) (int), + int (B::*) (int)>::value ? -1 : 1]; +int Test4[mini_is_convertible<int (A::*), int (B::*)>::value ? -1 : 1]; diff --git a/gcc/testsuite/g++.dg/template/sfinae22.C b/gcc/testsuite/g++.dg/template/sfinae22.C new file mode 100644 index 000000000..cdac99d91 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae22.C @@ -0,0 +1,39 @@ +// PR c++/44908 +// { dg-options "-std=c++0x" } + +#include <utility> + +struct A { }; + +struct B +: public virtual A { }; + +template<typename From, typename To> + class mini_is_convertible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template<typename To1> + static void test_aux(To1); + + template<typename To1, typename From1> + static decltype(test_aux<To1>(std::declval<From1>()), one()) + test(int); + + template<typename, typename> + static two test(...); + + public: + static const bool value = sizeof(test<To, From>(0)) == 1; + }; + +template<typename From, typename To> + const bool mini_is_convertible<From, To>::value; + +static_assert (!mini_is_convertible<int (B::*) (int), + int (A::*) (int)>::value, ""); +static_assert (!mini_is_convertible<int (B::*), int (A::*)>::value, ""); +static_assert (!mini_is_convertible<int (A::*) (int), + int (B::*) (int)>::value, ""); +static_assert (!mini_is_convertible<int (A::*), int (B::*)>::value, ""); diff --git a/gcc/testsuite/g++.dg/template/sfinae23.C b/gcc/testsuite/g++.dg/template/sfinae23.C new file mode 100644 index 000000000..9e0197a70 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae23.C @@ -0,0 +1,23 @@ +// PR c++/44969 +// { dg-options "-std=c++0x" } + +template<typename Tp, typename... Args> + class mini_is_constructible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template<typename Tp1, typename... Args1> + static decltype(Tp1(Args1()...), one()) + test(int); + + template<typename, typename...> + static two test(...); + + public: + static const bool value = sizeof(test<Tp, Args...>(0)) == 1; + }; + +class A { }; + +int Test[mini_is_constructible<int, A, A>::value ? -1 : 1]; diff --git a/gcc/testsuite/g++.dg/template/sfinae24.C b/gcc/testsuite/g++.dg/template/sfinae24.C new file mode 100644 index 000000000..7138c96e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae24.C @@ -0,0 +1,26 @@ +// PR c++/44969 + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +template<typename Tp, typename Arg1, typename Arg2> + class mini_is_constructible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template<typename Tp1, typename Arg1_, typename Arg2_> + static typename + enable_if<(sizeof(Tp1(Arg1_(), Arg2_()), 1) > 0), one>::type + test(int); + + template<typename, typename, typename> + static two test(...); + + public: + static const bool value = sizeof(test<Tp, Arg1, Arg2>(0)) == 1; + }; + +class A { }; + +int Test[mini_is_constructible<int, A, A>::value ? -1 : 1]; diff --git a/gcc/testsuite/g++.dg/template/sfinae25.C b/gcc/testsuite/g++.dg/template/sfinae25.C new file mode 100644 index 000000000..e9ee83e12 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae25.C @@ -0,0 +1,14 @@ +template <int I> +struct A { }; + +template <int J> +void f(A<1/J>); + +template <int J> +void f(...) { } + +int main() +{ + f<0>(); +} + diff --git a/gcc/testsuite/g++.dg/template/sfinae26.C b/gcc/testsuite/g++.dg/template/sfinae26.C new file mode 100644 index 000000000..dcb018f80 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae26.C @@ -0,0 +1,34 @@ +// Origin: PR c++/46170 +// { dg-do compile } + +namespace util { + struct option_value { + }; + template <class T> struct options_map_impl { + typedef T options_struct_type; + typedef bool (*opt_func)(const option_value&, options_struct_type&); + template <class V, V K> static bool set_member_constant(const option_value&, + options_struct_type&, V options_struct_type::*); + template <class V, V options_struct_type::*mem, V K> static bool + set_member_constant(const option_value& opt, options_struct_type& t) { + return set_member_constant<V,K>(opt, t, mem); + } + }; +} +struct cflat_options { + bool show_precharges; +}; +typedef util::options_map_impl<cflat_options> options_map_impl_type; +class register_options_modifier { + typedef options_map_impl_type::opt_func modifier_type; +public: register_options_modifier(); + register_options_modifier(const char* Mode, const modifier_type COM, + const char* h); +}; +static const register_options_modifier +cflat_opt_mod_show_precharges("precharges", + &options_map_impl_type::set_member_constant<bool, + &cflat_options::show_precharges, true>, "show precharge expressions"), + cflat_opt_mod_no_show_precharges("no-" "precharges", + &options_map_impl_type::set_member_constant<bool, + &cflat_options::show_precharges, false>, "hide precharge expressions"); diff --git a/gcc/testsuite/g++.dg/template/sfinae27.C b/gcc/testsuite/g++.dg/template/sfinae27.C new file mode 100644 index 000000000..0ecd1700d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae27.C @@ -0,0 +1,33 @@ +// Origin: PR c++/46162 + +struct small_type { char dummy; }; +struct large_type { char dummy[2]; }; + +template<class T> +struct has_foo_member_variable +{ + template<int T::*> struct tester; + template<class U> static small_type has_foo(tester<&U::foo> *); + template<class U> static large_type has_foo(...); + static const bool value = (sizeof(has_foo<T>(0)) == sizeof(small_type)); +}; + +struct A +{ + static int foo() + { + return 0; + } +}; + +struct B +{ + static int foo; +}; + +void +bar() +{ + bool b = has_foo_member_variable<A>::value; +} + diff --git a/gcc/testsuite/g++.dg/template/sfinae3.C b/gcc/testsuite/g++.dg/template/sfinae3.C new file mode 100644 index 000000000..349463d95 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae3.C @@ -0,0 +1,17 @@ +// PR c++/24671 +// { dg-do compile } + +template<typename> struct A +{ + typedef int X; + static const int i = 0; +}; + +template<typename> struct B +{ + B(const B&); + typedef typename A<char[A<B>::i]>::X Y; // { dg-error "forbids zero-size array" } + template<typename T> B(T, Y); +}; + +B<int> b(0,0); // { dg-message "instantiated from here" } diff --git a/gcc/testsuite/g++.dg/template/sfinae4.C b/gcc/testsuite/g++.dg/template/sfinae4.C new file mode 100644 index 000000000..a9650511e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae4.C @@ -0,0 +1,35 @@ +// DR 339 +// +// Test of the use of free functions with SFINAE +void foo(int) { } +template<typename T> void foo(T*) { } + +typedef char yes_type; +struct no_type { char data[2]; }; + +template<typename T> T create_a(); + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +template<typename T> + typename enable_if<(sizeof(foo(create_a<T const&>()), 1) > 0), + yes_type>::type + check_has_foo(const volatile T&); + +no_type check_has_foo(...); + +template<typename T> +struct has_foo +{ + static const bool value = + (sizeof(check_has_foo(create_a<T const&>())) == sizeof(yes_type)); +}; + +struct X { }; + +int a1[has_foo<int>::value? 1 : -1]; +int a2[has_foo<long>::value? 1 : -1]; +int a3[has_foo<int*>::value? 1 : -1]; +int a4[has_foo<X>::value? -1 : 1]; +int a5[has_foo<int X::*>::value? -1 : 1]; diff --git a/gcc/testsuite/g++.dg/template/sfinae5.C b/gcc/testsuite/g++.dg/template/sfinae5.C new file mode 100644 index 000000000..516e5cc85 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae5.C @@ -0,0 +1,47 @@ +// DR 339 +// +// Test of the use of member functions with SFINAE +typedef char yes_type; +struct no_type { char data[2]; }; + +template<typename T> T create_a(); + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +template<typename T> + typename enable_if<(sizeof(create_a<T>().foo(), 1) > 0), + yes_type>::type + check_has_member_foo(const volatile T&); + +no_type check_has_member_foo(...); + +template<typename T> +struct has_foo +{ + static const bool value = + (sizeof(check_has_member_foo(create_a<T const&>())) == sizeof(yes_type)); +}; + +struct X { }; +struct Y { + void foo(); +}; +struct Z { + void foo(int); +}; + +struct A { + int foo; +}; + +struct B { + static int foo(); +}; + +int a1[has_foo<X>::value? -1 : 1]; +int a2[has_foo<Y>::value? 1 : -1]; +int a3[has_foo<Z>::value? -1 : 1]; +int a4[has_foo<int>::value? -1 : 1]; +int a5[has_foo<A>::value? -1 : 1]; +int a6[has_foo<B>::value? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/template/sfinae6.C b/gcc/testsuite/g++.dg/template/sfinae6.C new file mode 100644 index 000000000..64567aae2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae6.C @@ -0,0 +1,83 @@ +// DR 339 +// +// Test of the use of the function call operator with SFINAE +typedef char yes_type; +struct no_type { char data[2]; }; + +template<typename T> T create_a(); + +template<typename T> struct type { }; + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +template<typename F, typename T1, typename T2> + typename enable_if<sizeof(create_a<F>()(create_a<T1>(), create_a<T2>()), 1), + yes_type>::type + check_is_callable2(type<F>, type<T1>, type<T2>); + +no_type check_is_callable2(...); + +template<typename F, typename T1, typename T2 = T1> +struct is_callable2 +{ + static const bool value = + (sizeof(check_is_callable2(type<F>(), type<T1>(), type<T2>())) + == sizeof(yes_type)); +}; + +#define JOIN( X, Y ) DO_JOIN( X, Y ) +#define DO_JOIN( X, Y ) DO_JOIN2(X,Y) +#define DO_JOIN2( X, Y ) X##Y + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr) +#else +# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1] +#endif + + +struct A; +struct B; + +struct A { + A(B); +}; + +struct B { + B(A); +}; + +struct F1 { }; + +struct F2 { + bool operator()(int, float); +}; + +struct F3 { + bool operator()(int); +}; + +struct F4 { + void operator()(A, A); + void operator()(B, B); +}; + +struct F5 { + void operator()(A, A); + +private: + void operator()(B, B); +}; + +STATIC_ASSERT((is_callable2<int(*)(int, int), long, int>::value)); +STATIC_ASSERT((!is_callable2<int(*)(int, int), int*, int>::value)); +STATIC_ASSERT((!is_callable2<F1, int, int>::value)); +STATIC_ASSERT((is_callable2<F2, int, int>::value)); +STATIC_ASSERT((!is_callable2<F2, int*, int>::value)); +STATIC_ASSERT((!is_callable2<F3, int, int>::value)); +STATIC_ASSERT((is_callable2<F4, A, A>::value)); +STATIC_ASSERT((is_callable2<F4, B, B>::value)); +STATIC_ASSERT((!is_callable2<F4, A, B>::value)); +STATIC_ASSERT((is_callable2<F5, A, A>::value)); +STATIC_ASSERT((!is_callable2<F5, A, B>::value)); diff --git a/gcc/testsuite/g++.dg/template/sfinae6_neg.C b/gcc/testsuite/g++.dg/template/sfinae6_neg.C new file mode 100644 index 000000000..2df4ade47 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae6_neg.C @@ -0,0 +1,58 @@ +// DR 339 +// +// Test of the use of the function call operator with SFINAE +typedef char yes_type; +struct no_type { char data[2]; }; + +template<typename T> T create_a(); + +template<typename T> struct type { }; + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +template<typename F, typename T1, typename T2> + typename enable_if<sizeof(create_a<F>()(create_a<T1>(), create_a<T2>()), 1), + yes_type>::type + check_is_callable2(type<F>, type<T1>, type<T2>); + +no_type check_is_callable2(...); + +template<typename F, typename T1, typename T2 = T1> +struct is_callable2 +{ + static const bool value = + (sizeof(check_is_callable2(type<F>(), type<T1>(), type<T2>())) + == sizeof(yes_type)); // { dg-error "within this context" } +}; + +#define JOIN( X, Y ) DO_JOIN( X, Y ) +#define DO_JOIN( X, Y ) DO_JOIN2(X,Y) +#define DO_JOIN2( X, Y ) X##Y + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr) +#else +# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1] +#endif + + +struct A; +struct B; + +struct A { + A(B); +}; + +struct B { + B(A); +}; + +struct F { + void operator()(A, A); + +private: + void operator()(B, B); // { dg-error "is private" } +}; + +STATIC_ASSERT((is_callable2<F, B, B>::value)); diff --git a/gcc/testsuite/g++.dg/template/sfinae7.C b/gcc/testsuite/g++.dg/template/sfinae7.C new file mode 100644 index 000000000..8551eb279 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae7.C @@ -0,0 +1,199 @@ +// DR 339 +// +// Test of the use of various binary operators with SFINAE + +// Boilerplate helpers +typedef char yes_type; +struct no_type { char data[2]; }; + +template<typename T> T create_a(); +template<typename T> struct type { }; + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +#define JOIN( X, Y ) DO_JOIN( X, Y ) +#define DO_JOIN( X, Y ) DO_JOIN2(X,Y) +#define DO_JOIN2( X, Y ) X##Y + +#define DEFINE_INFIX_BINARY_TRAIT(Name,Op) \ +template<typename T, typename U> \ + typename enable_if<(sizeof(create_a<T>() Op create_a<U>(), 1) > 0), \ + yes_type>::type \ + JOIN(check_,Name)(type<T>, type<U>); \ + \ +no_type JOIN(check_,Name)(...); \ + \ +template<typename T, typename U = T> \ +struct Name \ +{ \ + static const bool value = \ + (sizeof(JOIN(check_,Name)(type<T>(), type<U>())) == sizeof(yes_type)); \ +} + +template<typename T, typename U> + typename enable_if<(sizeof(create_a<T>()[create_a<U>()], 1) > 0), + yes_type>::type + check_subscript(int); + +template<typename T, typename U> + no_type check_subscript(...); + +template<typename T, typename U> +struct can_subscript +{ + static const bool value = + (sizeof(check_subscript<T, U>(0)) == sizeof(yes_type)); +}; + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr) +#else +# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1] +#endif + +struct X { }; +struct Y { int operator[](X); }; + +// is_addable +DEFINE_INFIX_BINARY_TRAIT(is_addable, +); +X operator+(X, X); +X operator+(X, Y); +STATIC_ASSERT((is_addable<int>::value)); +STATIC_ASSERT((is_addable<int, long>::value)); +STATIC_ASSERT((is_addable<X>::value)); +STATIC_ASSERT((is_addable<int*, int>::value)); +STATIC_ASSERT((!is_addable<int*>::value)); +STATIC_ASSERT((is_addable<X, Y>::value)); +STATIC_ASSERT((!is_addable<Y>::value)); + +// is_subtractable +DEFINE_INFIX_BINARY_TRAIT(is_subtractable, -); +X operator-(X, X); +X operator-(X, Y); +STATIC_ASSERT((is_subtractable<int>::value)); +STATIC_ASSERT((is_subtractable<int, long>::value)); +STATIC_ASSERT((is_subtractable<X>::value)); +STATIC_ASSERT((is_subtractable<int*, int>::value)); +STATIC_ASSERT((is_subtractable<int*>::value)); +STATIC_ASSERT((is_subtractable<X, Y>::value)); +STATIC_ASSERT((!is_subtractable<Y>::value)); +STATIC_ASSERT((!is_subtractable<int X::*>::value)); + +// is_multiplicable +DEFINE_INFIX_BINARY_TRAIT(is_multiplicable, *); +X operator*(X, X); +X operator*(X, Y); +STATIC_ASSERT((is_multiplicable<int>::value)); +STATIC_ASSERT((is_multiplicable<int, long>::value)); +STATIC_ASSERT((is_multiplicable<X>::value)); +STATIC_ASSERT((!is_multiplicable<int*, int>::value)); +STATIC_ASSERT((!is_multiplicable<int*>::value)); +STATIC_ASSERT((is_multiplicable<X, Y>::value)); +STATIC_ASSERT((!is_multiplicable<Y>::value)); +STATIC_ASSERT((!is_multiplicable<int X::*>::value)); + +// is_divisible +DEFINE_INFIX_BINARY_TRAIT(is_divisible, /); +X operator/(X, X); +X operator/(X, Y); +STATIC_ASSERT((is_divisible<int>::value)); +STATIC_ASSERT((is_divisible<int, long>::value)); +STATIC_ASSERT((is_divisible<X>::value)); +STATIC_ASSERT((!is_divisible<int*, int>::value)); +STATIC_ASSERT((!is_divisible<int*>::value)); +STATIC_ASSERT((is_divisible<X, Y>::value)); +STATIC_ASSERT((!is_divisible<Y>::value)); +STATIC_ASSERT((!is_divisible<int X::*>::value)); + +// has_remainder +DEFINE_INFIX_BINARY_TRAIT(has_remainder, %); +X operator%(X, X); +X operator%(X, Y); +STATIC_ASSERT((has_remainder<int>::value)); +STATIC_ASSERT((has_remainder<int, long>::value)); +STATIC_ASSERT((!has_remainder<float>::value)); +STATIC_ASSERT((has_remainder<X>::value)); +STATIC_ASSERT((!has_remainder<int*, int>::value)); +STATIC_ASSERT((!has_remainder<int*>::value)); +STATIC_ASSERT((has_remainder<X, Y>::value)); +STATIC_ASSERT((!has_remainder<Y>::value)); +STATIC_ASSERT((!has_remainder<int X::*>::value)); + +// has_xor +DEFINE_INFIX_BINARY_TRAIT(has_xor, ^); +X operator^(X, X); +X operator^(X, Y); +STATIC_ASSERT((has_xor<int>::value)); +STATIC_ASSERT((has_xor<int, long>::value)); +STATIC_ASSERT((!has_xor<float>::value)); +STATIC_ASSERT((has_xor<X>::value)); +STATIC_ASSERT((!has_xor<int*, int>::value)); +STATIC_ASSERT((!has_xor<int*>::value)); +STATIC_ASSERT((has_xor<X, Y>::value)); +STATIC_ASSERT((!has_xor<Y>::value)); +STATIC_ASSERT((!has_xor<int X::*>::value)); + +// has_bitand +DEFINE_INFIX_BINARY_TRAIT(has_bitand, &); +X operator&(X, X); +X operator&(X, Y); +STATIC_ASSERT((has_bitand<int>::value)); +STATIC_ASSERT((has_bitand<int, long>::value)); +STATIC_ASSERT((!has_bitand<float>::value)); +STATIC_ASSERT((has_bitand<X>::value)); +STATIC_ASSERT((!has_bitand<int*, int>::value)); +STATIC_ASSERT((!has_bitand<int*>::value)); +STATIC_ASSERT((has_bitand<X, Y>::value)); +STATIC_ASSERT((!has_bitand<Y>::value)); +STATIC_ASSERT((!has_bitand<int X::*>::value)); + +// has_bitor +DEFINE_INFIX_BINARY_TRAIT(has_bitor, |); +X operator|(X, X); +X operator|(X, Y); +STATIC_ASSERT((has_bitor<int>::value)); +STATIC_ASSERT((has_bitor<int, long>::value)); +STATIC_ASSERT((!has_bitor<float>::value)); +STATIC_ASSERT((has_bitor<X>::value)); +STATIC_ASSERT((!has_bitor<int*, int>::value)); +STATIC_ASSERT((!has_bitor<int*>::value)); +STATIC_ASSERT((has_bitor<X, Y>::value)); +STATIC_ASSERT((!has_bitor<Y>::value)); +STATIC_ASSERT((!has_bitor<int X::*>::value)); + +// has_left_shift +DEFINE_INFIX_BINARY_TRAIT(has_left_shift, <<); +X operator<<(X, X); +X operator<<(X, Y); +STATIC_ASSERT((has_left_shift<int>::value)); +STATIC_ASSERT((has_left_shift<int, long>::value)); +STATIC_ASSERT((!has_left_shift<float>::value)); +STATIC_ASSERT((has_left_shift<X>::value)); +STATIC_ASSERT((!has_left_shift<int*, int>::value)); +STATIC_ASSERT((!has_left_shift<int*>::value)); +STATIC_ASSERT((has_left_shift<X, Y>::value)); +STATIC_ASSERT((!has_left_shift<Y>::value)); +STATIC_ASSERT((!has_left_shift<int X::*>::value)); + +// has_right_shift +DEFINE_INFIX_BINARY_TRAIT(has_right_shift, >>); +X operator>>(X, X); +X operator>>(X, Y); +STATIC_ASSERT((has_right_shift<int>::value)); +STATIC_ASSERT((has_right_shift<int, long>::value)); +STATIC_ASSERT((!has_right_shift<float>::value)); +STATIC_ASSERT((has_right_shift<X>::value)); +STATIC_ASSERT((!has_right_shift<int*, int>::value)); +STATIC_ASSERT((!has_right_shift<int*>::value)); +STATIC_ASSERT((has_right_shift<X, Y>::value)); +STATIC_ASSERT((!has_right_shift<Y>::value)); +STATIC_ASSERT((!has_right_shift<int X::*>::value)); + +// can_subscript +STATIC_ASSERT((can_subscript<int*, int>::value)); +STATIC_ASSERT((can_subscript<int, int*>::value)); +STATIC_ASSERT((can_subscript<int(&)[7], int>::value)); +STATIC_ASSERT((can_subscript<int, int(&)[7]>::value)); +STATIC_ASSERT((!can_subscript<X, Y>::value)); +STATIC_ASSERT((can_subscript<Y, X>::value)); diff --git a/gcc/testsuite/g++.dg/template/sfinae8.C b/gcc/testsuite/g++.dg/template/sfinae8.C new file mode 100644 index 000000000..5ac09c6b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae8.C @@ -0,0 +1,182 @@ +// DR 339 +// +// Test of the use of various boolean binary operators with SFINAE + +// Boilerplate helpers +typedef char yes_type; +struct no_type { char data[2]; }; + +template<typename T> T create_a(); +template<typename T> struct type { }; + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +#define JOIN( X, Y ) DO_JOIN( X, Y ) +#define DO_JOIN( X, Y ) DO_JOIN2(X,Y) +#define DO_JOIN2( X, Y ) X##Y + +bool accepts_bool(bool); + +#define DEFINE_BINARY_PREDICATE_TRAIT(Name,Op) \ +template<typename T, typename U> \ + typename enable_if<sizeof(accepts_bool(create_a<T>() Op create_a<U>())), \ + yes_type>::type \ + JOIN(check_,Name)(type<T>, type<U>); \ + \ +no_type JOIN(check_,Name)(...); \ + \ +template<typename T, typename U = T> \ +struct Name \ +{ \ + static const bool value = \ + (sizeof(JOIN(check_,Name)(type<T>(), type<U>())) == sizeof(yes_type)); \ +} + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr) +#else +# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1] +#endif + +struct X { }; +struct Y { }; + +struct convertible_to_bool { + operator int convertible_to_bool::* (); +}; + +struct not_convertible_to_bool { }; + +// is_less_than_comparable +DEFINE_BINARY_PREDICATE_TRAIT(is_less_than_comparable,<); +bool operator<(X, X); +convertible_to_bool operator<(X, Y); +not_convertible_to_bool operator<(Y, X); + +STATIC_ASSERT((is_less_than_comparable<int>::value)); +STATIC_ASSERT((is_less_than_comparable<int, long>::value)); +STATIC_ASSERT((is_less_than_comparable<int*>::value)); +STATIC_ASSERT((is_less_than_comparable<X>::value)); +STATIC_ASSERT((is_less_than_comparable<X, Y>::value)); +STATIC_ASSERT((!is_less_than_comparable<Y, X>::value)); +STATIC_ASSERT((!is_less_than_comparable<Y>::value)); + +// is_less_equal_comparable +DEFINE_BINARY_PREDICATE_TRAIT(is_less_equal_comparable,<=); +bool operator<=(X, X); +convertible_to_bool operator<=(X, Y); +not_convertible_to_bool operator<=(Y, X); + +STATIC_ASSERT((is_less_equal_comparable<int>::value)); +STATIC_ASSERT((is_less_equal_comparable<int, long>::value)); +STATIC_ASSERT((is_less_equal_comparable<int*>::value)); +STATIC_ASSERT((is_less_equal_comparable<X>::value)); +STATIC_ASSERT((is_less_equal_comparable<X, Y>::value)); +STATIC_ASSERT((!is_less_equal_comparable<Y, X>::value)); +STATIC_ASSERT((!is_less_equal_comparable<Y>::value)); + +// is_greater_than_comparable +DEFINE_BINARY_PREDICATE_TRAIT(is_greater_than_comparable,>); +bool operator>(X, X); +convertible_to_bool operator>(X, Y); +not_convertible_to_bool operator>(Y, X); + +STATIC_ASSERT((is_greater_than_comparable<int>::value)); +STATIC_ASSERT((is_greater_than_comparable<int, long>::value)); +STATIC_ASSERT((is_greater_than_comparable<int*>::value)); +STATIC_ASSERT((is_greater_than_comparable<X>::value)); +STATIC_ASSERT((is_greater_than_comparable<X, Y>::value)); +STATIC_ASSERT((!is_greater_than_comparable<Y, X>::value)); +STATIC_ASSERT((!is_greater_than_comparable<Y>::value)); + +// is_greater_equal_comparable +DEFINE_BINARY_PREDICATE_TRAIT(is_greater_equal_comparable,>=); +bool operator>=(X, X); +convertible_to_bool operator>=(X, Y); +not_convertible_to_bool operator>=(Y, X); + +STATIC_ASSERT((is_greater_equal_comparable<int>::value)); +STATIC_ASSERT((is_greater_equal_comparable<int, long>::value)); +STATIC_ASSERT((is_greater_equal_comparable<int*>::value)); +STATIC_ASSERT((is_greater_equal_comparable<X>::value)); +STATIC_ASSERT((is_greater_equal_comparable<X, Y>::value)); +STATIC_ASSERT((!is_greater_equal_comparable<Y, X>::value)); +STATIC_ASSERT((!is_greater_equal_comparable<Y>::value)); + +// is_equality_comparable +struct Z : X { }; +DEFINE_BINARY_PREDICATE_TRAIT(is_equality_comparable,==); +bool operator==(X, X); +convertible_to_bool operator==(X, Y); +not_convertible_to_bool operator==(Y, X); + +STATIC_ASSERT((is_equality_comparable<int>::value)); +STATIC_ASSERT((is_equality_comparable<int, long>::value)); +STATIC_ASSERT((is_equality_comparable<int*>::value)); +STATIC_ASSERT((is_equality_comparable<X>::value)); +STATIC_ASSERT((is_equality_comparable<X, Y>::value)); +STATIC_ASSERT((!is_equality_comparable<Y, X>::value)); +STATIC_ASSERT((!is_equality_comparable<Y>::value)); +STATIC_ASSERT((is_equality_comparable<int X::*>::value)); +STATIC_ASSERT((!is_equality_comparable<int X::*, int Y::*>::value)); +STATIC_ASSERT((!is_equality_comparable<int*, float*>::value)); +STATIC_ASSERT((is_equality_comparable<X*, Z*>::value)); +STATIC_ASSERT((!is_equality_comparable<X*, Y*>::value)); + +// is_not_equal_comparable +DEFINE_BINARY_PREDICATE_TRAIT(is_not_equal_comparable,!=); +bool operator!=(X, X); +convertible_to_bool operator!=(X, Y); +not_convertible_to_bool operator!=(Y, X); + +STATIC_ASSERT((is_not_equal_comparable<int>::value)); +STATIC_ASSERT((is_not_equal_comparable<int, long>::value)); +STATIC_ASSERT((is_not_equal_comparable<int*>::value)); +STATIC_ASSERT((is_not_equal_comparable<X>::value)); +STATIC_ASSERT((is_not_equal_comparable<X, Y>::value)); +STATIC_ASSERT((!is_not_equal_comparable<Y, X>::value)); +STATIC_ASSERT((!is_not_equal_comparable<Y>::value)); +STATIC_ASSERT((is_not_equal_comparable<int X::*>::value)); +STATIC_ASSERT((!is_not_equal_comparable<int X::*, int Y::*>::value)); +STATIC_ASSERT((!is_not_equal_comparable<int*, float*>::value)); +STATIC_ASSERT((is_not_equal_comparable<X*, Z*>::value)); +STATIC_ASSERT((!is_not_equal_comparable<X*, Y*>::value)); + +// has_logical_and +DEFINE_BINARY_PREDICATE_TRAIT(has_logical_and,&&); +bool operator&&(X, X); +convertible_to_bool operator&&(X, Y); +not_convertible_to_bool operator&&(Y, X); + +STATIC_ASSERT((has_logical_and<int>::value)); +STATIC_ASSERT((has_logical_and<int, long>::value)); +STATIC_ASSERT((has_logical_and<int*>::value)); +STATIC_ASSERT((has_logical_and<X>::value)); +STATIC_ASSERT((has_logical_and<X, Y>::value)); +STATIC_ASSERT((!has_logical_and<Y, X>::value)); +STATIC_ASSERT((!has_logical_and<Y>::value)); +STATIC_ASSERT((has_logical_and<int X::*>::value)); +STATIC_ASSERT((has_logical_and<int X::*, int Y::*>::value)); +STATIC_ASSERT((has_logical_and<int*, float*>::value)); +STATIC_ASSERT((has_logical_and<X*, Z*>::value)); +STATIC_ASSERT((has_logical_and<X*, Y*>::value)); + +// has_logical_or +DEFINE_BINARY_PREDICATE_TRAIT(has_logical_or,||); +bool operator||(X, X); +convertible_to_bool operator||(X, Y); +not_convertible_to_bool operator||(Y, X); + +STATIC_ASSERT((has_logical_or<int>::value)); +STATIC_ASSERT((has_logical_or<int, long>::value)); +STATIC_ASSERT((has_logical_or<int*>::value)); +STATIC_ASSERT((has_logical_or<X>::value)); +STATIC_ASSERT((has_logical_or<X, Y>::value)); +STATIC_ASSERT((!has_logical_or<Y, X>::value)); +STATIC_ASSERT((!has_logical_or<Y>::value)); +STATIC_ASSERT((has_logical_or<int X::*>::value)); +STATIC_ASSERT((has_logical_or<int X::*, int Y::*>::value)); +STATIC_ASSERT((has_logical_or<int*, float*>::value)); +STATIC_ASSERT((has_logical_or<X*, Z*>::value)); +STATIC_ASSERT((has_logical_or<X*, Y*>::value)); diff --git a/gcc/testsuite/g++.dg/template/sfinae9.C b/gcc/testsuite/g++.dg/template/sfinae9.C new file mode 100644 index 000000000..4e27ff61b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae9.C @@ -0,0 +1,207 @@ +// DR 339 +// +// Test of the use of various assignment operators with SFINAE + +// Boilerplate helpers +typedef char yes_type; +struct no_type { char data[2]; }; + +template<typename T> T create_a(); +template<typename T> struct type { }; + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +#define JOIN( X, Y ) DO_JOIN( X, Y ) +#define DO_JOIN( X, Y ) DO_JOIN2(X,Y) +#define DO_JOIN2( X, Y ) X##Y + +#define DEFINE_INFIX_BINARY_TRAIT(Name,Op) \ +template<typename T, typename U> \ + typename enable_if<(sizeof(create_a<T>() Op create_a<U>(), 1) > 0), \ + yes_type>::type \ + JOIN(check_,Name)(type<T>, type<U>); \ + \ +no_type JOIN(check_,Name)(...); \ + \ +template<typename T, typename U = T> \ +struct Name \ +{ \ + static const bool value = \ + (sizeof(JOIN(check_,Name)(type<T&>(), type<U>())) == sizeof(yes_type)); \ +} + +#ifdef __GXX_EXPERIMENTAL_CXX0X__ +# define STATIC_ASSERT(Expr) static_assert(Expr, #Expr) +#else +# define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1] +#endif + +struct Y { + Y& operator=(Y&); +}; + +struct X { + X& operator=(Y); + X& operator+=(X); + X& operator-=(X); + X& operator*=(X); + X& operator/=(X); + X& operator%=(X); + X& operator^=(X); + X& operator&=(X); + X& operator|=(X); + X& operator<<=(X); + X& operator>>=(X); +}; +struct Z { }; + +// is_assignable +DEFINE_INFIX_BINARY_TRAIT(is_assignable, =); +STATIC_ASSERT((is_assignable<int>::value)); +STATIC_ASSERT((is_assignable<int, long>::value)); +STATIC_ASSERT((is_assignable<X>::value)); +STATIC_ASSERT((!is_assignable<int*, int>::value)); +STATIC_ASSERT((is_assignable<int*>::value)); +STATIC_ASSERT((is_assignable<X, Y>::value)); +STATIC_ASSERT((!is_assignable<X, Z>::value)); +STATIC_ASSERT((!is_assignable<Y>::value)); +STATIC_ASSERT((!is_assignable<const int, long>::value)); + +// has_plus_assign +DEFINE_INFIX_BINARY_TRAIT(has_plus_assign, +=); +X& operator+=(X&, Y); +STATIC_ASSERT((has_plus_assign<int>::value)); +STATIC_ASSERT((has_plus_assign<int, long>::value)); +STATIC_ASSERT((has_plus_assign<X>::value)); +STATIC_ASSERT((has_plus_assign<int*, int>::value)); +STATIC_ASSERT((!has_plus_assign<int*>::value)); +STATIC_ASSERT((has_plus_assign<X, Y>::value)); +STATIC_ASSERT((!has_plus_assign<X, Z>::value)); +STATIC_ASSERT((!has_plus_assign<Y>::value)); +STATIC_ASSERT((!has_plus_assign<const int, long>::value)); + +// has_minus_assign +DEFINE_INFIX_BINARY_TRAIT(has_minus_assign, -=); +X& operator-=(X&, Y); +STATIC_ASSERT((has_minus_assign<int>::value)); +STATIC_ASSERT((has_minus_assign<int, long>::value)); +STATIC_ASSERT((has_minus_assign<X>::value)); +STATIC_ASSERT((has_minus_assign<int*, int>::value)); +STATIC_ASSERT((!has_minus_assign<int*>::value)); +STATIC_ASSERT((has_minus_assign<X, Y>::value)); +STATIC_ASSERT((!has_minus_assign<X, Z>::value)); +STATIC_ASSERT((!has_minus_assign<Y>::value)); +STATIC_ASSERT((!has_minus_assign<int X::*>::value)); +STATIC_ASSERT((!has_minus_assign<const int, long>::value)); + +// has_multiply_assign +DEFINE_INFIX_BINARY_TRAIT(has_multiply_assign, *=); +X& operator*=(X&, Y); +STATIC_ASSERT((has_multiply_assign<int>::value)); +STATIC_ASSERT((has_multiply_assign<int, long>::value)); +STATIC_ASSERT((has_multiply_assign<X>::value)); +STATIC_ASSERT((!has_multiply_assign<int*, int>::value)); +STATIC_ASSERT((!has_multiply_assign<int*>::value)); +STATIC_ASSERT((has_multiply_assign<X, Y>::value)); +STATIC_ASSERT((!has_multiply_assign<X, Z>::value)); +STATIC_ASSERT((!has_multiply_assign<Y>::value)); +STATIC_ASSERT((!has_multiply_assign<int X::*>::value)); +STATIC_ASSERT((!has_multiply_assign<const int, long>::value)); + +// has_divide_assign +DEFINE_INFIX_BINARY_TRAIT(has_divide_assign, /=); +X& operator/=(X&, Y); +STATIC_ASSERT((has_divide_assign<int>::value)); +STATIC_ASSERT((has_divide_assign<int, long>::value)); +STATIC_ASSERT((has_divide_assign<X>::value)); +STATIC_ASSERT((!has_divide_assign<int*, int>::value)); +STATIC_ASSERT((!has_divide_assign<int*>::value)); +STATIC_ASSERT((has_divide_assign<X, Y>::value)); +STATIC_ASSERT((!has_divide_assign<X, Z>::value)); +STATIC_ASSERT((!has_divide_assign<Y>::value)); +STATIC_ASSERT((!has_divide_assign<int X::*>::value)); + +// has_remainder_assign +DEFINE_INFIX_BINARY_TRAIT(has_remainder_assign, %=); +X& operator%=(X&, Y); +STATIC_ASSERT((has_remainder_assign<int>::value)); +STATIC_ASSERT((has_remainder_assign<int, long>::value)); +STATIC_ASSERT((!has_remainder_assign<float>::value)); +STATIC_ASSERT((has_remainder_assign<X>::value)); +STATIC_ASSERT((!has_remainder_assign<int*, int>::value)); +STATIC_ASSERT((!has_remainder_assign<int*>::value)); +STATIC_ASSERT((has_remainder_assign<X, Y>::value)); +STATIC_ASSERT((!has_remainder_assign<X, Z>::value)); +STATIC_ASSERT((!has_remainder_assign<Y>::value)); +STATIC_ASSERT((!has_remainder_assign<int X::*>::value)); + +// has_xor_assign +DEFINE_INFIX_BINARY_TRAIT(has_xor_assign, ^=); +X& operator^=(X&, Y); +STATIC_ASSERT((has_xor_assign<int>::value)); +STATIC_ASSERT((has_xor_assign<int, long>::value)); +STATIC_ASSERT((!has_xor_assign<float>::value)); +STATIC_ASSERT((has_xor_assign<X>::value)); +STATIC_ASSERT((!has_xor_assign<int*, int>::value)); +STATIC_ASSERT((!has_xor_assign<int*>::value)); +STATIC_ASSERT((has_xor_assign<X, Y>::value)); +STATIC_ASSERT((!has_xor_assign<X, Z>::value)); +STATIC_ASSERT((!has_xor_assign<Y>::value)); +STATIC_ASSERT((!has_xor_assign<int X::*>::value)); + +// has_bitand_assign +DEFINE_INFIX_BINARY_TRAIT(has_bitand_assign, &=); +X& operator&=(X&, Y); +STATIC_ASSERT((has_bitand_assign<int>::value)); +STATIC_ASSERT((has_bitand_assign<int, long>::value)); +STATIC_ASSERT((!has_bitand_assign<float>::value)); +STATIC_ASSERT((has_bitand_assign<X>::value)); +STATIC_ASSERT((!has_bitand_assign<int*, int>::value)); +STATIC_ASSERT((!has_bitand_assign<int*>::value)); +STATIC_ASSERT((has_bitand_assign<X, Y>::value)); +STATIC_ASSERT((!has_bitand_assign<X, Z>::value)); +STATIC_ASSERT((!has_bitand_assign<Y>::value)); +STATIC_ASSERT((!has_bitand_assign<int X::*>::value)); + +// has_bitor_assign +DEFINE_INFIX_BINARY_TRAIT(has_bitor_assign, |=); +X& operator|=(X&, Y); +STATIC_ASSERT((has_bitor_assign<int>::value)); +STATIC_ASSERT((has_bitor_assign<int, long>::value)); +STATIC_ASSERT((!has_bitor_assign<float>::value)); +STATIC_ASSERT((has_bitor_assign<X>::value)); +STATIC_ASSERT((!has_bitor_assign<int*, int>::value)); +STATIC_ASSERT((!has_bitor_assign<int*>::value)); +STATIC_ASSERT((has_bitor_assign<X, Y>::value)); +STATIC_ASSERT((!has_bitor_assign<X, Z>::value)); +STATIC_ASSERT((!has_bitor_assign<Y>::value)); +STATIC_ASSERT((!has_bitor_assign<int X::*>::value)); + +// has_left_shift_assign +DEFINE_INFIX_BINARY_TRAIT(has_left_shift_assign, <<=); +X& operator<<=(X&, Y); +STATIC_ASSERT((has_left_shift_assign<int>::value)); +STATIC_ASSERT((has_left_shift_assign<int, long>::value)); +STATIC_ASSERT((!has_left_shift_assign<float>::value)); +STATIC_ASSERT((has_left_shift_assign<X>::value)); +STATIC_ASSERT((!has_left_shift_assign<int*, int>::value)); +STATIC_ASSERT((!has_left_shift_assign<int*>::value)); +STATIC_ASSERT((has_left_shift_assign<X, Y>::value)); +STATIC_ASSERT((!has_left_shift_assign<X, Z>::value)); +STATIC_ASSERT((!has_left_shift_assign<Y>::value)); +STATIC_ASSERT((!has_left_shift_assign<int X::*>::value)); + +// has_right_shift_assign +DEFINE_INFIX_BINARY_TRAIT(has_right_shift_assign, >>=); +X& operator>>=(X&, Y); +STATIC_ASSERT((has_right_shift_assign<int>::value)); +STATIC_ASSERT((has_right_shift_assign<int, long>::value)); +STATIC_ASSERT((!has_right_shift_assign<float>::value)); +STATIC_ASSERT((has_right_shift_assign<X>::value)); +STATIC_ASSERT((!has_right_shift_assign<int*, int>::value)); +STATIC_ASSERT((!has_right_shift_assign<int*>::value)); +STATIC_ASSERT((has_right_shift_assign<X, Y>::value)); +STATIC_ASSERT((!has_right_shift_assign<X, Z>::value)); +STATIC_ASSERT((!has_right_shift_assign<Y>::value)); +STATIC_ASSERT((!has_right_shift_assign<int X::*>::value)); diff --git a/gcc/testsuite/g++.dg/template/shift1.C b/gcc/testsuite/g++.dg/template/shift1.C new file mode 100644 index 000000000..a4ceec92c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/shift1.C @@ -0,0 +1,11 @@ +// PR c++/18140 +// { dg-options "-std=gnu++98" } + +template <int N> struct IntHolder { + static const int value = N; +}; + +template <int N, int S> struct ShrIntHolder { + static const int value = IntHolder< N>>S >::value; +}; + diff --git a/gcc/testsuite/g++.dg/template/sizeof-template-argument.C b/gcc/testsuite/g++.dg/template/sizeof-template-argument.C new file mode 100644 index 000000000..2cdc32859 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof-template-argument.C @@ -0,0 +1,15 @@ +/* This used to ICE (PR c++/29573) */ +/* { dg-do compile } */ + +template<int> struct A {}; + +template<typename> struct B : A <sizeof(=)> {}; /* { dg-error "parse error in template argument list" } */ + +template<typename> struct C : A <sizeof(=)> {}; /* { dg-error "parse error in template argument list" } */ + +int a; + +template<typename> struct D : A <sizeof(a=1)> {}; /* This used to ICE as well. */ + +template<typename> struct E : A <sizeof(a=1)> {}; /* This used to ICE as well. */ + diff --git a/gcc/testsuite/g++.dg/template/sizeof1.C b/gcc/testsuite/g++.dg/template/sizeof1.C new file mode 100644 index 000000000..45a7db48c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof1.C @@ -0,0 +1,15 @@ +// Test use of `sizeof' as a template parameter. +// Origin: smacdonald@seimac.com + +// { dg-do compile } + +template <unsigned I> struct A { static char *value; }; + +template <typename SizeType> +struct B +{ +char * f() const +{ +return (A<sizeof(void *)>::value); +} +}; diff --git a/gcc/testsuite/g++.dg/template/sizeof10.C b/gcc/testsuite/g++.dg/template/sizeof10.C new file mode 100644 index 000000000..5ecf13e13 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof10.C @@ -0,0 +1,7 @@ +// PR c++/23357 + +template<typename T> bool foo() +{ + const long int i = sizeof(T) > 1 ? sizeof(T) : 0; + return i > 0; +} diff --git a/gcc/testsuite/g++.dg/template/sizeof11.C b/gcc/testsuite/g++.dg/template/sizeof11.C new file mode 100644 index 000000000..7428e0b23 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof11.C @@ -0,0 +1,14 @@ +// PR c++/29435 + +template < class T > struct A {}; +template < int> void g() +{ + sizeof (A < int>); +} + +template < class T > struct B; +template < int> void f() +{ + sizeof (B<int>); // { dg-error "incomplete" } +} + diff --git a/gcc/testsuite/g++.dg/template/sizeof12.C b/gcc/testsuite/g++.dg/template/sizeof12.C new file mode 100644 index 000000000..e165d2aab --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof12.C @@ -0,0 +1,19 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/41863 + +template<int X> +struct Bar +{ +}; + +template<typename T> +class Foo +{ + T m_foo; + + void + crash() + { + Bar<sizeof(m_foo)> bar; + } +}; diff --git a/gcc/testsuite/g++.dg/template/sizeof13.C b/gcc/testsuite/g++.dg/template/sizeof13.C new file mode 100644 index 000000000..2f4a26e50 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof13.C @@ -0,0 +1,17 @@ +// PR c++/42623 +// We should choose f(B) because f(A<undef>) involves applying sizeof to +// an incomplete class, so it is removed by SFINAE. +// { dg-do link } + +struct undef; + +template <typename U, int N = sizeof(U)> struct A { A(int); }; +template <typename U> void f(A<U>); + +template <typename U> struct B { B(int) { } }; +template <typename U> void f(B<U>) { } + +int main() +{ + f<undef>(0); +} diff --git a/gcc/testsuite/g++.dg/template/sizeof2.C b/gcc/testsuite/g++.dg/template/sizeof2.C new file mode 100644 index 000000000..76d1cf44c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof2.C @@ -0,0 +1,23 @@ +// { dg-do compile } + +template<int size> +struct Foobar { + // Contents irrelevant +}; + +template <typename A> +struct Wrapper { + // Contents irrelevant +}; + +template <typename A> +Foobar<sizeof(Wrapper<A>)> * +compiler_bug (A) +{ + return 0; +} + +int main() +{ + compiler_bug(1); +} diff --git a/gcc/testsuite/g++.dg/template/sizeof3.C b/gcc/testsuite/g++.dg/template/sizeof3.C new file mode 100644 index 000000000..a98bbc30a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof3.C @@ -0,0 +1,13 @@ +// The call to f is not potentially evaluated (3.2), so f<int> is not used, +// so it should not be instantiated. + +template <class T> +T f (T) +{ + typename T::X x; +} + +int main() +{ + int i = sizeof (f(0)); +} diff --git a/gcc/testsuite/g++.dg/template/sizeof4.C b/gcc/testsuite/g++.dg/template/sizeof4.C new file mode 100644 index 000000000..4856a2741 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof4.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// Origin: <anthwil at nortelnetworks dot com> +// c++/4933: using sizeof with comma operator as template argument + +template<unsigned F> +struct Foo {}; + +template<typename T> +T makeT(); + +template<typename T,typename U> +struct Bar +{ + typedef Foo + < + sizeof((makeT<T>(), makeT<U>())) + > Type; +}; diff --git a/gcc/testsuite/g++.dg/template/sizeof5.C b/gcc/testsuite/g++.dg/template/sizeof5.C new file mode 100644 index 000000000..4096fed53 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof5.C @@ -0,0 +1,15 @@ +// PR c++/9907 +// Origin: nes@lrde.epita.fr +// sizeof(foo()) was not considered constant. + + +template <unsigned n> struct bar {}; + +int foo(); + +template <class T> +void baz() +{ + bar<sizeof(foo())> b; +} + diff --git a/gcc/testsuite/g++.dg/template/sizeof6.C b/gcc/testsuite/g++.dg/template/sizeof6.C new file mode 100644 index 000000000..3ef3794b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof6.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// Contributed by Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// PR c++/13683: bogus warning about passing non-PODs through ellipsis + +struct B {}; +struct NonPOD : B {}; + +struct A +{ + static int check(...); + static NonPOD GetNonPOD(void); + enum { value = sizeof(A::check(A::GetNonPOD())) }; +}; diff --git a/gcc/testsuite/g++.dg/template/sizeof7.C b/gcc/testsuite/g++.dg/template/sizeof7.C new file mode 100644 index 000000000..4964bfd25 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof7.C @@ -0,0 +1,14 @@ +// { dg-do compile } +// Testcase by: bangerth@dealii.org +// PR c++/10858: failure with calling a method inside sizeof in a template + + template <int> struct P {}; + + void bar (); + + template <class T> struct X { + static int foo(void (*)()); + P<sizeof(foo(&bar))> p; + }; + + template class X<int>; diff --git a/gcc/testsuite/g++.dg/template/sizeof8.C b/gcc/testsuite/g++.dg/template/sizeof8.C new file mode 100644 index 000000000..861febc16 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof8.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// Testcase by: bangerth@dealii.org +// PR c++/11406: ICE + +template <int> struct S{}; + +template <int N> S<sizeof(new double[N])> f() {} + +template S<sizeof(void*)> f<2>(); diff --git a/gcc/testsuite/g++.dg/template/sizeof9.C b/gcc/testsuite/g++.dg/template/sizeof9.C new file mode 100644 index 000000000..8d9ec95ae --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof9.C @@ -0,0 +1,6 @@ +// PR c++/21025 + +template<int N> struct X { char x[N]; }; +template<typename T> X<1 + sizeof(T) - sizeof(T)> F(T const &); +template<int N> struct S { int d() { F(1); } }; + diff --git a/gcc/testsuite/g++.dg/template/spec1.C b/gcc/testsuite/g++.dg/template/spec1.C new file mode 100644 index 000000000..27996377f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec1.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +// Origin: <schmid@snake.iap.physik.tu-darmstadt.de> + +// Bug: ICE during invalid instantiation of member function +// which enclosing class is specialized. + +template <class T> +struct A +{ + void f(T) {} +}; + +template<> +struct A<int> +{ + void f(int) {} +}; + +template +void A<int>::f(int); // { dg-error "not match" } diff --git a/gcc/testsuite/g++.dg/template/spec10.C b/gcc/testsuite/g++.dg/template/spec10.C new file mode 100644 index 000000000..4bf7f46a2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec10.C @@ -0,0 +1,27 @@ +// { dg-do run } + +// Origin: Lynn Akers <lakers@peachtree.com> + +// PR c++/10940: Problem handling parameter list for static member +// that is a specialization of a member template of a template class. + +template<int b> +class o +{ +public: + template<typename T> static void do_add(T* p, T v); +}; + +template<> +template<typename T> +inline void o<32>::do_add(T* p, T v) +{ + *p += v; +} + +int main() +{ + int a = 0x1000; + o<32>().do_add<int>(&a, 0x2000); + return (a != 0x3000); +} diff --git a/gcc/testsuite/g++.dg/template/spec11.C b/gcc/testsuite/g++.dg/template/spec11.C new file mode 100644 index 000000000..36d93a94e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec11.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +// Origin: jhbrown@bluefinrobotics.com + +// PR c++/13635: ICE explicit specialization of member function template + +template <class foo> +class bar { +public: + template <class baz> + int func(baz *x); +}; + +template <> +template <class baz> +int bar<double>::func(baz *x) { return 5;} + +template <> +template <> +int bar<double>::func(int *x) { return 5;} diff --git a/gcc/testsuite/g++.dg/template/spec12.C b/gcc/testsuite/g++.dg/template/spec12.C new file mode 100644 index 000000000..7cf2e2f0a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec12.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// Contributed by: Wolfgang Bangerth <bangerth at dealii dot org> +// PR c++/14409: Accepts invalid function signature for explicit instantiation + +struct X +{ + template <typename U> + void foo (U) {} + + template <typename U> + void foo_const (U) const {} +}; + +template void X::foo (int); +template void X::foo_const (int) const; + +template void X::foo (int) const; // { dg-error "" } +template void X::foo_const (int); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/template/spec13.C b/gcc/testsuite/g++.dg/template/spec13.C new file mode 100644 index 000000000..f2a3a373e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec13.C @@ -0,0 +1,16 @@ +// { dg-options "-w" } + +template <typename T> +struct S { + int i; + template <typename U> void f(U) {} +}; + +template<> +template <typename U> +void S<int>::f(U) { i; } + +void f() { + S<int> s; + s.f<int>(3); +} diff --git a/gcc/testsuite/g++.dg/template/spec14.C b/gcc/testsuite/g++.dg/template/spec14.C new file mode 100644 index 000000000..9b59565c4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec14.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// Origin: <weissr at informatik dot uni-tuebingen dot de> +// PR c++/3671: Non-type enum parameters must not be converted + +enum T1 {a}; +enum T2 {b}; + +struct Y { + template <T1 i> void foo() {} + template <T2 i> void foo() {} +}; + +struct Z { + template <T1 i> void foo() {} +}; + +template void Y::foo<b> (); +template void Z::foo<b> (); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/template/spec15.C b/gcc/testsuite/g++.dg/template/spec15.C new file mode 100644 index 000000000..37fbc08e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec15.C @@ -0,0 +1,35 @@ +// { dg-do compile } +// Contributed by Wolfgang Bangerth <bangerth at ticam dot utexas dot edu> +// PR c++/509: Make sure specializations of member templates match correctly +// between template and non-template overloads. + +template <class T> +struct A { + template <class U> void f (U); + void f2 (int); + + template <class U> void h (U); + void h (long); +}; + +template <> +struct A<float> { + template <class U> void g (U); + void g2 (float); +}; + +template <> void A<int>::f (int); // { dg-error "" } +// { dg-message "need 2" "" { target *-*-* } 21 } +template <> template <> void A<int>::f (int); + +template <> void A<int>::f2 (int); +template <> template <> void A<int>::f2 (int); // { dg-error "" } + +template <> void A<float>::g (float); +template <> template <> void A<float>::g(float); // { dg-error "" } + +template <> void A<float>::g2 (float); // { dg-error "" } +template <> template <> void A<float>::g2(float); // { dg-error "" } + +template <> void A<long>::h (long); +template <> template <> void A<long>::h(long); diff --git a/gcc/testsuite/g++.dg/template/spec16.C b/gcc/testsuite/g++.dg/template/spec16.C new file mode 100644 index 000000000..c872052a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec16.C @@ -0,0 +1,11 @@ +// { dg-do compile } +// Contributed by Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// PR c++/14497: Reject specialization without template headers + +template <int N> +struct A { + template<int M> void B () ; +}; + +void A<0>::B<0>() { // { dg-error "specializing member 'A<0>::B<0>' requires 'template<>' syntax" } +} diff --git a/gcc/testsuite/g++.dg/template/spec17.C b/gcc/testsuite/g++.dg/template/spec17.C new file mode 100644 index 000000000..237557684 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec17.C @@ -0,0 +1,11 @@ +// PR c++/16224 + +namespace io { + template <typename> int foo(); // { dg-error "" } +} + +using namespace io; + +template<> int foo<int>(); // { dg-error "" } + +int a = foo<int>(); diff --git a/gcc/testsuite/g++.dg/template/spec18.C b/gcc/testsuite/g++.dg/template/spec18.C new file mode 100644 index 000000000..a22e8543d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec18.C @@ -0,0 +1,13 @@ +// PR c++/17936 + +template<int, int N> struct A +{ + void foo(); +}; + +template<int N> struct A<1, N> +{ + void foo(); +}; + +template<> void A<1, 2>::foo(); diff --git a/gcc/testsuite/g++.dg/template/spec19.C b/gcc/testsuite/g++.dg/template/spec19.C new file mode 100644 index 000000000..082431533 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec19.C @@ -0,0 +1,23 @@ +// PR c++/18962 + +template<class T1,int N1> +class Klasse +{ +public: + template <class T2,int N2> + void function( const Klasse<T2,N2>& ); +}; + +template<> +template<class T2,int N2> +void Klasse<int,1>::function( const Klasse<T2,N2>& param ) +{ + param; // make sure we use the argument list from the definition. +} + +int main() +{ + Klasse<int,1> instance; + Klasse<char,2> param; + instance.function( param ); +} diff --git a/gcc/testsuite/g++.dg/template/spec2.C b/gcc/testsuite/g++.dg/template/spec2.C new file mode 100644 index 000000000..de0fe4c15 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec2.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Origin: <schmid@snake.iap.physik.tu-darmstadt.de> + +// Bug: Overloading of ordinary and template member function +// which enclosing class is specialized is not handled correctly. + +template <class T> +struct A +{ + void f(T) {} +}; + +template<> +struct A<int> +{ + void f(int) {} + template <class T> void f(T) {} +}; + +template +void A<int>::f(int); diff --git a/gcc/testsuite/g++.dg/template/spec20.C b/gcc/testsuite/g++.dg/template/spec20.C new file mode 100644 index 000000000..71548e4af --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec20.C @@ -0,0 +1,19 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 31 Mar 2005 <nathan@codesourcery.com> + +// Origin: Giovanni Bajo <giovannibajo@libero.it> +// Bug 19203: Failure to implement DR 214 + +template <class A> +void foo(const A& a); + +template <class RET, class ARG1> +int foo(RET (&)(ARG1)); // this one + + +float decl(int); + +int bar(void) +{ + return foo(decl); +} diff --git a/gcc/testsuite/g++.dg/template/spec21.C b/gcc/testsuite/g++.dg/template/spec21.C new file mode 100644 index 000000000..e04ac5a2d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec21.C @@ -0,0 +1,28 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 31 Mar 2005 <nathan@codesourcery.com> + +// { dg-do run } +// DR214 + +template <class T> T f(int) {return 0;} +template <class T, class U> T f(U){return 1;} + +template <typename T, typename R> T checked_cast (R const &) {return 0;} +template <typename T, typename R> T checked_cast (R *) {return 1;} + + +int main () +{ + int i = 0; + + if (f<int>(1)) + return 1; + + if (checked_cast<int>(i) != 0) + return 2; + + if (checked_cast<int>(&i) != 1) + return 3; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/spec22.C b/gcc/testsuite/g++.dg/template/spec22.C new file mode 100644 index 000000000..f916ea468 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec22.C @@ -0,0 +1,21 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 2 Apr 2005 <nathan@codesourcery.com> + +// PR 20723 +// Origin: Andrew Pinski <pinskia@gcc.gnu.org> +// Nathan Sidwell <nathan@gcc.gnu.org> + +template <typename T> class srp; +template <typename T> struct ptr +{ + template <typename U> ptr(const srp<U> &other); // { dg-message "ptr<T>::ptr" } +}; +template <typename T> struct srp +{ + template <typename U> operator ptr<U>(void) const; // { dg-message "srp<T>::operator" } +}; +ptr<int> parent_get() +{ + srp<int> parent; // { dg-message "candidate" } + return parent; // { dg-error "is ambiguous" } +} diff --git a/gcc/testsuite/g++.dg/template/spec23.C b/gcc/testsuite/g++.dg/template/spec23.C new file mode 100644 index 000000000..3d401f00e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec23.C @@ -0,0 +1,26 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 2 Apr 2005 <nathan@codesourcery.com> + +// PR 20723 +// Origin: Andrew Pinski <pinskia@gcc.gnu.org> +// Nathan Sidwell <nathan@gcc.gnu.org> + +struct Foo +{ + template <typename T> + Foo (const T &); // { dg-message "T = Bar" } +}; + +struct Bar +{ + template <typename T> + operator T () const; // { dg-message "T = Foo" } +}; + +Foo Quux (Bar const &b) +{ + return b; // { dg-error "ambiguous" } + // { dg-message "candidate" "candidate note" { target *-*-* } 22 } +} + + diff --git a/gcc/testsuite/g++.dg/template/spec24.C b/gcc/testsuite/g++.dg/template/spec24.C new file mode 100644 index 000000000..08848952e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec24.C @@ -0,0 +1,22 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 1 June 2005 <nathan@codesourcery.com> + +// PR 20350: ICE on member specialization with later initialization +// Origin: Carlo Wood carlo@gcc.gnu.org + +template <int i> struct Mutex +{ + static int mutex; +}; + +template <int i> +int Mutex<i>::mutex = {1}; + +template <> int Mutex<0>::mutex; +template <> int Mutex<0>::mutex = 0; + +void g() +{ + Mutex<0>::mutex = 0; +} + diff --git a/gcc/testsuite/g++.dg/template/spec25.C b/gcc/testsuite/g++.dg/template/spec25.C new file mode 100644 index 000000000..3f641fe5a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec25.C @@ -0,0 +1,10 @@ +namespace N { + template <typename T> + struct S { + void f() {} + }; +} + +namespace K { + template <> void N::S<char>::f() {} // { dg-error "namespace|definition" } +} diff --git a/gcc/testsuite/g++.dg/template/spec26.C b/gcc/testsuite/g++.dg/template/spec26.C new file mode 100644 index 000000000..3d187071a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec26.C @@ -0,0 +1,35 @@ +// dg-do run +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 16 Sep 2005 <nathan@codesourcery.com> + +// PR 23519 template specialization ordering (DR214) +// Origin: Maxim Yegorushkin <maxim.yegorushkin@gmail.com> + +struct A +{ + template<class T> int operator+(T&) { return 1;} +}; + +template<class T> struct B +{ + int operator-(A&) {return 2;} + template<typename R> int operator*(R&) {return 3;} +}; + +template <typename T, typename R> int operator-(B<T>, R&) {return 4;} +template<class T> int operator+(A&, B<T>&) { return 5;} +template <typename T> int operator*(T &, A&){return 6;} + +int main() +{ + A a; + B<A> b; + if ((a + b) != 5) + return 1; + + if ((b - a) != 2) + return 2; + + if ((b * a) != 6) + return 3; +} diff --git a/gcc/testsuite/g++.dg/template/spec27.C b/gcc/testsuite/g++.dg/template/spec27.C new file mode 100644 index 000000000..a31adadd3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec27.C @@ -0,0 +1,14 @@ +// PR c++/24139 + +template<typename T> +struct O { + struct I; +}; + +template<> +struct O<int>::I +{ + I(); +}; + +O<int>::I::I() {} diff --git a/gcc/testsuite/g++.dg/template/spec28.C b/gcc/testsuite/g++.dg/template/spec28.C new file mode 100644 index 000000000..f0bb22cae --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec28.C @@ -0,0 +1,6 @@ +// PR c++/25854 +// Bad diagnostic +// { dg-do compile } + +template<typename> struct A {}; // { dg-error "provided" } +template<> struct A<> {}; // { dg-error "wrong number" } diff --git a/gcc/testsuite/g++.dg/template/spec29.C b/gcc/testsuite/g++.dg/template/spec29.C new file mode 100644 index 000000000..4df00ee7d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec29.C @@ -0,0 +1,13 @@ +// PR c++/25855 +// { dg-do run } + +template <typename T> int qCompare(const T *t1, const T *t2) { return 1; } +template <typename T> int qCompare(T *t1, T *t2) { return 2; } +template <typename T1, typename T2> int qCompare(const T1 *t1, const T2 *t2) { + return 3; } +template<> int qCompare(const char *t1, const char *t2) { return 4; } +int main() +{ + if (qCompare("a", "b") != 4) + return 1; +} diff --git a/gcc/testsuite/g++.dg/template/spec3.C b/gcc/testsuite/g++.dg/template/spec3.C new file mode 100644 index 000000000..d3fa401b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec3.C @@ -0,0 +1,16 @@ +// PR c++/3870 +// Test that performing a type instantiation in order to match up a +// specialization doesn't clobber last_function_parms. + +template <class T> +struct A { typedef int I; }; + +template <class T> +inline typename T::I +foo (typename T::I, const T*); + +template <> +int foo (int i, const A<long>*) +{ + return i + 1; +} diff --git a/gcc/testsuite/g++.dg/template/spec30.C b/gcc/testsuite/g++.dg/template/spec30.C new file mode 100644 index 000000000..403b812f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec30.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +template<int N> +inline int +foo (int a) +{ + return a; +} + +template<> +inline int +foo<0> (int a = 123) // { dg-error "default argument" } +{ + return a + 1; +} diff --git a/gcc/testsuite/g++.dg/template/spec31.C b/gcc/testsuite/g++.dg/template/spec31.C new file mode 100644 index 000000000..3b36ab486 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec31.C @@ -0,0 +1,10 @@ +// PR c++/28058 + +template<int> struct A +{ + A() {} +}; + +A<0> a; + +template<> A<0>::A() {} // { dg-error "specialization" } diff --git a/gcc/testsuite/g++.dg/template/spec32.C b/gcc/testsuite/g++.dg/template/spec32.C new file mode 100644 index 000000000..6ef172b50 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec32.C @@ -0,0 +1,6 @@ +//PR c++/28861 + +struct A +{ + template<template<int> class B> struct B<0>; // { dg-error "name of class shadows" } +}; diff --git a/gcc/testsuite/g++.dg/template/spec33.C b/gcc/testsuite/g++.dg/template/spec33.C new file mode 100644 index 000000000..7b7a75198 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec33.C @@ -0,0 +1,7 @@ +//PR c++/27667 + +struct A +{ + template<int> static void foo () {} + template<> static void foo<0>() {} // { dg-error "explicit|template" } +}; diff --git a/gcc/testsuite/g++.dg/template/spec34.C b/gcc/testsuite/g++.dg/template/spec34.C new file mode 100644 index 000000000..6c28e57fb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec34.C @@ -0,0 +1,9 @@ +// PR c++/26988 + +struct B{}; + +struct Bar : virtual B { + template <typename T> Bar( T const& cast ); +}; + +template <> Bar::Bar( int const & cast ) {} diff --git a/gcc/testsuite/g++.dg/template/spec35.C b/gcc/testsuite/g++.dg/template/spec35.C new file mode 100644 index 000000000..709ece5dd --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec35.C @@ -0,0 +1,29 @@ +// PR c++/31923 +// C++ DR 605 -- "...the linkage of an explicit specialization must be that of +// the template." + +// { dg-require-weak "" } +// { dg-do compile { target i?86-*-* x86_64-*-* } } + +template<class T> +static void f1 (T) { } + +// { dg-final { scan-assembler-not ".glob(a|)l\[\t \]*_?_Z2f1IfEvT_" } } +template<> +void f1<float> (float) { } // Expected to have static linkage + +template<class T> +void f2 (T) { } + +// { dg-final { scan-assembler ".glob(a|)l\[\t \]*_?_Z2f2IfEvT_" } } +template<> +void f2<float> (float) { } // Expected to have global linkage + +void instantiator () +{ + // { dg-final { scan-assembler-not ".glob(a|)l\[\t \]*_?_Z2f1IiEvT_" } } + f1(0); // Expected to have static linkage + + // { dg-final { scan-assembler ".weak(_definition)?\[\t \]*_?_Z2f2IiEvT_" { target { ! { *-*-mingw* *-*-cygwin } } } } } + f2(0); // Expected to have weak global linkage +} diff --git a/gcc/testsuite/g++.dg/template/spec36.C b/gcc/testsuite/g++.dg/template/spec36.C new file mode 100644 index 000000000..7e8dc5241 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec36.C @@ -0,0 +1,16 @@ +/* PR c++/38089 */ +/* { dg-do compile } */ + +struct basic_string +{ + basic_string(const int __s); +}; +namespace MyNS { + class MyClass { + template <typename T> + T test() { } /* { dg-error "from definition" } */ + }; +} +template <> +basic_string MyNS::MyClass::test() /* { dg-error "specialization of" } */ +{ return 1; } diff --git a/gcc/testsuite/g++.dg/template/spec37.C b/gcc/testsuite/g++.dg/template/spec37.C new file mode 100644 index 000000000..2c01eb028 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec37.C @@ -0,0 +1,6 @@ +// PR c++/28300 + +template<typename> struct A +{ + template<typename T> struct A<T*>; // { dg-error "namespace scope" } +}; diff --git a/gcc/testsuite/g++.dg/template/spec4.C b/gcc/testsuite/g++.dg/template/spec4.C new file mode 100644 index 000000000..18116acb5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec4.C @@ -0,0 +1,11 @@ +// { dg-do compile } +// Origin: Wolfgang Bangerth <wolfgang.bangerth@iwr.uni-heidelberg.de> + +// PR c++/2863 +// Default function argument and template specialization. + +struct X { + template <int dim> void f(int=0); +}; + +template <> void X::f<1> () {} // { dg-error "(not match|declaration)" } diff --git a/gcc/testsuite/g++.dg/template/spec5.C b/gcc/testsuite/g++.dg/template/spec5.C new file mode 100644 index 000000000..ad101b01d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec5.C @@ -0,0 +1,3 @@ +template <int i> struct A; +template <> struct A<0> { struct B; }; +struct A<0>::B {}; diff --git a/gcc/testsuite/g++.dg/template/spec6.C b/gcc/testsuite/g++.dg/template/spec6.C new file mode 100644 index 000000000..915b83312 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec6.C @@ -0,0 +1,10 @@ +template <bool, int> struct X {}; + +template <bool C> struct X<C,1> { + typedef double* type; + type foo () const; +}; + +template <bool C> +typename X<C,1>::type +X<C,1>::foo () const {} diff --git a/gcc/testsuite/g++.dg/template/spec7.C b/gcc/testsuite/g++.dg/template/spec7.C new file mode 100644 index 000000000..18d3c90c4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec7.C @@ -0,0 +1,27 @@ +// { dg-do compile } + +// PR c++/6440: Specialization of member class template. + +template<class T> struct A +{ + template<class U> struct B {}; +}; + +template<> template<class U> +struct A<int>::B +{ + void f(); + template <class V> void g(V); +}; + +template<> template<> template <class V> void A<int>::B<char>::g(V) +{ +} + +A<int>::B<char> b; + +int h() +{ + b.f(); + b.g(0); +} diff --git a/gcc/testsuite/g++.dg/template/spec8.C b/gcc/testsuite/g++.dg/template/spec8.C new file mode 100644 index 000000000..ccbf17c2f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec8.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +// Specialization of member class template. + +template<class T1> struct A +{ + template<class T2> struct B {}; + template<class T2> struct C {}; +}; + +template <> template <> struct A<int>::B<int>; +template <> template <class U> struct A<int>::B {}; +A<int>::B<int> ab; // { dg-error "incomplete" } + +A<int>::C<char> ac; +template <> template <class U> struct A<int>::C {}; // { dg-error "specialization" } diff --git a/gcc/testsuite/g++.dg/template/spec9.C b/gcc/testsuite/g++.dg/template/spec9.C new file mode 100644 index 000000000..013fa0d99 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec9.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +// Origin: Lynn Akers <lakers@peachtree.com> +// Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/10956: Incorrect template substitution for member template +// specialization inside template class. + +template <int> struct C { + template<typename T> void pre_add(T); +}; + +template<> +template<typename T> +void C<32>::pre_add(T) { + T pre; +} + +int main() { + C<32>().pre_add<int>(1); +} diff --git a/gcc/testsuite/g++.dg/template/static1.C b/gcc/testsuite/g++.dg/template/static1.C new file mode 100644 index 000000000..98e1acb9e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static1.C @@ -0,0 +1,4 @@ +template <typename T> struct A +{ + static const int t[1][1]={{0}}; // { dg-error "brace-enclosed|in-class" } +}; diff --git a/gcc/testsuite/g++.dg/template/static10.C b/gcc/testsuite/g++.dg/template/static10.C new file mode 100644 index 000000000..881db081c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static10.C @@ -0,0 +1,24 @@ +// PR c++/19555 + +namespace __gnu_debug_def { } +namespace std +{ + using namespace __gnu_debug_def; + template<typename _Tp> class allocator {}; // { dg-message "std::allocator" } +} +namespace __gnu_debug_def +{ + template<typename _Tp, + typename _Allocator = std::allocator<_Tp> > + class vector + { + void + swap(vector<_Tp,_Allocator>& __x); + }; +} +namespace std +{ + template<> void + vector<int, allocator<int> >::swap(vector<int, allocator<int> >&) { } // { dg-error "" } + // { dg-message "suggested alternative" "suggested alternative" { target *-*-* } 22 } +} diff --git a/gcc/testsuite/g++.dg/template/static11.C b/gcc/testsuite/g++.dg/template/static11.C new file mode 100644 index 000000000..3e489eac5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static11.C @@ -0,0 +1,8 @@ +// PR c++/19826 + +template<typename T> struct A +{ + static const T i = 1; + char a[i]; +}; + diff --git a/gcc/testsuite/g++.dg/template/static12.C b/gcc/testsuite/g++.dg/template/static12.C new file mode 100644 index 000000000..73becab27 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static12.C @@ -0,0 +1,13 @@ +// PR c++/18470 + +template<typename> struct A +{ + static const int i=1; +}; + +template<typename T> struct B : A<T> +{ + using A<T>::i; + char s[i]; // fails + char t[A<T>::i]; // compiles +}; diff --git a/gcc/testsuite/g++.dg/template/static13.C b/gcc/testsuite/g++.dg/template/static13.C new file mode 100644 index 000000000..c43f55547 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static13.C @@ -0,0 +1,14 @@ +// PR c++/23099 + +struct Base { + int x; +}; + +template <typename T> +struct A { + static const int N = sizeof(static_cast<Base*>(T())); +}; + +struct Derived : Base { + A<Derived*> a; +}; diff --git a/gcc/testsuite/g++.dg/template/static14.C b/gcc/testsuite/g++.dg/template/static14.C new file mode 100644 index 000000000..5bc0e731a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static14.C @@ -0,0 +1,13 @@ +struct Base { + int x; +}; + +template <typename T> +struct A { + static const int N = sizeof(static_cast<Base*>(T())); + int a[N]; +}; + +struct Derived : Base { + A<Derived*> a; +}; diff --git a/gcc/testsuite/g++.dg/template/static15.C b/gcc/testsuite/g++.dg/template/static15.C new file mode 100644 index 000000000..d8faa35a6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static15.C @@ -0,0 +1,71 @@ +// PR c++/23667 +// { dg-options "-std=gnu++98" } + +template<int dummy> + struct X + { + static const int n_primes = 256; + static const unsigned long primes[n_primes + 1]; + }; + +template<int dummy> + const int X<dummy>::n_primes; + +template<int dummy> + const unsigned long X<dummy>::primes[n_primes + 1] = + { + 2ul, 3ul, 5ul, 7ul, 11ul, 13ul, 17ul, 19ul, 23ul, 29ul, 31ul, + 37ul, 41ul, 43ul, 47ul, 53ul, 59ul, 61ul, 67ul, 71ul, 73ul, 79ul, + 83ul, 89ul, 97ul, 103ul, 109ul, 113ul, 127ul, 137ul, 139ul, 149ul, + 157ul, 167ul, 179ul, 193ul, 199ul, 211ul, 227ul, 241ul, 257ul, + 277ul, 293ul, 313ul, 337ul, 359ul, 383ul, 409ul, 439ul, 467ul, + 503ul, 541ul, 577ul, 619ul, 661ul, 709ul, 761ul, 823ul, 887ul, + 953ul, 1031ul, 1109ul, 1193ul, 1289ul, 1381ul, 1493ul, 1613ul, + 1741ul, 1879ul, 2029ul, 2179ul, 2357ul, 2549ul, 2753ul, 2971ul, + 3209ul, 3469ul, 3739ul, 4027ul, 4349ul, 4703ul, 5087ul, 5503ul, + 5953ul, 6427ul, 6949ul, 7517ul, 8123ul, 8783ul, 9497ul, 10273ul, + 11113ul, 12011ul, 12983ul, 14033ul, 15173ul, 16411ul, 17749ul, + 19183ul, 20753ul, 22447ul, 24281ul, 26267ul, 28411ul, 30727ul, + 33223ul, 35933ul, 38873ul, 42043ul, 45481ul, 49201ul, 53201ul, + 57557ul, 62233ul, 67307ul, 72817ul, 78779ul, 85229ul, 92203ul, + 99733ul, 107897ul, 116731ul, 126271ul, 136607ul, 147793ul, + 159871ul, 172933ul, 187091ul, 202409ul, 218971ul, 236897ul, + 256279ul, 277261ul, 299951ul, 324503ul, 351061ul, 379787ul, + 410857ul, 444487ul, 480881ul, 520241ul, 562841ul, 608903ul, + 658753ul, 712697ul, 771049ul, 834181ul, 902483ul, 976369ul, + 1056323ul, 1142821ul, 1236397ul, 1337629ul, 1447153ul, 1565659ul, + 1693859ul, 1832561ul, 1982627ul, 2144977ul, 2320627ul, 2510653ul, + 2716249ul, 2938679ul, 3179303ul, 3439651ul, 3721303ul, 4026031ul, + 4355707ul, 4712381ul, 5098259ul, 5515729ul, 5967347ul, 6456007ul, + 6984629ul, 7556579ul, 8175383ul, 8844859ul, 9569143ul, 10352717ul, + 11200489ul, 12117689ul, 13109983ul, 14183539ul, 15345007ul, + 16601593ul, 17961079ul, 19431899ul, 21023161ul, 22744717ul, + 24607243ul, 26622317ul, 28802401ul, 31160981ul, 33712729ul, + 36473443ul, 39460231ul, 42691603ul, 46187573ul, 49969847ul, + 54061849ul, 58488943ul, 63278561ul, 68460391ul, 74066549ul, + 80131819ul, 86693767ul, 93793069ul, 101473717ul, 109783337ul, + 118773397ul, 128499677ul, 139022417ul, 150406843ul, 162723577ul, + 176048909ul, 190465427ul, 206062531ul, 222936881ul, 241193053ul, + 260944219ul, 282312799ul, 305431229ul, 330442829ul, 357502601ul, + 386778277ul, 418451333ul, 452718089ul, 489790921ul, 529899637ul, + 573292817ul, 620239453ul, 671030513ul, 725980837ul, 785430967ul, + 849749479ul, 919334987ul, 994618837ul, 1076067617ul, 1164186217ul, + 1259520799ul, 1362662261ul, 1474249943ul, 1594975441ul, + 1725587117ul, 1866894511ul, 2019773507ul, 2185171673ul, + 2364114217ul, 2557710269ul, 2767159799ul, 2993761039ul, + 3238918481ul, 3504151727ul, 3791104843ul, 4101556399ul, + 4294967291ul, + 4294967291ul // sentinel so we don't have to test result of + // lower_bound + }; + +template<bool b> + struct static_assert; + +template<> + struct static_assert<true> { }; + +int main() +{ + static_assert< X<0>::n_primes == 256 >(); +} diff --git a/gcc/testsuite/g++.dg/template/static16.C b/gcc/testsuite/g++.dg/template/static16.C new file mode 100644 index 000000000..f33ac3a55 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static16.C @@ -0,0 +1,20 @@ +// PR c++/23691 + +namespace std { + class type_info { + bool operator==(const type_info& __arg) const; + }; +} +template <class T, T val> struct integral_constant { + static const T value = val; +}; +template< typename T > struct is_integral : integral_constant<bool,false> {}; +template <bool B> struct enable_if_c {}; +template<typename Functor> +typename enable_if_c<(is_integral<Functor>::value)>::type +operator==(const int& f, Functor g); +template<class D> +int get_deleter( std::type_info const & ti ) +{ + return ti == typeid(D); +} diff --git a/gcc/testsuite/g++.dg/template/static17.C b/gcc/testsuite/g++.dg/template/static17.C new file mode 100644 index 000000000..bf79bccc3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static17.C @@ -0,0 +1,13 @@ +// PR c++/23896 + +template <int> struct X {}; + +template <typename T> struct length { + static const int value = 2; +}; + +template <typename T> void foo () { + sizeof(X<length<T>::value>); +} + +template void foo<int>(); diff --git a/gcc/testsuite/g++.dg/template/static18.C b/gcc/testsuite/g++.dg/template/static18.C new file mode 100644 index 000000000..2a2ace939 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static18.C @@ -0,0 +1,13 @@ +// PR c++/23914 + +template <class T> +struct foo_template { + static const unsigned complexity = 0; +}; + +template <int x> struct STATIC_ASSERTION {}; + +void gcc_402_problem_minimal() +{ + sizeof(STATIC_ASSERTION< foo_template<int>::complexity >); +} diff --git a/gcc/testsuite/g++.dg/template/static19.C b/gcc/testsuite/g++.dg/template/static19.C new file mode 100644 index 000000000..d720127b8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static19.C @@ -0,0 +1,18 @@ +// PR c++/24275 + +template <bool val> struct bool_var { + static const bool value = val; +}; +namespace is_inc_ { + struct any { + template <class T> any(T const&); + }; + int operator++(any const&); + template <class T> struct impl { + static T &x; + static const bool value = sizeof(++x) == 1; + }; +} +template<typename T> struct is_incr : bool_var< is_inc_::impl<T>::value> {}; +struct not_incr{}; +typedef int sa1[ is_incr<not_incr>::value ? -1 : 1]; diff --git a/gcc/testsuite/g++.dg/template/static2.C b/gcc/testsuite/g++.dg/template/static2.C new file mode 100644 index 000000000..881f07ce9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static2.C @@ -0,0 +1,17 @@ +class A; + +template<int A::* P> +class B +{ +public: + static int A::* const p = P; // { dg-error "" } +}; + +class A +{ +public: + +int dummy; + +B<&A::dummy> d; +}; diff --git a/gcc/testsuite/g++.dg/template/static20.C b/gcc/testsuite/g++.dg/template/static20.C new file mode 100644 index 000000000..6f1096b88 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static20.C @@ -0,0 +1,14 @@ +// PR c++/24277 + +template< int Bits > struct uint_t { + typedef unsigned short fast; +}; +template < int Bits > struct mask_uint_t { + typedef typename uint_t< Bits >::fast fast; + static const fast sig_bits = 1; + static const fast sig_bits_fast = fast(sig_bits); +}; +template < int Bits> int checksum ( ) { + return 1 & mask_uint_t<Bits>::sig_bits_fast; +} +int i = checksum<1>(); diff --git a/gcc/testsuite/g++.dg/template/static21-a.cc b/gcc/testsuite/g++.dg/template/static21-a.cc new file mode 100644 index 000000000..9489ae7d0 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static21-a.cc @@ -0,0 +1,17 @@ +template<int dummy> + struct X + { + static const int n_primes = 256; + static const unsigned long primes[n_primes + 1]; + }; + + template<int dummy> + const int X<dummy>::n_primes; + + template<int dummy> + const unsigned long X<dummy>::primes[n_primes + 1] = + { 0 }; + + +const unsigned long *f1(void){return &X<0>::primes[0];} +int main(){} diff --git a/gcc/testsuite/g++.dg/template/static21.C b/gcc/testsuite/g++.dg/template/static21.C new file mode 100644 index 000000000..66b045087 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static21.C @@ -0,0 +1,20 @@ +// PR c++/24389 +// { dg-additional-sources "static21-a.cc" } +// { dg-do link } + +template<int dummy> +struct X +{ + static const int n_primes = 256; + static const unsigned long primes[n_primes + 1]; +}; + +template<int dummy> +const int X<dummy>::n_primes; + +template<int dummy> +const unsigned long X<dummy>::primes[n_primes + 1] = + { 0 }; + +const unsigned long *f(void){return &X<0>::primes[0];} + diff --git a/gcc/testsuite/g++.dg/template/static22.C b/gcc/testsuite/g++.dg/template/static22.C new file mode 100644 index 000000000..02c7a0cd6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static22.C @@ -0,0 +1,11 @@ +// PR c++/26266 + +template<typename> struct A +{ + static const int i = 1; + static const int j = i; + static const int k = int(j); + int x[k]; +}; + +A<char> a; diff --git a/gcc/testsuite/g++.dg/template/static23.C b/gcc/testsuite/g++.dg/template/static23.C new file mode 100644 index 000000000..b28400a64 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static23.C @@ -0,0 +1,15 @@ +// PR c++/26266 + +template<typename> struct A +{ + static const int i = 1; +}; + +template<typename> struct B +{ + static const int j = A<char>::i; + static const int k = int(j); + int x[k]; +}; + +B<char> b; diff --git a/gcc/testsuite/g++.dg/template/static24.C b/gcc/testsuite/g++.dg/template/static24.C new file mode 100644 index 000000000..3d8f9e326 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static24.C @@ -0,0 +1,15 @@ +template<typename> struct A; + +template<> struct A<char> +{ + static const char i = 1; +}; + +template<typename T> struct B +{ + static const int j = A<T>::i; + static const int k = int(j); + int x[k]; +}; + +B<char> b; diff --git a/gcc/testsuite/g++.dg/template/static25.C b/gcc/testsuite/g++.dg/template/static25.C new file mode 100644 index 000000000..20c0c846e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static25.C @@ -0,0 +1,14 @@ +// PR c++/27819 + +struct A +{ + static const char i = 1; +}; + +template<int> struct B +{ + static const int j = A::i; + int x[int(j)]; +}; + +B<0> b; diff --git a/gcc/testsuite/g++.dg/template/static26.C b/gcc/testsuite/g++.dg/template/static26.C new file mode 100644 index 000000000..095248bac --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static26.C @@ -0,0 +1,10 @@ +// PR c++/28016 +// { dg-final { scan-assembler-not "computed" } } + +template<class T1, class T2> +struct scalar_divides_assign { + static const bool computed ; +}; + +template<class T1, class T2> +const bool scalar_divides_assign<T1,T2>::computed = true; diff --git a/gcc/testsuite/g++.dg/template/static27.C b/gcc/testsuite/g++.dg/template/static27.C new file mode 100644 index 000000000..0b63967e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static27.C @@ -0,0 +1,13 @@ +// PR c++/28235 + +template<typename> struct A +{ + static const bool i = true; + template<bool = i> struct B {}; + B<> b; +}; + +void f() { + A<int> a1, a2; + a1.b = a2.b; +} diff --git a/gcc/testsuite/g++.dg/template/static28.C b/gcc/testsuite/g++.dg/template/static28.C new file mode 100644 index 000000000..eb5ec5313 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static28.C @@ -0,0 +1,15 @@ +// PR c++/29518 + +template< bool C > int assertion_failed( int); +template< class > +struct N +{ + static bool const okay = true; + enum { + t = sizeof( assertion_failed<okay>( 0)) + }; +}; +int main() +{ + N<int> n; +} diff --git a/gcc/testsuite/g++.dg/template/static29.C b/gcc/testsuite/g++.dg/template/static29.C new file mode 100644 index 000000000..a949c0cd8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static29.C @@ -0,0 +1,5 @@ +// PR c++/29570 + +template<int> struct A { static const int i; }; + +template<int N> const int A<N>::i = { A<N>::i }; diff --git a/gcc/testsuite/g++.dg/template/static3.C b/gcc/testsuite/g++.dg/template/static3.C new file mode 100644 index 000000000..65cf2c9e7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static3.C @@ -0,0 +1,25 @@ +template <class data> class foo +{ + public: + static const int a; + static const int b; + static const int c; + static const int d; +}; + +template <class data> const int foo<data>::a = 1; +template <class data> const int foo<data>::b = a; +template <class data> const int foo<data>::c = b; +template <class data> const int foo<data>::d = c; + +typedef foo<int> fooInt; + +int main( void ) +{ + fooInt *f; + + f = new fooInt(); + + if (f->c != 1 || f->d != 1) + return 1; +} diff --git a/gcc/testsuite/g++.dg/template/static30.C b/gcc/testsuite/g++.dg/template/static30.C new file mode 100644 index 000000000..01fa5dc1e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static30.C @@ -0,0 +1,10 @@ +// PR c++/31992 + +template <int> struct A +{ + static const int i1; + static const int i2; +}; + +template <int N> const int A<N>::i1(A<N>::i); +template <int N> const int A<N>::i2(3, A<N>::i); diff --git a/gcc/testsuite/g++.dg/template/static31.C b/gcc/testsuite/g++.dg/template/static31.C new file mode 100644 index 000000000..935a8a790 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static31.C @@ -0,0 +1,19 @@ +// PR c++/32674 + +class C +{ + static const int j = 3; +}; + +template<int> class A +{ + static const int i1; + static const int i2; + static const int i3; + static const int i4; +}; + +template<int N> const int A<N>::i1(C::j); +template<int N> const int A<N>::i2 = C::j; +template<int N> const int A<N>::i3(C::j, 5); // { dg-error "compound expression" } +template<int N> const int A<N>::i4 = (C::j, 7); diff --git a/gcc/testsuite/g++.dg/template/static4.C b/gcc/testsuite/g++.dg/template/static4.C new file mode 100644 index 000000000..c5486326c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static4.C @@ -0,0 +1,7 @@ +template <class R> +struct A { + static int _test; // { dg-error "" } + static int _test; // { dg-error "" } +}; +template <class R> int A<R>::_test = 0; +struct B : public A <int> { }; diff --git a/gcc/testsuite/g++.dg/template/static5.C b/gcc/testsuite/g++.dg/template/static5.C new file mode 100644 index 000000000..05eaf8fbd --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static5.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +// Origin: Mirek Fidler <cxl@ntllib.org> +// Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/12932: ICE address of static function as template argument + +struct Test { + static void fun(); +}; + +template <void (*fun)()> +void foo () { (*fun)(); } + + +template +void foo<Test::fun> (); diff --git a/gcc/testsuite/g++.dg/template/static6.C b/gcc/testsuite/g++.dg/template/static6.C new file mode 100644 index 000000000..30ecae940 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static6.C @@ -0,0 +1,14 @@ +// PR c++/13969 + +struct B { + static const int N=10; +}; + +template <int> struct X {}; + +template <typename> struct S { + static const int N = B::N; + X<N> x; +}; + +template class S<float>; diff --git a/gcc/testsuite/g++.dg/template/static7.C b/gcc/testsuite/g++.dg/template/static7.C new file mode 100644 index 000000000..edb8e6a8d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static7.C @@ -0,0 +1,16 @@ +// PR c++/17530 +// { dg-do link } + +typedef void (*Func) (); +void f (Func) {} +struct B +{ + static void staticfunc () {} +}; +template <int> +void C(){ f (B::staticfunc); } +int main () +{ + C<0>(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/static8.C b/gcc/testsuite/g++.dg/template/static8.C new file mode 100644 index 000000000..f8229fd82 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static8.C @@ -0,0 +1,8 @@ +// PR c++/17585 + +template <void (*p)(void)> struct S03 {}; +class C03 { +public: + static void f(void) {} + void g(void) { S03<&f> s03; } +}; diff --git a/gcc/testsuite/g++.dg/template/static9.C b/gcc/testsuite/g++.dg/template/static9.C new file mode 100644 index 000000000..884564760 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static9.C @@ -0,0 +1,9 @@ +// PR c++/17524 + +template<typename T> struct A +{ + static const T i = 0; // { dg-error "declared void" "void" } + // { dg-error "invalid|non-literal" "invalid" { target *-*-* } 5 } +}; + +A<void> a; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/stdarg1.C b/gcc/testsuite/g++.dg/template/stdarg1.C new file mode 100644 index 000000000..94804eeed --- /dev/null +++ b/gcc/testsuite/g++.dg/template/stdarg1.C @@ -0,0 +1,55 @@ +// PR c++/47022 +// { dg-do compile } +// Suppress a warning that is irrelevant to the purpose of this test. +// { dg-options "-Wno-abi" { target arm_eabi } } + +#include <cstdarg> + +template <typename T> +void +f1 (T *p, va_list ap) +{ + *p = va_arg (ap, long double); + *p += va_arg (ap, double); +} + +template <typename T> +void +f2 (T *p, va_list ap) +{ + *p = __real__ va_arg (ap, _Complex int); + *p += __imag__ va_arg (ap, _Complex double); + *p += __imag__ va_arg (ap, _Complex long double); +} + +template <typename T> +void +f3 (T *p, va_list ap) +{ + *p = va_arg (ap, T); +} + +void +foo (int x, va_list ap) +{ + if (x == 0) + { + long double ld; + f1 (&ld, ap); + } + else if (x == 1) + { + int i; + f2 (&i, ap); + } + else if (x == 2) + { + long double ld; + f3 (&ld, ap); + } + else if (x == 3) + { + _Complex double cd; + f3 (&cd, ap); + } +} diff --git a/gcc/testsuite/g++.dg/template/stmtexpr1.C b/gcc/testsuite/g++.dg/template/stmtexpr1.C new file mode 100644 index 000000000..a470ca8f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/stmtexpr1.C @@ -0,0 +1,10 @@ +// PR c++/17404 +// { dg-do compile } +// { dg-options "" } + +template <int> void foo () +{ + __builtin_expect (({0;}), 1); +} + +template void foo<1> (); diff --git a/gcc/testsuite/g++.dg/template/stmtexpr2.C b/gcc/testsuite/g++.dg/template/stmtexpr2.C new file mode 100644 index 000000000..ef29b43c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/stmtexpr2.C @@ -0,0 +1,26 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/36408 +// { dg-options "" } +// { dg-do compile } + +template<int> +void +foo() +{ + int i = ({ }); // { dg-error "void value not ignored" } +} + +template<int> +void +bar() +{ + int i = ({ ({}); }); // { dg-error "void value not ignored" } +} + +int +main () +{ + foo<0> (); + bar<0> (); +} + diff --git a/gcc/testsuite/g++.dg/template/string1.C b/gcc/testsuite/g++.dg/template/string1.C new file mode 100644 index 000000000..a5d6c7dd6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/string1.C @@ -0,0 +1,7 @@ +// PR c++/28337 + +template <int> void foo() +{ + (0 ? "" : "X") + 1; +} + diff --git a/gcc/testsuite/g++.dg/template/strlen1.C b/gcc/testsuite/g++.dg/template/strlen1.C new file mode 100644 index 000000000..ddec51d7b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/strlen1.C @@ -0,0 +1,9 @@ +template <typename A1> +void monk2 (A1) {} + +unsigned int strlen (const char*); + +void monk () +{ + monk2 (strlen ("")); +} diff --git a/gcc/testsuite/g++.dg/template/subst1.C b/gcc/testsuite/g++.dg/template/subst1.C new file mode 100644 index 000000000..827af23d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/subst1.C @@ -0,0 +1,27 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 16 Sep 2002 <nathan@codesourcery.com> + +// PR 7718. ICE. + +template <typename OBJECT> +void default_initializer(const OBJECT &) { } + + +template <typename OBJECT, void init_function(const OBJECT &)> +class cContainer { + public: + template <typename INITIALIZER> + void Add(const INITIALIZER &initializer) { + init_function(initializer); + } +}; + +int main() { + cContainer<int, default_initializer<int> > c; + + c.Add<int>(42); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/template-id-1.C b/gcc/testsuite/g++.dg/template/template-id-1.C new file mode 100644 index 000000000..60ce4e7ff --- /dev/null +++ b/gcc/testsuite/g++.dg/template/template-id-1.C @@ -0,0 +1,33 @@ +// Copyright (C) 2002 Free Software Foundation +// Origin: C++/1058 +// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net> +// { dg-do compile } + +struct A { + typedef int Y; + typedef double Z; +}; + +struct B { + template<typename T> + void func(typename T::Y, typename T::Z) { } +}; + +template<typename T> +struct X { + void gunc(); +}; + +template<typename T> +void X<T>::gunc() +{ + B b; + b.func<A>(0, 3.); +} + +int main() +{ + X<int> x; + x.gunc(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/template-id-2.C b/gcc/testsuite/g++.dg/template/template-id-2.C new file mode 100644 index 000000000..6d37350e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/template-id-2.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Origin: Richard Guenther <rguenth@tat.physik.uni-tuebingen.de> + +// PR c++/12924 + +template<typename> struct A {}; + +template<> struct A<void> +{ + template<typename T> void foo() + { + A<T> a; + a.template foo<int>(); // { dg-error "no member" } + } +}; + +void bar() +{ + A<void> a; + a.foo<int>(); // { dg-message "instantiated" } +} diff --git a/gcc/testsuite/g++.dg/template/template-id-4.C b/gcc/testsuite/g++.dg/template/template-id-4.C new file mode 100644 index 000000000..26f4809bc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/template-id-4.C @@ -0,0 +1,22 @@ +// PR c++/48157 + +struct AType +{ + template<class AA> + void SomeFuncTemplate() + { } +}; + +template < class T > +struct TTest2 +{ + template<T> struct helper; + + template<class U> + static void check(helper<&U::template SomeFuncTemplate<int> > *); +}; + +int main() +{ + TTest2< void (AType::*)() >::check<AType>(0); +} diff --git a/gcc/testsuite/g++.dg/template/this-targ1.C b/gcc/testsuite/g++.dg/template/this-targ1.C new file mode 100644 index 000000000..6864be5ab --- /dev/null +++ b/gcc/testsuite/g++.dg/template/this-targ1.C @@ -0,0 +1,23 @@ +// PR c++/47904 + +template <bool> +struct S +{ +}; + +template <class T> +class U +{ + T t; + int foo () const + { + S <sizeof (t) == 1> s; + return 1; + } + int bar () const + { + S <sizeof (t) == 1> s; + return 1; + } +}; + diff --git a/gcc/testsuite/g++.dg/template/ttp1.C b/gcc/testsuite/g++.dg/template/ttp1.C new file mode 100644 index 000000000..7b323028e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp1.C @@ -0,0 +1,9 @@ +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } + +template <template <typename T> class A > +class B : virtual A<void> +{ + typedef int INT; + INT i; +}; diff --git a/gcc/testsuite/g++.dg/template/ttp10.C b/gcc/testsuite/g++.dg/template/ttp10.C new file mode 100644 index 000000000..09bdb1a84 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp10.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +// Origin: Ivan Godard <igodard@pacbell.net> +// Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/16175: Missing cv qualifier in error message output + +template <typename> struct Template {}; + +template<template<typename> class D> +struct B { + static void foo1(const D<void> *); // { dg-error "const" } + static void foo2(volatile D<void> *);// { dg-error "volatile" } +}; + +class E : protected B<Template> {}; + +void bar() { + E::foo1 (0); // { dg-error "context" } + E::foo2 (0); // { dg-error "context" } +} diff --git a/gcc/testsuite/g++.dg/template/ttp11.C b/gcc/testsuite/g++.dg/template/ttp11.C new file mode 100644 index 000000000..84867e107 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp11.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Origin: heinlein@informatik.uni-ulm.de + +// PR c++/14429: Matching of template template parameter containing +// non-type parameter with type that depends on earlier parameter. + +template <template <typename U, U* p> class T> +struct X {}; + +template <template <typename U, U* p> class T> +struct Y { + X<T> x; +}; diff --git a/gcc/testsuite/g++.dg/template/ttp12.C b/gcc/testsuite/g++.dg/template/ttp12.C new file mode 100644 index 000000000..554738bf4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp12.C @@ -0,0 +1,19 @@ +// Copyright (C) 2004 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +// Check the type of non-type parameter in template template parameter +// only if it is dependent. + +template <template <int* p> class T> +struct X {}; + +template <typename U, template <U* p> class T> +struct Y { + X<T> x; +}; + +template <int* p> struct Z {}; + +Y<int, Z> y1; +Y<char, Z> y2; // { dg-error "mismatch|expected|invalid" } diff --git a/gcc/testsuite/g++.dg/template/ttp13.C b/gcc/testsuite/g++.dg/template/ttp13.C new file mode 100644 index 000000000..2c35b3a79 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp13.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +// Origin: Wolfgang Bangerth <bangerth@dealii.org> + +// PR c++/15664: Template substitution of template template parameter + +template <int N> struct S { + template<template<typename> class A> + friend void foo(); +}; + +template<template<typename> class A> +void foo(); + +template <typename> struct X {}; + +int main () { + S<1> s; + foo<X>(); +} diff --git a/gcc/testsuite/g++.dg/template/ttp14.C b/gcc/testsuite/g++.dg/template/ttp14.C new file mode 100644 index 000000000..2b216090b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp14.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Origin: akim@epita.fr +// Volker Reichelt <reichelt@gcc.gnu.org> + +// PR c++/18276: Template substitution of template template parameter + +template<template<int> class> struct A; + +template<int> struct B +{ + template<template<int> class> friend class A; +}; + +B<0> b; diff --git a/gcc/testsuite/g++.dg/template/ttp15.C b/gcc/testsuite/g++.dg/template/ttp15.C new file mode 100644 index 000000000..5bb285eb5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp15.C @@ -0,0 +1,21 @@ +struct Dense { + static const unsigned int dim = 1; +}; + +template <template <typename> class View, + typename Block> +void operator+(float, View<Block> const&); + +template <typename Block, + unsigned int Dim = Block::dim> +struct Lvalue_proxy { + operator float() const; +}; + +void +test_1d (void) +{ + Lvalue_proxy<Dense> p; + float b; + b + p; +} diff --git a/gcc/testsuite/g++.dg/template/ttp16.C b/gcc/testsuite/g++.dg/template/ttp16.C new file mode 100644 index 000000000..c556c7d98 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp16.C @@ -0,0 +1,7 @@ +template <template <typename> class C> +void f() {} + +template <typename T, typename U = int> +struct S {}; + +template void f<S>(); // { dg-error "match" } diff --git a/gcc/testsuite/g++.dg/template/ttp17.C b/gcc/testsuite/g++.dg/template/ttp17.C new file mode 100644 index 000000000..f1ddeb12e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp17.C @@ -0,0 +1,7 @@ +template <template <typename> class C> +void f(C<double>) {} + +template <typename T, typename U = int> +struct S {}; + +template void f(S<double>); // { dg-error "match" } diff --git a/gcc/testsuite/g++.dg/template/ttp18.C b/gcc/testsuite/g++.dg/template/ttp18.C new file mode 100644 index 000000000..095c07fb9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp18.C @@ -0,0 +1,10 @@ +template <template <typename> class T> +void f(T<int>) {} + +template <typename T> +union U {}; + +void g() { + f(U<int>()); +} + diff --git a/gcc/testsuite/g++.dg/template/ttp19.C b/gcc/testsuite/g++.dg/template/ttp19.C new file mode 100644 index 000000000..12a37c9cd --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp19.C @@ -0,0 +1,7 @@ +// PR c++/27689 + +void f (...); +template <template <typename> class F, typename T> void f (F<T>); +template <typename> struct foo { struct bar {}; }; +void g (foo<int>::bar x) { f(x); } + diff --git a/gcc/testsuite/g++.dg/template/ttp2.C b/gcc/testsuite/g++.dg/template/ttp2.C new file mode 100644 index 000000000..45d9abddf --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp2.C @@ -0,0 +1,17 @@ +// Copyright (C) 2001 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +template <class U> struct Alloc {}; + +template <class T, class U = Alloc<T> > struct Vector {}; + +template <template <class T, class U = Alloc<T> > class TT> +struct C { + TT<int> tt; +}; + +int main() +{ + C<Vector> c; +} diff --git a/gcc/testsuite/g++.dg/template/ttp20.C b/gcc/testsuite/g++.dg/template/ttp20.C new file mode 100644 index 000000000..0d1784c9f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp20.C @@ -0,0 +1,11 @@ +// PR c++/27424 +// Bug: failing to substitute the 'int' into C + +template<typename T> struct A +{ + template<template<T> class> struct B {}; + template<T> struct C; + B<C> b; +}; + +A<int> a; diff --git a/gcc/testsuite/g++.dg/template/ttp21.C b/gcc/testsuite/g++.dg/template/ttp21.C new file mode 100644 index 000000000..f0bda99d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp21.C @@ -0,0 +1,5 @@ +// PR c++/28853 +// { dg-do compile } + +template<template<int> class A> +int A<0>::i; // { dg-error "template template parameter" } diff --git a/gcc/testsuite/g++.dg/template/ttp22.C b/gcc/testsuite/g++.dg/template/ttp22.C new file mode 100644 index 000000000..08eaa3042 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp22.C @@ -0,0 +1,8 @@ +// PR c++/28860 +// { dg-do compile } + +template<template<int> class A> +class A<0>; // { dg-error "shadows template template parameter" } + +template<template<int> class B> +class B<0> {}; // { dg-error "shadows template template parameter" } diff --git a/gcc/testsuite/g++.dg/template/ttp23.C b/gcc/testsuite/g++.dg/template/ttp23.C new file mode 100644 index 000000000..1210f042f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp23.C @@ -0,0 +1,17 @@ +// PR c++/29236 + +template <typename T> struct A {}; + +template <template <typename> class P> +struct B { + template <template <typename> class Q> + friend bool foo (const B<Q>& a); +}; + +template <template <typename> class Q> +bool foo (const B<Q>& a); + +void bar () { + B<A> a; + foo (a); +} diff --git a/gcc/testsuite/g++.dg/template/ttp24.C b/gcc/testsuite/g++.dg/template/ttp24.C new file mode 100644 index 000000000..2b8e28515 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp24.C @@ -0,0 +1,6 @@ +// PR c++/30897 + +template<template <typename T, typename = T > class U> struct A +{ + template<int> U<int> foo(); +}; diff --git a/gcc/testsuite/g++.dg/template/ttp25.C b/gcc/testsuite/g++.dg/template/ttp25.C new file mode 100644 index 000000000..861d187d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp25.C @@ -0,0 +1,29 @@ +// { dg-do compile } +template<typename T, template<T> class C> +void f1(T, C<5>); // { dg-message "note" } + +template<typename T, template<T> class C> +void f2(C<5>, T); + +template<typename T, template<T> class C> +void f3(C<5>, T); // { dg-message "note" } + +template<typename T> struct metafun { typedef T type; }; + +template<> struct metafun<short> { typedef int type; }; + +template<typename T, template<typename metafun<T>::type> class C> +void f4(T, C<5>); // { dg-message "note" } + +template<int N> struct X {}; +void g() { + f1(5l, X<5>()); // { dg-error "no matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 20 } + f2(X<5>(), 5); + f3(X<5>(), 5l); // { dg-error "no matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 23 } + f4(5, X<5>()); + f4(5l, X<5>()); // { dg-error "no matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 26 } + f4((short)5, X<5>()); +} diff --git a/gcc/testsuite/g++.dg/template/ttp26.C b/gcc/testsuite/g++.dg/template/ttp26.C new file mode 100644 index 000000000..6ba5cb28a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp26.C @@ -0,0 +1,5 @@ +// PR c++/34052 +template<typename T = int, typename U> class C; // { dg-error "no default argument" } + +template<template<typename T = int, typename U> class C> struct X; // { dg-error "no default argument" } + diff --git a/gcc/testsuite/g++.dg/template/ttp27.C b/gcc/testsuite/g++.dg/template/ttp27.C new file mode 100644 index 000000000..f69369085 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp27.C @@ -0,0 +1,6 @@ +// PR c++/35678 + +template<typename T, T> struct A; +template<typename> struct B; +template<template<typename T, T> class U> struct B<U<char, 'h'> > {}; +B<A<char,'h'> > x; diff --git a/gcc/testsuite/g++.dg/template/ttp3.C b/gcc/testsuite/g++.dg/template/ttp3.C new file mode 100644 index 000000000..a7f231a7f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp3.C @@ -0,0 +1,26 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 29 Dec 2001 <nathan@codesourcery.com> + +// PR 5213. We failed to spot that class List was a template, rather +// than a non-template or specialization + + +template <class T> class vector { }; + +class OUTER { + public: + template <class T> + class List { }; + + vector<class List> data; // { dg-error "invalid|required|ISO C" "" } +}; + +template <class T> +class List { }; + +// This next line should just do a lookup of 'class List', and then +// get a type/value mismatch. Instead we try and push 'class List' +// into the global namespace and get a redeclaration error. +vector<class List > data; // { dg-error "invalid|required|declaration" "" } diff --git a/gcc/testsuite/g++.dg/template/ttp4.C b/gcc/testsuite/g++.dg/template/ttp4.C new file mode 100644 index 000000000..4dff70103 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp4.C @@ -0,0 +1,11 @@ +// { dg-do compile } +// Origin: Ewgenij Gawrilow <gawrilow@math.tu-berlin.de> + +// PR c++/6723 +// ICE when default template argument contains instantiation of +// template template parameter. + +template <typename A, typename B, + template <typename,typename> class Predicate, + bool _matches=Predicate<A,B>::answer> +struct helper { }; diff --git a/gcc/testsuite/g++.dg/template/ttp5.C b/gcc/testsuite/g++.dg/template/ttp5.C new file mode 100644 index 000000000..ee9d1ff7c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp5.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +// Origin: sneechy@hotmail.com + +// PR c++/8772: Incorrect diagnostics for template template parameter +// mismatch + +template <int> struct A { + template <int> struct B { + enum { v = 1 }; + }; +}; + +template <template <int> class F> struct C { + enum { v = F<1>::v || 2 }; +}; + +template <int n> struct D { + enum { v = C<A<n>::B>::v }; // { dg-error "mismatch|class template" } +}; diff --git a/gcc/testsuite/g++.dg/template/ttp6.C b/gcc/testsuite/g++.dg/template/ttp6.C new file mode 100644 index 000000000..a4c6ab059 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp6.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +// Origin: Eelis van der Weegen <gccbugs@contacts.eelis.net> + +// PR c++/10552: Member class template as template template argument +// substitution issue. + +template <template <typename> class A, typename> +struct B +{ + typedef typename A<int>::t t; +}; + +template <typename D> +struct E +{ + template <typename> struct F { typedef int t; }; + typedef typename B<F, D>::t t; +}; + +typedef E<int>::t t; diff --git a/gcc/testsuite/g++.dg/template/ttp7.C b/gcc/testsuite/g++.dg/template/ttp7.C new file mode 100644 index 000000000..0bcaa8f72 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp7.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// Contributed by Andrew Pinski <pinskia at gcc dot gnu dot org> +// PR c++/13810: ICE while parsing invalid default argument for a +// template template parameter. + +struct X; +template<int> struct A {}; + +template<template<int> class = X > struct B1 {}; // { dg-error "as a default value" } +template<template<int> class = A<0> > struct B2 {}; // { dg-error "as a default value" } + +template <typename T> +struct S { + template <template <typename> class = S> struct I1 {}; // { dg-error "as a default value" } + template <template <typename> class = ::S> struct I2 {}; +}; diff --git a/gcc/testsuite/g++.dg/template/ttp8.C b/gcc/testsuite/g++.dg/template/ttp8.C new file mode 100644 index 000000000..99f99b965 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp8.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// Contributed by: Niall Douglas <s_gccbugzilla at netprod dot com> +// PR c++/14284: Failure to select specialization + +template<typename> struct S; +template<template<class> class> struct I {}; + +template<class, int> struct Match; + +template<template<class> class C> +struct Match<I<C>, 0> {}; + +template<template<class> class C, int i> +struct Match<I<C>, i>; + +Match<I<S>, 0> v; diff --git a/gcc/testsuite/g++.dg/template/ttp9.C b/gcc/testsuite/g++.dg/template/ttp9.C new file mode 100644 index 000000000..060ab7788 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp9.C @@ -0,0 +1,28 @@ +// { dg-do compile } + +// Origin: David Abrahams <dave@boost-consulting.com> +// Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/12170: Deducing template template parameter from nested +// class template. + +template <typename> struct W {}; + +template< template<typename> class F, typename T> +int foo(W< F<T> >); + + +template<typename T> +struct L { + static int const value = sizeof(foo(W<T>())); + typedef T type; +}; + + +template <typename> +struct Y { + template <typename> struct X { typedef int type; }; + typedef typename L<X<int> >::type type; +}; + +template struct Y<int>; diff --git a/gcc/testsuite/g++.dg/template/type1.C b/gcc/testsuite/g++.dg/template/type1.C new file mode 100644 index 000000000..b74d975ac --- /dev/null +++ b/gcc/testsuite/g++.dg/template/type1.C @@ -0,0 +1,8 @@ +// Test for helpful error messages on invalid nested-name-specifiers. + +struct A { + template <class T> struct B { static int c; }; +}; + +int A::B::c; // { dg-error "parameters" } +int A::C::d; // { dg-error "declared" } diff --git a/gcc/testsuite/g++.dg/template/type2.C b/gcc/testsuite/g++.dg/template/type2.C new file mode 100644 index 000000000..509c4820d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/type2.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// Origin: Juan Carlos Arevalo-Baeza <jcab@JCABs-Rumblings.com> + +// PR c++/8442 +// Type template parameter incorrectly treated as template template +// parameter. + +template <typename T> struct A {}; + +template <typename T> struct B +{ + template <typename U> struct C {}; + template <typename U> A<C<U> > foo(U); +}; + +B<void> b; diff --git a/gcc/testsuite/g++.dg/template/typedef1.C b/gcc/testsuite/g++.dg/template/typedef1.C new file mode 100644 index 000000000..75b00e0fb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef1.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 9 Dec 2001 <nathan@nathan@codesourcery.com> + +// PR 72 + +template <typename T> struct A +{ + typedef T type; +}; + +template <typename T> struct B +{ + typedef int xxx; // { dg-error "" } + typedef T xxx; // { dg-error "" } + typedef typename A<T>::type xxx; // { dg-error "" } + typedef A<int>::type xxx; // { dg-error "" } +}; + +B<int> good; diff --git a/gcc/testsuite/g++.dg/template/typedef10.C b/gcc/testsuite/g++.dg/template/typedef10.C new file mode 100644 index 000000000..c2a2108f0 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef10.C @@ -0,0 +1,14 @@ +// PR c++/34573 + +template < class Gtr_> +void compute_gr() +{ + typedef int Less_chain; + struct utils { + utils(const Less_chain& lc) {}; + }; + utils U(1); +} +int main(void){ + compute_gr<int>(); +} diff --git a/gcc/testsuite/g++.dg/template/typedef11.C b/gcc/testsuite/g++.dg/template/typedef11.C new file mode 100644 index 000000000..c7c7c989f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef11.C @@ -0,0 +1,25 @@ +// Author: Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/26693 +// { dg-do compile } + + +class Alpha +{ + typedef int X; // { dg-error "'typedef int Alpha::X' is private" } +}; + +template<int> +class Beta +{ + typedef int Y; // { dg-error "'typedef int Beta<0>::Y' is private" } +}; + +template <int> +int +bar () +{ + Beta<0>::Y i = 0; + return Alpha::X (); +} + +int i = bar<0> (); // { dg-error "within this context" } diff --git a/gcc/testsuite/g++.dg/template/typedef12.C b/gcc/testsuite/g++.dg/template/typedef12.C new file mode 100644 index 000000000..30605044f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef12.C @@ -0,0 +1,23 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: Jason Merrill <jason@redhat.com>, PR c++/26693 +// { dg-do compile } + +class A +{ + protected: + typedef int mytype; +}; + +template <class T> class B; + +class C: public A +{ + template <class T> friend class B; +}; + +template <class T> class B +{ + C::mytype mem; +}; + +B<int> b; diff --git a/gcc/testsuite/g++.dg/template/typedef13.C b/gcc/testsuite/g++.dg/template/typedef13.C new file mode 100644 index 000000000..a22e1cb11 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef13.C @@ -0,0 +1,16 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/26693 +// { dg-do compile } + +class A +{ + typedef int mytype; // { dg-error "typedef int A::mytype' is private" } +}; + +template <class T> class B : public A +{ + mytype mem; // { dg-error "within this context" } +}; + +B<int> b; // { dg-message "instantiated from here" } + diff --git a/gcc/testsuite/g++.dg/template/typedef14.C b/gcc/testsuite/g++.dg/template/typedef14.C new file mode 100644 index 000000000..caa565a08 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef14.C @@ -0,0 +1,16 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/26693 +// { dg-do compile } + +template <class T> +struct A +{ + typedef int mytype; + + void + foo () + { + mytype v = ~static_cast<mytype> (0); + } +}; + diff --git a/gcc/testsuite/g++.dg/template/typedef15.C b/gcc/testsuite/g++.dg/template/typedef15.C new file mode 100644 index 000000000..e9e3d94ff --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef15.C @@ -0,0 +1,25 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/26693 +// { dg-do compile } + +template<class T> struct C0; + +struct Foo { + typedef int TypedefedFoo; + typedef C0<Foo> TypedefedC0; +}; + +template<class T> +struct C0 +{ + typedef Foo TypedefedFoo; + typename T::TypedefedC0::TypedefedFoo m; +}; + +template<class U> +struct C1 +{ + typedef C0<Foo> TypedefedC0; +}; + +C0<C1<int> > c; diff --git a/gcc/testsuite/g++.dg/template/typedef16.C b/gcc/testsuite/g++.dg/template/typedef16.C new file mode 100644 index 000000000..29870605a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef16.C @@ -0,0 +1,27 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/26693 +// { dg-do compile } + +struct C0 +{ +}; + +template<class T, class U> +struct C1 +{ + typedef C0 TypedefedC0; + + template<class W> + void foo (TypedefedC0 *, W) + { + } + + template<class W> C1 (W w) + { + TypedefedC0 c; + foo (&c, w); + } + +}; +C0 c0; +C1<int, char> c1 (&c0); diff --git a/gcc/testsuite/g++.dg/template/typedef17.C b/gcc/testsuite/g++.dg/template/typedef17.C new file mode 100644 index 000000000..263e28886 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef17.C @@ -0,0 +1,32 @@ +// PR c++/37806 + +extern "C" int printf (const char *, ...); + +template <typename T> +struct S1 +{ + typedef void (function_type)(int) const; +}; + + +struct S2: public S1<int> +{ + virtual function_type f = 0; +}; + +struct S3: public S2 +{ + void + f (int i) const + { + printf ("Hello world: %d\n", i); + } +}; + + +int +main() +{ + S3 s; + s.f(5); +} diff --git a/gcc/testsuite/g++.dg/template/typedef18.C b/gcc/testsuite/g++.dg/template/typedef18.C new file mode 100644 index 000000000..8ea3c736a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef18.C @@ -0,0 +1,24 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/40007 +// { dg-do compile } + +template<typename T> +struct x +{ + protected: + typedef int type; +}; + +template<typename T> +struct y : public x<T> +{ + typename x<T>::type z; +}; + +template<> +struct y<void> : public x<void> +{ + typedef x<void>::type z; +}; + +template class y<int>; diff --git a/gcc/testsuite/g++.dg/template/typedef19.C b/gcc/testsuite/g++.dg/template/typedef19.C new file mode 100644 index 000000000..2fac20ea0 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef19.C @@ -0,0 +1,21 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/40007 +// { dg-do compile } + +class A +{ + typedef int mytype; // { dg-error "'typedef int A::mytype' is private" } +}; + +template <class T> +class B : public A +{ +}; + +template<class T> +class B<T*> : public A +{ + mytype mem; // { dg-error "within this context" } +}; + +B<int*> b; diff --git a/gcc/testsuite/g++.dg/template/typedef2.C b/gcc/testsuite/g++.dg/template/typedef2.C new file mode 100644 index 000000000..cfe0f3f75 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef2.C @@ -0,0 +1,4 @@ +// PR c++/18155 + +template<int> typedef struct A; // { dg-warning "'typedef' was ignored" } + // { dg-error "" "" { target *-*-* } 3 } diff --git a/gcc/testsuite/g++.dg/template/typedef20.C b/gcc/testsuite/g++.dg/template/typedef20.C new file mode 100644 index 000000000..c768ce0a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef20.C @@ -0,0 +1,27 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/40007 +// { dg-do compile } + +class x +{ + typedef int privtype; // { dg-error "is private" } + +protected: + typedef int type; +}; + +template<typename T> +struct y : public x +{ + typename x::type z; +}; + +template<typename T> +struct y<T*> : public x +{ + typedef x::type good; + typedef x::privtype bad; // { dg-error "within this context" } +}; + +template class y<int>; +template class y<int*>; diff --git a/gcc/testsuite/g++.dg/template/typedef21.C b/gcc/testsuite/g++.dg/template/typedef21.C new file mode 100644 index 000000000..3185331be --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef21.C @@ -0,0 +1,11 @@ +// PR c++/37037 + +typedef void F(void); +template <typename T> struct S +{ + static F f; +}; +template class S<int>; +template <class T> void S<T>::f(void) +{} + diff --git a/gcc/testsuite/g++.dg/template/typedef22.C b/gcc/testsuite/g++.dg/template/typedef22.C new file mode 100644 index 000000000..e3ecfcb36 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef22.C @@ -0,0 +1,18 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/14777 +// { dg-do compile } + +template <typename T> +struct B +{ +protected: + typedef int M; // { dg-error "protected" } +}; + +template <typename T> +struct A : B<T> { + typedef typename B<char>::M N; // { dg-error "context" } + A (int = N ()); +}; + +A<int> a = A<int> (); diff --git a/gcc/testsuite/g++.dg/template/typedef23.C b/gcc/testsuite/g++.dg/template/typedef23.C new file mode 100644 index 000000000..e70355037 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef23.C @@ -0,0 +1,25 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/42069 +// { dg-do compile } + +struct A +{ + static const int N = 0; +}; + +template<int> struct B {}; + +template<typename T, int> +struct C +{ + typedef T U; + B<U::N> b; +}; + +template<typename T> +struct C<T*, 0> +{ + B<T::N> b; +}; + +C<A*, 0> c; diff --git a/gcc/testsuite/g++.dg/template/typedef24.C b/gcc/testsuite/g++.dg/template/typedef24.C new file mode 100644 index 000000000..ddcae1d61 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef24.C @@ -0,0 +1,33 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/42225 +// { dg-do compile } + +template<class T> +struct A +{ + typedef T I; +}; + +template<class T, int> +struct B +{ + typedef T TT; + typedef typename TT::I TT_I; + typedef A<TT_I> TA; +}; + +template<class T> +void +foo() +{ + typedef T TT; + typedef typename TT::I TT_I; + typedef A<TT_I> TA; +} + +int +main() +{ + foo<A<int> >(); +} + diff --git a/gcc/testsuite/g++.dg/template/typedef25.C b/gcc/testsuite/g++.dg/template/typedef25.C new file mode 100644 index 000000000..4f5868f12 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef25.C @@ -0,0 +1,43 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/42225 +// { dg-options "-std=c++0x" } +// { dg-do compile } + +template<class T> +struct A +{ + typedef T I; + static const char *i; +}; + +template<class T, int> +struct B +{ + typedef T TT; + typedef decltype(TT::i) TT_I0; + typedef decltype(&TT::i) TT_I1; + typedef decltype(*TT::i) TT_I2; + typedef A<TT_I0> TA0; + typedef A<TT_I1> TA1; + typedef A<TT_I2> TA2; +}; + +template<class T> +void +foo() +{ + typedef T TT; + typedef decltype(TT::i) TT_I0; + typedef decltype(&TT::i) TT_I1; + typedef decltype(*TT::i) TT_I2; + typedef A<TT_I0> TA0; + typedef A<TT_I1> TA1; + typedef A<TT_I2> TA2; +} + +int +main() +{ + foo<A<int> >(); +} + diff --git a/gcc/testsuite/g++.dg/template/typedef26.C b/gcc/testsuite/g++.dg/template/typedef26.C new file mode 100644 index 000000000..7f4bc6b5c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef26.C @@ -0,0 +1,40 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/42225 +// { dg-do compile } + +struct A +{ + typedef int TI; +}; + +template<class T0> +struct S0 +{ + int i; +}; + +template<class _T, int> +struct S1 +{ + typedef _T T; + typedef typename T::TI TTI; + typedef S0<TTI> TT0; + typedef S0<typename T::TI> TT1; +}; + +template<class T> +void +foo(const T&) +{ + typedef typename T::TI TTI; + typedef S0<TTI> TT1; + typedef S0<typename T::TI> TT2; +} + +int +main() +{ + A a; + foo (a); +} + diff --git a/gcc/testsuite/g++.dg/template/typedef27.C b/gcc/testsuite/g++.dg/template/typedef27.C new file mode 100644 index 000000000..e50f17ccd --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef27.C @@ -0,0 +1,55 @@ +// Origin: PR c++/42713 +// { dg-do compile } + +template<class T> +struct S +{ +}; + +template<class T> +struct S0 +{ + typedef T TT; +}; + +template<class U, class V> +struct super_struct : S0<V> +{ + typedef S0<V> super; +}; + +template<class U, class V, class W> +struct S1 : super_struct<U, V> +{ + typedef super_struct<U, V> super; + typedef typename super::super Super2; + typedef typename Super2::TT Super2TT; + void + foo() + { + S<Super2TT> s1; + } +}; + +template<class U, class V> +struct S2 : super_struct<U, V> +{ + typedef super_struct<U, V> super; + typedef typename super::super Super2; + typedef typename Super2::TT Super2TT; + void + foo() + { + S<Super2TT> s1; + } +}; + +int +main() +{ + S1<int, S<int>, int> s1; + s1.foo(); + S2<int, S<int> > s2; + s2.foo(); +} + diff --git a/gcc/testsuite/g++.dg/template/typedef28.C b/gcc/testsuite/g++.dg/template/typedef28.C new file mode 100644 index 000000000..a0bad1bb9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef28.C @@ -0,0 +1,28 @@ +// Origin: PR c++/42820 +// { dg-do compile } + + +template <class T> struct vector{}; +struct Traits{struct Primitive{struct Id{};};}; + +template <class Tree, class Polyhedron> struct Tree_vs_naive +{ + typedef typename Tree::Primitive Primitive; + + void f() const + { + typedef vector<typename Primitive::Id> Id_vector; + } +}; + +template <class Tree> void test_hint_strategies() +{ + vector<typename Tree::Primitive::Id> v; +} + +int main(void) +{ + test_hint_strategies<Traits>(); +} + + diff --git a/gcc/testsuite/g++.dg/template/typedef29.C b/gcc/testsuite/g++.dg/template/typedef29.C new file mode 100644 index 000000000..bb3b81e35 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef29.C @@ -0,0 +1,25 @@ +// Origin: PR c++/42820 +// { dg-do compile } + +template <class T> struct vector{}; +template<class T>struct Traits{struct Primitive{struct Id{};};}; + +template <template<class T> class Tree, class Polyhedron> struct Tree_vs_naive +{ + typedef typename Tree<int>::Primitive Primitive; + + void f() const + { + typedef vector<typename Primitive::Id> Id_vector; + } +}; + +template <template<class T> class Tree> void test_hint_strategies() +{ + vector<typename Tree<int>::Primitive::Id> v; +} + +int main(void) +{ + test_hint_strategies<Traits>(); +} diff --git a/gcc/testsuite/g++.dg/template/typedef3.C b/gcc/testsuite/g++.dg/template/typedef3.C new file mode 100644 index 000000000..481f451d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef3.C @@ -0,0 +1,7 @@ +// PR c++/19397 +// { dg-do compile } + +template<typename> struct A +{ + typedef int ::template; // { dg-error "template" } +}; diff --git a/gcc/testsuite/g++.dg/template/typedef30.C b/gcc/testsuite/g++.dg/template/typedef30.C new file mode 100644 index 000000000..2f9362a1e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef30.C @@ -0,0 +1,20 @@ +// Origin: PR c++/43206 +// { dg-do compile } + +template<class A> struct NumericTraits{ typedef A TInputImage;}; +template<class B> class CovariantVector{}; +template<class C> struct Image{ typedef C PixelType;}; +template<class H, class E, class D> +class F { + typedef H G; + typedef + typename NumericTraits<typename G::PixelType>::RealType + InputRealType; +}; + +template<typename TInputImage, + typename TOutputImage=Image<CovariantVector<typename NumericTraits<typename TInputImage::PixelType>::TInputImage> > > +class XXX{}; + +XXX<Image<float> > x; + diff --git a/gcc/testsuite/g++.dg/template/typedef31.C b/gcc/testsuite/g++.dg/template/typedef31.C new file mode 100644 index 000000000..7d66e3f5b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef31.C @@ -0,0 +1,21 @@ +// Origin: PR c++/43558 +// { dg-do compile } + +class Compressible; +template <class T, class EngineTag> class Engine; +template <class T> +class Engine<T, Compressible> +{ + public: + typedef T Element_t; + //Element_t read(int); + T read(int); +}; + +template <class T> +T Engine<T, Compressible>::read(int) +{ +} + +Engine<int, Compressible> x; + diff --git a/gcc/testsuite/g++.dg/template/typedef32.C b/gcc/testsuite/g++.dg/template/typedef32.C new file mode 100644 index 000000000..b32e66c3f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef32.C @@ -0,0 +1,46 @@ +// Origin: PR c++/43704 +// { dg-do compile } + +template<typename T2, typename T3> +struct if_ +{ + typedef T2 type; +}; + +template<class I1> +struct iterator_restrict_traits +{ + struct iterator_category {}; +}; + +template<class T> +struct matrix +{ + struct ci {struct ic {};}; + class i {}; +}; + +template<class M, class TRI> +struct triangular_adaptor +{ + typedef typename if_<typename M::ci,typename M::i>::type ty1; + class iterator2 : iterator_restrict_traits<typename ty1::ic>::iterator_category + { + }; +}; + +template<class M> +struct banded_adaptor +{ + typedef typename if_<typename M::ci,typename M::i>::type ty1; + class iterator1 : iterator_restrict_traits<typename ty1::ic>::iterator_category + { + }; +}; + +template<class T> +struct singular_decomposition +{ + banded_adaptor<matrix<double> >::iterator1 it1; +}; + diff --git a/gcc/testsuite/g++.dg/template/typedef33.C b/gcc/testsuite/g++.dg/template/typedef33.C new file mode 100644 index 000000000..1d2117b3a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef33.C @@ -0,0 +1,21 @@ +// Origin PR c++/43800 +// { dg-do compile } + +template<class T, class U=T> +struct V +{ + typedef T t_type; +}; + +template<class T> +class J +{ + typedef typename V<T>::t_type t_type; + const t_type& f(); // #0: +private: + t_type b; +}; + +template<class T> +const typename V<T>::t_type& J<T>::f() {return b;} // #1 + diff --git a/gcc/testsuite/g++.dg/template/typedef34.C b/gcc/testsuite/g++.dg/template/typedef34.C new file mode 100644 index 000000000..a82e155e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef34.C @@ -0,0 +1,37 @@ +// Origin PR c++/45200 +// { dg-do compile } + +template<typename T> +struct remove_reference +{ + typedef T type; +}; + +template<typename TestType> +struct forward_as_lref +{ +}; + +template<typename Seq, typename N> +struct apply1 +{ + typedef typename remove_reference<Seq>::type seq; + typedef forward_as_lref<typename seq::seq_type> type; //#0 +}; + +template<typename Seq> +struct apply +{ + typedef forward_as_lref<typename remove_reference<Seq>::type::seq_type> type; //#1 +}; + +struct reverse_view +{ + typedef int seq_type; +}; + +int +main() +{ + apply<reverse_view >::type a2; +} diff --git a/gcc/testsuite/g++.dg/template/typedef35.C b/gcc/testsuite/g++.dg/template/typedef35.C new file mode 100644 index 000000000..2dddf0966 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef35.C @@ -0,0 +1,41 @@ +// Origin c++/45558 +// { dg-do compile } + +template <typename S, typename T> +struct C +{ + template <typename U> + struct B + { + template <typename W> + struct E + { + explicit E(const W &x) : w(x) {} + const W &w; + }; + }; +}; + +struct F; +template <typename X> +struct D +{ + D() {} +}; + +const D<F> g; +template <typename S, typename T> +struct A +{ + template <typename U> + struct B : C<S, T>::template B<U> + { + typedef typename C<S, T>::template B<U> V; + static const D<typename V::template E<D<F> > > a; + }; +}; + +template <typename S, typename T> +template <typename U> +const D<typename C<S, T>::template B<U>::template E<D<F> > > +A<S, T>::B<U>::a = typename C<S, T>::template B<U>::template E<D<F> >(g); diff --git a/gcc/testsuite/g++.dg/template/typedef36.C b/gcc/testsuite/g++.dg/template/typedef36.C new file mode 100644 index 000000000..318deef92 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef36.C @@ -0,0 +1,23 @@ +// Origin: PR c++/45606 +// { dg-do compile } + +template<class T, class U = int> +struct S0 +{ + typedef int const_iterator; +}; + +template<class T> +struct Test +{ + typedef S0<T> SAlias; + typedef typename SAlias::const_iterator const_iterator; + const_iterator begin (); +}; + +template<class T> +typename S0<T>::const_iterator +Test<T>::begin() +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/typedef37.C b/gcc/testsuite/g++.dg/template/typedef37.C new file mode 100644 index 000000000..eefa38316 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef37.C @@ -0,0 +1,58 @@ +// Origin: PR c++/47398 +// { dg-do compile } + +template<int> +struct A +{ + typedef int INT; +}; + +template<int I> +struct transform +{ + static int bar(); +}; + +template<class T, int a, class U, int b> +struct B +{ + typedef typename A<a>::INT TINT; + void baz(); +}; + +template<class T, int a, class U> +struct B<T, a, U, 1> +{ + typedef typename A<a>::INT TINT; + void foo(); +}; + +template<class T, int a, class U, int b> +void +B<T, a, U, b>::baz() +{ + int c = transform<sizeof(TINT)>::bar();//#0 +} + +template<class T, int a, class U> +void +B<T, a, U, 1>::foo() +{ + int c = transform<sizeof(TINT)>::bar();//#1 +} + +int +main() +{ + B<int, 2, char, 1> i; + i.foo(); + // While instantiating + // + // template<class T, int a, class U> void B<T, a, U, 1>::foo() + // + // lookup_template_class resolves transform<sizeof(TINT)> in #1 to + // the wrong one; it picks up the one in #0 instead. This is because + // to compare the two A<a> comp_template_args uses cp_tree_equal + // that fails to consider the number of siblings of parm 'a'. +return 0; +} diff --git a/gcc/testsuite/g++.dg/template/typedef38.C b/gcc/testsuite/g++.dg/template/typedef38.C new file mode 100644 index 000000000..445db17bd --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef38.C @@ -0,0 +1,27 @@ +// Origin: PR c++/46394 +// { dg-options "-std=c++0x" } +// { dg-do compile } + +template<class T> +struct S0 +{ + typedef T type; +}; + +template<class... X> +struct S1 +{ + typedef int I; +}; + +struct A +{ + template<class...U, class V=typename S1<typename S0<U>::type...>::I> + A(U...u); +}; + +int +main() +{ + A a(1, 2); +} diff --git a/gcc/testsuite/g++.dg/template/typedef4.C b/gcc/testsuite/g++.dg/template/typedef4.C new file mode 100644 index 000000000..60fad0688 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef4.C @@ -0,0 +1,10 @@ +// PR c++/27572 +// { dg-do compile } + +template<typedef> void foo(); // { dg-error "no type|typedef declaration|template" } + +void bar() +{ + foo<int>(); // { dg-error "matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 8 } +} diff --git a/gcc/testsuite/g++.dg/template/typedef5.C b/gcc/testsuite/g++.dg/template/typedef5.C new file mode 100644 index 000000000..04b8eac3b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef5.C @@ -0,0 +1,7 @@ +// PR c++/27572 +// { dg-do compile } + +template<typedef,int> struct A1; // { dg-error "no type|typedef declaration|default argument" } +template<typedef x,int> struct A2; // { dg-error "type|typedef declaration|default argument" } +template<typedef x[],int> struct A3; // { dg-error "no type|typedef declaration|expected" } +template<typedef int x, int> struct A4; // { dg-error "typedef declaration|default argument" } diff --git a/gcc/testsuite/g++.dg/template/typedef6.C b/gcc/testsuite/g++.dg/template/typedef6.C new file mode 100644 index 000000000..c95945966 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef6.C @@ -0,0 +1,8 @@ +//PR c++/28303 + +template<typename T> struct A +{ + typedef struct typename T::X X; // { dg-error "expected identifier|two or more" } +}; + +template<typename T> A<T>::X::X() {} // { dg-error "not a type|forbids declaration|invalid use of" } diff --git a/gcc/testsuite/g++.dg/template/typedef7.C b/gcc/testsuite/g++.dg/template/typedef7.C new file mode 100644 index 000000000..2d39c90b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef7.C @@ -0,0 +1,15 @@ +// An intermediate version of the fix for c++/19407 broke this example. + +struct A +{ + typedef struct { int i; } S; +}; + +template <class T> +struct B: public A +{ + template <class U> + static S f (); +}; + +template struct B<int>; diff --git a/gcc/testsuite/g++.dg/template/typedef8.C b/gcc/testsuite/g++.dg/template/typedef8.C new file mode 100644 index 000000000..f13260688 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef8.C @@ -0,0 +1,21 @@ +// PR c++/34206 + +template<class _T1, class _T2> struct pair { }; +template <class T0, class T1> struct tuple { + template <class U1, class U2> + tuple& operator=(const pair<U1, U2>& k) { } +}; +template<class T1, class T2> inline tuple<T1&, T2&> tie(T1& t1, T2& t2) { } + +template <class T> struct A +{ + typedef T type; + pair<type, type> f(); +}; + +void g(A<int> a) +{ + typedef A<int>::type type; + type begin1, end1; + tie(begin1, end1) = a.f(); +} diff --git a/gcc/testsuite/g++.dg/template/typedef9.C b/gcc/testsuite/g++.dg/template/typedef9.C new file mode 100644 index 000000000..8d2ed3675 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef9.C @@ -0,0 +1,25 @@ +// PR c++/34846 + +template<typename, typename> struct __are_same { enum { __value = 0 }; }; +template<typename _Tp> struct __are_same<_Tp, _Tp> { enum { __value = 1 }; }; +template<typename, bool> struct __enable_if { }; +template<typename _Tp> struct __enable_if<_Tp, true> { typedef _Tp __type; }; +template<typename _Iterator, typename _Container> class __normal_iterator { +public: + __normal_iterator(); + template<typename _Iter> + __normal_iterator( + const __normal_iterator<_Iter, typename __enable_if<_Container, +(__are_same<_Iter, typename _Container::pointer>::__value) >::__type>& __i) + { } +}; +template<typename _Tp> class vector { +public: + typedef _Tp* pointer; + typedef __normal_iterator<int, vector<_Tp> > iterator; +}; +void test() { + typedef int t; + vector<t*>::iterator x; + vector<t*>::iterator y = x; +} diff --git a/gcc/testsuite/g++.dg/template/typeid-template-argument.C b/gcc/testsuite/g++.dg/template/typeid-template-argument.C new file mode 100644 index 000000000..38dbfd3f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typeid-template-argument.C @@ -0,0 +1,7 @@ +// This used to ICE (PR28420) + +// { dg-do compile } + +template<int> struct A; + +int i = sizeof(A<typeid>); // { dg-error "operator cannot appear in a constant-expression|template argument 1 is invalid" } diff --git a/gcc/testsuite/g++.dg/template/typename1.C b/gcc/testsuite/g++.dg/template/typename1.C new file mode 100644 index 000000000..86658c5f9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename1.C @@ -0,0 +1,9 @@ +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } + +template <class T> +class B : virtual T::A +{ + typedef int INT; + INT i; +}; diff --git a/gcc/testsuite/g++.dg/template/typename10.C b/gcc/testsuite/g++.dg/template/typename10.C new file mode 100644 index 000000000..f6f9931df --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename10.C @@ -0,0 +1,24 @@ +// { dg-do compile } + +// Copyright (C) 2006 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 25 Aug 2006 <nathan@codesourcery.com> + +// Origin: Tobias Schwinger <tschwinger@neoscientists.org> +// PR 27787. Too eager to resolve a typename + +template<typename X> +struct x +{ + template<typename Y> + struct y + { + typedef Y type; + }; +}; + +template<typename A> +struct a : x<A> +{ + template<typename B> + typename a::template y<B>::type f(B); +}; diff --git a/gcc/testsuite/g++.dg/template/typename11.C b/gcc/testsuite/g++.dg/template/typename11.C new file mode 100644 index 000000000..fb776105f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename11.C @@ -0,0 +1,11 @@ +// PR c++/28999 + +namespace N +{ + template<int> void foo(); +} + +template<int> struct A +{ + friend void typename N::foo<0>(); // { dg-error "type|expected" } +}; diff --git a/gcc/testsuite/g++.dg/template/typename12.C b/gcc/testsuite/g++.dg/template/typename12.C new file mode 100644 index 000000000..0bb78c7c8 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename12.C @@ -0,0 +1,25 @@ +// { dg-do compile } + +// Copyright (C) 2007 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 21 Jul 2007 <nathan@codesourcery.com> + +// Origin: sschunck@pdf.de +// PR 30818, failure to resolve typename typedef + +template < typename T > +class A +{ + typedef int type; + class B; +}; + +template < typename T > +class A<T>::B +{ + typedef typename A<T>::type type; + type f(); +}; + +template < typename T > +typename A<T>::B::type +A<T>::B::f() { return 0; } diff --git a/gcc/testsuite/g++.dg/template/typename13.C b/gcc/testsuite/g++.dg/template/typename13.C new file mode 100644 index 000000000..527b0d153 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename13.C @@ -0,0 +1,24 @@ +// { dg-do compile } + +// Copyright (C) 2007 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 21 Jul 2007 <nathan@codesourcery.com> + +template <typename T> struct A +{ + struct B; + typedef typename B::type type; +}; + +template <typename T> struct A<T>::B +{ + typedef typename A<T>::type type; + + type Foo (); +}; + +template <typename T> +typename A<T>::B::type +A<T>::B::Foo () +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/typename14.C b/gcc/testsuite/g++.dg/template/typename14.C new file mode 100644 index 000000000..7e73cb0f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename14.C @@ -0,0 +1,24 @@ +// { dg-do compile } + +// Copyright (C) 2007 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 21 Jul 2007 <nathan@codesourcery.com> + +template <typename T> struct A +{ + typedef const T X; + + struct B; +}; + +template <typename T> struct A<T>::B +{ + typedef volatile typename A<T>::X Y; + + T const volatile *Foo (); +}; + +template<typename T> +typename A<T>::B::Y *A<T>::B::Foo () +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/typename15.C b/gcc/testsuite/g++.dg/template/typename15.C new file mode 100644 index 000000000..fece885ea --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename15.C @@ -0,0 +1,12 @@ +// PR37314 ice-on-valid-code, from w.doeringer +template <typename T> +class Cdeque { + typedef T *pointer; + class iterator { + typedef typename Cdeque<T>::pointer pointer; + pointer operator->(); + }; +}; +template <typename T> T* Cdeque<T>::iterator::operator->() { } + + diff --git a/gcc/testsuite/g++.dg/template/typename16.C b/gcc/testsuite/g++.dg/template/typename16.C new file mode 100644 index 000000000..45da11162 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename16.C @@ -0,0 +1,25 @@ +// PR37314 rejects-valid, from w.doeringer +template <typename T> +struct A { + typedef __PTRDIFF_TYPE__ difference_type; + struct B { + typedef typename A<T>::difference_type difference_type; + difference_type operator-(B const&) const; + T t; + }; +}; +// + +template <typename T> +typename A<T>::B::difference_type A<T>::B::operator-(B const&) const { + return -1; +} + +// +int main() { + A<int>::B i; + ++i.t; + return 0; +} + + diff --git a/gcc/testsuite/g++.dg/template/typename17.C b/gcc/testsuite/g++.dg/template/typename17.C new file mode 100644 index 000000000..748b1f7ab --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename17.C @@ -0,0 +1,10 @@ +// { dg-do compile } + +// This should fail as A::foo<0> is not a typename at all. +struct A +{ + template<int> void foo(int i) + { + typename A::foo<0>(i1); // { dg-error "" } + } +}; diff --git a/gcc/testsuite/g++.dg/template/typename18.C b/gcc/testsuite/g++.dg/template/typename18.C new file mode 100644 index 000000000..4134ef6f6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename18.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// These typename should work as they are types. +struct A +{ + typedef int a; + template <int> + struct f {}; + template<int> void foo(int i) + { + typename A::a(i1); + typename A::f<0>(i2); + } +}; diff --git a/gcc/testsuite/g++.dg/template/typename2.C b/gcc/testsuite/g++.dg/template/typename2.C new file mode 100644 index 000000000..b0e16d464 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename2.C @@ -0,0 +1,26 @@ +// { dg-do compile } +// { dg-options "" } + +// Copyright (C) 2001, 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 21 Mar 2002 <nathan@codesourcery.com> + +// PR 5507. Overzealous implicit typename warning + +template<typename _CharT> +class __ctype_abstract_base +{ + typedef int mask; +}; + +template<typename _CharT> +class ctype : public __ctype_abstract_base<_CharT> +{ + typedef typename ctype::mask mask; +}; + +template<typename _CharT> +class ctype2 : public __ctype_abstract_base<_CharT> +{ + typedef mask mask; // { dg-error "does not name a type" "no type" } + // { dg-message "note" "note" { target *-*-* } 24 } +}; diff --git a/gcc/testsuite/g++.dg/template/typename3.C b/gcc/testsuite/g++.dg/template/typename3.C new file mode 100644 index 000000000..0ad9a2a0c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename3.C @@ -0,0 +1,7 @@ +// { dg-do compile } +// crash test - PR 7266 + +template <class A> +struct B { + typedef A::C::D E; // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/template/typename4.C b/gcc/testsuite/g++.dg/template/typename4.C new file mode 100644 index 000000000..18cdd1aba --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename4.C @@ -0,0 +1,3 @@ +struct B { template <typename U> struct C; }; +template <typename T> struct A { typedef typename T::C V; }; // { dg-error "not a type" } +void f () { A<B>::V p; } // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/template/typename5.C b/gcc/testsuite/g++.dg/template/typename5.C new file mode 100644 index 000000000..2f72b5f86 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename5.C @@ -0,0 +1,19 @@ +// { dg-do compile } + +// Origin: ariels@compugen.co.il + +// PR c++/2513: typename handling when scope is dependent as +// described in DR108. + +template <bool flag> struct Select { + typedef int Result; +}; + +template <template<class> class Pred> struct FindType { + typedef typename Select<true>::Result Result; +}; + +template <int bits> struct Int { + template<typename T> struct RightSize {}; + typedef typename FindType<RightSize>::Result type; +}; diff --git a/gcc/testsuite/g++.dg/template/typename6.C b/gcc/testsuite/g++.dg/template/typename6.C new file mode 100644 index 000000000..937ea96aa --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename6.C @@ -0,0 +1,11 @@ +struct O { + template <typename T> + struct I { + I (int); + }; +}; + +template <typename T> +void f() { + typename ::O::I<int>(3); +} diff --git a/gcc/testsuite/g++.dg/template/typename7.C b/gcc/testsuite/g++.dg/template/typename7.C new file mode 100644 index 000000000..d9c8f2609 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename7.C @@ -0,0 +1,19 @@ +// PR c++/17501 + +template<int> struct A; + +template<> struct A<0> +{ + struct B + { + struct C + { + typedef int D; + }; + }; +}; + +template<int I> struct E +{ + typename A<I>::B::C::D i; +}; diff --git a/gcc/testsuite/g++.dg/template/typename8.C b/gcc/testsuite/g++.dg/template/typename8.C new file mode 100644 index 000000000..85f585d94 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename8.C @@ -0,0 +1,10 @@ +// PR c++/18738 + +namespace foo { + typedef int my_type; +} + +template<typename T> +struct A { + typename foo::my_type bar(); +}; diff --git a/gcc/testsuite/g++.dg/template/typename9.C b/gcc/testsuite/g++.dg/template/typename9.C new file mode 100644 index 000000000..5f6fb96bc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typename9.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 14 Dec 2004 <nathan@codesourcery.com> + +// PR 18981. ICE +// Origin: Andreas Schwab <schwab@suse.de> + +template <class T> +struct tree { + struct iterator; + struct sibling_iterator { + friend struct tree<T>::iterator; + }; +}; diff --git a/gcc/testsuite/g++.dg/template/unify1.C b/gcc/testsuite/g++.dg/template/unify1.C new file mode 100644 index 000000000..2f0a18cf4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/unify1.C @@ -0,0 +1,26 @@ +// Test non-type template argument folding. +// Origin: smacdonald@seimac.com + +// { dg-do compile } + +template < int I1, int I2 > +class unit +{ +public: + unit() {} + unit( const unit<I1,I2>& ) {} + + template< int Q1, int Q2 > + unit< I1 - Q1, I2 - Q2 > operator / ( const unit< Q1, Q2 >& rhs ) const { + return unit< I1 - Q1, I2 - Q2 >(); + } + +}; + +int main() +{ + const unit<1,0> u1; + const unit<2,0> u2; + + unit<-1,0> u3( u1 / u2 ); +} diff --git a/gcc/testsuite/g++.dg/template/unify10.C b/gcc/testsuite/g++.dg/template/unify10.C new file mode 100644 index 000000000..8dc434b75 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/unify10.C @@ -0,0 +1,60 @@ +// { dg-do compile } +// Origin: Wolfgang Bangerth <bangerth at ticam dot utexas dot edu> +// and Rene Fonseca <fonseca at mip dot sdu dot dk> +// PR c++/8271: Check cv-qualifiers while unifying pointer to member +// functions. + +struct MyClass { + void mMethod() throw() {} + void cMethod() const throw() {} + void vMethod() volatile throw() {} + void cvMethod() const volatile throw() {} +}; + +template<class CLASS> +void mFunction(void (CLASS::* method)()) {} // { dg-message "note" } + +template<class CLASS> +void cFunction(void (CLASS::* method)() const) {} // { dg-message "note" } + +template<class CLASS> +void vFunction(void (CLASS::* method)() volatile) {} // { dg-message "note" } + +template<class CLASS> +void cvFunction(void (CLASS::* method)() const volatile) {} // { dg-message "note" } + +int main() { + mFunction(&MyClass::mMethod); + mFunction(&MyClass::cMethod); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 28 } + mFunction(&MyClass::vMethod); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 30 } + mFunction(&MyClass::cvMethod); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 32 } + + cFunction(&MyClass::mMethod); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 35 } + cFunction(&MyClass::cMethod); + cFunction(&MyClass::vMethod); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 38 } + cFunction(&MyClass::cvMethod); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 40 } + + vFunction(&MyClass::mMethod); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 43 } + vFunction(&MyClass::cMethod); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 45 } + vFunction(&MyClass::vMethod); + vFunction(&MyClass::cvMethod); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 48 } + + cvFunction(&MyClass::mMethod); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 51 } + cvFunction(&MyClass::cMethod); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 53 } + cvFunction(&MyClass::vMethod); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 55 } + cvFunction(&MyClass::cvMethod); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/unify11.C b/gcc/testsuite/g++.dg/template/unify11.C new file mode 100644 index 000000000..ed6b31c31 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/unify11.C @@ -0,0 +1,37 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin: PR c++/40684 +// { dg-options "-std=c++0x" } + +struct A +{ +}; + +template <typename S, typename T, typename U, typename S::v = &S::v::s> +typename S::A +foo (S c, T t, U u) // { dg-message "note" } +{ +} + +struct B +{ + struct C + { + template <typename U> + C (U t) + { + A a; + A b = foo (this, a, t); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 23 } + } + } c; + B () : c (A ()) + { + } +}; + +int +main () +{ + B f; +} + diff --git a/gcc/testsuite/g++.dg/template/unify2.C b/gcc/testsuite/g++.dg/template/unify2.C new file mode 100644 index 000000000..e5e6d1904 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/unify2.C @@ -0,0 +1,13 @@ +// { dg-do compile } + +template<int I> void f1 (char [][I+1]) {} +template<int I> void f2 (char [][I+0]) {} +template<int I> void f3 (char [][I]) {} +template<int I> void f4 (char [][I-0]) {} +template<int I> void f5 (char [][I-1]) {} + +template void f1 (char [][6]); // { dg-error "does not match" } +template void f2 (char [][6]); // { dg-error "does not match" } +template void f3 (char [][6]); +template void f4 (char [][6]); // { dg-error "does not match" } +template void f5 (char [][6]); // { dg-error "does not match" } diff --git a/gcc/testsuite/g++.dg/template/unify3.C b/gcc/testsuite/g++.dg/template/unify3.C new file mode 100644 index 000000000..190a0cb95 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/unify3.C @@ -0,0 +1,11 @@ +// Test unifying SCOPE_REF. +// Origin: Marc Duflot <m.duflot@ulg.ac.be> +// { dg-do compile } + +template <int n> class A {}; +template <int m> class R {}; + +template <int n> struct Trait { enum {m = n}; }; + +template <int n> R<Trait<n>::m> f(A<n>); +template <> R<1> f(A<1>) {return R<1>();} diff --git a/gcc/testsuite/g++.dg/template/unify4.C b/gcc/testsuite/g++.dg/template/unify4.C new file mode 100644 index 000000000..19d9f3a9f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/unify4.C @@ -0,0 +1,18 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 28 Jan 2003 <nathan@codesourcery.com> + +// PR 9437. We'd unify 'T *' with 'U C::*', which is obviously broken + +struct X +{ + template <typename T> + operator T* () const { return static_cast<T*> (0); } +} null; + +struct A { int i; }; + +static void f (int A::* pmi) { } + +int main () { f (null); } // { dg-error "cannot convert" "" } diff --git a/gcc/testsuite/g++.dg/template/unify5.C b/gcc/testsuite/g++.dg/template/unify5.C new file mode 100644 index 000000000..6928f1f84 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/unify5.C @@ -0,0 +1,10 @@ + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 1 Apr 2004 <nathan@codesourcery.com> +// Origin:Matt Austern <austern@apple.com> + +// PR:c++/14007 + +template <typename T> struct X {}; // #1 +template <typename T> struct X<const T>; //#2 +template struct X<int&>; //#3 diff --git a/gcc/testsuite/g++.dg/template/unify6.C b/gcc/testsuite/g++.dg/template/unify6.C new file mode 100644 index 000000000..b12ecb29b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/unify6.C @@ -0,0 +1,23 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 1 Apr 2004 <nathan@codesourcery.com> + +void Baz (); + +template <typename T> void Foo1 (T *); // #1 +template <typename T> void Foo1 (T const *a) {a (1);} // #2 + +template <typename T> T const *Foo2 (T *); + +template <typename T> void Foo3 (T *, T const * = 0); // { dg-message "note" } + +void Bar () +{ + Foo1 (&Baz); // #1 + + Foo2 (&Baz); + + Foo3 (&Baz); + + Foo3 (&Baz, &Baz); // { dg-error "no matching function" "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 21 } +} diff --git a/gcc/testsuite/g++.dg/template/unify7.C b/gcc/testsuite/g++.dg/template/unify7.C new file mode 100644 index 000000000..2bfa56303 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/unify7.C @@ -0,0 +1,15 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 1 Apr 2004 <nathan@codesourcery.com> + +// PR c++/3518 +template <typename T> void Foo (const T &); +template <typename T> void Baz (const T (*)()); // { dg-message "note" } + +int &f (); + +int main() +{ + Foo (f); + Baz (f); // { dg-error "no matching function" "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 13 } +} diff --git a/gcc/testsuite/g++.dg/template/unify8.C b/gcc/testsuite/g++.dg/template/unify8.C new file mode 100644 index 000000000..9caf085f6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/unify8.C @@ -0,0 +1,20 @@ +// { dg-do link } + +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 7 Jul 2005 <nathan@codesourcery.com> + +// Origin:Wolfgang Bangerth <bangerth@dealii.org> +// PR 21799: deduction of cvqualifiers on member functions was wrong + +template <class T> void f (T &, void (T::*)() ); +template <class T> void f (const T &, void (T::*)() const) {} + +struct X { + void g() const {} +}; + +const X *x; + +int main () { + f (*x, &X::g); +} diff --git a/gcc/testsuite/g++.dg/template/unify9.C b/gcc/testsuite/g++.dg/template/unify9.C new file mode 100644 index 000000000..40f6b9271 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/unify9.C @@ -0,0 +1,18 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 7 Jul 2005 <nathan@codesourcery.com> + +// Origin:Wolfgang Bangerth <bangerth@dealii.org> +// PR 21799: deduction of cvqualifiers on member functions was wrong + +template <class T> void f (T &, void (T::*)() ); // { dg-message "note" } + +struct X { + void g() const {} +}; + +const X *x; + +int main () { + f (*x, &X::g); // { dg-error "no matching function" } + // { dg-message "candidate" "candidate note" { target *-*-* } 16 } +} diff --git a/gcc/testsuite/g++.dg/template/union1.C b/gcc/testsuite/g++.dg/template/union1.C new file mode 100644 index 000000000..9019c38a2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/union1.C @@ -0,0 +1,29 @@ +// { dg-do run } + +extern "C" void abort (); + +void g (char c) +{ + if (c != 'a') + abort (); +} + +void h (int i) +{ + if (i != 3) + abort (); +} + +template <typename T> void f(T const &t) +{ + union { char c; T t_; }; + + c = 'a'; + g (c); + t_ = 3; + h (t_); +} + +int main () { + f (3); +} diff --git a/gcc/testsuite/g++.dg/template/union2.C b/gcc/testsuite/g++.dg/template/union2.C new file mode 100644 index 000000000..25f1e086f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/union2.C @@ -0,0 +1,12 @@ +/* PR c++/40557 */ +/* { dg-do compile } */ + +struct A +{ + typedef int X; +}; + +template<int> union B +{ + A::X x; +}; diff --git a/gcc/testsuite/g++.dg/template/using1.C b/gcc/testsuite/g++.dg/template/using1.C new file mode 100644 index 000000000..e4d4a004e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using1.C @@ -0,0 +1,42 @@ +// { dg-do run } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 22 Jul 2003 <nathan@codesourcery.com> + +// PR 9447. Using decls in template classes. + +template <class T> +struct Foo { + int i; +}; + +struct Baz +{ + int j; +}; + +template <class T> +struct Bar : public Foo<T>, Baz { + using Foo<T>::i; + using Baz::j; + + int foo () { return i; } + int baz () { return j; } +}; + +int main() +{ + Bar<int> bar; + + bar.i = 1; + bar.j = 2; + + if (bar.foo() != 1) + return 1; + + if (bar.baz() != 2) + return 1; + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/template/using10.C b/gcc/testsuite/g++.dg/template/using10.C new file mode 100644 index 000000000..8f0cbda2a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using10.C @@ -0,0 +1,11 @@ +// PR c++/22136 + +struct B { + void foo(); +}; + +template <typename T> class I : public B {}; + +template <typename T> class D : private I<T> { + I<T>::B::foo; +}; diff --git a/gcc/testsuite/g++.dg/template/using11.C b/gcc/testsuite/g++.dg/template/using11.C new file mode 100644 index 000000000..21cc5d2ef --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using11.C @@ -0,0 +1,8 @@ +struct X { + void f(); +}; + +template <typename T> +struct S : public T { + using X::f; +}; diff --git a/gcc/testsuite/g++.dg/template/using12.C b/gcc/testsuite/g++.dg/template/using12.C new file mode 100644 index 000000000..cebfab1ee --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using12.C @@ -0,0 +1,7 @@ +struct A { +}; + +template <typename T> +struct S : public A { + using A::operator(); // { dg-error "no member" } +}; diff --git a/gcc/testsuite/g++.dg/template/using13.C b/gcc/testsuite/g++.dg/template/using13.C new file mode 100644 index 000000000..3f86ede37 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using13.C @@ -0,0 +1,11 @@ +//PR c++/28051 + +template<int> struct A {}; + +template<int N> struct B : A<N> +{ + using A<N>::operator typename A<N>::X; // { dg-error "no type named" } +}; + +B<0> b; + diff --git a/gcc/testsuite/g++.dg/template/using14.C b/gcc/testsuite/g++.dg/template/using14.C new file mode 100644 index 000000000..ebb4e090a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using14.C @@ -0,0 +1,21 @@ +// PR c++/26102 + +template <class T> struct B1 { int i(); }; + +struct B2 { int i(); }; + +template <class T> struct C : public B1<T>, public B2 +{ + using B2::i; + void f() + { + i(); // should be accepted + i.i(); // { dg-error "member" } + } +}; + +int main() +{ + C<int> c; + c.f(); // { dg-message "instantiated" } +} diff --git a/gcc/testsuite/g++.dg/template/using15.C b/gcc/testsuite/g++.dg/template/using15.C new file mode 100644 index 000000000..b158ac09c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using15.C @@ -0,0 +1,25 @@ +// Reduced from the testcase for c++/29433 + +template <class T> +struct A: T +{ + void f(typename T::type); + using T::f; + void g() { f(1); } +}; + +template <class T> +struct B: T +{ typedef int type; }; + +struct C +{ + typedef double type; + void f(); +}; + +int main() +{ + A<B<A<C> > > a; + a.g(); +} diff --git a/gcc/testsuite/g++.dg/template/using2.C b/gcc/testsuite/g++.dg/template/using2.C new file mode 100644 index 000000000..5d21f575b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using2.C @@ -0,0 +1,30 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 22 Jul 2003 <nathan@codesourcery.com> + +// PR 9447. Using decls in template classes. + +template <class T> +struct Foo { + int i; // { dg-error "Foo" } +}; + +struct Baz +{ + int i; // { dg-error "Baz" } +}; + +template <class T> +struct Bar : public Foo<T>, Baz { + using Foo<T>::i; + using Baz::i; + + int foo () { return i; } // { dg-error "request for member" } +}; + +void foo (Bar<int> &bar) +{ + bar.foo(); // { dg-message "instantiated" } +} + diff --git a/gcc/testsuite/g++.dg/template/using3.C b/gcc/testsuite/g++.dg/template/using3.C new file mode 100644 index 000000000..11f2899c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using3.C @@ -0,0 +1,42 @@ +// { dg-do run } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 22 Jul 2003 <nathan@codesourcery.com> + +// PR 9447. Using decls in template classes. + +template <class T> +struct Foo { + int i (int) {return 1;} +}; + +struct Baz +{ + int k (int) {return 2;} +}; + +template <class T> +struct Bar : public Foo<T> , Baz { + using Foo<T>::i; + using Baz::k; + + int i (float) {return 3;} + int k (float) {return 3;} + + int foo() + { + if (i (1) != 1) + return 1; + if (k (1) != 2) + return 2; + + return 0; + } +}; + +int main() +{ + Bar<int> bar; + + return bar.foo(); +} diff --git a/gcc/testsuite/g++.dg/template/using4.C b/gcc/testsuite/g++.dg/template/using4.C new file mode 100644 index 000000000..8c46da464 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using4.C @@ -0,0 +1,39 @@ +// { dg-do run } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 22 Jul 2003 <nathan@codesourcery.com> + +// PR 9447. Using decls in template classes. + +template <class T> +struct Foo { + int k (float) {return 1;} +}; + +struct Baz +{ + int k (int) {return 2;} +}; + +template <class T> +struct Bar : public Foo<T> , Baz { + using Foo<T>::k; + using Baz::k; + + int foo() + { + if (k (1.0f) != 1) + return 1; + if (k (1) != 2) + return 2; + + return 0; + } +}; + +int main() +{ + Bar<int> bar; + + return bar.foo(); +} diff --git a/gcc/testsuite/g++.dg/template/using5.C b/gcc/testsuite/g++.dg/template/using5.C new file mode 100644 index 000000000..096ddc0b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using5.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 31 Jul 2003 <nathan@codesourcery.com> + +// PR 9447. further test cases for dependent using decl + +template <typename T> struct Base; + +template <typename T> struct Derived : public Base<T> { + using Base<T>::i; + + Derived() { i; } + + int get_i() { return i.f(); } + +}; diff --git a/gcc/testsuite/g++.dg/template/using6.C b/gcc/testsuite/g++.dg/template/using6.C new file mode 100644 index 000000000..ee8d5be96 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using6.C @@ -0,0 +1,14 @@ +namespace foo { + template<typename T> + struct A {}; +} + +namespace bar { + template<typename T> + struct A {}; +} + +namespace foo { + using bar::A; // { dg-error "" } +} + diff --git a/gcc/testsuite/g++.dg/template/using7.C b/gcc/testsuite/g++.dg/template/using7.C new file mode 100644 index 000000000..390dfbaac --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using7.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 1 Aug 2003 <nathan@codesourcery.com> + +// PR 9447. Using decls in reopened template classes. + +template <typename> struct A { int i; }; + +template <typename T> struct B : public A<T> +{ + using A<T>::i; + int foo() const; +}; + +struct C {}; + +template <typename T> int B<T>::foo() const +{ + return i; +} diff --git a/gcc/testsuite/g++.dg/template/using8.C b/gcc/testsuite/g++.dg/template/using8.C new file mode 100644 index 000000000..a79158710 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using8.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Origin: Sergey Shandar <comer@pisem.net> + +// PR c++/9810: Access checking for member function template +// appeared in using declaration. + +struct A +{ + template<class R> void F(R) {} +}; + +struct B: private A +{ + using A::F; +}; + +int main() +{ + B b; + b.F(3); +} diff --git a/gcc/testsuite/g++.dg/template/using9.C b/gcc/testsuite/g++.dg/template/using9.C new file mode 100644 index 000000000..ac5194509 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using9.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +// Origin: stefaandr@hotmail.com + +// PR c++/17154: Using declaration in partial class template specialization. + +template <int numrows, class T> struct A { void test_A() {} }; +template <int numrows, class T> struct B {}; +template <class T> struct B <3, T> : public A <3, T> { + using A <3, T>::test_A; + void test_B_spec() { test_A(); } +}; diff --git a/gcc/testsuite/g++.dg/template/varmod1.C b/gcc/testsuite/g++.dg/template/varmod1.C new file mode 100644 index 000000000..6ae78d900 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/varmod1.C @@ -0,0 +1,11 @@ +// { dg-options "-w" } + +template<typename T> void foo(T); // { dg-message "note" } + +void bar() +{ + int i; + int A[i][i]; + foo(A); // { dg-error "" } + // { dg-message "candidate" "candidate note" { target *-*-* } 9 } +} diff --git a/gcc/testsuite/g++.dg/template/vla1.C b/gcc/testsuite/g++.dg/template/vla1.C new file mode 100644 index 000000000..fe93440f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/vla1.C @@ -0,0 +1,9 @@ +// PR c++/29226 +// { dg-options "" } + +template <bool> +static int label (int w) +{ + sizeof(int[w]); +} +int a = label<false>(1); diff --git a/gcc/testsuite/g++.dg/template/vla2.C b/gcc/testsuite/g++.dg/template/vla2.C new file mode 100644 index 000000000..183f8fadc --- /dev/null +++ b/gcc/testsuite/g++.dg/template/vla2.C @@ -0,0 +1,20 @@ +// PR c++/28879 +// { dg-do compile } +// { dg-options "" } + +struct A +{ + static int i; + int j; +}; + +template<int> void foo () +{ + int x[A::i]; +//int y[A().j]; +} + +void bar () +{ + foo<6> (); +} diff --git a/gcc/testsuite/g++.dg/template/void1.C b/gcc/testsuite/g++.dg/template/void1.C new file mode 100644 index 000000000..732e9d06e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/void1.C @@ -0,0 +1,4 @@ +// PR c++/27430 +// { dg-do compile } + +template<void[]> struct A; // { dg-error "array of void" } diff --git a/gcc/testsuite/g++.dg/template/void10.C b/gcc/testsuite/g++.dg/template/void10.C new file mode 100644 index 000000000..4904a281a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/void10.C @@ -0,0 +1,10 @@ +//PR c++/28736 + +template<void> struct A // { dg-error "not a valid type" } +{ + template<typename> friend struct B; +}; + +template<typename> struct B {}; + +B<int> b; diff --git a/gcc/testsuite/g++.dg/template/void11.C b/gcc/testsuite/g++.dg/template/void11.C new file mode 100644 index 000000000..1aad7a157 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/void11.C @@ -0,0 +1,12 @@ +// PR c++/31446 + +template<void> struct A // { dg-error "valid type" } + +{ + template<int> friend void foo(); +}; + +void bar() +{ + foo<0>(); // { dg-error "not declared|primary-expression" } +} diff --git a/gcc/testsuite/g++.dg/template/void12.C b/gcc/testsuite/g++.dg/template/void12.C new file mode 100644 index 000000000..1d064b63e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/void12.C @@ -0,0 +1,7 @@ +// PR c++/28639 + +template<void> struct A // { dg-error "not a valid type" } +{ + static const int i = 1; + char a[i]; +}; diff --git a/gcc/testsuite/g++.dg/template/void13.C b/gcc/testsuite/g++.dg/template/void13.C new file mode 100644 index 000000000..3f36735db --- /dev/null +++ b/gcc/testsuite/g++.dg/template/void13.C @@ -0,0 +1,11 @@ +// PR c++/30299 + +struct A +{ + int i; +}; + +template<void> struct B : A // { dg-error "not a valid type" } +{ + B() { this->i; } +}; diff --git a/gcc/testsuite/g++.dg/template/void14.C b/gcc/testsuite/g++.dg/template/void14.C new file mode 100644 index 000000000..7781c6187 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/void14.C @@ -0,0 +1,7 @@ +// PR c++/36411 +// { dg-do compile } + +template<template<void> class> struct A // { dg-error "not a valid type" } +{ + template<template<int> class T> A<T> foo(); // { dg-error "mismatch|expected|invalid" } +}; diff --git a/gcc/testsuite/g++.dg/template/void2.C b/gcc/testsuite/g++.dg/template/void2.C new file mode 100644 index 000000000..eceb36219 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/void2.C @@ -0,0 +1,9 @@ +// PR c++/27496 +// { dg-do compile } + +template<int> struct A +{ + template<void> friend class X; // { dg-error "void|valid type" } +}; + +A<0> a; diff --git a/gcc/testsuite/g++.dg/template/void3.C b/gcc/testsuite/g++.dg/template/void3.C new file mode 100644 index 000000000..bb59934ff --- /dev/null +++ b/gcc/testsuite/g++.dg/template/void3.C @@ -0,0 +1,5 @@ +//PR c++/28637 + +template<void> struct A {}; // { dg-error "not a valid type" } +A<0> a; // { dg-error "type" } + diff --git a/gcc/testsuite/g++.dg/template/void4.C b/gcc/testsuite/g++.dg/template/void4.C new file mode 100644 index 000000000..fe30b2e37 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/void4.C @@ -0,0 +1,7 @@ +//PR c++/28638 + +template<void> struct A; // { dg-error "not a valid type" } + +template<template<int> class> struct B {}; + +B<A> b; // { dg-error "template|invalid type" } diff --git a/gcc/testsuite/g++.dg/template/void5.C b/gcc/testsuite/g++.dg/template/void5.C new file mode 100644 index 000000000..bef9b91f6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/void5.C @@ -0,0 +1,5 @@ +//PR c++/28640 + +template<void> struct A; // { dg-error "not a valid type" } +template<int> struct A; + diff --git a/gcc/testsuite/g++.dg/template/void6.C b/gcc/testsuite/g++.dg/template/void6.C new file mode 100644 index 000000000..2d5f7ead1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/void6.C @@ -0,0 +1,3 @@ +//PR c++/28594 + +template<void, int> struct A; // { dg-error "not a valid type" } diff --git a/gcc/testsuite/g++.dg/template/void7.C b/gcc/testsuite/g++.dg/template/void7.C new file mode 100644 index 000000000..95d87a207 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/void7.C @@ -0,0 +1,8 @@ +//PR c++/28741 + +template<void> struct A // { dg-error "not a valid type" } +{ + static int i; +}; + +A<0> a; // { dg-error "invalid type|not a valid type" } diff --git a/gcc/testsuite/g++.dg/template/void8.C b/gcc/testsuite/g++.dg/template/void8.C new file mode 100644 index 000000000..e45c91c04 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/void8.C @@ -0,0 +1,7 @@ +//PR c++/28737 + +template<void> struct A; // { dg-error "not a valid type" } + +template<typename> struct B; + +template<void N> struct B<A<N> > {}; // { dg-error "not a valid type|declared|invalid" } diff --git a/gcc/testsuite/g++.dg/template/void9.C b/gcc/testsuite/g++.dg/template/void9.C new file mode 100644 index 000000000..bb2ed66ff --- /dev/null +++ b/gcc/testsuite/g++.dg/template/void9.C @@ -0,0 +1,4 @@ +//PR c++/28738 + +template<int,void> struct A {}; // { dg-error "not a valid type" } +template<int N> struct A<N,0> {}; // { dg-error "not a valid type" } diff --git a/gcc/testsuite/g++.dg/template/vtable1.C b/gcc/testsuite/g++.dg/template/vtable1.C new file mode 100644 index 000000000..c5f122adb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/vtable1.C @@ -0,0 +1,23 @@ +// Test that vtables are set up properly for constructors and destructors +// of template classes. + +// { dg-do run } + +int r; + +template <class T> +struct A { + virtual void f () { } + A() { f (); } + ~A() { f (); } +}; + +struct B : public A<int> { + virtual void f () { ++r; } +}; + +int main () +{ + { B b; } + return r; +} diff --git a/gcc/testsuite/g++.dg/template/vtable2.C b/gcc/testsuite/g++.dg/template/vtable2.C new file mode 100644 index 000000000..3bcc1ac3f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/vtable2.C @@ -0,0 +1,18 @@ +// Use a small template instantiation depth to speed up testing +// { dg-options "-ftemplate-depth-5" } +// { dg-do compile } + +// Origin: rullo.pat@tiscalinet.it +// Nathanael Nerode <neroden@gcc.gnu.org> +// Wolfgang Bangerth <bangerth@dealii.org> + +// PR c++/6749: Infinite loop generating vtable. + +template <class T> struct inner {}; + +template <class T> struct parent { + virtual void f() // { dg-error "instantiation depth" } + { parent<inner<T> > p; }; +}; + +template struct parent<int>; diff --git a/gcc/testsuite/g++.dg/template/warn1.C b/gcc/testsuite/g++.dg/template/warn1.C new file mode 100644 index 000000000..2b804f7ca --- /dev/null +++ b/gcc/testsuite/g++.dg/template/warn1.C @@ -0,0 +1,36 @@ +// { dg-do compile } +// { dg-options "-Wall" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 14 Aug 2003 <nathan@codesourcery.com> + +// PR 11512. erroneous warnings + +template <class T> void Foo(T i) +{ + i++, i++; + i, i++; // { dg-warning "left operand" "" } + i++, i; // { dg-warning "right operand" "" } + for (;; --i, ++i) + ; +} + +void Bar () +{ + Foo (1); // { dg-message "instantiated" } +} + +struct M {}; + +struct C +{ + M m; + C () :m (M ()) {} +}; + + +void Baz (int i) +{ + i ? i + 1 : i + 2; // { dg-warning "operand of" } + i ? i++ : 0; +} diff --git a/gcc/testsuite/g++.dg/template/wrap1.C b/gcc/testsuite/g++.dg/template/wrap1.C new file mode 100644 index 000000000..72f687efd --- /dev/null +++ b/gcc/testsuite/g++.dg/template/wrap1.C @@ -0,0 +1,27 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Michael Matz 03 Mar 2002 <matz@suse.de> +// instance of an actual pattern in 252.eon from SPEC2000 + +// The last Wrapper<char> once wasn't completed when applying '='. + +template <class T> +class Wrapper { + public: + Wrapper (T& a); + Wrapper (const Wrapper<char>& ref); +}; + +template <class T> +class Element { +public: + T * operator[](int x); +}; + +void test() +{ + char bla = 42; + Element< Wrapper <unsigned char> > elem; + elem[1][1] = Wrapper<char> (bla); +} diff --git a/gcc/testsuite/g++.dg/tls/diag-1.C b/gcc/testsuite/g++.dg/tls/diag-1.C new file mode 100644 index 000000000..af538719d --- /dev/null +++ b/gcc/testsuite/g++.dg/tls/diag-1.C @@ -0,0 +1,31 @@ +// Valid __thread specifiers. +// { dg-require-effective-target tls } + +__thread int g1; +extern __thread int g2; +static __thread int g3; + +void foo() +{ + extern __thread int l1; + static __thread int l2; +} + +struct A { + static __thread int i; +}; + +__thread int A::i = 42; + +template <typename T> struct B { + static __thread T t; +}; + +template <typename T> +__thread T B<T>::t = 42; + +void bar () +{ + int j = B<int>::t; + int k = B<const int>::t; +} diff --git a/gcc/testsuite/g++.dg/tls/diag-2.C b/gcc/testsuite/g++.dg/tls/diag-2.C new file mode 100644 index 000000000..484b18845 --- /dev/null +++ b/gcc/testsuite/g++.dg/tls/diag-2.C @@ -0,0 +1,26 @@ +/* Invalid __thread specifiers. */ +/* { dg-require-effective-target tls } */ + +__thread extern int g1; /* { dg-error "'__thread' before 'extern'" } */ +__thread static int g2; /* { dg-error "'__thread' before 'static'" } */ +__thread __thread int g3; /* { dg-error "duplicate '__thread'" } */ +typedef __thread int g4; /* { dg-error "multiple storage classes" } */ + +void foo() +{ + __thread int l1; /* { dg-error "implicitly auto and declared '__thread'" } */ + auto __thread int l2; /* { dg-error "multiple storage classes" } */ + __thread extern int l3; /* { dg-error "'__thread' before 'extern'" } */ + register __thread int l4; /* { dg-error "multiple storage classes" } */ +} + +__thread void f1 (); /* { dg-error "invalid for function" } */ +extern __thread void f2 (); /* { dg-error "invalid for function" } */ +static __thread void f3 (); /* { dg-error "invalid for function" } */ +__thread void f4 () { } /* { dg-error "invalid for function" } */ + +void bar(__thread int p1); /* { dg-error "(invalid in parameter)|(specified for parameter)" } */ + +struct A { + __thread int i; /* { dg-error "storage class specified" } */ +}; diff --git a/gcc/testsuite/g++.dg/tls/diag-3.C b/gcc/testsuite/g++.dg/tls/diag-3.C new file mode 100644 index 000000000..ea5158b89 --- /dev/null +++ b/gcc/testsuite/g++.dg/tls/diag-3.C @@ -0,0 +1,11 @@ +// Report invalid extern and __thread combinations. +// { dg-require-effective-target tls } + +extern int j; // { dg-error "previously declared here" } +__thread int j; // { dg-error "follows non-thread-local" } + +extern __thread int i; // { dg-error "previously declared here" } +int i; // { dg-error "follows thread-local" } + +extern __thread int k; // This is fine. +__thread int k; diff --git a/gcc/testsuite/g++.dg/tls/diag-4.C b/gcc/testsuite/g++.dg/tls/diag-4.C new file mode 100644 index 000000000..55e985e92 --- /dev/null +++ b/gcc/testsuite/g++.dg/tls/diag-4.C @@ -0,0 +1,10 @@ +/* Invalid __thread specifiers. */ +/* { dg-require-effective-target tls } */ + +__thread typedef int g4; /* { dg-error "multiple storage classes" } */ + +void foo() +{ + __thread auto int l2; /* { dg-error "multiple storage classes" } */ + __thread register int l4; /* { dg-error "multiple storage classes" } */ +} diff --git a/gcc/testsuite/g++.dg/tls/diag-5.C b/gcc/testsuite/g++.dg/tls/diag-5.C new file mode 100644 index 000000000..ca92b3074 --- /dev/null +++ b/gcc/testsuite/g++.dg/tls/diag-5.C @@ -0,0 +1,5 @@ +// PR c++/30536 +// Invalid __thread specifiers. +// { dg-require-effective-target tls } + +struct A { __thread register int i; }; // { dg-error "multiple storage classes|storage class specified" } diff --git a/gcc/testsuite/g++.dg/tls/init-1.C b/gcc/testsuite/g++.dg/tls/init-1.C new file mode 100644 index 000000000..97867123a --- /dev/null +++ b/gcc/testsuite/g++.dg/tls/init-1.C @@ -0,0 +1,14 @@ +/* Valid initializations. */ +/* { dg-require-effective-target tls } */ + +__thread int i = 42; + +static int j; +__thread int *p = &j; + +/* Note that this is valid in C++ (unlike C) as a run-time initialization. */ +int *q = &i; + +/* Valid because "const int k" is an integral constant expression in C++. */ +__thread const int k = 42; +__thread const int l = k; diff --git a/gcc/testsuite/g++.dg/tls/init-2.C b/gcc/testsuite/g++.dg/tls/init-2.C new file mode 100644 index 000000000..c9f646d3a --- /dev/null +++ b/gcc/testsuite/g++.dg/tls/init-2.C @@ -0,0 +1,14 @@ +/* Invalid initializations. */ +/* { dg-require-effective-target tls } */ + +extern __thread int i; +__thread int *p = &i; /* { dg-error "dynamically initialized" } */ + +extern int f(); +__thread int j = f(); /* { dg-error "dynamically initialized" } */ + +struct S +{ + S(); +}; +__thread S s; /* { dg-error "" } two errors here */ diff --git a/gcc/testsuite/g++.dg/tls/static-1.C b/gcc/testsuite/g++.dg/tls/static-1.C new file mode 100644 index 000000000..506b0fcf7 --- /dev/null +++ b/gcc/testsuite/g++.dg/tls/static-1.C @@ -0,0 +1,30 @@ +// { dg-do run } +// { dg-options "-O2" } +// { dg-require-effective-target tls_runtime } +// { dg-add-options tls } +// { dg-additional-sources "static-1a.cc" } + +extern "C" void abort (); +extern int test (); + +struct A +{ + static __thread int i; +}; + +__thread int A::i = 8; + +int +main () +{ + if (A::i != 8) + abort (); + + if (test ()) + abort (); + + if (A::i != 17) + abort (); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/tls/static-1a.cc b/gcc/testsuite/g++.dg/tls/static-1a.cc new file mode 100644 index 000000000..1c6109f86 --- /dev/null +++ b/gcc/testsuite/g++.dg/tls/static-1a.cc @@ -0,0 +1,20 @@ +// { dg-do run } +// { dg-options "-O2" } +// { dg-require-effective-target tls_runtime } +// { dg-add-options tls } +// { dg-additional-sources "static-1a.cc" } + +struct A +{ + static __thread int i; +}; + +int +test () +{ + if (A::i != 8) + return 1; + + A::i = 17; + return 0; +} diff --git a/gcc/testsuite/g++.dg/tls/tls.exp b/gcc/testsuite/g++.dg/tls/tls.exp new file mode 100644 index 000000000..6450ea34f --- /dev/null +++ b/gcc/testsuite/g++.dg/tls/tls.exp @@ -0,0 +1,35 @@ +# Copyright (C) 2002, 2005, 2007 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# GCC testsuite that uses the `dg.exp' driver. + +# Load support procs. +load_lib g++-dg.exp + +# If a testcase doesn't have special options, use these. +global DEFAULT_CXXFLAGS +if ![info exists DEFAULT_CXXFLAGS] then { + set DEFAULT_CXXFLAGS " -ansi -pedantic-errors -Wno-long-long" +} + +# Initialize `dg'. +dg-init + +# Main loop. +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C]] "" $DEFAULT_CXXFLAGS + +# All done. +dg-finish diff --git a/gcc/testsuite/g++.dg/tls/trivial.C b/gcc/testsuite/g++.dg/tls/trivial.C new file mode 100644 index 000000000..e2b8f45b8 --- /dev/null +++ b/gcc/testsuite/g++.dg/tls/trivial.C @@ -0,0 +1,3 @@ +// { dg-require-effective-target tls } + +__thread int i; diff --git a/gcc/testsuite/g++.dg/torture/20070621-1.C b/gcc/testsuite/g++.dg/torture/20070621-1.C new file mode 100644 index 000000000..185314a47 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/20070621-1.C @@ -0,0 +1,116 @@ +/* Reduced from libstdc++-v3/testsuite/25_algorithms/equal/1.cc + +1.2.ii: In function 'void test1()': +1.2.ii:104: error: true/false edge after a non-COND_EXPR in bb 15 +1.2.ii:104: internal compiler error: verify_flow_info failed + +*/ + +__extension__ typedef __PTRDIFF_TYPE__ ptrdiff_t; +namespace std __attribute__ ((__visibility__ ("default"))) { + template<typename, typename> struct __are_same { + enum { + __value = 0 }; + }; + template<typename _Tp> struct __is_integer { + enum { + __value = 0 }; + }; + template<typename _Tp> struct __is_pointer { + enum { + __value = 0 }; + }; + template<typename _Tp> struct __is_normal_iterator { + enum { + __value = 0 }; + }; + struct input_iterator_tag { + }; + template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t, typename _Pointer = _Tp*, typename _Reference = _Tp&> struct iterator { + typedef _Tp value_type; + }; + template<typename _Iterator> struct iterator_traits { + typedef typename _Iterator::value_type value_type; + }; + template<typename _Iterator, bool _BoolType = __is_normal_iterator<_Iterator>::__value> struct __niter_base { + static const _Iterator& __b(const _Iterator& __it) { + return __it; + } + }; + template<bool _BoolType> struct __equal { + template<typename _II1, typename _II2> static bool equal(_II1 __first1, _II1 __last1, _II2 __first2) { + for (; + __first1 != __last1; + ++__first1, ++__first2) if (!(*__first1 == *__first2)) return false; + } + }; + template<typename _II1, typename _II2> inline bool __equal_aux(_II1 __first1, _II1 __last1, _II2 __first2) { + typedef typename iterator_traits<_II1>::value_type _ValueType1; + typedef typename iterator_traits<_II2>::value_type _ValueType2; + const bool __simple = (__is_integer<_ValueType1>::__value && __is_pointer<_II1>::__value && __is_pointer<_II2>::__value && __are_same<_ValueType1, _ValueType2>::__value); + return std::__equal<__simple>::equal(__first1, __last1, __first2); + } + template<typename _II1, typename _II2> inline bool equal(_II1 __first1, _II1 __last1, _II2 __first2) { + return std::__equal_aux(__niter_base<_II1>::__b(__first1), __niter_base<_II1>::__b(__last1), __niter_base<_II2>::__b(__first2)); + } + } +extern "C" { + extern void __assert_fail (__const char *__assertion, __const char *__file, unsigned int __line, __const char *__function) throw () __attribute__ ((__noreturn__)); + } +namespace __gnu_test { + template<typename T> struct BoundsContainer { + T* first; + T* last; + BoundsContainer(T* _first, T* _last) : first(_first), last(_last) { + } + }; + template<class T> class input_iterator_wrapper:public std::iterator <std::input_iterator_tag, T, ptrdiff_t, T*, T&> { + public: + typedef BoundsContainer<T> ContainerType; + T* ptr; + ContainerType* SharedInfo; + input_iterator_wrapper(T* _ptr, ContainerType* SharedInfo_in) : ptr(_ptr), SharedInfo(SharedInfo_in) { + } + bool operator==(const input_iterator_wrapper& in) const { + (static_cast<void> (__builtin_expect (!!(SharedInfo != __null && SharedInfo == in.SharedInfo), 1) ? 0 : (__assert_fail ("SharedInfo != __null && SharedInfo == in.SharedInfo", "/abuild/rguenther/gcc/libstdc++-v3/testsuite/util/testsuite_iterators.h", 201, __PRETTY_FUNCTION__), 0))); + (static_cast<void> (__builtin_expect (!!(ptr>=SharedInfo->first && in.ptr>=SharedInfo->first), 1) ? 0 : (__assert_fail ("ptr>=SharedInfo->first && in.ptr>=SharedInfo->first", "/abuild/rguenther/gcc/libstdc++-v3/testsuite/util/testsuite_iterators.h", 202, __PRETTY_FUNCTION__), 0))); + } + bool operator!=(const input_iterator_wrapper& in) const { + return !(*this == in); + } + T& operator*() const { + (static_cast<void> (__builtin_expect (!!(SharedInfo && ptr < SharedInfo->last), 1) ? 0 : (__assert_fail ("SharedInfo && ptr < SharedInfo->last", "/abuild/rguenther/gcc/libstdc++-v3/testsuite/util/testsuite_iterators.h", 215, __PRETTY_FUNCTION__), 0))); + (static_cast<void> (__builtin_expect (!!(ptr >= SharedInfo->first), 1) ? 0 : (__assert_fail ("ptr >= SharedInfo->first", "/abuild/rguenther/gcc/libstdc++-v3/testsuite/util/testsuite_iterators.h", 216, __PRETTY_FUNCTION__), 0))); + } + input_iterator_wrapper& operator++() { + (static_cast<void> (__builtin_expect (!!(SharedInfo && ptr < SharedInfo->last), 1) ? 0 : (__assert_fail ("SharedInfo && ptr < SharedInfo->last", "/abuild/rguenther/gcc/libstdc++-v3/testsuite/util/testsuite_iterators.h", 237, __PRETTY_FUNCTION__), 0))); + ptr++; + SharedInfo->first=ptr; + } + }; + template <class T, template<class T> class ItType> struct test_container { + typename ItType<T>::ContainerType bounds; + test_container(T* _first, T* _last):bounds(_first, _last) { + } + ItType<T> it(T* pos) { + return ItType<T>(pos, &bounds); + } + ItType<T> begin() { + return it(bounds.first); + } + ItType<T> end() { + } + }; + } +using __gnu_test::test_container; +using __gnu_test::input_iterator_wrapper; +typedef test_container<int, input_iterator_wrapper> Container; +int array1[] = { + 0, 1}; +int array2[] = { + 1, 0}; +void test1() { + Container con1(array1, array1); + Container con2(array2, array2); + (static_cast<void> (__builtin_expect (!!(std::equal(con1.begin(), con1.end(), con2.begin())), 1) ? 0 : (__assert_fail ("std::equal(con1.begin(), con1.end(), con2.begin())", "/abuild/rguenther/gcc/libstdc++-v3/testsuite/25_algorithms/equal/1.cc", 35, __PRETTY_FUNCTION__), 0))); + } diff --git a/gcc/testsuite/g++.dg/torture/20080625-1.C b/gcc/testsuite/g++.dg/torture/20080625-1.C new file mode 100644 index 000000000..b18c28226 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/20080625-1.C @@ -0,0 +1,27 @@ +extern "C" { + typedef unsigned char sal_Bool; + typedef struct _rtl_uString { + } rtl_uString; + void rtl_uString_release( rtl_uString * str ) throw (); +} +class OUString { + rtl_uString * pData; +public: + OUString() {} + ~OUString() { + rtl_uString_release( pData ); + } + sal_Bool equalsIgnoreAsciiCase( const OUString & str ) const; +}; +bool findAndRemove(); +long getAttributeProps() +{ + long nAttrs = 0; + OUString aValue; + if (findAndRemove() + && aValue.equalsIgnoreAsciiCase(OUString())) + ; + else + nAttrs |= 1; + return nAttrs; +} diff --git a/gcc/testsuite/g++.dg/torture/20090329-1.C b/gcc/testsuite/g++.dg/torture/20090329-1.C new file mode 100644 index 000000000..0274a1944 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/20090329-1.C @@ -0,0 +1,59 @@ +/* { dg-do compile } */ + +struct input_iterator_tag { }; +template<typename _Category, typename _Tp, typename _Distance = long, typename _Pointer = _Tp*, typename _Reference = _Tp&> +struct iterator { + typedef _Category iterator_category; +}; +template<typename _Iterator> struct iterator_traits { + typedef typename _Iterator::iterator_category iterator_category; +}; +template<typename, typename> struct __lc_rai { + template<typename _II1, typename _II2> + static _II1 __newlast1(_II1, _II1 __last1, _II2, _II2) { + return __last1; + } + template<typename _II> + static bool __cnd2(_II __first, _II __last) { + return __first != __last; + } +}; +template<typename _II1, typename _II2, typename _Compare> +bool lexicographical_compare(_II1 __first1, _II1 __last1, _II2 __first2, + _II2 __last2, _Compare __comp) { + typedef typename iterator_traits<_II1>::iterator_category _Category1; + typedef typename iterator_traits<_II2>::iterator_category _Category2; + typedef __lc_rai<_Category1, _Category2> __rai_type; + __last1 = __rai_type::__newlast1(__first1, __last1, __first2, __last2); + for (; + __first1 != __last1 && __rai_type::__cnd2(__first2, __last2); + ++__first1, ++__first2) { + if (__comp(*__first1, *__first2)) return true; + } +} +void __assert_fail () throw () __attribute__ ((__noreturn__)); +template<typename T> struct BoundsContainer { }; +template<class T> class input_iterator_wrapper : public iterator<input_iterator_tag, T, long, T*, T&> { +public: + typedef BoundsContainer<T> ContainerType; + T* ptr; + ContainerType* SharedInfo; + input_iterator_wrapper(const input_iterator_wrapper& in) : ptr(in.ptr), SharedInfo(in.SharedInfo) { } + bool operator==(const input_iterator_wrapper& in) const { + (static_cast<void> ((SharedInfo != __null + && SharedInfo == in.SharedInfo) + ? 0 : (__assert_fail (), 0))); + } + bool operator!=(const input_iterator_wrapper& in) const { + return !(*this == in); + } + T& operator*() const { } + input_iterator_wrapper& operator++() { } +}; +struct X { }; +bool predicate(const X&, const X&) { + return true; +} +bool test2(input_iterator_wrapper<X>& x) { + return lexicographical_compare(x, x, x, x, predicate); +} diff --git a/gcc/testsuite/g++.dg/torture/20090706-1.C b/gcc/testsuite/g++.dg/torture/20090706-1.C new file mode 100644 index 000000000..43a59f0e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/20090706-1.C @@ -0,0 +1,41 @@ +/* { dg-do compile } */ + +namespace std __attribute__ ((__visibility__ ("default"))) { + template<typename _Tp> class new_allocator { }; + template<typename _Tp> class allocator: public new_allocator<_Tp> { }; + template<typename _Tp, typename _Alloc> struct _Vector_base { }; + template<typename _Tp, typename _Alloc = std::allocator<_Tp> > + class vector : protected _Vector_base<_Tp, _Alloc> { }; +}; +template<int Dim> class Vector { }; +enum CenteringType { VertexType, EdgeType, FaceType, CellType }; +enum ContinuityType { XDim = 1, YDim = XDim << 1, ZDim = YDim << 1 }; +template <int Dim> class Centering { +public: + typedef Vector<Dim> Position; + typedef std::vector<Position> Positions; + Centering(const Positions &positions); + Positions positions_m; +}; +template <int Dim> class CanonicalCentering { + CanonicalCentering(); + template <class T> static T combine(const T &op1, const T &op2); + static Centering<Dim>*** centering_table_m; +}; +template <int Dim> CanonicalCentering<Dim>::CanonicalCentering() +{ + typename Centering<Dim>::Positions positions[Dim][2]; + enum { x = 0, y, z }; + int cont = 0; + if (Dim > 1) + { + centering_table_m[EdgeType][cont][YDim] = Centering<Dim>(positions[y][cont]); + centering_table_m[EdgeType][cont][XDim|YDim] = Centering<Dim>(combine(positions[x][cont], positions[y][cont])); + } + if (Dim > 2) + { + centering_table_m[EdgeType][cont][ZDim] = Centering<Dim>(positions[z][cont]); + centering_table_m[EdgeType][cont][XDim|ZDim] = Centering<Dim>(combine(positions[x][cont], positions[z][cont])); + } +} +template class CanonicalCentering<2>; diff --git a/gcc/testsuite/g++.dg/torture/20100702-1.C b/gcc/testsuite/g++.dg/torture/20100702-1.C new file mode 100644 index 000000000..3d223fffb --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/20100702-1.C @@ -0,0 +1,37 @@ +// { dg-do compile } +// { dg-options "-fprefetch-loop-arrays -w" } + +class ggPoint3 { +public: + ggPoint3(); + inline double &x() { + return e[0]; + } + inline double &y() { + return e[1]; + } + ggPoint3(const ggPoint3 &p); + double e[3]; +}; +class ggBox3 { +public: + ggPoint3 min() const; +}; +class ggHAffineMatrix3; +ggPoint3 operator*(const ggHAffineMatrix3 &m, const ggPoint3 &v); +void foo (ggPoint3 *); +void SetMatrix(ggHAffineMatrix3& toworld, ggBox3& box) +{ + ggPoint3 p[2][2][2]; + int i, j, k; + for (i = 0; i < 2; j++) + for (k = 0; k < 2; k++) + { + if (i == 0) + p[i][j][k].x() = box.min().x(); + if (j == 0) + p[i][j][k].y() = box.min().y(); + p[i][j][k] = toworld * p[i][j][k]; + } + foo (&p[0][0][0]); +} diff --git a/gcc/testsuite/g++.dg/torture/20100825.C b/gcc/testsuite/g++.dg/torture/20100825.C new file mode 100644 index 000000000..460c1b608 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/20100825.C @@ -0,0 +1,15 @@ +// { dg-do run } + +typedef enum { zero = 0, one = 1, two = 2, ENUM_MAX = 3 } my_enum; +my_enum e; +extern "C" void abort (void); +int __attribute__((noinline)) foo() { return 10; } +int main() +{ + int r; + r = foo(); + if ((r < 0) || (r >= ENUM_MAX)) + return 0; + e = (my_enum)r; + abort (); +} diff --git a/gcc/testsuite/g++.dg/torture/covariant-1.C b/gcc/testsuite/g++.dg/torture/covariant-1.C new file mode 100644 index 000000000..9f1fd0a52 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/covariant-1.C @@ -0,0 +1,33 @@ +// { dg-do run } + +extern "C" void abort (); + +class A { +public: + virtual A* getThis() { return this; } +}; + +class B { +int a; +public: + virtual B* getThis() { return this; } +}; + +class AB : public A, public B { +public: + virtual AB* getThis() { return this; } +}; + +int main () +{ + AB ab; + + A* a = &ab; + B* b = &ab; + + if (a->getThis() != a + || b->getThis() != b) + abort (); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/darwin-cfstring-3.C b/gcc/testsuite/g++.dg/torture/darwin-cfstring-3.C new file mode 100644 index 000000000..2d755ec8d --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/darwin-cfstring-3.C @@ -0,0 +1,30 @@ +/* Test whether the __builtin__CFStringMakeConstantString + "function" generates compile-time objects with the correct layout. */ +/* Developed by Ziemowit Laski <zlaski@apple.com>. */ + +/* { dg-do compile { target *-*-darwin* } } */ +/* { dg-options "-mconstant-cfstrings" } */ + +typedef const struct __CFString *CFStringRef; + +#ifdef __CONSTANT_CFSTRINGS__ +#define CFSTR(STR) ((CFStringRef) __builtin___CFStringMakeConstantString (STR)) +#else +#error __CONSTANT_CFSTRINGS__ not defined +#endif + +extern int cond; +extern const char *func(void); + +CFStringRef s0 = CFSTR("Hello" "there"); + +void foo(void) { + const CFStringRef s1 = CFSTR("Str1"); + + s0 = s1; +} + +/* { dg-final { scan-assembler "\\.long\[ \\t\]+___CFConstantStringClassReference\n\[ \\t\]*\\.long\[ \\t\]+1992\n\[ \\t\]*\\.long\[ \\t\]+LC.*\n\[ \\t\]*\\.long\[ \\t\]+4\n" { target { *-*-darwin* && { ! lp64 } } } } } */ +/* { dg-final { scan-assembler "\\.long\[ \\t\]+___CFConstantStringClassReference\n\[ \\t\]*\\.long\[ \\t\]+1992\n\[ \\t\]*\\.long\[ \\t\]+LC.*\n\[ \\t\]*\\.long\[ \\t\]+10\n" { target { *-*-darwin* && { ! lp64 } } } } } */ +/* { dg-final { scan-assembler ".quad\t___CFConstantStringClassReference\n\t.long\t1992\n\t.space 4\n\t.quad\t.*\n\t.quad\t4\n" { target { *-*-darwin* && { lp64 } } } } } */ +/* { dg-final { scan-assembler ".quad\t___CFConstantStringClassReference\n\t.long\t1992\n\t.space 4\n\t.quad\t.*\n\t.quad\t10\n" { target { *-*-darwin* && { lp64 } } } } } */ diff --git a/gcc/testsuite/g++.dg/torture/dg-torture.exp b/gcc/testsuite/g++.dg/torture/dg-torture.exp new file mode 100644 index 000000000..7525e0408 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/dg-torture.exp @@ -0,0 +1,7 @@ +# This harness is for tests that should be run at all optimisation levels. + +load_lib g++-dg.exp + +dg-init +gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.C $srcdir/c-c++-common/torture/*.c]] "" +dg-finish diff --git a/gcc/testsuite/g++.dg/torture/ipa-cp-1.C b/gcc/testsuite/g++.dg/torture/ipa-cp-1.C new file mode 100644 index 000000000..37c046d87 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/ipa-cp-1.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ + +// With IPA-CP, this caused a problem on darwin, where +// _M_reset is being cloned, it was still being marked +// as weak and then we had to change the calls to the +// newly marked function for the non throwing behavior. + +int& f(int&); +inline void _M_reset(int &_M_vbp) throw() +{ + f(_M_vbp); +} +extern int _S_last_request; +void _M_allocate_single_object() throw() +{ + _M_reset(_S_last_request); + _M_reset(_S_last_request); +} diff --git a/gcc/testsuite/g++.dg/torture/pr27218.C b/gcc/testsuite/g++.dg/torture/pr27218.C new file mode 100644 index 000000000..b1e18dd33 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr27218.C @@ -0,0 +1,16 @@ +/* { dg-do compile } */ + +struct Vector +{ + double _x, _y; +}; +typedef Vector Point; +Vector d; +static inline Vector f(void) +{ + return d; +} +void add_duck (void) +{ + new Point (f()); +} diff --git a/gcc/testsuite/g++.dg/torture/pr30252.C b/gcc/testsuite/g++.dg/torture/pr30252.C new file mode 100644 index 000000000..aabf88f51 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr30252.C @@ -0,0 +1,226 @@ +/* { dg-do run } */ +/* { dg-options "-fstrict-aliasing" } */ + +extern "C" void abort (void); +namespace sigc { + template <class T_type> + struct type_trait + { + typedef T_type& pass; + typedef const T_type& take; + typedef T_type* pointer; + }; + template <class T_base, class T_derived> + struct is_base_and_derived + { + struct big { + char memory[64]; + }; + static big is_base_class_(...); + static char is_base_class_(typename type_trait<T_base>::pointer); + static const bool value = + sizeof(is_base_class_(reinterpret_cast<typename type_trait<T_derived>::pointer>(0))) == + sizeof(char); + }; + struct nil; + struct functor_base {}; + template <class T_functor, bool I_derives_functor_base=is_base_and_derived<functor_base,T_functor>::value> + struct functor_trait + { + }; + template <class T_functor> + struct functor_trait<T_functor,true> + { + typedef typename T_functor::result_type result_type; + typedef T_functor functor_type; + }; + template <class T_arg1, class T_return> + class pointer_functor1 : public functor_base + { + typedef T_return (*function_type)(T_arg1); + function_type func_ptr_; + public: + typedef T_return result_type; + explicit pointer_functor1(function_type _A_func): func_ptr_(_A_func) {} + T_return operator()(typename type_trait<T_arg1>::take _A_a1) const + { return func_ptr_(_A_a1); } + }; + template <class T_arg1, class T_return> + inline pointer_functor1<T_arg1, T_return> + ptr_fun1(T_return (*_A_func)(T_arg1)) + { return pointer_functor1<T_arg1, T_return>(_A_func); } + struct adaptor_base : public functor_base {}; + template <class T_functor, + class T_arg1=void, + bool I_derives_adaptor_base=is_base_and_derived<adaptor_base,T_functor>::value> + struct deduce_result_type + { typedef typename functor_trait<T_functor>::result_type type; }; + template <class T_functor> + struct adaptor_functor : public adaptor_base + { + template <class T_arg1=void> + struct deduce_result_type + { typedef typename sigc::deduce_result_type<T_functor, T_arg1>::type type; }; + typedef typename functor_trait<T_functor>::result_type result_type; + result_type + operator()() const; + template <class T_arg1> + typename deduce_result_type<T_arg1>::type + operator()(T_arg1 _A_arg1) const + { return functor_(_A_arg1); } + explicit adaptor_functor(const T_functor& _A_functor) + : functor_(_A_functor) + {} + mutable T_functor functor_; + }; + template <class T_functor> + typename adaptor_functor<T_functor>::result_type + adaptor_functor<T_functor>::operator()() const + { return functor_(); } + template <class T_functor, bool I_isadaptor = is_base_and_derived<adaptor_base, T_functor>::value> struct adaptor_trait; + template <class T_functor> + struct adaptor_trait<T_functor, true> + { + typedef T_functor adaptor_type; + }; + template <class T_functor> + struct adaptor_trait<T_functor, false> + { + typedef typename functor_trait<T_functor>::functor_type functor_type; + typedef adaptor_functor<functor_type> adaptor_type; + }; + template <class T_functor> + struct adapts : public adaptor_base + { + typedef typename adaptor_trait<T_functor>::adaptor_type adaptor_type; + explicit adapts(const T_functor& _A_functor) + : functor_(_A_functor) + {} + mutable adaptor_type functor_; + }; + template <class T_type> + struct reference_wrapper + { + }; + template <class T_type> + struct unwrap_reference + { + typedef T_type type; + }; + template <class T_type> + class bound_argument + { + public: + bound_argument(const T_type& _A_argument) + : visited_(_A_argument) + {} + inline T_type& invoke() + { return visited_; } + T_type visited_; + }; + template <class T_wrapped> + class bound_argument< reference_wrapper<T_wrapped> > + { + }; + template <int I_location, class T_functor, class T_type1=nil> + struct bind_functor; + template <class T_functor, class T_type1> + struct bind_functor<-1, T_functor, T_type1> : public adapts<T_functor> + { + typedef typename adapts<T_functor>::adaptor_type adaptor_type; + typedef typename adaptor_type::result_type result_type; + result_type + operator()() + { + return this->functor_.template operator()<typename type_trait<typename unwrap_reference<T_type1>::type>::pass> (bound1_.invoke()); + } + bind_functor(typename type_trait<T_functor>::take _A_func, typename type_trait<T_type1>::take _A_bound1) + : adapts<T_functor>(_A_func), bound1_(_A_bound1) + {} + bound_argument<T_type1> bound1_; + }; + template <class T_type1, class T_functor> + inline bind_functor<-1, T_functor, + T_type1> + bind(const T_functor& _A_func, T_type1 _A_b1) + { return bind_functor<-1, T_functor, + T_type1> + (_A_func, _A_b1); + } + namespace internal { + struct slot_rep; + typedef void* (*hook)(slot_rep *); + struct slot_rep + { + hook call_; + }; + } + class slot_base : public functor_base + { + public: + typedef internal::slot_rep rep_type; + explicit slot_base(rep_type* rep) + : rep_(rep) + { + } + mutable rep_type *rep_; + }; + namespace internal { + template <class T_functor> + struct typed_slot_rep : public slot_rep + { + typedef typename adaptor_trait<T_functor>::adaptor_type adaptor_type; + adaptor_type functor_; + inline typed_slot_rep(const T_functor& functor) + : functor_(functor) + { + } + }; + template<class T_functor> + struct slot_call0 + { + static void *call_it(slot_rep* rep) + { + typedef typed_slot_rep<T_functor> typed_slot; + typed_slot *typed_rep = static_cast<typed_slot*>(rep); + return (typed_rep->functor_)(); + } + static hook address() + { + return &call_it; + } + }; + } + + class slot0 : public slot_base + { + public: + typedef void * (*call_type)(rep_type*); + inline void *operator()() const + { + return slot_base::rep_->call_ (slot_base::rep_); + } + template <class T_functor> + slot0(const T_functor& _A_func) + : slot_base(new internal::typed_slot_rep<T_functor>(_A_func)) + { + slot_base::rep_->call_ = internal::slot_call0<T_functor>::address(); + } + }; +} +struct A +{ + static void *foo (void *p) { return p; } + typedef sigc::slot0 C; + C bar(); +}; +A::C A::bar () +{ + return sigc::bind (sigc::ptr_fun1 (&A::foo), (void*)0); +} +int main (void) +{ + A a; + if (a.bar ()() != 0) + abort (); +} diff --git a/gcc/testsuite/g++.dg/torture/pr30567.C b/gcc/testsuite/g++.dg/torture/pr30567.C new file mode 100644 index 000000000..389daf357 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr30567.C @@ -0,0 +1,32 @@ +/* { dg-do run } */ + +template <typename T> +struct const_ref +{ + const T* begin; + const_ref(const T* b) : begin(b) {} +}; + +template <typename T> +T sum(const_ref<T> const& a) +{ + T result = 0; + for(unsigned i=0;i<1;i++) result += a.begin[i]; + return result; +} + +struct tiny_plain +{ + int elems[2]; + tiny_plain() { elems[0]=1; } +}; + +struct vec3 : tiny_plain {}; + +struct mat3 +{ + int type() const { return sum(const_ref<int>(vec3().elems)) == 1; } +}; + +int main() { return mat3().type() ? 0 : 1; } + diff --git a/gcc/testsuite/g++.dg/torture/pr31081-1.C b/gcc/testsuite/g++.dg/torture/pr31081-1.C new file mode 100644 index 000000000..cb11b2148 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr31081-1.C @@ -0,0 +1,23 @@ +/* { dg-do compile } */ + +static int get_record (void); +void f(void); +int g(void); +static int get_record (void) +{ + int result; + try + { + result = g(); + f(); + } + catch (const int &) { } + return result; +} +int NAV_get_record ( ) +{ + int result; + for (;;) + if (get_record ()) + return 1; +} diff --git a/gcc/testsuite/g++.dg/torture/pr31081-2.C b/gcc/testsuite/g++.dg/torture/pr31081-2.C new file mode 100644 index 000000000..a14ef3798 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr31081-2.C @@ -0,0 +1,48 @@ +/* { dg-do compile } */ + +class CString +{ +public: + CString(); + ~CString() { operator delete(_rep); } + operator const char*() const { return _rep; } +private: + CString(char* cstr); + char* _rep; +}; + +class String +{ +public: + + String(); + String(const char* str); + ~String(); + CString getCString() const; +}; + +int is_absolute_path(const char *path); + +inline void getAbsolutePath( + const char* path, + const String& filename) +{ + (!is_absolute_path(filename.getCString()) && path); + return; +} + +int foo(int &value); + +int main(int argc, char** argv) +{ + int repeatTestCount = 0; + if (foo(repeatTestCount)) + { + repeatTestCount = 1; + } + for (int numTests = 1; numTests <= repeatTestCount; numTests++) + { + getAbsolutePath("blah", "blah"); + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr31579.C b/gcc/testsuite/g++.dg/torture/pr31579.C new file mode 100644 index 000000000..131532e63 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr31579.C @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +// middle-end/31579 +// Expand was crashing while expanding the tree for the initializer + +struct Industry { + unsigned char produced_cargo[2]; +}; +unsigned int a = (((__SIZE_TYPE__)&reinterpret_cast<const volatile +char&>((((Industry*)(char*)8)->produced_cargo[0]))) - 8); + diff --git a/gcc/testsuite/g++.dg/torture/pr31863.C b/gcc/testsuite/g++.dg/torture/pr31863.C new file mode 100644 index 000000000..8d8ccc43a --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr31863.C @@ -0,0 +1,777 @@ +/* { dg-do link } */ +/* { dg-timeout-factor 2.0 } */ + +namespace Loki +{ + class NullType {}; + template <class T, class U> + struct Typelist + { + typedef T Head; + typedef U Tail; + }; + + + + namespace TL + { + template + < + typename T1 = NullType, typename T2 = NullType, typename T3 = +NullType, + typename T4 = NullType, typename T5 = NullType, typename T6 = +NullType, + typename T7 = NullType, typename T8 = NullType, typename T9 = +NullType, + typename T10 = NullType, typename T11 = NullType, typename T12 += NullType, + typename T13 = NullType, typename T14 = NullType, typename T15 += NullType, + typename T16 = NullType, typename T17 = NullType, typename T18 += NullType, + typename T19 = NullType, typename T20 = NullType, typename T21 += NullType, + typename T22 = NullType, typename T23 = NullType, typename T24 += NullType, + typename T25 = NullType, typename T26 = NullType, typename T27 += NullType, + typename T28 = NullType, typename T29 = NullType, typename T30 += NullType, + typename T31 = NullType, typename T32 = NullType, typename T33 += NullType, + typename T34 = NullType, typename T35 = NullType, typename T36 += NullType, + typename T37 = NullType, typename T38 = NullType, typename T39 += NullType, + typename T40 = NullType + > + struct MakeTypelist + { + private: + typedef typename MakeTypelist + < + T2 , T3 , T4 , + T5 , T6 , T7 , + T8 , T9 , T10, + T11, T12, T13, + T14, T15, T16, + T17, T18, T19, + T20, T21, T22, + T23, T24, T25, + T26, T27, T28, + T29, T30, T31, + T32, T33, T34, + T35, T36, T37, + T38, T39, T40 + > + ::Result TailResult; + + public: + typedef Typelist<T1, TailResult> Result; + }; + + template<> + struct MakeTypelist<> + { + typedef NullType Result; + }; + + } +} +template <class Key> +class Factory; + +template <class Key, bool iW> +struct Context +{ + typedef Key KeyType; + enum + { + isWrite = iW + }; +}; + +namespace detail +{ + +template <class Key, bool isWrite> +class CreatorUnitBaseImpl +{ +public: + typedef Context<Key, isWrite> Context_; +private: + typedef void*(CreatorUnitBaseImpl::*CreateFun)(Context_&, unsigned&, const +Key&); + CreateFun createFun_; + +protected: + virtual void* createUninitialized () = 0; + template <class Value> + void* createImpl (Context_& ctx, unsigned& ver, const Key& k) + { + return createUninitialized(); + } +private: + CreatorUnitBaseImpl(); +public: + template <class Value> + CreatorUnitBaseImpl (Value*) : + createFun_( &CreatorUnitBaseImpl::template createImpl<Value> ) + { + } + + virtual ~CreatorUnitBaseImpl () {} + + CreatorUnitBaseImpl(const CreatorUnitBaseImpl& s) + : createFun_(s.createFun_) + { + } + + CreatorUnitBaseImpl& operator=(const CreatorUnitBaseImpl& s) + { + createFun_ = s.createFun_; + return *this; + } + void* create (Context_& ctx, unsigned& ver, const Key& k) + { + return (this->*createFun_)(ctx, ver, k); + } +}; + +template <class Key> +class Creator : protected CreatorUnitBaseImpl<Key, true>, protected +CreatorUnitBaseImpl<Key, false> +{ +public: + typedef void* (*CreatorFun) (); + +private: + CreatorFun fun_; +protected: + virtual void* createUninitialized () + { + if (fun_) + return (*fun_)(); + return 0; + } +private: + Creator (); +public: + template <class Value> + Creator (CreatorFun f, Value*) : + CreatorUnitBaseImpl<Key, true>((Value*)0), + CreatorUnitBaseImpl<Key, false>((Value*)0), + fun_(f) + { + } + + Creator(const Creator& s) : + CreatorUnitBaseImpl<Key, true>(s), + CreatorUnitBaseImpl<Key, false>(s), + fun_(s.fun_) + { + + } + + Creator& operator=(const Creator& s) + { + CreatorUnitBaseImpl<Key, true>::operator=(s); + CreatorUnitBaseImpl<Key, false>::operator=(s); + fun_ = s.fun_; + return *this; + } + + virtual ~Creator () + { + } + + template <class Context> + void* createObject (Context& ctx, unsigned& ver, const Key& k) + { + void* r = CreatorUnitBaseImpl<Key, Context::isWrite>::create(ctx, ver, +k); + return r; + } +}; + +} + +template <class Key> +class Factory +{ +public: + typedef Key KeyType; + typedef void* (*CreatorFun) (); + typedef detail::Creator<Key> Creator; +public: + Factory () {} + ~Factory () {} + + template <class Value> + bool registerCreator (const Key& k, CreatorFun fun) + { + return true; + } + template <class Context> + void* createObject (const Key& k, Context& ctx, unsigned& ver) + { + return 0; + } +}; + +template <class Key, class Base, Key key> +struct ClassSpec +{ + typedef Key KeyType; + typedef Base BaseType; + enum {KeyValue = key}; +}; + +template <class Key, class T> +class Serializer; + +template <class Key, class Base, Key key> +class Serializer<Key, ClassSpec <Key, Base, key> > + : public virtual Factory<Key> +{ + typedef Key KeyType; + typedef Base BaseType; + enum {KeyValue = key}; + typedef Factory<Key> Inherited; + typedef Serializer<Key, ClassSpec< Key, Base, key > > SelfType; + + static void* create () + { + return (void*) (new BaseType); + } +public: + Serializer() + { + Inherited::template registerCreator<BaseType>( + KeyValue, + &SelfType::create); + } +}; + +template <class Key, class Head> +class Serializer<Key, Loki::Typelist<Head, Loki::NullType> >: + public Serializer<Key, Head> +{ +}; + +template <class Key, class Head, class Tail> +class Serializer<Key, Loki::Typelist<Head, Tail> >: + public virtual Serializer<Key, Head>, + public virtual Serializer<Key, Tail> +{ +}; + +template <class Key> +class Serializer<Key, Loki::NullType> : public virtual Factory<Key> +{ +}; + + + + +typedef unsigned KeyType; + + + +typedef Factory<KeyType> FactoryType; + +typedef KeyType Key; + +struct A001 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 1; } + static const char* className () {return "A001";} +}; + +struct A002 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 2; } + static const char* className () {return "A002";} +}; + +struct A003 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 3; } + static const char* className () {return "A003";} +}; + +struct A004 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 4; } + static const char* className () {return "A004";} +}; + +struct A005 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 5; } + static const char* className () {return "A005";} +}; + +struct A006 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 6; } + static const char* className () {return "A006";} +}; + +struct A007 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 7; } + static const char* className () {return "A007";} +}; + +struct A008 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 8; } + static const char* className () {return "A008";} +}; + +struct A009 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 9; } + static const char* className () {return "A009";} +}; + +struct A010 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 10; } + static const char* className () {return "A010";} +}; + +struct A011 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 11; } + static const char* className () {return "A011";} +}; + +struct A012 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 12; } + static const char* className () {return "A012";} +}; + +struct A013 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 13; } + static const char* className () {return "A013";} +}; + +struct A014 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 14; } + static const char* className () {return "A014";} +}; + +struct A015 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 15; } + static const char* className () {return "A015";} +}; + +struct A016 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 16; } + static const char* className () {return "A016";} +}; + +struct A017 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 17; } + static const char* className () {return "A017";} +}; + +struct A018 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 18; } + static const char* className () {return "A018";} +}; + +struct A019 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 19; } + static const char* className () {return "A019";} +}; + +struct A020 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 20; } + static const char* className () {return "A020";} +}; + +struct A021 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 21; } + static const char* className () {return "A021";} +}; + +struct A022 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 22; } + static const char* className () {return "A022";} +}; + +struct A023 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 23; } + static const char* className () {return "A023";} +}; + +struct A024 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 24; } + static const char* className () {return "A024";} +}; + +struct A025 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 25; } + static const char* className () {return "A025";} +}; + +struct A026 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 26; } + static const char* className () {return "A026";} +}; + +struct A027 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 27; } + static const char* className () {return "A027";} +}; + +struct A028 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 28; } + static const char* className () {return "A028";} +}; + +struct A029 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 29; } + static const char* className () {return "A029";} +}; + +struct A030 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 30; } + static const char* className () {return "A030";} +}; + +struct A031 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 31; } + static const char* className () {return "A031";} +}; + +struct A032 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 32; } + static const char* className () {return "A032";} +}; + +struct A033 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 33; } + static const char* className () {return "A033";} +}; + +struct A034 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 34; } + static const char* className () {return "A034";} +}; + +struct A035 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 35; } + static const char* className () {return "A035";} +}; + +struct A036 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 36; } + static const char* className () {return "A036";} +}; + +struct A037 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 37; } + static const char* className () {return "A037";} +}; + +struct A038 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 38; } + static const char* className () {return "A038";} +}; + +struct A039 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 39; } + static const char* className () {return "A039";} +}; + +struct A040 +{ + template <class Context> + bool serialize(Context& ctx, unsigned& ver) + { + return true; + } + static Key classId() { return 40; } + static const char* className () {return "A040";} +}; + +Factory<Key>& getInstance() +{ + static Serializer<Key, + Loki::TL::MakeTypelist< + ClassSpec<Key, A001, 1>, + ClassSpec<Key, A002, 2>, + ClassSpec<Key, A003, 3>, + ClassSpec<Key, A004, 4>, + ClassSpec<Key, A005, 5>, + ClassSpec<Key, A006, 6>, + ClassSpec<Key, A007, 7>, + ClassSpec<Key, A008, 8>, + ClassSpec<Key, A009, 9>, + ClassSpec<Key, A010, 10>, + ClassSpec<Key, A011, 11>, + ClassSpec<Key, A012, 12>, + ClassSpec<Key, A013, 13>, + ClassSpec<Key, A014, 14>, + ClassSpec<Key, A015, 15>, + ClassSpec<Key, A016, 16>, + ClassSpec<Key, A017, 17>, + ClassSpec<Key, A018, 18>, + ClassSpec<Key, A019, 19>, + ClassSpec<Key, A020, 20>, + ClassSpec<Key, A021, 21>, + ClassSpec<Key, A022, 22>, + ClassSpec<Key, A023, 23>, + ClassSpec<Key, A024, 24>, + ClassSpec<Key, A025, 25>, + ClassSpec<Key, A026, 26>, + ClassSpec<Key, A027, 27>, + ClassSpec<Key, A028, 28>, + ClassSpec<Key, A029, 29>, + ClassSpec<Key, A030, 30>, + ClassSpec<Key, A031, 31>, + ClassSpec<Key, A032, 32>, + ClassSpec<Key, A033, 33>, + ClassSpec<Key, A034, 34>, + ClassSpec<Key, A035, 35>, + ClassSpec<Key, A036, 36>, + ClassSpec<Key, A037, 37>, + ClassSpec<Key, A038, 38>, + ClassSpec<Key, A039, 39>, + ClassSpec<Key, A040, 40> + >::Result + > instance; + return instance; +} + +int main () +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr32304.C b/gcc/testsuite/g++.dg/torture/pr32304.C new file mode 100644 index 000000000..236d00b97 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr32304.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +struct S { + S() {} +}; +S f() { + static S s; + return s; +} diff --git a/gcc/testsuite/g++.dg/torture/pr32563.C b/gcc/testsuite/g++.dg/torture/pr32563.C new file mode 100644 index 000000000..d536b3faa --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr32563.C @@ -0,0 +1,8 @@ +/* { dg-do compile } */ + +struct A +{ + char c[1]; +} a; + +const __SIZE_TYPE__ i = (__SIZE_TYPE__)&a.c[0] - 1; diff --git a/gcc/testsuite/g++.dg/torture/pr32950.C b/gcc/testsuite/g++.dg/torture/pr32950.C new file mode 100644 index 000000000..8d64296e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr32950.C @@ -0,0 +1,19 @@ +/* { dg-do compile } */ + +struct A +{ + __complex__ double c; +}; + +struct B +{ + A a; + B(A x) : a(x) {} + void foo(); +}; + +void bar() +{ + B b = A(); + B(b).foo(); +} diff --git a/gcc/testsuite/g++.dg/torture/pr33134.C b/gcc/testsuite/g++.dg/torture/pr33134.C new file mode 100644 index 000000000..43482c7fc --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr33134.C @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +/* Used to crash in VRP. */ +/* Testcase by Martin Michlmayr <tbm@cyrius.com> */ + +class FXObject; +class FXStream +{ + public:FXStream (const FXObject *cont = __null); + FXStream & operator<< (const unsigned char &v); +}; + +bool fxsaveGIF (FXStream &store) +{ + int bitsperpixel; + unsigned char c1; + c1 = 0x80; + c1 |= (bitsperpixel - 1) << 4; + store << c1; +} diff --git a/gcc/testsuite/g++.dg/torture/pr33340.C b/gcc/testsuite/g++.dg/torture/pr33340.C new file mode 100644 index 000000000..bac882156 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr33340.C @@ -0,0 +1,27 @@ +void* operator new(__SIZE_TYPE__, void* __p) { } + +struct auto_ptr { + int* p; + ~auto_ptr() { delete p; } +}; + +typedef void* T; +struct vector { + void push_back(const T& __x) { + ::new(0) T(__x); + insert(__x); + } + void insert(const T& __x); +} v; + +void g(); +void f() { + auto_ptr ap; + if (ap.p) { + ap.p = new int(); + } + g(); + int* tmp = ap.p; + ap.p = 0; + v.push_back(tmp); +} diff --git a/gcc/testsuite/g++.dg/torture/pr33572.C b/gcc/testsuite/g++.dg/torture/pr33572.C new file mode 100644 index 000000000..91cd073fd --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr33572.C @@ -0,0 +1,17 @@ +// { dg-do run } +#include <vector> +#include <memory> + +struct Foo { virtual void f() {} }; + +int main(int argc, char**) +{ + std::auto_ptr<Foo> foo; + if (argc >= 0) { + foo.reset(new Foo()); + } else { + std::vector<int> v; + } + Foo* p = foo.release(); + p->f(); +} diff --git a/gcc/testsuite/g++.dg/torture/pr33589-1.C b/gcc/testsuite/g++.dg/torture/pr33589-1.C new file mode 100644 index 000000000..eea89f421 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr33589-1.C @@ -0,0 +1,22 @@ +// { dg-do compile } +struct base { void somemethod() {} }; +struct derived : public base { }; + +struct smartpointer +{ + ~smartpointer() { } + operator derived*() const + { + return 0; + } +}; +typedef void ( derived::* methodptr_type )(); +methodptr_type getmemberptr() +{ + return &derived::somemethod; +} +void somefunction() +{ + smartpointer pObj; + ( pObj->*getmemberptr() )(); +} diff --git a/gcc/testsuite/g++.dg/torture/pr33589-2.C b/gcc/testsuite/g++.dg/torture/pr33589-2.C new file mode 100644 index 000000000..325892bc6 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr33589-2.C @@ -0,0 +1,13 @@ +// { dg-do compile } + +void f(void*) throw(); + +void somefunction() +{ +try { + void (*g)(void*) = (void (*)(void*))f; + void (*g2)(int*) = (void (*)(int*))g; + g2(0); +} catch (...) +{throw;} +} diff --git a/gcc/testsuite/g++.dg/torture/pr33627.C b/gcc/testsuite/g++.dg/torture/pr33627.C new file mode 100644 index 000000000..a14e34551 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr33627.C @@ -0,0 +1,57 @@ +/* { dg-do compile } */ + +typedef unsigned int UT_uint32; +typedef UT_uint32 PT_DocPosition; +typedef UT_uint32 PT_BlockOffset; +typedef enum _PTStruxType { PTX_Block } PTStruxType; +typedef UT_uint32 PL_ListenerId; +typedef const void * PL_StruxFmtHandle; +class PX_ChangeRecord; +class pf_Frag { + public: + typedef enum _PFType { PFT_Object } PFType; + inline PFType getType(void) const { } + inline pf_Frag * getNext(void) const { } + PT_DocPosition getPos(void) const { } +}; +class pf_Fragments { + public: + pf_Frag * getFirst() const; +}; +class pt_PieceTable { + bool getStruxOfTypeFromPosition(PL_ListenerId listenerId, PT_DocPosition docPos, PTStruxType pts, PL_StruxFmtHandle * psfh) const; + bool _tellAndMaybeAddListener(PL_ListenerId listenerId, bool bAdd); + pf_Fragments m_fragments; +}; +class pf_Frag_Object : public pf_Frag +{ + public: + virtual bool createSpecialChangeRecord(PX_ChangeRecord ** ppcr, PT_DocPosition dpos, PT_BlockOffset blockOffset) const; +}; +bool pt_PieceTable::_tellAndMaybeAddListener(PL_ListenerId listenerId, bool bAdd) +{ + PL_StruxFmtHandle sfh = 0; + PT_DocPosition sum = 0; + UT_uint32 blockOffset = 0; + for (pf_Frag * pf = m_fragments.getFirst(); (pf); pf=pf->getNext()) + { + pf_Frag_Object * pfo = static_cast<pf_Frag_Object *> (pf); + PX_ChangeRecord * pcr = __null; + bool bStatus1 = false; + if(sfh != __null) { + bStatus1 = pfo->createSpecialChangeRecord(&pcr,sum,blockOffset); + if (!(bStatus1)) + return (false); + } + else + { + PT_DocPosition pos = pf->getPos(); + getStruxOfTypeFromPosition(listenerId,pos,PTX_Block,&sfh); + bStatus1 = pfo->createSpecialChangeRecord(&pcr,pos,blockOffset); + if (!(bStatus1)) + return (false); + } + if (!(bStatus1)) + return (false); + } +} diff --git a/gcc/testsuite/g++.dg/torture/pr33735.C b/gcc/testsuite/g++.dg/torture/pr33735.C new file mode 100644 index 000000000..0a90745b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr33735.C @@ -0,0 +1,21 @@ +// { dg-do compile } +#include <string> +typedef struct _ts { } PyThreadState; +PyThreadState * Py_NewInterpreter(void); +void Py_EndInterpreter(PyThreadState *); +class ApplicationError { +public: + ApplicationError(std::string errormsg) : errormsg(errormsg) { } + std::string errormsg; +}; +void run() +{ + PyThreadState *py_state=__null; + try { + if (!(py_state=Py_NewInterpreter())) + throw ApplicationError("error"); + } + catch(ApplicationError e) { + Py_EndInterpreter(py_state); + } +} diff --git a/gcc/testsuite/g++.dg/torture/pr33819.C b/gcc/testsuite/g++.dg/torture/pr33819.C new file mode 100644 index 000000000..a2f868dae --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr33819.C @@ -0,0 +1,22 @@ +/* { dg-do run } */ + +class s +{ +public: + s(long long aa) : a(aa), i1(0) { } + long long id() const { return (this->a << 16) >> 16; } + bool operator< (s sv) { return this->a < sv.id(); } +private: + long long a : 48; + int i1 : 16; +}; +s g(1); +extern "C" void abort (void); +int +main(int, char**) +{ + if (g < (1LL << 38) - 1) + return 0; + abort (); +} + diff --git a/gcc/testsuite/g++.dg/torture/pr33887-1.C b/gcc/testsuite/g++.dg/torture/pr33887-1.C new file mode 100644 index 000000000..2f17d9583 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr33887-1.C @@ -0,0 +1,44 @@ +/* { dg-do run } */ + +extern "C" void abort (void); +struct S { unsigned int i : 24; } x; +void __attribute__((noinline)) test1() +{ + if (--x.i != 0x00ffffff) + abort (); + if (x.i != 0x00ffffff) + abort (); +} +void __attribute__((noinline)) test2() +{ + if (x.i-- != 0) + abort (); + if (x.i != 0x00ffffff) + abort (); +} +void __attribute__((noinline)) test3() +{ + if (++x.i != 0) + abort (); + if (x.i != 0) + abort (); +} +void __attribute__((noinline)) test4() +{ + if (x.i++ != 0x00ffffff) + abort (); + if (x.i != 0) + abort (); +} +int main() +{ + x.i = 0; + test1(); + x.i = 0; + test2(); + x.i = 0x00ffffff; + test3(); + x.i = 0x00ffffff; + test4(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr33887-2.C b/gcc/testsuite/g++.dg/torture/pr33887-2.C new file mode 100644 index 000000000..f64cfad96 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr33887-2.C @@ -0,0 +1,21 @@ +/* { dg-do run } */ + +extern "C" void abort() __attribute__ ((noreturn)); + +struct s +{ + unsigned long long f1 : 40; + unsigned int f2 : 24; +} sv; + +int main() +{ + int f2; + sv.f2 = (1 << 24) - 1; + __asm__ volatile ("" : : : "memory"); + ++sv.f2; + f2 = sv.f2; + if (f2 != 0) + abort(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr33887-3.C b/gcc/testsuite/g++.dg/torture/pr33887-3.C new file mode 100644 index 000000000..b4b883fba --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr33887-3.C @@ -0,0 +1,26 @@ +/* { dg-do run } */ + +extern "C" void abort (void); + +struct s +{ + unsigned long long f1 : 40; + unsigned int f2 : 24; +}; + +s sv; + +void __attribute__((noinline)) foo(unsigned int i) +{ + unsigned int tmp; + sv.f2 = i; + tmp = sv.f2; + if (tmp != 0) + abort (); +} + +int main() +{ + foo (0xff000000u); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr34099.C b/gcc/testsuite/g++.dg/torture/pr34099.C new file mode 100644 index 000000000..49fa9cac1 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr34099.C @@ -0,0 +1,25 @@ +/* { dg-do run } */ + +#include <complex> + +typedef std::complex<double> NumType; + +void +multiply(NumType a, NumType b, unsigned ac, NumType &ab) +{ + NumType s; + for (unsigned j=0; j<ac; j++) + s = a * b; + ab = s; +} +extern "C" void abort (void); +int main() +{ + NumType a(1,2), b(3,-2), c; + multiply(a, b, 1, c); + if (c.real() != 7 + || c.imag() != 4) + abort (); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/torture/pr34222.C b/gcc/testsuite/g++.dg/torture/pr34222.C new file mode 100644 index 000000000..130896dc9 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr34222.C @@ -0,0 +1,65 @@ +/* { dg-do compile } */ + +namespace std __attribute__ ((__visibility__ ("default"))) { + template<class _CharT> struct char_traits; + } +__extension__ typedef __PTRDIFF_TYPE__ ptrdiff_t; +namespace std __attribute__ ((__visibility__ ("default"))) { + typedef ptrdiff_t streamsize; + template<typename _CharT, typename _Traits = char_traits<_CharT> > class basic_ifstream; + typedef basic_ifstream<char> ifstream; + class ios_base { + }; + } +template<class T> class Vector4 { + public: + inline Vector4(); + inline Vector4(T, T, T, T); + T x, y, z, w; + }; +template<class T> class Matrix4 { + public: + Matrix4(const Vector4<T>&, const Vector4<T>&, const Vector4<T>&, const Vector4<T>&); + Matrix4(const Matrix4<T>& m); + Vector4<T> r[4]; + }; +typedef Vector4<float> Vec4f; +typedef Matrix4<float> Mat4f; +template<class T> Vector4<T>::Vector4() : x(0), y(0), z(0), w(0) { + } +template<class T> Vector4<T>::Vector4(T _x, T _y, T _z, T _w) : x(_x), y(_y), z(_z), w(_w) { + } +template<class T> Matrix4<T>::Matrix4(const Vector4<T>& v0, const Vector4<T>& v1, const Vector4<T>& v2, const Vector4<T>& v3) { + } +namespace std __attribute__ ((__visibility__ ("default"))) { + template<typename _CharT, typename _Traits> class basic_ios : public ios_base { + }; + template<typename _CharT, typename _Traits> class basic_istream : virtual public basic_ios<_CharT, _Traits> { + public: + typedef _CharT char_type; + typedef basic_istream<_CharT, _Traits> __istream_type; + __istream_type& read(char_type* __s, streamsize __n); + }; + template<typename _CharT, typename _Traits> class basic_ifstream : public basic_istream<_CharT, _Traits> { + }; + } +using namespace std; +static float readFloat(ifstream& in) { + float f; + in.read((char*) &f, sizeof(float)); + } +Mat4f readMeshMatrix(ifstream& in, int nBytes) { + float m00 = readFloat(in); + float m01 = readFloat(in); + float m02 = readFloat(in); + float m10 = readFloat(in); + float m11 = readFloat(in); + float m12 = readFloat(in); + float m20 = readFloat(in); + float m21 = readFloat(in); + float m22 = readFloat(in); + float m30 = readFloat(in); + float m31 = readFloat(in); + float m32 = readFloat(in); + return Mat4f(Vec4f(m00, m01, m02, 0), Vec4f(m10, m11, m12, 0), Vec4f(m20, m21, m22, 0), Vec4f(m30, m31, m32, 1)); + } diff --git a/gcc/testsuite/g++.dg/torture/pr34235.C b/gcc/testsuite/g++.dg/torture/pr34235.C new file mode 100644 index 000000000..5f05841c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr34235.C @@ -0,0 +1,11 @@ +/* { dg-do run } */ + +extern "C" void abort (void); +int main() +{ + short x = -1; + unsigned int c = ((unsigned int)x) >> 1; + if (c != 0x7fffffff) + abort(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr34241.C b/gcc/testsuite/g++.dg/torture/pr34241.C new file mode 100644 index 000000000..70f186c5b --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr34241.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ + +inline void *operator new (__SIZE_TYPE__, void *__p) throw () +{ + return __p; +} +struct A +{ + A(int, double); + inline explicit A (int pattern, bool cs) + { + new (this) A (pattern, double(cs)); + } +}; +A test () +{ + const A a (42, true); +} diff --git a/gcc/testsuite/g++.dg/torture/pr34641.C b/gcc/testsuite/g++.dg/torture/pr34641.C new file mode 100644 index 000000000..0cf507762 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr34641.C @@ -0,0 +1,177 @@ +// { dg-do compile } +// { dg-require-effective-target fpic } +// { dg-require-visibility "" } +// { dg-options "-fPIC" } + + +typedef __SIZE_TYPE__ size_t; +extern "C" void * +malloc (size_t __size) +throw () __attribute__ ((__malloc__)); + namespace std __attribute__ ((__visibility__ ("default"))) +{ + using::size_t; +} +inline void *operator +new (std::size_t, void *__p) +throw () +{ + return __p; +} +template < class _T1, class _T2 > struct pair +{ + _T1 first; + _T2 second; + pair (const _T1 & __a, const _T2 & __b):first (__a), second (__b) + { + } + template < class _U1, class _U2 > + pair (const pair < _U1, _U2 > &__p):first (__p.first), second (__p.second) + { + } +}; + +template < class _T1, class _T2 > + inline pair < _T1, _T2 > make_pair (_T1 __x, _T2 __y) +{ + return pair < _T1, _T2 > (__x, __y); +} +template < typename _Tp > inline const _Tp & +max (const _Tp & __a, const _Tp & __b) +{ +} +typedef unsigned short int uint16_t; +typedef unsigned long int uintptr_t; +typedef uint16_t UChar; +namespace std __attribute__ ((__visibility__ ("default"))) +{ + struct __numeric_limits_base + { + }; + template < typename _Tp > struct numeric_limits:public __numeric_limits_base + { + static _Tp max () throw () + { + } + }; +} + +template < typename T > class VectorBufferBase +{ +public: + void allocateBuffer (size_t newCapacity) + { + if (newCapacity > std::numeric_limits < size_t >::max () / sizeof (T)) + *(int *) (uintptr_t) 0xbbadbeef = 0; + } +}; + +template < typename T, size_t inlineCapacity > class VectorBuffer; +template < typename T > class VectorBuffer < T, 0 >:private VectorBufferBase < + T > +{ +public: + typedef VectorBufferBase < T > Base; + using Base::allocateBuffer; +}; + +template < typename T, size_t inlineCapacity = 0 > class Vector +{ + typedef VectorBuffer < T, inlineCapacity > Impl; +public: + typedef T *iterator; + size_t size () const + { + return m_size; + } + size_t capacity () const + { + } + iterator begin () + { + } + iterator end () + { + return begin () + m_size; + } + void shrink (size_t size); + void reserveCapacity (size_t newCapacity); + void clear () + { + shrink (0); + } + template < typename U > void append (const U &); + void expandCapacity (size_t newMinCapacity); + template < typename U > U * expandCapacity (size_t newMinCapacity, U *); + size_t m_size; + Impl m_impl; +}; +template < typename T, size_t inlineCapacity > + void Vector < T, inlineCapacity >::expandCapacity (size_t newMinCapacity) +{ + reserveCapacity (max + (newMinCapacity, + max (static_cast < size_t > (16), + capacity () + capacity () / 4 + 1))); +} + +template < typename T, size_t inlineCapacity > + template < typename U > + inline U * Vector < T, + inlineCapacity >::expandCapacity (size_t newMinCapacity, U * ptr) +{ + expandCapacity (newMinCapacity); +} +template < typename T, size_t inlineCapacity > + void Vector < T, inlineCapacity >::reserveCapacity (size_t newCapacity) +{ + m_impl.allocateBuffer (newCapacity); +} +template < typename T, size_t inlineCapacity > + template < typename U > + inline void Vector < T, inlineCapacity >::append (const U & val) +{ + const U *ptr = &val; + if (size () == capacity ()) + ptr = expandCapacity (size () + 1, ptr); + new (end ())T (*ptr); +} + +class Range; +class TextIterator +{ +public: + explicit TextIterator (const Range *, + bool emitCharactersBetweenAllVisiblePositions = + false); + bool atEnd () const + { + } + void advance (); + int length () const + { + } +}; +UChar * +plainTextToMallocAllocatedBuffer (const Range * r, unsigned &bufferLength) +{ + static const unsigned cMaxSegmentSize = 1 << 16; + typedef pair < UChar *, unsigned >TextSegment; + Vector < TextSegment > *textSegments = 0; + Vector < UChar > textBuffer; + for (TextIterator it (r); !it.atEnd (); it.advance ()) + { + if (textBuffer.size () + && textBuffer.size () + it.length () > cMaxSegmentSize) + { + UChar *newSegmentBuffer = + static_cast < + UChar * >(malloc (textBuffer.size () * sizeof (UChar))); + if (!textSegments) + textSegments = new Vector < TextSegment >; + textSegments-> + append (make_pair (newSegmentBuffer, textBuffer.size ())); + textBuffer.clear (); + } + } +} diff --git a/gcc/testsuite/g++.dg/torture/pr34651.C b/gcc/testsuite/g++.dg/torture/pr34651.C new file mode 100644 index 000000000..2fce4d7a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr34651.C @@ -0,0 +1,25 @@ +/* { dg-do compile } */ + +typedef bool Bool; +struct CString { + CString (const char * =__null); + CString & operator += (const CString &); +}; +struct THotKey { + short Key; + Bool Control; + Bool Shift; + Bool Alt; +}; +THotKey m_HotKey; +THotKey GetHotKey () { return m_HotKey; } +void Serialize () +{ + THotKey inHotKey (GetHotKey()); + CString outCombinaison (inHotKey.Control + ? ((inHotKey.Alt || inHotKey.Shift) + ? "ctrl+" : "ctrl") + : __null); + outCombinaison += inHotKey.Alt ? inHotKey.Shift ? "alt+" : "alt" : ""; + outCombinaison += inHotKey.Shift ? "shift" : ""; +} diff --git a/gcc/testsuite/g++.dg/torture/pr34850.C b/gcc/testsuite/g++.dg/torture/pr34850.C new file mode 100644 index 000000000..4f630f837 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr34850.C @@ -0,0 +1,75 @@ +/* { dg-do compile } */ +/* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */ + +typedef unsigned char uint8_t; +typedef unsigned int uint32_t; +typedef uint8_t byte; +typedef uint32_t u32bit; +__extension__ typedef __SIZE_TYPE__ size_t; +extern "C" { + extern void __warn_memset_zero_len (void) __attribute__((__warning__ (""))); + extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__, __artificial__)) + void * memset (void *__dest, int __ch, size_t __len) throw () { + if (__builtin_constant_p (__len) && __len == 0) + __warn_memset_zero_len (); /* { dg-warning "declared with attribute warning" } */ + } +} +inline void clear_mem(void* ptr, u32bit n) { + memset(ptr, 0, n); +} +template<typename T> class MemoryRegion { +public: + u32bit size() const { + } + const T* begin() const { + } + void set(const T in[], u32bit n) { + create(n); + } + void set(const MemoryRegion<T>& in) { + set(in.begin(), in.size()); + } + void clear() { + clear_mem(buf, allocated); + } + void create(u32bit); + MemoryRegion() { + used = allocated = 0; + } + mutable T* buf; + mutable u32bit used; + mutable u32bit allocated; +}; +template<typename T> void MemoryRegion<T>::create(u32bit n) { + if(n <= allocated) { + clear(); + } +} +template<typename T> class SecureVector : public MemoryRegion<T> { +public: + SecureVector<T>& operator=(const MemoryRegion<T>& in) { + if(this != &in) set(in); + } +}; +class OctetString { +public: + SecureVector<byte> bits_of() const { + } + OctetString& operator^=(const OctetString&); + void change(const MemoryRegion<byte>& in) { + bits = in; + } + OctetString(const MemoryRegion<byte>& in) { + change(in); + } + SecureVector<byte> bits; +}; +OctetString& OctetString::operator^=(const OctetString& k) { + if(&k == this) { + bits.clear(); + } +} +bool __attribute__((flatten)) +operator==(const OctetString& s1, const OctetString& s2) { + return (s1.bits_of() == s2.bits_of()); +} diff --git a/gcc/testsuite/g++.dg/torture/pr34953.C b/gcc/testsuite/g++.dg/torture/pr34953.C new file mode 100644 index 000000000..5d7b38c92 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr34953.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-w" } */ + +void B_CLEAR(void* ret); +void B_NeverReturns(void* ret) __attribute__((noreturn)); + +int main() +{ + const struct AutoErrPop { ~AutoErrPop() { } } AutoErrPopper = { }; + B_NeverReturns(0); +} + +void B_NeverReturns(void* ret) +{ + B_CLEAR(ret); /* Never returns (does a setjmp/goto) */ +} + diff --git a/gcc/testsuite/g++.dg/torture/pr35164-1.C b/gcc/testsuite/g++.dg/torture/pr35164-1.C new file mode 100644 index 000000000..1704c2226 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr35164-1.C @@ -0,0 +1,69 @@ +typedef __SIZE_TYPE__ size_t; +template<typename _Iterator, typename _Container> class __normal_iterator { +public: + const _Iterator& base() const; +}; +template<typename _BI1, typename _BI2> inline +void copy_backward(_BI1 __first, _BI1 __last, _BI2 __result) { + while (__first != __last) *--__result = *--__last; +} +template<typename _Tp> struct _Vector_base { + struct _Vector_impl { _Tp* _M_finish; }; + _Vector_impl _M_impl; +}; +template<typename _Tp > class vector : protected _Vector_base<_Tp> { + typedef vector<_Tp> vector_type; + typedef _Tp * pointer; + typedef _Tp & reference; + typedef __normal_iterator<pointer, vector_type> iterator; + typedef size_t size_type; +public: + iterator end(); + void resize(size_type __new_size) { insert(end(), __new_size); } + reference operator[](size_type __n); + void insert(iterator __position, size_type __n) + { + pointer __old_finish(this->_M_impl._M_finish); + copy_backward(__position.base(), __old_finish - __n, __old_finish); + } +}; +struct A { + virtual ~A (); + void incRef (); + void decRef (); +}; +struct C : public A { + static C *alloc (); +}; +template <class T> struct B { + B () : ptr (T::alloc ()) { } + B (T *a_ptr) : ptr (a_ptr) { } + ~B () { decRef (); } + B& operator= (const B<T>& a) { if (a.get () != this->get ()) { decRef (); +incRef (); } } + template<class U> operator B<U> () const { return B<U> (ptr); } + T* operator-> () const { } + T* get () const { return ptr; } + void decRef () const { if (ptr != 0) ptr->decRef (); } + void incRef () const { if (ptr != 0) ptr->incRef (); } + T *ptr; +}; +struct D : public C { + template <class T> inline void foo (const B<T> & x) { d.resize (1); d[0] = x; +} + vector<B <C> > d; +}; +struct E : public C { + static E *alloc (); +}; +struct F : public D { + static F *alloc (); +}; +void foo (vector<B<D> > & x) { + for (int i = 0; i < 2; ++i) + { + B<F> l; + B<E> m; + l->foo (m); + } +} diff --git a/gcc/testsuite/g++.dg/torture/pr35164-2.C b/gcc/testsuite/g++.dg/torture/pr35164-2.C new file mode 100644 index 000000000..463cad7f7 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr35164-2.C @@ -0,0 +1,27 @@ +struct __shared_count { + __shared_count() { _M_pi = new int; } + int * _M_pi; +}; +template<typename _Tp> +class __shared_ptr { +public: + __shared_ptr(_Tp* __p); + void reset(int * __p) { + __shared_ptr(__p).swap(*this); + } + void swap(__shared_ptr<_Tp>& __other) { + __other._M_refcount._M_pi = _M_refcount._M_pi; + } + __shared_count _M_refcount; +}; +template<typename _Tp> class shared_ptr : public __shared_ptr<_Tp> {}; +int main() { + for (shared_ptr<int> *iter;;) + { + try { + (iter++)->reset(new int); + } + catch (...) { + } + } +} diff --git a/gcc/testsuite/g++.dg/torture/pr35400.C b/gcc/testsuite/g++.dg/torture/pr35400.C new file mode 100644 index 000000000..021135df8 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr35400.C @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-Wtype-limits" } */ + +struct A +{ + A(); + ~A(); +}; + +void foo() +{ + A x[1]; +} diff --git a/gcc/testsuite/g++.dg/torture/pr35526.C b/gcc/testsuite/g++.dg/torture/pr35526.C new file mode 100644 index 000000000..d0a8e6d2c --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr35526.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ + +extern void *memcpy (void *__dest, __const void *__src, __SIZE_TYPE__ __n); + +char internal_crash_read_ip[] = { 0xb8 }; + +struct u_internal_crash_read_t +{ + char ip[sizeof (internal_crash_read_ip)]; +} +u_internal_crash_read; + +void +gSignalHandler (int psignalNr, int pinfo, int pctx) +{ + memcpy (u_internal_crash_read.ip, internal_crash_read_ip, + sizeof (internal_crash_read_ip)); +} diff --git a/gcc/testsuite/g++.dg/torture/pr36191.C b/gcc/testsuite/g++.dg/torture/pr36191.C new file mode 100644 index 000000000..175707d1b --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr36191.C @@ -0,0 +1,17 @@ +// PR c++/36191 +// { dg-do compile } +// { dg-options "-fnon-call-exceptions" } +// { dg-skip-if "Frame pointer required for unwind tables" { m68k*-*-* fido*-*-* } "-fomit-frame-pointer" "" } + +__complex__ double +foo (__complex__ double x, double y) +{ + try + { + return x / y; + } + catch (char *s) + { + return x; + } +} diff --git a/gcc/testsuite/g++.dg/torture/pr36444.C b/gcc/testsuite/g++.dg/torture/pr36444.C new file mode 100644 index 000000000..ae639e25d --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr36444.C @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-msse" { target { i?86-*-* x86_64-*-* } } } */ +#define vector __attribute__((vector_size(16) )) +struct struct1 { + union {} vmx; + struct struct2 { + struct2(const struct2& r) {} + } w; +} __attribute__((aligned(16))); +struct struct3 { + vector float vmx; + operator const struct1& () const{ + return *reinterpret_cast<const struct1*>(this); + } +}; +struct3 func3( struct3 V1); +struct3 func2( void ); +void func1( ) { + struct1 vVec = func2() ; + func3 ( (struct3&)vVec ); +} + diff --git a/gcc/testsuite/g++.dg/torture/pr36445.C b/gcc/testsuite/g++.dg/torture/pr36445.C new file mode 100644 index 000000000..56642e9ec --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr36445.C @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-msse" { target { i?86-*-* x86_64-*-* } } } */ +// This used to fail as we would try to expand a VCE where one side had +// a mode of BLKmode and the other side was a vector mode. +#define vector __attribute__((vector_size(16) )) +struct struct1 { + union { float a[3]; } vmx; + struct struct2 { + struct2(const struct2& r) {} + } w; +} __attribute__((aligned(16))); +struct struct3 { + vector float vmx; + operator const struct1& () const{ + return *reinterpret_cast<const struct1*>(this); + } +}; +struct3 func3( struct3 V1); +struct3 func2( void ); +void func1( ) { + struct1 vVec = func2() ; + func3 ( (struct3&)vVec ); +} diff --git a/gcc/testsuite/g++.dg/torture/pr36745.C b/gcc/testsuite/g++.dg/torture/pr36745.C new file mode 100644 index 000000000..53845aaa7 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr36745.C @@ -0,0 +1,122 @@ +/* PR target/36745 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fPIC" } */ +/* { dg-require-effective-target fpic } */ + +typedef __SIZE_TYPE__ size_t; +class QBasicAtomicInt +{ +public: + int _q_value; + inline bool operator== (int value) const + { + } + bool ref (); + bool deref (); +}; +inline bool +QBasicAtomicInt::ref () +{ + __asm__ ("": "=m" (_q_value): :); + return true; +} + +namespace std +{ + using::size_t; +} +extern "C++" +{ + inline void *operator new (std::size_t, void *__p) + { + return __p; + } +} +struct QMapData +{ + QBasicAtomicInt ref; + static QMapData shared_null; +}; +template < class Key, class T > class QMap +{ + QMapData *d; +public: inline QMap ():d (&QMapData::shared_null) + { + } + inline ~ QMap () + { + if (!d->ref.deref ()) + freeData (d); + } + void freeData (QMapData * d); +}; +struct QVectorData +{ + QBasicAtomicInt ref; + static QVectorData shared_null; +}; +template < typename T > struct QVectorTypedData +{ + QBasicAtomicInt ref; +}; +template < typename T > class QVector +{ + union + { + QVectorData *p; + QVectorTypedData < T > *d; + }; +public: inline QVector ():p (&QVectorData::shared_null) + { + d->ref.ref (); + } + inline void detach () + { + if (d->ref == 1) + detach_helper (); + } + inline T *data () + { + detach (); + } + T & operator[](int i); + void detach_helper (); + void realloc (); +}; +template < typename T > void QVector < T >::detach_helper () +{ + realloc (); +} + +template < typename T > inline T & QVector < T >::operator[](int i) +{ + return data ()[i]; +} +template < typename T > void QVector < T >::realloc () +{ + T *j, *i; + i->~T (); + while (j-- == i) + new (j) T; +} + +void +mergeInto (QVector < int >*a) +{ +}; +struct QRegExpAutomatonState +{ + QVector < int >outs; + QMap < int, int >reenter; + QMap < int, int >anchors; +}; +class QRegExpEngine +{ + void addCatTransitions (); + QVector < QRegExpAutomatonState > s; +}; +void +QRegExpEngine::addCatTransitions () +{ + mergeInto (&s[2].outs); +} diff --git a/gcc/testsuite/g++.dg/torture/pr36826.C b/gcc/testsuite/g++.dg/torture/pr36826.C new file mode 100644 index 000000000..436220ba8 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr36826.C @@ -0,0 +1,166 @@ +template <class T> T CoinMax(register const T x1, register const T x2); +template <class T> T CoinMin(register const T x1, register const T x2); +class CoinIndexedVector; +class ClpModel { +protected: + double objectiveScale_; + double rhsScale_; + int numberRows_; + int numberColumns_; + double * rowActivity_; + double * columnActivity_; + double * dual_; + double * reducedCost_; + double* rowLower_; + double* rowUpper_; + double * rowObjective_; + double * columnLower_; + double * columnUpper_; + double * rowScale_; + double * columnScale_; + double * inverseRowScale_; + double * inverseColumnScale_; + int problemStatus_; + int secondaryStatus_; +}; +class ClpSimplex : public ClpModel { + void deleteRim(int getRidOfFactorizationData=2); + double upperOut_; + double dualTolerance_; + double primalTolerance_; + double * rowLowerWork_; + double * columnLowerWork_; + double * rowUpperWork_; + double * columnUpperWork_; + double * rowObjectiveWork_; + CoinIndexedVector * columnArray_[6]; + double * reducedCostWork_; + double * rowActivityWork_; + double * columnActivityWork_; + ClpSimplex * auxiliaryModel_; +}; +class CoinIndexedVector { +public: + void clear(); +}; +void ClpSimplex::deleteRim(int getRidOfFactorizationData) +{ + int numberRows=numberRows_; + int numberColumns=numberColumns_; + int i; + int numberPrimalScaled=0; + int numberPrimalUnscaled=0; + int numberDualScaled=0; + int numberDualUnscaled=0; + double scaleC = 1.0/objectiveScale_; + double scaleR = 1.0/rhsScale_; + if (!inverseColumnScale_) { + for (i=0; i<numberColumns; i++) + { + double scaleFactor = columnScale_[i]; + double valueScaled = columnActivityWork_[i]; + double lowerScaled = columnLowerWork_[i]; + double upperScaled = columnUpperWork_[i]; + if (lowerScaled>-1.0e20||upperScaled<1.0e20) { + if (valueScaled<lowerScaled-primalTolerance_|| valueScaled>upperScaled+primalTolerance_) + numberPrimalScaled++; + else + upperOut_ = CoinMax(upperOut_,CoinMin(valueScaled-lowerScaled,upperScaled-valueScaled)); + } + columnActivity_[i] = valueScaled*scaleFactor*scaleR; + double value = columnActivity_[i]; + if (value<columnLower_[i]-primalTolerance_) + numberPrimalUnscaled++; + else if (value>columnUpper_[i]+primalTolerance_) + numberPrimalUnscaled++; + double valueScaledDual = reducedCostWork_[i]; + if (valueScaled>columnLowerWork_[i]+primalTolerance_&&valueScaledDual>dualTolerance_) + numberDualScaled++; + if (valueScaled<columnUpperWork_[i]-primalTolerance_&&valueScaledDual<-dualTolerance_) + numberDualScaled++; + reducedCost_[i] = (valueScaledDual*scaleC)/scaleFactor; + double valueDual = reducedCost_[i]; + if (value>columnLower_[i]+primalTolerance_&&valueDual>dualTolerance_) + numberDualUnscaled++; + if (value<columnUpper_[i]-primalTolerance_&&valueDual<-dualTolerance_) + numberDualUnscaled++; + } + for (i=0; i<numberRows; i++) + { + double scaleFactor = rowScale_[i]; + double valueScaled = rowActivityWork_[i]; + double lowerScaled = rowLowerWork_[i]; + double upperScaled = rowUpperWork_[i]; + if (lowerScaled>-1.0e20||upperScaled<1.0e20) { if (valueScaled<lowerScaled-primalTolerance_|| valueScaled>upperScaled+primalTolerance_) numberPrimalScaled++; else upperOut_ = CoinMax(upperOut_,CoinMin(valueScaled-lowerScaled,upperScaled-valueScaled)); } + rowActivity_[i] = (valueScaled*scaleR)/scaleFactor; + double value = rowActivity_[i]; + if (value<rowLower_[i]-primalTolerance_) numberPrimalUnscaled++; + else if (value>rowUpper_[i]+primalTolerance_) numberPrimalUnscaled++; + double valueScaledDual = dual_[i]+rowObjectiveWork_[i]; + ; + if (valueScaled>rowLowerWork_[i]+primalTolerance_&&valueScaledDual>dualTolerance_) numberDualScaled++; + if (valueScaled<rowUpperWork_[i]-primalTolerance_&&valueScaledDual<-dualTolerance_) numberDualScaled++; + dual_[i] *= scaleFactor*scaleC; + double valueDual = dual_[i]; + if (rowObjective_) valueDual += rowObjective_[i]; + if (value>rowLower_[i]+primalTolerance_&&valueDual>dualTolerance_) numberDualUnscaled++; + if (value<rowUpper_[i]-primalTolerance_&&valueDual<-dualTolerance_) numberDualUnscaled++; + } + } + const double * inverseScale = inverseColumnScale_; + for (i=0; i<numberColumns; i++) + { + double scaleFactor = columnScale_[i]; + double valueScaled = columnActivityWork_[i]; + double lowerScaled = columnLowerWork_[i]; + double upperScaled = columnUpperWork_[i]; + if (lowerScaled>-1.0e20||upperScaled<1.0e20) { if (valueScaled<lowerScaled-primalTolerance_|| valueScaled>upperScaled+primalTolerance_) numberPrimalScaled++; else upperOut_ = CoinMax(upperOut_,CoinMin(valueScaled-lowerScaled,upperScaled-valueScaled)); } + columnActivity_[i] = valueScaled*scaleFactor*scaleR; + double value = columnActivity_[i]; + if (value<columnLower_[i]-primalTolerance_) numberPrimalUnscaled++; + else if (value>columnUpper_[i]+primalTolerance_) numberPrimalUnscaled++; + double valueScaledDual = reducedCostWork_[i]; + if (valueScaled>columnLowerWork_[i]+primalTolerance_&&valueScaledDual>dualTolerance_) numberDualScaled++; + if (valueScaled<columnUpperWork_[i]-primalTolerance_&&valueScaledDual<-dualTolerance_) numberDualScaled++; + reducedCost_[i] = (valueScaledDual*scaleC)*inverseScale[i]; + double valueDual = reducedCost_[i]; + if (value>columnLower_[i]+primalTolerance_&&valueDual>dualTolerance_) numberDualUnscaled++; + if (value<columnUpper_[i]-primalTolerance_&&valueDual<-dualTolerance_) numberDualUnscaled++; + } + inverseScale = inverseRowScale_; + for (i=0; i<numberRows; i++) + { + double scaleFactor = rowScale_[i]; + double valueScaled = rowActivityWork_[i]; + double lowerScaled = rowLowerWork_[i]; + double upperScaled = rowUpperWork_[i]; + if (lowerScaled>-1.0e20||upperScaled<1.0e20) { if (valueScaled<lowerScaled-primalTolerance_|| valueScaled>upperScaled+primalTolerance_) numberPrimalScaled++; else upperOut_ = CoinMax(upperOut_,CoinMin(valueScaled-lowerScaled,upperScaled-valueScaled)); } + rowActivity_[i] = (valueScaled*scaleR)*inverseScale[i]; + double value = rowActivity_[i]; + if (value<rowLower_[i]-primalTolerance_) numberPrimalUnscaled++; + else if (value>rowUpper_[i]+primalTolerance_) numberPrimalUnscaled++; + double valueScaledDual = dual_[i]+rowObjectiveWork_[i]; + ; + if (valueScaled>rowLowerWork_[i]+primalTolerance_&&valueScaledDual>dualTolerance_) numberDualScaled++; + if (valueScaled<rowUpperWork_[i]-primalTolerance_&&valueScaledDual<-dualTolerance_) numberDualScaled++; + dual_[i] *= scaleFactor*scaleC; + double valueDual = dual_[i]; + if (rowObjective_) valueDual += rowObjective_[i]; + if (value>rowLower_[i]+primalTolerance_&&valueDual>dualTolerance_) numberDualUnscaled++; + if (value<rowUpper_[i]-primalTolerance_&&valueDual<-dualTolerance_) numberDualUnscaled++; + } + if (numberPrimalUnscaled) { + if (numberDualUnscaled) + secondaryStatus_=4; + else + secondaryStatus_=2; + } + if (numberDualUnscaled) + secondaryStatus_=3; + int iRow,iColumn; + for (iRow=0; iRow<4; iRow++) + ; + for (iColumn=0; iColumn<2; iColumn++) + if (columnArray_[iColumn]) + columnArray_[iColumn]->clear(); +} diff --git a/gcc/testsuite/g++.dg/torture/pr36960.C b/gcc/testsuite/g++.dg/torture/pr36960.C new file mode 100644 index 000000000..280a6755d --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr36960.C @@ -0,0 +1,22 @@ +// { dg-do run } + +struct Lower { + const int& ref; + Lower(const int& ref) : ref(ref) { } +}; +struct Middle : public virtual Lower { + Middle(const int& ref) : Lower(ref) { } +}; +struct Upper : public Middle { + Upper(const int& ref) : Lower(ref), Middle(ref) { } + int get() { return ref; } +}; +extern "C" void abort (void); +int main() +{ + int i = 0; + Upper upper(i); + if (upper.get() != 0) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr37146-1.C b/gcc/testsuite/g++.dg/torture/pr37146-1.C new file mode 100644 index 000000000..ea65226f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr37146-1.C @@ -0,0 +1,83 @@ +// PR c++/37146 +// { dg-do run } + +extern "C" void abort (); +int a, b; +struct A { int i:8; int j:8; int k:16; int l:32; } c; + +void +f1 (int x, int y) +{ + (x ? a : b) = y; +} + +void +f2 (int x, int y) +{ + (x ? c.i : c.j) = y; +} + +void +f3 (int x, int y) +{ + (x ? c.i : a) = y; +} + +void +f4 (int x, int y) +{ + (x ? c.i : c.k) = y; +} + +void +f5 (int x, int y) +{ + (x ? c.l : b) = y; +} + +#define CHECK(var, exp) \ + do \ + { \ + if (var != exp) \ + abort (); \ + var = -1; \ + if (a != -1 \ + || b != -1 \ + || c.i != -1 \ + || c.j != -1 \ + || c.k != -1 \ + || c.l != -1) \ + abort (); \ + } \ + while (0) + +int +main () +{ + a = -1; + b = -1; + c.i = -1; + c.j = -1; + c.k = -1; + c.l = -1; + f1 (1, 264); + CHECK (a, 264); + f1 (0, 264); + CHECK (b, 264); + f2 (1, 112); + CHECK (c.i, 112); + f2 (0, 112); + CHECK (c.j, 112); + f3 (1, 26); + CHECK (c.i, 26); + f3 (0, 26); + CHECK (a, 26); + f4 (1, 107); + CHECK (c.i, 107); + f4 (0, 107); + CHECK (c.k, 107); + f5 (1, 95); + CHECK (c.l, 95); + f5 (0, 95); + CHECK (b, 95); +} diff --git a/gcc/testsuite/g++.dg/torture/pr37146-2.C b/gcc/testsuite/g++.dg/torture/pr37146-2.C new file mode 100644 index 000000000..2a5417694 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr37146-2.C @@ -0,0 +1,67 @@ +// PR c++/37146 +// { dg-do run } + +extern "C" void abort (); +int a, b; +struct A { int i:8; int j:8; int k:16; int l:32; } c; + +int +f1 (int x) +{ + return x ? a : b; +} + +int +f2 (int x) +{ + return x ? c.i : c.j; +} + +int +f3 (int x) +{ + return x ? c.i : a; +} + +int +f4 (int x) +{ + return x ? c.i : c.k; +} + +int +f5 (int x) +{ + return x ? c.l : b; +} + +int +main () +{ + a = 17; + b = 18; + c.i = 19; + c.j = 20; + c.k = 21; + c.l = 22; + if (f1 (1) != a) + abort (); + if (f1 (0) != b) + abort (); + if (f2 (1) != c.i) + abort (); + if (f2 (0) != c.j) + abort (); + if (f3 (1) != c.i) + abort (); + if (f3 (0) != a) + abort (); + if (f4 (1) != c.i) + abort (); + if (f4 (0) != c.k) + abort (); + if (f5 (1) != c.l) + abort (); + if (f5 (0) != b) + abort (); +} diff --git a/gcc/testsuite/g++.dg/torture/pr37343.C b/gcc/testsuite/g++.dg/torture/pr37343.C new file mode 100644 index 000000000..c4614f39f --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr37343.C @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +typedef enum RW { rwBitmapGrey, rwBitmapGrey16 } RW; +void FindDepth(RW); +void ParseDumpBitmap(RW kind, int maxfiles) +{ + static const RW normalTypes[] = { }; + const RW *bitmapTypes; + int i; + switch (kind) { + case rwBitmapGrey: + case rwBitmapGrey16: + bitmapTypes = &kind; + break; + default: + bitmapTypes = normalTypes; + } + for (i = 0; i < maxfiles; i++) + FindDepth(bitmapTypes[i]); +} diff --git a/gcc/testsuite/g++.dg/torture/pr37345.C b/gcc/testsuite/g++.dg/torture/pr37345.C new file mode 100644 index 000000000..5b49f5306 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr37345.C @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +class EbmlElement { + virtual EbmlElement * Clone() const; +}; +class KaxTracks : public EbmlElement { +public: + EbmlElement * Clone() const { + return new KaxTracks(*this); + } +}; +KaxTracks kax_tracks; +void finish_file(void) +{ + kax_tracks.Clone(); +} diff --git a/gcc/testsuite/g++.dg/torture/pr37354.C b/gcc/testsuite/g++.dg/torture/pr37354.C new file mode 100644 index 000000000..acdf29110 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr37354.C @@ -0,0 +1,14 @@ +/* { dg-do compile } */ + +class GenericClass; +struct AlsaDriver +{ + virtual int _read (unsigned nframes); +}; +typedef void (GenericClass::*GenericMemFuncType) (); +GenericMemFuncType m_pFunction; +void AlsaDriver1 () +{ + m_pFunction = reinterpret_cast < GenericMemFuncType > (&AlsaDriver::_read); +} + diff --git a/gcc/testsuite/g++.dg/torture/pr37421.C b/gcc/testsuite/g++.dg/torture/pr37421.C new file mode 100644 index 000000000..4b8447eac --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr37421.C @@ -0,0 +1,39 @@ +/* { dg-do compile } */ + +#include <stdio.h> +#include <string.h> + +inline int +bci (const float &source) +{ + int dest; + memcpy (&dest, &source, sizeof (dest)); + return dest; +} + +inline float +bcf (const int &source) +{ + float dest; + memcpy (&dest, &source, sizeof (dest)); + return dest; +} + +float +Foo () +{ + const int foo = bci (0.0f); + int bar = foo; + const int baz = foo & 1; + if (!baz && (foo & 2)) + bar = 0; + return bcf (bar); +} + +int +main () +{ + printf ("Foo() = %f\n", Foo()); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/torture/pr37456.C b/gcc/testsuite/g++.dg/torture/pr37456.C new file mode 100644 index 000000000..cf2021be2 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr37456.C @@ -0,0 +1,14 @@ +/* { dg-do compile } */ + +int zot(int); +struct bar { + ~bar() { } +}; +int x; +void doit(int a, int b, int c) +{ + bar pn; + int b1 = zot(a) * c; + int b2 = zot(b) * c; + x = b1 + b2; +} diff --git a/gcc/testsuite/g++.dg/torture/pr37716.C b/gcc/testsuite/g++.dg/torture/pr37716.C new file mode 100644 index 000000000..13b98d68a --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr37716.C @@ -0,0 +1,56 @@ +// PR tree-optimization/37716 +// { dg-do compile } + +struct A +{ + struct B + { + int a, b, c, d; + void *e[1]; + }; + B *d; + inline void **f1 (int i) const + { + return d->e + d->c + i; + } +}; + +template <typename T> +struct C +{ + struct D + { + void *v; + inline T & f3 () + { + return *reinterpret_cast <T *> (this); + } + }; + union + { + A p; + A::B *d; + }; + T & operator[](int i) + { + if (d->a != 1) + f2 (); + return reinterpret_cast <D *> (p.f1 (i))->f3 (); + } + void f2 (); + void f3 (int i, const T & t); +}; + +class E +{ + int e, f; +}; + +C <E> c; + +void +foo (int x) +{ + E e = c[x]; + c.f3 (x, e); +} diff --git a/gcc/testsuite/g++.dg/torture/pr37922.C b/gcc/testsuite/g++.dg/torture/pr37922.C new file mode 100644 index 000000000..a7d05ab0f --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr37922.C @@ -0,0 +1,502 @@ +// { dg-do run } +// { dg-options "-fpic" { target fpic } } + +typedef __SIZE_TYPE__ size_t; + +template <typename NumType> +inline +NumType +absolute(NumType const& x) +{ + if (x < NumType(0)) return -x; + return x; +} + +class trivial_accessor +{ + public: + typedef size_t index_type; + struct index_value_type {}; + + trivial_accessor() : size_(0) {} + + trivial_accessor(size_t const& n) : size_(n) {} + + size_t size_1d() const { return size_; } + + protected: + size_t size_; +}; + +namespace N0 +{ + template <typename ElementType, + typename AccessorType = trivial_accessor> + class const_ref + { + public: + typedef ElementType value_type; + typedef size_t size_type; + + typedef AccessorType accessor_type; + typedef typename accessor_type::index_type index_type; + typedef typename accessor_type::index_value_type index_value_type; + + const_ref() {} + + const_ref(const ElementType* begin, accessor_type const& accessor) + : begin_(begin), accessor_(accessor) + { + init(); + } + + const_ref(const ElementType* begin, index_value_type const& n0) + : begin_(begin), accessor_(n0) + { + init(); + } + + const_ref(const ElementType* begin, index_value_type const& n0, + index_value_type const& n1) + : begin_(begin), accessor_(n0, n1) + { + init(); + } + + const_ref(const ElementType* begin, index_value_type const& n0, + index_value_type const& n1, + index_value_type const& n2) + : begin_(begin), accessor_(n0, n1, n2) + { + init(); + } + + accessor_type const& accessor() const { return accessor_; } + size_type size() const { return size_; } + + const ElementType* begin() const { return begin_; } + const ElementType* end() const { return end_; } + + ElementType const& + operator[](size_type i) const { return begin_[i]; } + + const_ref<ElementType> + as_1d() const + { + return const_ref<ElementType>(begin_, size_); + } + + protected: + void + init() + { + size_ = accessor_.size_1d(); + end_ = begin_ + size_; + } + + const ElementType* begin_; + accessor_type accessor_; + size_type size_; + const ElementType* end_; + }; +} + +template <typename ElementType, + typename AccessorType = trivial_accessor> +class ref : public N0::const_ref<ElementType, AccessorType> +{ + public: + typedef ElementType value_type; + typedef size_t size_type; + + typedef N0::const_ref<ElementType, AccessorType> base_class; + typedef AccessorType accessor_type; + typedef typename accessor_type::index_type index_type; + + ref() {} + + ElementType* + begin() const { return const_cast<ElementType*>(this->begin_); } + + ElementType* + end() const { return const_cast<ElementType*>(this->end_); } + + ElementType& + operator[](size_type i) const { return begin()[i]; } +}; + +namespace N1 { + template <typename ElementType, size_t N> + class tiny_plain + { + public: + typedef ElementType value_type; + typedef size_t size_type; + + static const size_t fixed_size=N; + + ElementType elems[N]; + + tiny_plain() {} + + static size_type size() { return N; } + + ElementType* begin() { return elems; } + const ElementType* begin() const { return elems; } + ElementType* end() { return elems+N; } + const ElementType* end() const { return elems+N; } + ElementType& operator[](size_type i) { return elems[i]; } + ElementType const& operator[](size_type i) const { return elems[i]; } + }; + + template <typename ElementType, size_t N> + class tiny : public tiny_plain<ElementType, N> + { + public: + typedef ElementType value_type; + typedef size_t size_type; + + typedef tiny_plain<ElementType, N> base_class; + + tiny() {} + }; +} + +template <typename NumType> +class mat3 : public N1::tiny_plain<NumType, 9> +{ + public: + typedef typename N1::tiny_plain<NumType, 9> base_type; + + mat3() {} + mat3(NumType const& e00, NumType const& e01, NumType const& e02, + NumType const& e10, NumType const& e11, NumType const& e12, + NumType const& e20, NumType const& e21, NumType const& e22) + : base_type(e00, e01, e02, e10, e11, e12, e20, e21, e22) + {} + mat3(base_type const& a) + : base_type(a) + {} + + NumType const& + operator()(size_t r, size_t c) const + { + return this->elems[r * 3 + c]; + } + NumType& + operator()(size_t r, size_t c) + { + return this->elems[r * 3 + c]; + } + + NumType + trace() const + { + mat3 const& m = *this; + return m[0] + m[4] + m[8]; + } + + NumType + determinant() const + { + mat3 const& m = *this; + return m[0] * (m[4] * m[8] - m[5] * m[7]) + - m[1] * (m[3] * m[8] - m[5] * m[6]) + + m[2] * (m[3] * m[7] - m[4] * m[6]); + } +}; + +template <typename NumType> +inline +mat3<NumType> +operator-(mat3<NumType> const& v) +{ + mat3<NumType> result; + for(size_t i=0;i<9;i++) { + result[i] = -v[i]; + } + return result; +} + +class mat_grid : public N1::tiny<size_t, 2> +{ + public: + typedef N1::tiny<size_t, 2> index_type; + typedef index_type::value_type index_value_type; + + mat_grid() { this->elems[0]=0; this->elems[1]=0; } + + mat_grid(index_type const& n) : index_type(n) {} + + mat_grid(index_value_type const& n0, index_value_type const& n1) + { this->elems[0]=n0; this->elems[1]=n1; } + + size_t size_1d() const { return elems[0] * elems[1]; } + + size_t + operator()(index_value_type const& r, index_value_type const& c) const + { + return r * elems[1] + c; + } +}; + +template <typename NumType, typename AccessorType = mat_grid> +class mat_const_ref : public N0::const_ref<NumType, AccessorType> +{ + public: + typedef AccessorType accessor_type; + typedef typename N0::const_ref<NumType, AccessorType> base_type; + typedef typename accessor_type::index_value_type index_value_type; + + mat_const_ref() {} + + mat_const_ref(const NumType* begin, accessor_type const& grid) + : base_type(begin, grid) + {} + + mat_const_ref(const NumType* begin, index_value_type const& n_rows, + index_value_type const& n_columns) + : base_type(begin, accessor_type(n_rows, n_columns)) + {} + + accessor_type + grid() const { return this->accessor(); } + + index_value_type const& + n_rows() const { return this->accessor()[0]; } + + index_value_type const& + n_columns() const { return this->accessor()[1]; } + + NumType const& + operator()(index_value_type const& r, index_value_type const& c) const + { + return this->begin()[this->accessor()(r, c)]; + } +}; + +template <typename NumType, typename AccessorType = mat_grid> +class mat_ref : public mat_const_ref<NumType, AccessorType> +{ + public: + typedef AccessorType accessor_type; + typedef mat_const_ref<NumType, AccessorType> base_type; + typedef typename accessor_type::index_value_type index_value_type; + + mat_ref() {} + + mat_ref(NumType* begin, accessor_type const& grid) + : base_type(begin, grid) + {} + + mat_ref(NumType* begin, index_value_type n_rows, + index_value_type n_columns) + : base_type(begin, accessor_type(n_rows, n_columns)) + {} + + NumType* + begin() const { return const_cast<NumType*>(this->begin_); } + + NumType* + end() const { return const_cast<NumType*>(this->end_); } + + NumType& + operator[](index_value_type const& i) const { return begin()[i]; } + + NumType& + operator()(index_value_type const& r, index_value_type const& c) const + { + return this->begin()[this->accessor()(r, c)]; + } +}; + + template <typename AnyType> + inline void + swap(AnyType* a, AnyType* b, size_t n) + { + for(size_t i=0;i<n;i++) { + AnyType t = a[i]; a[i] = b[i]; b[i] = t; + } + } + +template <typename IntType> +size_t +form_t(mat_ref<IntType>& m, + mat_ref<IntType> const& t) +{ + typedef size_t size_t; + size_t mr = m.n_rows(); + size_t mc = m.n_columns(); + size_t tc = t.n_columns(); + if (tc) { + } + size_t i, j; + for (i = j = 0; i < mr && j < mc;) { + size_t k = i; while (k < mr && m(k,j) == 0) k++; + if (k == mr) + j++; + else { + if (i != k) { + swap(&m(i,0), &m(k,0), mc); + if (tc) swap(&t(i,0), &t(k,0), tc); + } + for (k++; k < mr; k++) { + IntType a = absolute(m(k, j)); + if (a != 0 && a < absolute(m(i,j))) { + swap(&m(i,0), &m(k,0), mc); + if (tc) swap(&t(i,0), &t(k,0), tc); + } + } + if (m(i,j) < 0) { + for(size_t ic=0;ic<mc;ic++) m(i,ic) *= -1; + if (tc) for(size_t ic=0;ic<tc;ic++) t(i,ic) *= -1; + } + bool cleared = true; + for (k = i+1; k < mr; k++) { + IntType a = m(k,j) / m(i,j); + if (a != 0) { + for(size_t ic=0;ic<mc;ic++) m(k,ic) -= a * m(i,ic); + if (tc) for(size_t ic=0;ic<tc;ic++) t(k,ic) -= a * t(i,ic); + } + if (m(k,j) != 0) cleared = false; + } + if (cleared) { i++; j++; } + } + } + m = mat_ref<IntType>(m.begin(), i, mc); + return i; +} + +template <typename IntType> +size_t +form(mat_ref<IntType>& m) +{ + mat_ref<IntType> t(0,0,0); + return form_t(m, t); +} + +typedef mat3<int> sg_mat3; + +class rot_mx +{ + public: + explicit + rot_mx(sg_mat3 const& m, int denominator=1) + : num_(m), den_(denominator) + {} + + sg_mat3 const& + num() const { return num_; } + sg_mat3& + num() { return num_; } + + int const& + operator[](size_t i) const { return num_[i]; } + int& + operator[](size_t i) { return num_[i]; } + + int + const& operator()(int r, int c) const { return num_(r, c); } + int& + operator()(int r, int c) { return num_(r, c); } + + int const& + den() const { return den_; } + int& + den() { return den_; } + + rot_mx + minus_unit_mx() const + { + rot_mx result(*this); + for (size_t i=0;i<9;i+=4) result[i] -= den_; + return result; + } + + rot_mx + operator-() const { return rot_mx(-num_, den_); } + + int + type() const; + + int + order(int type=0) const; + + private: + sg_mat3 num_; + int den_; +}; + +class rot_mx_info +{ + public: + rot_mx_info(rot_mx const& r); + + int type() const { return type_; } + + private: + int type_; +}; + +int rot_mx::type() const +{ + int det = num_.determinant(); + if (det == -1 || det == 1) { + switch (num_.trace()) { + case -3: return -1; + case -2: return -6; + case -1: if (det == -1) return -4; + else return 2; + case 0: if (det == -1) return -3; + else return 3; + case 1: if (det == -1) return -2; + else return 4; + case 2: return 6; + case 3: return 1; + } + } + return 0; +} + +int rot_mx::order(int type) const +{ + if (type == 0) type = rot_mx::type(); + if (type > 0) return type; + if (type % 2) return -type * 2; + return -type; +} + +rot_mx_info::rot_mx_info(rot_mx const& r) +: type_(r.type()) +{ + if (type_ == 0) { + return; + } + rot_mx proper_r = r; + int proper_order = type_; + // THE PROBLEM IS AROUND HERE + if (proper_order < 0) { + proper_order *= -1; + proper_r = -proper_r; // THIS FAILS ... + } + if (proper_order > 1) { + rot_mx rmi = proper_r.minus_unit_mx(); // ... THEREFORE WRONG HERE + mat_ref<int> re_mx(rmi.num().begin(), 3, 3); + if (form(re_mx) != 2) { + type_ = 0; + } + } +} + +int main() +{ + N1::tiny<int, 9> e; + e[0] = 1; e[1] = 0; e[2] = 0; + e[3] = 0; e[4] = -1; e[5] = 0; + e[6] = 0; e[7] = 0; e[8] = 1; + rot_mx r(e); + rot_mx_info ri(r); + if (ri.type() != -2) + __builtin_abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr38565.C b/gcc/testsuite/g++.dg/torture/pr38565.C new file mode 100644 index 000000000..8cd1e1d4b --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr38565.C @@ -0,0 +1,11 @@ +// { dg-do compile } +// Ignore warning on some powerpc-linux configurations. +// { dg-prune-output "non-standard ABI extension" } +#define vector __attribute__((vector_size(16) )) +vector unsigned int f(int a) +{ + vector unsigned int mask = a ? (vector unsigned int){ 0x80000000, 0x80000000, +0x80000000, 0x80000000 } : (vector unsigned int){0}; + return mask; +} + diff --git a/gcc/testsuite/g++.dg/torture/pr38705.C b/gcc/testsuite/g++.dg/torture/pr38705.C new file mode 100644 index 000000000..8058d3a39 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr38705.C @@ -0,0 +1,27 @@ +// PR c++/38705 +// { dg-do compile } + +typedef int T; +typedef __SIZE_TYPE__ size_t; +extern "C" void *memcpy (void *, const void *, size_t); + +void +foo (char *p, const int q) +{ + memcpy (p, &q, sizeof (int)); +} + +struct S +{ + T t; + int u; + int bar () const; + template <class T> void foo (const T &x) const {} +}; + +int +S::bar () const +{ + foo (u); + foo (t); +} diff --git a/gcc/testsuite/g++.dg/torture/pr38745.C b/gcc/testsuite/g++.dg/torture/pr38745.C new file mode 100644 index 000000000..4ad9d85fe --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr38745.C @@ -0,0 +1,36 @@ +/* { dg-do compile } */ + +union u_u16 +{ + unsigned short v; + struct + { + unsigned char lo8, hi8; + } __attribute__ ((__may_alias__)) u; +} __attribute__ ((__may_alias__)); +union u_u32 +{ + unsigned int v; + struct + { + u_u16 lo16, hi16; + } u; +} __attribute__ ((__may_alias__)); +union u_u64 +{ + struct + { + u_u32 lo32, hi32; + } u; +}; +struct Record +{ +}; +long long +UnpackFullKey (Record & rec, const char *&p) +{ + long long c64 = 0; + (*(u_u16 *) & (*(u_u32 *) & ( *(u_u64*)&c64).u.lo32.v).u.lo16.v).u.hi8 = 1; + return c64; +} + diff --git a/gcc/testsuite/g++.dg/torture/pr38747.C b/gcc/testsuite/g++.dg/torture/pr38747.C new file mode 100644 index 000000000..0f18a2f22 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr38747.C @@ -0,0 +1,19 @@ +/* { dg-do run } */ + +extern "C" void abort (void); +inline void *operator new (__SIZE_TYPE__, void *__p) throw () { return __p; } + +int __attribute__((noinline)) +foo(void) +{ + float f = 0; + int *i = new (&f) int (1); + return *(int *)&f; +} + +int main() +{ + if (foo() != 1) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr38811.C b/gcc/testsuite/g++.dg/torture/pr38811.C new file mode 100644 index 000000000..e9b304da6 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr38811.C @@ -0,0 +1,73 @@ +/* { dg-do compile } */ + +typedef unsigned long ULONG; +void iwos_ErrorMessage(long error, const char * const file_name, + ULONG line_num, const char * const message); +class AbcA2d { +public: + double x; + double y; + ~AbcA2d() { } +}; +enum AbcZyParamType { ABC_SP_1 }; +class AbcExtent2d { + AbcA2d m_vMin; + AbcA2d m_vMax; +public: + AbcExtent2d(const AbcA2d & rMin, const AbcA2d & rMax); + AbcA2d ClampPoint2d(const AbcA2d & rPoint) const; + AbcA2d GetMax() const { return m_vMax; } + AbcA2d GetMin() const { } + AbcA2d Evaluate(double dNormalizedX, double dNormalizedY) const; +}; +inline AbcExtent2d::AbcExtent2d(const AbcA2d & rMin, const AbcA2d & rMax) +{ + if (rMin.x > rMax.x || rMin.y > rMax.y) + { + long sErr = (1007); + if (sErr != 1000) + iwos_ErrorMessage(sErr,(const char * const)__null, + 0,(const char * const)__null); + } + else + { + m_vMin = rMin; + m_vMax = rMax; + } +} +inline AbcA2d AbcExtent2d::ClampPoint2d(const AbcA2d & rPoint) const +{ + AbcA2d sRet = rPoint; + if (rPoint.x < m_vMin.x) + sRet.x = m_vMin.x; + return sRet; +} +inline AbcA2d AbcExtent2d::Evaluate(double dNormalizedX, double dNormalizedY) +const +{ + AbcA2d sRet; + sRet.x = m_vMin.x + dNormalizedX * (m_vMax.x - m_vMin.x); + sRet.y = m_vMin.y + dNormalizedY * (m_vMax.y - m_vMin.y); + return ClampPoint2d(sRet); +} +class AbcAbcdTracer { + AbcExtent2d m_vUVDomain; + virtual long TestIsoAbcde(AbcZyParamType eZyParam, double dParam, + int & rbZyxIsSolution); + virtual int DoesPointLieOnAbcde(AbcA2d & rUV, int bRefinePoint) const; +}; +long AbcAbcdTracer::TestIsoAbcde(AbcZyParamType eZyParam, double dParam, + int & rbZyxIsSolution) +{ + AbcA2d sUV1(m_vUVDomain.GetMin()); + AbcA2d sUV2(m_vUVDomain.GetMax()); + AbcExtent2d sUVIso(sUV1,sUV2); + for (ULONG i=0; i<10; i++) + { + double dT = i / (10 -1.0); + AbcA2d sUV = sUVIso.Evaluate(dT,dT); + if (!DoesPointLieOnAbcde(sUV,0)) + ; + } +} + diff --git a/gcc/testsuite/g++.dg/torture/pr39002.C b/gcc/testsuite/g++.dg/torture/pr39002.C new file mode 100644 index 000000000..534d91dfa --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr39002.C @@ -0,0 +1,88 @@ +// PR target/39002 +// { dg-do run } + +struct S +{ + double x; + double y; + double z; +}; + +double foo (S *, S *); +void bar (S *, S *, S *, double &, double &, double &); + +double +foo (S *a1, S *a2) +{ + return __builtin_sqrt ((a1->x - a2->x) * (a1->x - a2->x) + + (a1->y - a2->y) * (a1->y - a2->y) + + (a1->z - a2->z) * (a1->z - a2->z)); +} + +void +bar (S *p, S *q, S *r, double &x, double &y, double &z) +{ + if (foo (p, q) == 0.0) + { + x = r->x; + y = r->y; + z = r->z; + return; + } + if (foo (p, r) == 0.0) + { + x = r->x; + y = r->y; + z = r->z; + return; + } + if (foo (q, r) == 0.0) + { + x = r->x; + y = r->y; + z = r->z; + return; + } + + double a1, b1, c1, d1, e1; + double dx, dy, dz, dw, dv; + + a1 = q->x - p->x; + b1 = q->y - p->y; + c1 = q->z - p->z; + e1 = __builtin_sqrt (a1 * a1 + b1 * b1 + c1 * c1); + a1 = a1 / e1; + b1 = b1 / e1; + c1 = c1 / e1; + dx = p->x - r->x; + dy = p->y - r->y; + dz = p->z - r->z; + dw = dx * dx + dy * dy + dz * dz; + dv = 2.0 * dx * a1 + 2.0 * dy * b1 + 2.0 * dz * c1; + d1 = -dv / 2.0; + x = p->x + (a1 * d1); + y = p->y + (b1 * d1); + z = p->z + (c1 * d1); + return; +} + +int +main (void) +{ + S a, b, c, d, *p, *q, *r; + + p = &a; + q = &b; + r = &c; + a.x = 0.0; + a.y = 0.0; + a.z = 0.0; + b.x = 1.0; + b.y = 0.0; + b.z = 0.0; + c.x = 0.0; + c.y = 1.0; + c.z = 0.0; + bar (p, q, r, d.x, d.y, d.z); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr39259.C b/gcc/testsuite/g++.dg/torture/pr39259.C new file mode 100644 index 000000000..256181fa6 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr39259.C @@ -0,0 +1,40 @@ +// PR tree-optimization/39259 +// { dg-do compile } +// { dg-options "-O2" } + + +extern "C" int __mysetjmp () __attribute__ ((__returns_twice__)); + +class TContStatus {}; + +class TContEvent +{ +public: + inline void Execute () throw(); +}; + +class TCont +{ +public: + TContStatus ReadD (void* buf, int deadline) + { + TContEvent event; + event.Execute (); + return TContStatus(); + } + TContStatus ReadI (void *buf) + { + return ReadD (buf, 1); + } +}; + +void TContEvent::Execute () throw () +{ + __mysetjmp(); +} + +void Broken (TCont *mCont) +{ + mCont->ReadI(0); + mCont->ReadI(0); +} diff --git a/gcc/testsuite/g++.dg/torture/pr39362.C b/gcc/testsuite/g++.dg/torture/pr39362.C new file mode 100644 index 000000000..fb23439f5 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr39362.C @@ -0,0 +1,105 @@ +/* { dg-do compile } */ + +void *fastMalloc (int n); +void fastFree (void *p); +template <class T> struct C +{ + void deref () { delete static_cast <T *>(this); } +}; +template <typename T> +struct D +{ + D (T *ptr) : m_ptr (ptr) { } + ~D () { if (T * ptr = m_ptr) ptr->deref (); } + T *operator-> () const; + T *m_ptr; + typedef T *UnspecifiedBoolType; + operator UnspecifiedBoolType () const; +}; +template <typename T> struct E +{ + static void destruct (T * begin, T * end) + { + for (T * cur = begin; cur != end; ++cur) + cur->~T (); + } +}; +template <typename T> class F; +template <typename T> struct G +{ + static void destruct (T * begin, T * end) + { + E <T>::destruct (begin, end); + } + static void uninitializedFill (T * dst, T * dstEnd, const T & val) + { + F<T>::uninitializedFill (dst, dstEnd, val); + } +}; +template <typename T> struct H +{ + void allocateBuffer (int newCapacity) + { + m_buffer = static_cast <T *>(fastMalloc (newCapacity * sizeof (T))); + } + void deallocateBuffer (T * bufferToDeallocate) + { + if (m_buffer == bufferToDeallocate) + fastFree (bufferToDeallocate); + } + T *buffer () { } + int capacity () const { } + T *m_buffer; +}; +template <typename T, int cap> class I; +template <typename T> struct I <T, 0> : H <T> +{ + I (int capacity) { allocateBuffer (capacity); } + ~I () { deallocateBuffer (buffer ()); } + using H <T>::allocateBuffer; + H <T>::buffer; +}; +template <typename T, int cap = 0> struct J +{ + typedef T *iterator; + ~J () { if (m_size) shrink (0); } + J (const J &); + int capacity () const { m_buffer.capacity (); } + T & operator[](int i) { } + iterator begin () { } + iterator end () { return begin () + m_size; } + void shrink (int size); + template <typename U> void append (const U &); + int m_size; + I <T, cap> m_buffer; +}; +template <typename T, int cap> +J <T, cap>::J (const J & other) : m_buffer (other.capacity ()) +{ +} +template <typename T, int cap> +void J <T, cap>::shrink (int size) +{ + G <T>::destruct (begin () + size, end ()); + m_size = size; +} +struct A : public C <A> +{ + virtual ~A (); + typedef J <D <A> > B; + virtual A *firstChild () const; + virtual A *nextSibling () const; + virtual const B & children (int length); + B m_children; +}; +const A::B & +A::children (int length) +{ + for (D <A> obj = firstChild (); obj; obj = obj->nextSibling ()) + { + B children = obj->children (2); + for (unsigned i = 0; i <length; ++i) + m_children.append (children[i]); + } +} + diff --git a/gcc/testsuite/g++.dg/torture/pr39417.C b/gcc/testsuite/g++.dg/torture/pr39417.C new file mode 100644 index 000000000..b7bbb88b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr39417.C @@ -0,0 +1,56 @@ +// { dg-do run } + +#include <vector> + +std::vector <int> +sequence(int l, int n) +{ + std::vector <int> ret; + for(int i=n;i<=100;i++) + { + if(i%2==0) + { + if(l%i==i/2) + { + int init =l/i-i/2+1; + if(init>=0) + { + for(int j=0;j<i;j++) + { + ret.push_back(init); + init ++; + } + break; + } + } + } + else + { + if(l%i==0) + { + int init =l/i-i/2; + if(init>=0) + { + for(int j=0;j<i;j++) + { + ret.push_back(init); + init ++; + } + break; + } + } + } + } + return ret; +} +extern "C" void abort (void); +int main() +{ + std::vector<int> res = sequence(18, 2); + if (res.size () != 3 + || res[0] != 5 + || res[1] != 6 + || res[2] != 7) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr39678.C b/gcc/testsuite/g++.dg/torture/pr39678.C new file mode 100644 index 000000000..a7c120ad4 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr39678.C @@ -0,0 +1,26 @@ +/* PR target/39678 */ +/* { dg-do run } */ +/* { dg-options "-Wno-psabi" } */ +struct Y {}; +struct X { + struct Y y; + __complex__ float val; +}; + +struct X __attribute__((noinline)) +foo (float *p) +{ + struct X x; + __real x.val = p[0]; + __imag x.val = p[1]; + return x; +} +extern "C" void abort (void); +float a[2] = { 3., -2. }; +int main() +{ + struct X x = foo(a); + if (__real x.val != 3. || __imag x.val != -2.) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr39713.C b/gcc/testsuite/g++.dg/torture/pr39713.C new file mode 100644 index 000000000..4ff72d1a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr39713.C @@ -0,0 +1,25 @@ +/* { dg-do compile } */ + +template <typename To, typename From> +static inline To +bitwise_cast (From from) +{ + union + { + From f; + To t; + } u; + u.f = from; + return u.t; +} + +extern void foo (unsigned char *); + +double +bar () +{ + unsigned char b[sizeof (unsigned long long)]; + foo (b); + return bitwise_cast<double> (*(unsigned long long *) b); +} + diff --git a/gcc/testsuite/g++.dg/torture/pr39732.C b/gcc/testsuite/g++.dg/torture/pr39732.C new file mode 100644 index 000000000..418417587 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr39732.C @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-fprofile-generate" } */ + +template<class _CharT> struct char_traits; +template<typename _OI> +_OI __copy_move_a2(_OI __result); +template<typename _OI> inline _OI +copy(_OI __result) +{ + return __copy_move_a2 (__result); +} +template<typename _CharT, typename _Traits> +class basic_ostream { }; +template<typename _Tp, typename _CharT = char, typename _Traits = char_traits<_CharT> > +class ostream_iterator { + typedef basic_ostream<_CharT, _Traits> ostream_type; + ostream_type* _M_stream; + const _CharT* _M_string; +public: + ostream_iterator(ostream_type& __s, const _CharT* __c) + : _M_stream(&__s), _M_string(__c) { } + ostream_iterator(const ostream_iterator& __obj) + : _M_stream(__obj._M_stream), _M_string(__obj._M_string) { } +}; +int f(void) +{ + basic_ostream<char, char_traits<char> > os; + copy(ostream_iterator<const int>(os, ",")); +} diff --git a/gcc/testsuite/g++.dg/torture/pr39764.C b/gcc/testsuite/g++.dg/torture/pr39764.C new file mode 100644 index 000000000..a89013313 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr39764.C @@ -0,0 +1,14 @@ +/* { dg-do compile } */ + +class A; +class B { }; +extern const double NaN; +B foo(A* exec, double d); +inline B baz(A* a) { + return foo(a, NaN); +} +B bar(A* a) { + return baz(a); +} +extern const double NaN = (__builtin_nanf("")); + diff --git a/gcc/testsuite/g++.dg/torture/pr40081.C b/gcc/testsuite/g++.dg/torture/pr40081.C new file mode 100644 index 000000000..e65c5a843 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr40081.C @@ -0,0 +1,16 @@ +struct Atomic_t { + Atomic_t(int i) : val(i) { } + volatile int val; +}; +class RefCount { +public: + RefCount(Atomic_t c) : m_count(c) { } + Atomic_t m_count; +}; +class IntrusiveCountableBase { + RefCount m_useCount; +protected: + IntrusiveCountableBase(); +}; +IntrusiveCountableBase::IntrusiveCountableBase() : m_useCount(0) { } + diff --git a/gcc/testsuite/g++.dg/torture/pr40102.C b/gcc/testsuite/g++.dg/torture/pr40102.C new file mode 100644 index 000000000..49f56b5bc --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr40102.C @@ -0,0 +1,41 @@ +/* { dg-do compile } */ +bool foo0(int) { return true; } + +bool foo1(); + +struct A +{ + A(); + ~A(); + + template<typename T> void bar1(T f) + { + if (f(0)) + foo1(); + } + + template<typename T> void bar2(T); +}; + +template<typename T> void A::bar2(T f) +{ + A a, b[1], *p; + + while (foo1()) + { + if (p) + ++p; + if (p && foo1()) + bar1(f); + if (p) + ++p; + } + + if (foo1()) + bar1(f); +} + +void baz() +{ + A().bar2(foo0); +} diff --git a/gcc/testsuite/g++.dg/torture/pr40321.C b/gcc/testsuite/g++.dg/torture/pr40321.C new file mode 100644 index 000000000..917743109 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr40321.C @@ -0,0 +1,25 @@ +/* { dg-do compile } */ + +struct VectorD2 +{ + VectorD2() : x(0), y(0) { } + VectorD2(int _x, int _y) : x(_x), y(_y) { } + int x, y; + int GetLength2() const { return x*x + y*y; }; + VectorD2 operator+(const VectorD2 vec) const { + return VectorD2(x+vec.x,y+vec.y); + } +}; +struct Shape +{ + enum Type { ST_RECT, ST_CIRCLE } type; + VectorD2 pos; + VectorD2 radius; + bool CollisionWith(const Shape& s) const; +}; +bool Shape::CollisionWith(const Shape& s) const +{ + if(type == ST_CIRCLE && s.type == ST_RECT) + return s.CollisionWith(*this); + return (pos + s.pos).GetLength2() < (radius + s.radius).GetLength2(); +} diff --git a/gcc/testsuite/g++.dg/torture/pr40323.C b/gcc/testsuite/g++.dg/torture/pr40323.C new file mode 100644 index 000000000..c7ffcb5d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr40323.C @@ -0,0 +1,68 @@ +/* Testcase for PR 40323. */ +/* { dg-do compile } */ +/* { dg-options "-fno-early-inlining" } */ +/* { dg-add-options bind_pic_locally } */ + +extern void do_something (const char *, int); + +class Parent +{ +private: + const char *data; + +public: + Parent (const char *d) : data(d) + {} + + int funcOne (int delim) const; +}; + +class AnotherParent +{ +private: + double d; +public: + AnotherParent (void) : d(0) + {} +}; + + +class Child : public AnotherParent, Parent +{ +private: + int zzz; +public: + Child (const char *d) : Parent(d) + {} +}; + + +int Parent::funcOne (int delim) const +{ + int i; + for (i = 0; i < delim; i++) + do_something(data, i); + + return 1; +} + +int docalling (int (Child::* f)(int delim) const) +{ + Child S ("muhehehe"); + + return (S.*f)(4); +} + +typedef int (Parent::* my_mp_type)(int delim); + +int main (int argc, char *argv[]) +{ + int i; + int (Parent::* f)(int ) const; + int (Child::* g)(int ) const; + + f = &Parent::funcOne; + g = (int (Child::* )(int) const) f; + i = docalling (g); + return i; +} diff --git a/gcc/testsuite/g++.dg/torture/pr40335.C b/gcc/testsuite/g++.dg/torture/pr40335.C new file mode 100644 index 000000000..14ea95d40 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr40335.C @@ -0,0 +1,16 @@ +/* { dg-do run } */ + +extern "C" void abort (void); +int +main (void) +{ + int i = -1; + switch ((signed char) i) + { + case 255: /* { dg-bogus "exceeds maximum value" "" { xfail *-*-* } } */ + abort (); + default: + break; + } +} + diff --git a/gcc/testsuite/g++.dg/torture/pr40388.C b/gcc/testsuite/g++.dg/torture/pr40388.C new file mode 100644 index 000000000..63fbbfba5 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr40388.C @@ -0,0 +1,21 @@ +void foo(); + +struct A +{ + ~A() + { + try + { + foo(); + foo(); + } + catch (...) + { + } + } +}; + +void bar() +{ + A a1, a2; +} diff --git a/gcc/testsuite/g++.dg/torture/pr40389.C b/gcc/testsuite/g++.dg/torture/pr40389.C new file mode 100644 index 000000000..e3ceb1238 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr40389.C @@ -0,0 +1,84 @@ +/* { dg-do run } */ + +template <typename V> struct S +{ + V *f, *l; + __attribute__ ((noinline)) S (void) { f = 0, l = 0; } + void foo (V *x) + { + if (x->p != 0) + x->p->n = x->n; + else + f = x->n; + if (x->n != 0) + x->n->p = x->p; + else + l = x->p; + } + __attribute__ ((noinline)) void bar (V *x) + { + x->n = 0; + x->p = l; + if (l != 0) + l->n = x; + else + f = x; + l = x; + } +}; + +struct H; + +struct A +{ + S <H> k; +}; + +struct H +{ + A *a; + H *p, *n; + __attribute__ ((noinline)) H (void) { p = 0, n = 0, a = 0; } + __attribute__ ((noinline)) H (A *b) : a (b) + { + p = 0; + n = 0; + if (a != 0) + a->k.bar (this); + } + __attribute__ ((noinline)) H (const H &h) : a (h.a) + { + p = 0; + n = 0; + if (a != 0) + a->k.bar (this); + } + ~H (void) { if (a != 0) a->k.foo (this); } + H &operator= (const H &o) + { + if (a != 0 || &o == this) + __builtin_abort (); + a = o.a; + if (a != 0) + a->k.bar (this); + return *this; + } +}; + +__attribute__ ((noinline)) +H baz (void) +{ + return H (new A); +} + +H g; + +int +main (void) +{ + g = baz (); + if (g.a->k.f != &g) + __builtin_abort (); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/torture/pr40460.C b/gcc/testsuite/g++.dg/torture/pr40460.C new file mode 100644 index 000000000..1d54df72b --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr40460.C @@ -0,0 +1,9 @@ +/* { dg-do compile } */ + +void bar(int); +void foo(void) +{ + for (int i = 0; i<1; ++i) + bar (i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i); +} + diff --git a/gcc/testsuite/g++.dg/torture/pr40492.C b/gcc/testsuite/g++.dg/torture/pr40492.C new file mode 100644 index 000000000..cab9426d0 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr40492.C @@ -0,0 +1,26 @@ +typedef unsigned short ushort; +class QChar { +public: + QChar( const QChar& c ); + ushort ucs; +}; +inline QChar::QChar( const QChar& c ) : ucs( c.ucs ) { }; +class QString { }; +class KoAutoFormat { +public: + struct TypographicQuotes { QChar begin, end; }; + TypographicQuotes getConfigTypographicDoubleQuotes() const { + return m_typographicDoubleQuotes; + } + TypographicQuotes m_typographicDoubleQuotes; +}; +class KoAutoFormatDia { + QChar oDoubleBegin, oDoubleEnd; + KoAutoFormat * m_docAutoFormat; + bool noSignal; + void changeAutoformatLanguage(void); +}; +void KoAutoFormatDia::changeAutoformatLanguage(void) +{ + oDoubleEnd= m_docAutoFormat->getConfigTypographicDoubleQuotes().end; +} diff --git a/gcc/testsuite/g++.dg/torture/pr40642.C b/gcc/testsuite/g++.dg/torture/pr40642.C new file mode 100644 index 000000000..3f545a890 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr40642.C @@ -0,0 +1,26 @@ +// { dg-do compile } +// { dg-options "-fprofile-generate" } + +// GCC used to ICE with some EH edge missing. + +inline void* operator new(__SIZE_TYPE__, void* p) throw() { return p; } +inline void operator delete (void*, void*) throw() { } + +template<typename T> void foo(void* p, T t) +{ + new(p) T(t); +} + +void bar(); + +template<typename T> struct A +{ + T* p; + + A() { try { foo(p, T()); } catch(...) {} } + + A(const A&) { try { bar(); } catch(...) { throw; } } +}; + +A<A<int> > a; + diff --git a/gcc/testsuite/g++.dg/torture/pr40834.C b/gcc/testsuite/g++.dg/torture/pr40834.C new file mode 100644 index 000000000..67d302853 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr40834.C @@ -0,0 +1,52 @@ +/* { dg-do run } */ + +extern "C" void abort (void); +class XalanDOMString +{ +public: + int y; +}; + +class XObject +{ +public: + const XalanDOMString& str() const { return x; } + XalanDOMString x; +}; + +class XObjectPtr +{ +public: + XObjectPtr(const XObjectPtr& theSource) + { + m_xobjectPtr = theSource.m_xobjectPtr; + } + const XObject* operator->() const + { + return m_xobjectPtr; + }; + XObjectPtr(XObject *p) { m_xobjectPtr = p; } + XObject* m_xobjectPtr; +}; + +class FunctionSubstringBefore +{ +public: + int execute( const XObjectPtr arg1) const + { + const XalanDOMString& theFirstString = arg1->str(); + return theFirstString.y; + } +}; + +int +main () +{ + XObject x; + XObjectPtr y (&x); + x.x.y = -1; + FunctionSubstringBefore z; + if (z.execute (y) != -1) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr40924.C b/gcc/testsuite/g++.dg/torture/pr40924.C new file mode 100644 index 000000000..9140da3ba --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr40924.C @@ -0,0 +1,111 @@ +// PR rtl-optimization/40924 +// { dg-do run } + +extern "C" void abort (void); + +#define MAY_ALIAS __attribute__((__may_alias__)) + +typedef struct { float v[2]; } floata; +typedef struct { int v[2]; } inta; + +typedef unsigned int uint MAY_ALIAS; +typedef signed int sint MAY_ALIAS; +typedef float flt MAY_ALIAS; + +static inline unsigned short +less_than (inta a, inta b) +{ + unsigned short r = 0; + const uint *p1 = (const uint *) &a; + const uint *p2 = (const uint *) &b; + for (int i=0; i < 2; i++) + if (p1[i] < p2[i]) r |= (1 << i); + return r; +} + +static inline inta +multiply (inta b, inta c) +{ + inta r; + sint *p3 = (sint *) &c; + for (int i=0; i < 2; i++) + r.v[i] = (int) (b.v[i] * p3[i] & 0xFFFFFFFF); + return r; +} + +static inline floata +gather (inta indexes, const void *baseAddr) +{ + floata r; + + sint *idx = (sint *) &indexes; + flt *src = (flt *) baseAddr; + for (int i=0; i < 2; i++) + r.v[i] = *(src + idx[i]); + return r; +} + +static inline inta +add (const inta &b, const inta &c) +{ + inta result; + sint *r = (sint *) &result; + + for (int i=0; i < 2; i++) + r[i] = b.v[i] + c.v[i]; + return result; +} + +struct uintv +{ + inta data; + inline uintv () { data.v[0] = 0; data.v[1] = 1; } + inline uintv (unsigned int a) + { + for (int i=0; i < 2; i++) + *(uint *) &data.v[i] = a; + } + inline uintv (inta x) : data (x) {} + inline uintv operator* (const uintv &x) const + { return multiply (data, x.data); } + inline uintv operator+ (const uintv &x) const + { return uintv (add (data, x.data)); } + inline unsigned short operator< (const uintv &x) const + { return less_than (data, x.data); } +}; + +struct floatv +{ + floata data; + explicit inline floatv (const uintv &x) + { + uint *p2 = (uint *) &x.data; + for (int i=0; i < 2; i++) + data.v[i] = p2[i]; + } + inline floatv (const float *array, const uintv &indexes) + { + const uintv &offsets = indexes * uintv (1); + data = gather (offsets.data, array); + } + unsigned short operator== (const floatv &x) const + { + unsigned short r = 0; + for (int i=0; i < 2; i++) + if (data.v[i] == x.data.v[i]) r |= (1 << i); + return r; + } +}; + +int +main () +{ + const float array[2] = { 2, 3 }; + for (uintv i; (i < 2) == 3; i = i + 2) + { + const floatv ii (i + 2); + floatv a (array, i); + if ((a == ii) != 3) + abort (); + } +} diff --git a/gcc/testsuite/g++.dg/torture/pr40991.C b/gcc/testsuite/g++.dg/torture/pr40991.C new file mode 100644 index 000000000..c08124024 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr40991.C @@ -0,0 +1,113 @@ +/* { dg-options "-std=gnu++0x" } */ + +typedef __SIZE_TYPE__ size_t; +namespace std __attribute__ ((__visibility__ ("default"))) { + using ::size_t; + void __throw_bad_function_call() __attribute__((__noreturn__)); +} +inline void* operator new(std::size_t, void* __p) throw() { + return __p; +} +namespace std { + class type_info { + public: + bool operator==(const type_info& __arg) const { } + }; + namespace tr1 { + template<typename _Tp, _Tp __v> struct integral_constant { }; + typedef integral_constant<bool, true> true_type; + template<typename _Res, typename... _ArgTypes> + struct _Maybe_unary_or_binary_function { }; + class _Undefined_class; + union _Nocopy_types { + void (_Undefined_class::*_M_member_pointer)(); + }; + union _Any_data { + void* _M_access() { + return &_M_pod_data[0]; + } + char _M_pod_data[sizeof(_Nocopy_types)]; + }; + enum _Manager_operation { __get_type_info, __get_functor_ptr, __clone_functor, __destroy_functor }; + template<typename _Tp> struct _Simple_type_wrapper { + _Simple_type_wrapper(_Tp __value) : __value(__value) { } + _Tp __value; + }; + template<typename _Signature> class function; + class _Function_base { + public: + static const std::size_t _M_max_size = sizeof(_Nocopy_types); + static const std::size_t _M_max_align = __alignof__(_Nocopy_types); + template<typename _Functor> class _Base_manager { + static const bool __stored_locally = (sizeof(_Functor) <= _M_max_size && __alignof__(_Functor) <= _M_max_align && (_M_max_align % __alignof__(_Functor) == 0)); + typedef integral_constant<bool, __stored_locally> _Local_storage; + public: + static bool _M_manager(_Any_data& __dest, const _Any_data& __source, _Manager_operation __op) { } + static void _M_init_functor(_Any_data& __functor, const _Functor& __f) { + _M_init_functor(__functor, __f, _Local_storage()); + } + template<typename _Class, typename _Tp> static bool _M_not_empty_function(_Tp _Class::* const& __mp) { + return __mp; + } + static void _M_init_functor(_Any_data& __functor, const _Functor& __f, true_type) { + new (__functor._M_access()) _Functor(__f); + } + }; + ~_Function_base() { + if (_M_manager) _M_manager(_M_functor, _M_functor, __destroy_functor); + } + bool _M_empty() const { + return !_M_manager; + } + typedef bool (*_Manager_type)(_Any_data&, const _Any_data&, _Manager_operation); + _Any_data _M_functor; + _Manager_type _M_manager; + }; + template<typename _Signature, typename _Functor> class _Function_handler; + template<typename _Class, typename _Member, typename _Res, typename... _ArgTypes> class _Function_handler<_Res(_ArgTypes...), _Member _Class::*> : public _Function_handler<void(_ArgTypes...), _Member _Class::*> { + public: + static _Res _M_invoke(const _Any_data& __functor, _ArgTypes... __args) { } + }; + template<typename _Class, typename _Member, typename... _ArgTypes> class _Function_handler<void(_ArgTypes...), _Member _Class::*> : public _Function_base::_Base_manager< _Simple_type_wrapper< _Member _Class::* > > { }; + template<typename _Res, typename... _ArgTypes> class function<_Res(_ArgTypes...)> : public _Maybe_unary_or_binary_function<_Res, _ArgTypes...>, private _Function_base { + typedef _Res _Signature_type(_ArgTypes...); + struct _Useless { }; + public: + template<typename _Functor> function(_Functor __f, _Useless = _Useless()); + _Res operator()(_ArgTypes... __args) const; + const type_info& target_type() const; + typedef _Res (*_Invoker_type)(const _Any_data&, _ArgTypes...); + _Invoker_type _M_invoker; + }; + template<typename _Res, typename... _ArgTypes> template<typename _Functor> function<_Res(_ArgTypes...)>:: function(_Functor __f, _Useless) : _Function_base() { + typedef _Function_handler<_Signature_type, _Functor> _My_handler; + if (_My_handler::_M_not_empty_function(__f)) { + _M_invoker = &_My_handler::_M_invoke; + _M_manager = &_My_handler::_M_manager; + _My_handler::_M_init_functor(_M_functor, __f); + } + } + template<typename _Res, typename... _ArgTypes> _Res function<_Res(_ArgTypes...)>:: operator()(_ArgTypes... __args) const { + if (_M_empty()) { + __throw_bad_function_call(); + } + return _M_invoker(_M_functor, __args...); + } + template<typename _Res, typename... _ArgTypes> const type_info& function<_Res(_ArgTypes...)>:: target_type() const { + if (_M_manager) { + _Any_data __typeinfo_result; + _M_manager(__typeinfo_result, _M_functor, __get_type_info); + } + } + } +} +struct X { + int bar; +}; +void test05() { + using std::tr1::function; + X x; + function<int(X&)> frm(&X::bar); + frm(x) == 17; + typeid(int X::*) == frm.target_type(); +} diff --git a/gcc/testsuite/g++.dg/torture/pr41144.C b/gcc/testsuite/g++.dg/torture/pr41144.C new file mode 100644 index 000000000..64dc117d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr41144.C @@ -0,0 +1,23 @@ +/* { dg-do compile } */ + +struct rgba8; +template<class ColorT> class span_gouraud { +public: + struct coord_type { }; + coord_type m_coord[3]; +}; +template<class ColorT> class span_gouraud_rgba : public span_gouraud<ColorT> +{ + typedef ColorT color_type; + typedef span_gouraud<color_type> base_type; + typedef typename base_type::coord_type coord_type; +public: + void prepare() { + coord_type coord[3]; + } +}; +void the_application() { + typedef span_gouraud_rgba<rgba8> gouraud_span_gen_type; + gouraud_span_gen_type span_gouraud; + span_gouraud.prepare(); +} diff --git a/gcc/testsuite/g++.dg/torture/pr41183.C b/gcc/testsuite/g++.dg/torture/pr41183.C new file mode 100644 index 000000000..df3e30341 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr41183.C @@ -0,0 +1,30 @@ +// PR c++/41183 +// { dg-do compile } + +void foo (const char *); + +template <int *> +struct A +{ + template <typename T> A (const int &, T); + int i; +}; + +template <int *X> +template <typename T> +A<X>::A (const int &j, T) : i(j) +{ + foo (0); + foo (0); + foo (__PRETTY_FUNCTION__); +} + +int N; + +struct B +{ + B (); + A<&N> a; +}; + +B::B() : a(N, 0) {} diff --git a/gcc/testsuite/g++.dg/torture/pr41186.C b/gcc/testsuite/g++.dg/torture/pr41186.C new file mode 100644 index 000000000..fdfee2cd3 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr41186.C @@ -0,0 +1,29 @@ +/* { dg-do run } */ + +struct Foo { + Foo() {}; + int i; + short f; +}; +struct Bar : public Foo { + Bar() {}; + short b; +}; + +extern "C" void abort(void); + +int main() +{ + Bar b1, b2; + b2.i = 0; + b1.f = 0; + b1.b = 1; + b2.f = 1; + b2.b = 2; + static_cast<Foo&>(b1) = static_cast<Foo&>(b2); + if (b1.i != 0 || b1.b != 1) + abort (); + if (b1.f != 1) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr41257-2.C b/gcc/testsuite/g++.dg/torture/pr41257-2.C new file mode 100644 index 000000000..230fa5dde --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr41257-2.C @@ -0,0 +1,16 @@ +/* { dg-do link } */ + +struct A +{ + virtual ~A(); +}; + +struct B : virtual A +{ + virtual ~B() {} +}; + +int main() +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr41257.C b/gcc/testsuite/g++.dg/torture/pr41257.C new file mode 100644 index 000000000..60cfc5339 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr41257.C @@ -0,0 +1,20 @@ +/* { dg-do compile } */ + +struct A +{ + virtual void foo(); + virtual ~A(); + int i; +}; + +struct B : virtual A {}; + +struct C : B +{ + virtual void foo(); +}; + +void bar() +{ + C().foo(); +} diff --git a/gcc/testsuite/g++.dg/torture/pr41273.C b/gcc/testsuite/g++.dg/torture/pr41273.C new file mode 100644 index 000000000..bdce05355 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr41273.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-g" } */ + +long *H2_ipX_ener_sort; +double H2_old_populations[2]; +double H2_total; + +void H2_LevelPops() +{ + double sum_pop = 0.; + long nEner = 0; + while( nEner < 3 && sum_pop/H2_total < 0.99999 ) + { + long ip = H2_ipX_ener_sort[nEner]; + sum_pop += H2_old_populations[ip]; + ++nEner; + } +} diff --git a/gcc/testsuite/g++.dg/torture/pr41680.C b/gcc/testsuite/g++.dg/torture/pr41680.C new file mode 100644 index 000000000..7faab0d5f --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr41680.C @@ -0,0 +1,23 @@ +// PR target/41680 +// { dg-do compile } + +extern void baz (float); + +inline bool +bar (float x) +{ + union { float f; int i; } u; + u.f = x; + return (u.i & 1); +} + +void +foo (float *x) +{ + for (int i = 0; i < 10; i++) + { + float f = x[i]; + if (!bar (f)) + baz (f); + } +} diff --git a/gcc/testsuite/g++.dg/torture/pr41775.C b/gcc/testsuite/g++.dg/torture/pr41775.C new file mode 100644 index 000000000..3d8548e3f --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr41775.C @@ -0,0 +1,284 @@ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ + +typedef unsigned int size_t; +namespace std __attribute__ ((__visibility__ ("default"))) +{ + template < typename _Iterator > struct iterator_traits + { + }; + template < typename _Tp > struct iterator_traits <_Tp * > + { + typedef _Tp & reference; + }; +} + +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) +{ + using std::iterator_traits; + template < typename _Iterator, typename _Container > class __normal_iterator + { + public:typedef _Iterator iterator_type; + typedef typename iterator_traits < _Iterator >::reference reference; + reference operator* () const + { + } + __normal_iterator operator++ (int) + { + } + }; + template < typename _IteratorL, typename _IteratorR, + typename _Container > inline bool operator!= (const __normal_iterator < + _IteratorL, + _Container > &__lhs, + const __normal_iterator < + _IteratorR, + _Container > &__rhs) + { + } +} + +extern "C" +{ + extern "C" + { + __extension__ typedef __SIZE_TYPE__ __intptr_t; + } +} +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) +{ + template < typename _Tp > class new_allocator + { + public:typedef size_t size_type; + typedef _Tp *pointer; + template < typename _Tp1 > struct rebind + { + typedef new_allocator < _Tp1 > other; + }; + }; +} + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +template < typename _Tp > class allocator:public __gnu_cxx::new_allocator < + _Tp > + { + }; +} + +extern "C" +{ + typedef __intptr_t intptr_t; +} +namespace llvm +{ + template < typename NodeTy > class ilist_half_node + { + }; +template < typename NodeTy > class ilist_node:private ilist_half_node < + NodeTy > + { + }; + class MachineBasicBlock; + class MachineOperand + { + public:enum MachineOperandType + { + } + Contents; + unsigned getReg () const + { + } + }; + class TargetRegisterInfo; +} + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + template < typename _Tp, typename _Alloc > struct _Vector_base + { + typedef typename _Alloc::template rebind < _Tp >::other _Tp_alloc_type; + }; +template < typename _Tp, typename _Alloc = std::allocator < _Tp > >class vector:protected _Vector_base < _Tp, + _Alloc + > + { + typedef _Vector_base < _Tp, _Alloc > _Base; + typedef typename _Base::_Tp_alloc_type _Tp_alloc_type; + public:typedef _Tp value_type; + typedef typename _Tp_alloc_type::pointer pointer; + typedef __gnu_cxx::__normal_iterator < pointer, vector > iterator; + iterator begin () + { + } + iterator end () + { + } + }; +} + +namespace llvm +{ + class MachineFunction; + class MachineInstr:public ilist_node < MachineInstr > + { + public:const MachineBasicBlock *getParent () const + { + } + const MachineOperand & getOperand (unsigned i) const + { + } + bool registerDefIsDead (unsigned Reg, const TargetRegisterInfo * TRI = + __null) const + { + } + }; + class AnalysisResolver; + class Pass + { + AnalysisResolver *Resolver; + intptr_t PassID; + public: explicit Pass (intptr_t pid):Resolver (0), PassID (pid) + { + } + explicit Pass (const void *pid):Resolver (0), PassID ((intptr_t) pid) + { + } + template < typename AnalysisType > AnalysisType & getAnalysis () const; + }; + class FunctionPass:public Pass + { + public:explicit FunctionPass (intptr_t pid):Pass (pid) + { + } + explicit FunctionPass (const void *pid):Pass (pid) + { + } + }; + class PassInfo + { + public:typedef Pass *(*NormalCtor_t) (); + private:const char *const PassName; + const char *const PassArgument; + const intptr_t PassID; + const bool IsCFGOnlyPass; + const bool IsAnalysis; + const bool IsAnalysisGroup; + NormalCtor_t NormalCtor; + public: PassInfo (const char *name, const char *arg, intptr_t pi, NormalCtor_t normal = 0, bool isCFGOnly = false, bool is_analysis = false):PassName (name), PassArgument (arg), PassID (pi), + IsCFGOnlyPass (isCFGOnly), IsAnalysis (is_analysis), + IsAnalysisGroup (false), NormalCtor (normal) + { + } + }; + template < typename PassName > Pass * callDefaultCtor () + { + return new PassName (); + } + template < typename passName > struct RegisterPass:public PassInfo + { + RegisterPass (const char *PassArg, const char *Name, bool CFGOnly = false, bool is_analysis = false):PassInfo (Name, PassArg, intptr_t (&passName::ID), + PassInfo::NormalCtor_t (callDefaultCtor < passName >), CFGOnly, + is_analysis) + { + } + }; + template < typename T > class SmallVectorImpl + { + }; + template < typename T, + unsigned N > class SmallVector:public SmallVectorImpl < T > + { + }; + class MachineFunctionPass:public FunctionPass + { + protected:explicit MachineFunctionPass (intptr_t ID):FunctionPass (ID) + { + } + explicit MachineFunctionPass (void *ID):FunctionPass (ID) + { + } + virtual bool runOnMachineFunction (MachineFunction & MF) = 0; + }; + class LiveIndex + { + private:unsigned index; + }; + class VNInfo + { + }; + struct LiveRange + { + LiveIndex start; + LiveIndex end; + VNInfo *valno; + }; + class LiveInterval + { + public:typedef SmallVector < LiveRange, 4 > Ranges; + bool containsOneValue () const + { + } + LiveRange *getLiveRangeContaining (LiveIndex Idx) + { + } + void removeRange (LiveIndex Start, LiveIndex End, bool RemoveDeadValNo = + false); + void removeRange (LiveRange LR, bool RemoveDeadValNo = false) + { + removeRange (LR.start, LR.end, RemoveDeadValNo); + } + }; + class LiveIntervals:public MachineFunctionPass + { + public:static char ID; + LiveIndex getDefIndex (LiveIndex index) + { + } + LiveInterval & getInterval (unsigned reg) + { + } + LiveIndex getInstructionIndex (const MachineInstr * instr) const + { + } + }; +} + +using namespace llvm; +namespace +{ +struct __attribute__ ((visibility ("hidden"))) StrongPHIElimination:public + MachineFunctionPass + { + static char ID; + StrongPHIElimination ():MachineFunctionPass (&ID) + { + } + bool runOnMachineFunction (MachineFunction & Fn); + }; +} + +static RegisterPass < StrongPHIElimination > X ("strong-phi-node-elimination", + "Eliminate PHI nodes for register allocation, intelligently"); +bool +StrongPHIElimination::runOnMachineFunction (MachineFunction & Fn) +{ + LiveIntervals & LI = getAnalysis < LiveIntervals > (); + std::vector < MachineInstr * >phis; + for (std::vector < MachineInstr * >::iterator I = phis.begin (), E = + phis.end (); I != E;) + { + MachineInstr *PInstr = *(I++); + unsigned DestReg = PInstr->getOperand (0).getReg (); + LiveInterval & PI = LI.getInterval (DestReg); + if (PInstr->registerDefIsDead (DestReg)) + { + if (PI.containsOneValue ()) + { + LiveIndex idx = + LI.getDefIndex (LI.getInstructionIndex (PInstr)); + PI.removeRange (*PI.getLiveRangeContaining (idx), true); + } + } + } +} diff --git a/gcc/testsuite/g++.dg/torture/pr42110.C b/gcc/testsuite/g++.dg/torture/pr42110.C new file mode 100644 index 000000000..c778b4f2f --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr42110.C @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +bool foo(); + +struct A +{ + A* fooA() { if (foo()) foo(); return this; } + + virtual void barA(char); +}; + +template<int> struct B +{ + A *p, *q; + + void fooB(char c) { p->fooA()->barA(c); } +}; + +template<int N> inline void bar(B<N> b) { b.fooB(0); } + +extern template void bar(B<0>); + +void (*f)(B<0>) = bar; + +void baz() +{ + B<0>().fooB(0); +} diff --git a/gcc/testsuite/g++.dg/torture/pr42183.C b/gcc/testsuite/g++.dg/torture/pr42183.C new file mode 100644 index 000000000..375b37f0c --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr42183.C @@ -0,0 +1,51 @@ +// { dg-do compile } + +class IntSize { +public: + IntSize(int width, int height) : m_width(width), m_height(height) { } + int m_width, m_height; +}; +class IntPoint { +public: + IntPoint(int x, int y) : m_x(x), m_y(y) { } + int m_x, m_y; +}; +class IntRect { +public: + IntRect(int x, int y, int width, int height) + : m_location(IntPoint(x, y)), m_size(IntSize(width, height)) { } + void intersect(const IntRect&); + IntPoint m_location; + IntSize m_size; +}; +inline IntRect intersection(const IntRect& a, const IntRect& b) { + IntRect c = a; + c.intersect(b); + return c; +} +class RenderObject { +public: + int contentWidth() const { } + int contentHeight() const { } + virtual int xPos() const { } + virtual int yPos() const { } + virtual int paddingTop() const; + virtual int paddingLeft() const; + virtual int borderTop() const { } + virtual int borderLeft() const { } +}; +class RenderMenuList : public RenderObject { + virtual IntRect controlClipRect(int tx, int ty) const; + RenderObject* m_innerBlock; +}; +IntRect RenderMenuList::controlClipRect(int tx, int ty) const { + IntRect outerBox(tx + borderLeft() + paddingLeft(), + ty + borderTop() + paddingTop(), + contentWidth(), contentHeight()); + IntRect innerBox(tx + m_innerBlock->xPos() + m_innerBlock->paddingLeft(), + ty + m_innerBlock->yPos() + m_innerBlock->paddingTop(), + m_innerBlock->contentWidth(), + m_innerBlock->contentHeight()); + return intersection(outerBox, innerBox); +} + diff --git a/gcc/testsuite/g++.dg/torture/pr42357.C b/gcc/testsuite/g++.dg/torture/pr42357.C new file mode 100644 index 000000000..1a1d64e4f --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr42357.C @@ -0,0 +1,30 @@ +// { dg-do compile } +typedef unsigned char uint8; +typedef unsigned int uint32; +class PixelARGB { +public: + ~PixelARGB() throw() { } + PixelARGB (const uint32 argb_) throw() : argb (argb_) { } + inline __attribute__((always_inline)) uint8 getRed() const throw() { + return components.r; + } + union { + uint32 argb; + struct { + uint8 b, g, r, a; + } components; + }; +}; +class Colour { +public: + Colour() throw() : argb (0) {}; + uint8 getRed() const throw() { + return argb.getRed(); + } + PixelARGB argb; +}; +uint8 writeImage (void) { + Colour pixel; + pixel = Colour (); + return pixel.getRed(); +} diff --git a/gcc/testsuite/g++.dg/torture/pr42450.C b/gcc/testsuite/g++.dg/torture/pr42450.C new file mode 100644 index 000000000..f630fa2b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr42450.C @@ -0,0 +1,112 @@ +/* { dg-do compile } */ + +template < typename > class basic_stringstream; + +struct basic_string { + basic_string(); +}; + +struct ios_base { + virtual ~ios_base(); +}; + +class ostream:ios_base {}; +class istream:virtual ios_base {}; + +template < typename > struct basic_iostream:public istream, ostream { + ~basic_iostream () {} +}; +extern template class basic_iostream < char >; + +template < typename > struct basic_stringstream:public basic_iostream < char > { + basic_string _M_stringbuf; + ~basic_stringstream () {} +}; +extern template class basic_stringstream < char >; + +template < typename > struct AnyMatrixBase; +template < typename, int _Rows, int _Cols, int = _Rows, int = _Cols > class Matrix; +template < typename > class CwiseNullaryOp; + +template < typename Derived > struct MatrixBase:public AnyMatrixBase < Derived > { + typedef CwiseNullaryOp < Derived > ConstantReturnType; + ConstantReturnType Constant (); + template < typename > Derived cast (); + static CwiseNullaryOp < Derived > Random (int); +}; + +template < typename Derived > struct AnyMatrixBase { + Derived derived () {} + Derived & derived () const {} +}; + +template < typename, int > struct ei_matrix_storage {}; + +template < typename _Scalar, int, int, int _MaxRows, int _MaxCols > struct Matrix:MatrixBase < Matrix < _Scalar, _MaxRows, _MaxCols > > { + typedef MatrixBase < Matrix > Base; + ei_matrix_storage < int, _MaxCols > m_storage; + Matrix operator= (const Matrix other) { + _resize_to_match (other); + lazyAssign (other.derived ()); + } + template < typename OtherDerived > Matrix lazyAssign (MatrixBase < OtherDerived > other) { + _resize_to_match (other); + return Base (other.derived ()); + } + Matrix (); + template < typename OtherDerived > Matrix (const MatrixBase < OtherDerived > &other) { + *this = other; + } + template < typename OtherDerived > void _resize_to_match (const MatrixBase < OtherDerived > &) { + throw 1; + } +}; + +template < typename MatrixType > class CwiseNullaryOp: +public MatrixBase < CwiseNullaryOp < MatrixType > > {}; + +int f() +{ + bool align_cols; + if (align_cols) { + basic_stringstream<char> sstr; + f(); + } +} + +template < typename > struct AutoDiffScalar; +template < typename Functor > struct AutoDiffJacobian:Functor { + AutoDiffJacobian (Functor); + typedef typename Functor::InputType InputType; + typedef typename Functor::ValueType ValueType; + typedef Matrix < int, Functor::InputsAtCompileTime, 1 > DerivativeType; + typedef AutoDiffScalar < DerivativeType > ActiveScalar; + typedef Matrix < ActiveScalar, Functor::InputsAtCompileTime, 1 > ActiveInput; + void operator () (InputType x, ValueType *) { + ActiveInput ax = x.template cast < ActiveScalar > (); + } +}; + +template < int NX, int NY > struct TestFunc1 { + enum { + InputsAtCompileTime = NX + }; + typedef Matrix < float, NX, 1 > InputType; + typedef Matrix < float, NY, 1 > ValueType; + typedef Matrix < float, NY, NX > JacobianType; + int inputs (); +}; + +template < typename Func > void forward_jacobian (Func f) { + typename Func::InputType x = Func::InputType::Random (f.inputs ()); + typename Func::ValueType y; + typename Func::JacobianType jref = jref.Constant (); + AutoDiffJacobian < Func > autoj (f); + autoj (x, &y); +} + +void test_autodiff_scalar () +{ + forward_jacobian (TestFunc1 < 2, 2 > ()); + forward_jacobian (TestFunc1 < 3, 2 > ()); +} diff --git a/gcc/testsuite/g++.dg/torture/pr42462.C b/gcc/testsuite/g++.dg/torture/pr42462.C new file mode 100644 index 000000000..947fa388f --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr42462.C @@ -0,0 +1,47 @@ +/* { dg-do run } */ + +#define INLINE inline __attribute__((always_inline)) +extern "C" void abort (void); + +template<class> struct Foo { + inline bool isFalse() { return false; } + template <bool> void f1() {} + template <bool> INLINE void f2() { f1<false>(); } + template <bool> void f3() { f2<false>(); } + template <bool> INLINE void f4() { f3<false>(); } + int exec2(); + void execute(); + inline void unused(); +}; + +template<class T> inline void Foo<T>::unused() { + f4<true>(); +} + +static int counter = 0; + +template<class T> int Foo<T>::exec2() { + static void* table[2] = { &&begin, &&end }; + if (counter++ > 10) + return 0; + goto *(table[0]); +begin: + if (isFalse()) f1<false>(); +end: + return 1; +} + +template<class T> void Foo<T>::execute() { + int r = 1; + while (r) { r = exec2(); } +} + +template class Foo<int>; + +int main() { + Foo<int> c; + c.execute(); + if (counter < 10) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr42704.C b/gcc/testsuite/g++.dg/torture/pr42704.C new file mode 100644 index 000000000..735b1e7bd --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr42704.C @@ -0,0 +1,44 @@ +/* { dg-do compile } */ + +typedef int PRInt32; +class nsTreeRows { + class Subtree { }; + enum { kMaxDepth = 32 }; + struct Link { + Subtree* mParent; + PRInt32 mChildIndex; + Link& operator=(const Link& aLink) { + mParent = aLink.mParent; + mChildIndex = aLink.mChildIndex; + } + }; + class iterator { + PRInt32 mTop; + PRInt32 mRowIndex; + Link mLink[kMaxDepth]; + public: + iterator() : mTop(-1), mRowIndex(-1) { } + iterator& operator=(const iterator& aIterator); + }; + Subtree* EnsureSubtreeFor(Subtree* aParent, PRInt32 aChildIndex); + Subtree* GetSubtreeFor(const Subtree* aParent, +PRInt32 aChildIndex, PRInt32* aSubtreeSize = 0); + void InvalidateCachedRow() { + mLastRow = iterator(); + } + iterator mLastRow; +}; +nsTreeRows::Subtree* nsTreeRows::EnsureSubtreeFor(Subtree* aParent, + PRInt32 aChildIndex) { + Subtree* subtree = GetSubtreeFor(aParent, aChildIndex); + if (! subtree) { + InvalidateCachedRow(); + } +} +nsTreeRows::iterator& nsTreeRows::iterator::operator=(const iterator& +aIterator) { + mTop = aIterator.mTop; + for (PRInt32 i = mTop; + i >= 0; + --i) mLink[i] = aIterator.mLink[i]; +} diff --git a/gcc/testsuite/g++.dg/torture/pr42714.C b/gcc/testsuite/g++.dg/torture/pr42714.C new file mode 100644 index 000000000..b1b2d856e --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr42714.C @@ -0,0 +1,37 @@ +struct QVectorData { + static QVectorData shared_null; +}; +template <typename T> class QVector { + union { + QVectorData *d; + }; +public: + inline QVector() : d(&QVectorData::shared_null) { } + inline QVector(const QVector<T> &v) : d(v.d) { } +}; +class QXmlStreamAttribute { }; +class QXmlStreamAttributes : public QVector<QXmlStreamAttribute> { }; +class __attribute__ ((visibility("default"))) Smoke { +public: + union StackItem; + typedef StackItem* Stack; + typedef short Index; +}; +class SmokeBinding { }; +namespace __smokeqt { + class x_QXmlStreamAttributes : public QXmlStreamAttributes { + SmokeBinding* _binding; + public: + static void x_11(Smoke::Stack x) { + x_QXmlStreamAttributes* xret = new x_QXmlStreamAttributes(); + } + explicit x_QXmlStreamAttributes() : QXmlStreamAttributes() { } + }; + void xcall_QXmlStreamAttributes(Smoke::Index xi, void *obj, + Smoke::Stack args) + { + switch(xi) { + case 11: x_QXmlStreamAttributes::x_11(args); + } + } +} diff --git a/gcc/testsuite/g++.dg/torture/pr42739.C b/gcc/testsuite/g++.dg/torture/pr42739.C new file mode 100644 index 000000000..ccc05f836 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr42739.C @@ -0,0 +1,16 @@ +/* { dg-do compile } */ + +struct s { ~s() { s(); } }; + +int f() +{ + M: + s o = s(); + f(); + f(); + + L: + goto *(f() ? &&L : &&M); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr42760.C b/gcc/testsuite/g++.dg/torture/pr42760.C new file mode 100644 index 000000000..be85f7fc4 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr42760.C @@ -0,0 +1,46 @@ +// PR middle-end/42760 +// { dg-do compile } + +template <typename T> +struct A +{ + static T b (T it) { return it; } +}; + +template <typename T, typename U> +static U +baz (T x, T y, U z) +{ + for (long n = y - x; n > 0; --n) + { + *z = *x; + ++z; + } +}; + +template <typename T, typename U> +U +bar (T x, T y, U z) +{ + baz (A <T>::b (x), A <T>::b (y), A <U>::b (z)); +} + +struct C +{ + __complex__ float v; +}; + +template <class T> +struct B +{ + B (T y[]) { bar (y, y + 1, x); } + operator T *() { return x; } + T x[1]; +}; + +B <C> +foo () +{ + C y[1]; + return B <C> (y); +}; diff --git a/gcc/testsuite/g++.dg/torture/pr42773.C b/gcc/testsuite/g++.dg/torture/pr42773.C new file mode 100644 index 000000000..478ad278a --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr42773.C @@ -0,0 +1,54 @@ +// { dg-do compile } +// { dg-options "-fno-exceptions" } + +typedef unsigned int uint; +struct QShared { + bool deref() { + return !--count; + } + uint count; +}; +template <class T> class QValueListNode { +public: + QValueListNode<T>* next; + QValueListNode<T>* prev; +}; +template <class T> class QValueListPrivate : public QShared { +public: + typedef QValueListNode<T> Node; + typedef QValueListNode<T>* NodePtr; + QValueListPrivate(); + void derefAndDelete() { + if ( deref() ) delete this; + } + ~QValueListPrivate(); + NodePtr node; +}; +template <class T> QValueListPrivate<T>::QValueListPrivate() { + node = new Node; + node->next = node->prev = node; +} +template <class T> QValueListPrivate<T>::~QValueListPrivate() { + NodePtr p = node->next; + while( p != node ) { + NodePtr x = p->next; + delete p; + p = x; + } +} +template <class T> class QValueList { +public: + QValueList() { + sh = new QValueListPrivate<T>; + } + ~QValueList() { + sh->derefAndDelete(); + } + QValueListPrivate<T>* sh; +}; +class Cell { + QValueList<Cell*> obscuringCells() const; +}; +QValueList<Cell*> Cell::obscuringCells() const { + QValueList<Cell*> empty; +} diff --git a/gcc/testsuite/g++.dg/torture/pr42871.C b/gcc/testsuite/g++.dg/torture/pr42871.C new file mode 100644 index 000000000..452ad9319 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr42871.C @@ -0,0 +1,40 @@ +struct C +{ + ~C (); + int c3; +}; + +C *b2; + +static void +b1 (const C &x, unsigned b3, unsigned b4) +{ + unsigned i = 0; + for (; i < b3; i++) + if (i < b4) + { + b2[0].c3 = x.c3; + return; + } +} + +int a (); + +void +bar (unsigned b3, unsigned b4) +{ + C c[100]; + for (int i = 0; i < 100; i++) + { + c[i].c3 = i; + for (int j = 0; j < b3; j++) + if (j < b4) + { + b2[0].c3 = 0; + break; + } + b1 (c[i], b3, b4); + a (); + } +} + diff --git a/gcc/testsuite/g++.dg/torture/pr42883.C b/gcc/testsuite/g++.dg/torture/pr42883.C new file mode 100644 index 000000000..f164c3781 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr42883.C @@ -0,0 +1,63 @@ +// { dg-do compile } + +typedef __SIZE_TYPE__ size_t; +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) { + template<typename _Tp> class new_allocator { + public: + typedef size_t size_type; + typedef _Tp* pointer; + typedef _Tp& reference; + void deallocate(pointer __p, size_type) { + ::operator delete(__p); + } + }; +} +namespace std __attribute__ ((__visibility__ ("default"))) { + template<typename _Tp> class allocator: public __gnu_cxx::new_allocator<_Tp> { + public: + template<typename _Tp1> struct rebind { + typedef allocator<_Tp1> other; + }; + }; + template<typename _Tp, typename _Alloc> struct _Vector_base { + typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type; + struct _Vector_impl : public _Tp_alloc_type { + typename _Tp_alloc_type::pointer _M_start; + typename _Tp_alloc_type::pointer _M_end_of_storage; + }; + ~_Vector_base() { + _M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage - this->_M_impl._M_start); + } + _Vector_impl _M_impl; + void _M_deallocate(typename _Tp_alloc_type::pointer __p, size_t __n) { + if (__p) _M_impl.deallocate(__p, __n); + } + }; + template<typename _Tp, typename _Alloc = std::allocator<_Tp> > class vector : protected _Vector_base<_Tp, _Alloc> { + typedef _Vector_base<_Tp, _Alloc> _Base; + typedef typename _Base::_Tp_alloc_type _Tp_alloc_type; + public: + typedef typename _Tp_alloc_type::reference reference; + typedef size_t size_type; + size_type size() const { + } + reference operator[](size_type __n) { + } + }; +}; +class vtkConvexPointSet { +public: + static vtkConvexPointSet *New(); +}; +void MakeInternalMesh() { + std::vector< int > tempFaces[2]; + std::vector< int > firstFace; + int i, j, k; + for(i = 0; i < 1000; i++) { + for(int pointCount = 0; pointCount < 1000; pointCount++) { + for(j = 0; j < (int)tempFaces[0].size(); k++) + if(tempFaces[0][j] == tempFaces[1][k]) break; + } + vtkConvexPointSet::New(); + } +} diff --git a/gcc/testsuite/g++.dg/torture/pr42890.C b/gcc/testsuite/g++.dg/torture/pr42890.C new file mode 100644 index 000000000..937367665 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr42890.C @@ -0,0 +1,25 @@ +// PR tree-optimization/42890 +// { dg-do compile } + +extern "C" int puts (const char *) throw (); + +struct S +{ + const char *a; + const char **b; + S (const char *s) { a = s; b = &a; } + ~S () { puts (a); } +}; + +void +foo (int (*fn) (const char *)) +{ + S a ("foo"); + fn ("bar"); +} + +int +main () +{ + foo (puts); +} diff --git a/gcc/testsuite/g++.dg/torture/pr43068.C b/gcc/testsuite/g++.dg/torture/pr43068.C new file mode 100644 index 000000000..524fd23ee --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr43068.C @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-freorder-blocks -ftracer} */ + +struct A { + virtual A *f(); +}; +struct B : virtual A { + virtual B *f(); +}; +B *B::f() { return 0; } diff --git a/gcc/testsuite/g++.dg/torture/pr43257.C b/gcc/testsuite/g++.dg/torture/pr43257.C new file mode 100644 index 000000000..a3e75574a --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr43257.C @@ -0,0 +1,30 @@ +/* { dg-do assemble } */ + +class A {}; +class B {}; + +static void *func (int n) +{ + void *p; + if (p == 0) throw ::A (); +} + +static void *func (int n, B const &) +{ + try { + return func (n); + } + catch (::A const &) { + } + return func (n); +} + +void *f1 (int n) +{ + return func (n, B()); +} + +void *f2 (int n) +{ + return func (n, B()); +} diff --git a/gcc/testsuite/g++.dg/torture/pr43611.C b/gcc/testsuite/g++.dg/torture/pr43611.C new file mode 100644 index 000000000..6899a6ea4 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr43611.C @@ -0,0 +1,22 @@ +// { dg-do compile } +// { dg-options "-fkeep-inline-functions" } + +template < typename > +struct A { + void init (int); + A () + { + this->init (0); + } +}; + +template < typename > +struct B : A < int > { + A < int > a; + B () {} +}; + +extern template struct A < int >; +extern template struct B < int >; + +B < int > b; diff --git a/gcc/testsuite/g++.dg/torture/pr43784.C b/gcc/testsuite/g++.dg/torture/pr43784.C new file mode 100644 index 000000000..a83a6f374 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr43784.C @@ -0,0 +1,24 @@ +/* { dg-do run } */ +/* { dg-options "-fno-tree-sra" } */ + +struct S {int x, y, makemelarge[5];}; +S __attribute__((noinline)) f (S &s) { + S r; + r.x = s.y; + r.y = s.x; + return r; +} +int __attribute__((noinline)) glob (int a, int b) +{ + S local = { a, b }; + local = f (local); + return local.y; +} +extern "C" void abort (void); +int main (void) +{ + if (glob (1, 3) != 1) + abort (); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/torture/pr43801.C b/gcc/testsuite/g++.dg/torture/pr43801.C new file mode 100644 index 000000000..3b52d4abc --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr43801.C @@ -0,0 +1,22 @@ +// PR tree-optimization/43801 +// { dg-do compile } +// { dg-options "-fipa-cp -fipa-cp-clone" } + +struct A +{ + virtual void f (int); +}; +struct B : virtual A +{ + virtual void f (int i) { if (i) A::f(0); } +}; +struct C : virtual B +{ + virtual void f (int) { B::f(0); } +}; + +void +foo () +{ + C (); +} diff --git a/gcc/testsuite/g++.dg/torture/pr43879-1_0.C b/gcc/testsuite/g++.dg/torture/pr43879-1_0.C new file mode 100644 index 000000000..710f6adfe --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr43879-1_0.C @@ -0,0 +1,11 @@ +struct A { + int *i; + A(); + ~A(); +}; + +static int x = 0; + +A::A() : i(&x) {} +A::~A() {} + diff --git a/gcc/testsuite/g++.dg/torture/pr43879-1_1.C b/gcc/testsuite/g++.dg/torture/pr43879-1_1.C new file mode 100644 index 000000000..0c943381f --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr43879-1_1.C @@ -0,0 +1,48 @@ +/* { dg-do run } */ +/* { dg-options "-fipa-pta" } */ +/* { dg-additional-sources "pr43879-1_0.C" } */ + +struct A { + int *i; + A(); + ~A(); +}; + +static inline int +aa(int *a, int *b) +{ + (void)b; + return *a; +} + +struct B { + B() : i(0) {} + int i; + B(const A &a) : i(0) + { + f(*a.i); + } + void __attribute__((noinline, noclone)) + f(int j) + { + aa(&i, &j); + i = 1; + } +}; + +int +test() +{ + B b1; + B b2 = B(A()); + b1 = B(A()); + if (b1.i != b2.i) __builtin_abort(); + return 0; +} + +int +main() +{ + return test(); +} + diff --git a/gcc/testsuite/g++.dg/torture/pr43880.C b/gcc/testsuite/g++.dg/torture/pr43880.C new file mode 100644 index 000000000..bf82bc54b --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr43880.C @@ -0,0 +1,16 @@ +// { dg-do compile } + +extern void xread(void *); +class test +{ +public: + test(void); +}; +test::test(void) +{ + union { + char pngpal[1]; + }; + xread(pngpal); +} + diff --git a/gcc/testsuite/g++.dg/torture/pr43905.C b/gcc/testsuite/g++.dg/torture/pr43905.C new file mode 100644 index 000000000..0e49a32a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr43905.C @@ -0,0 +1,13 @@ +extern void sf ( __const char *); +struct Matrix{ + int operator[](int n){ + sf ( __PRETTY_FUNCTION__); + } + int operator[](int n)const{ + sf ( __PRETTY_FUNCTION__); + } +}; +void calcmy(Matrix const &b, Matrix &c, int k){ + b[k]; + c[k]; +} diff --git a/gcc/testsuite/g++.dg/torture/pr44069.C b/gcc/testsuite/g++.dg/torture/pr44069.C new file mode 100644 index 000000000..99fcd173e --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr44069.C @@ -0,0 +1,25 @@ +/* { dg-do run } */ + +template <unsigned R, unsigned C> +class M { +public: + M(const int* arr) { + for (unsigned long r = 0; r < R; ++r) + for (unsigned long c = 0; c < C; ++c) + m[r*C+c] = arr[r*C+c]; + } + int operator()(unsigned r, unsigned c) const + { return m[r*C+c]; } +private: + int m[R*C]; +}; +extern "C" void abort (void); +int main() +{ + int vals[2][2] = { { 1, 2 }, { 5, 6 } }; + M<2,2> m( &(vals[0][0]) ); + if (m(1,0) != 5) + abort (); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/torture/pr44148.C b/gcc/testsuite/g++.dg/torture/pr44148.C new file mode 100644 index 000000000..a60ba9aa3 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr44148.C @@ -0,0 +1,60 @@ +// PR c++/44148 +// { dg-do compile } +// { dg-options "" } +// { dg-options "-fpic" { target fpic } } + +template <typename T> struct S2 +{ + typedef const T &t2; + t2 operator* () const {} +}; +template <typename T> struct S3 +{ + typedef S2 <T> t5; +}; +template <typename T1, typename T2> T2 foo1 (T1 x, T2 y) { y (*x); } +template <class T> struct S4 +{ + T &operator* () const; +}; +struct S7 {}; +struct S8 +{ + typedef::S3 <S4 <S7> >::t5 t6; + t6 m1 () const; +}; +template <class T> struct S9 +{ + typedef T t3; + inline t3 &operator[] (unsigned int) {} +}; +template <typename T1, typename T2, typename T3, void (&T4) (const T1 &, T3 &)> struct S10 +{ + S10 (T2 &x, unsigned int y = 0) : u (x), v (y) {} + void operator () (const S4 <T1> &x) { T4 (*x, u[v++]); } + T2 &u; + unsigned int v; +}; +struct S15; +struct S11 +{ + static void m3 (const S8 &, S15 &); +}; +struct S16; +struct S12; +struct S13 +{ + static void m4 (const S7 &,S16 &); +}; +typedef S10 <S7, S12, S16, S13::m4> t10; +struct S12: S9 <S16> +{ +}; +struct S15 +{ + S12 p; +}; +void S11::m3 (const S8 &x, S15 &y) +{ + foo1 (x.m1 (), t10 (y.p)); +} diff --git a/gcc/testsuite/g++.dg/torture/pr44206.C b/gcc/testsuite/g++.dg/torture/pr44206.C new file mode 100644 index 000000000..a1dedb450 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr44206.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +template<int> struct A +{ + void foo(void(*)(A)); + void bar(void(*f)(A)) { foo(f); foo(f); } +}; + +template<int N> inline void FOO(A<N> a) +{ + a.foo(0); +} + +extern template void FOO(A<0>); + +void BAR() +{ + A<0> a; + FOO(a); + a.bar(FOO); +} diff --git a/gcc/testsuite/g++.dg/torture/pr44295.C b/gcc/testsuite/g++.dg/torture/pr44295.C new file mode 100644 index 000000000..8169bb0a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr44295.C @@ -0,0 +1,170 @@ +/* { dg-do compile } */ +extern "C" { + typedef __SIZE_TYPE__ size_t; + typedef struct { + } __sigset_t; + typedef union { + } pthread_barrierattr_t; + } + typedef unsigned short XMLCh; + typedef unsigned long XMLSize_t; + namespace xercesc_2_5 { + class DOMNodeList; + class DOMNode { + }; + class DOMDocumentRange { + }; + class DOMDocument: public DOMDocumentRange, public DOMNode { + }; + union wait { + struct { + } + __wait_stopped; + } + div_t; + class MemoryManager; + class XMemory { + public : void* operator new(size_t size, MemoryManager* memMgr); + void operator delete(void* p); + void operator delete(void* p, MemoryManager* memMgr); + }; + class XMLExcepts { + public : enum Codes { + NoError = 0 , HshTbl_ZeroModulus = 48 , HshTbl_BadHashFromKey = 49 }; + }; + class XMLUni { + }; + } + namespace xercesc_2_5 { + class XMLException : public XMemory { + public: + virtual ~XMLException(); + XMLException(const char* const srcFile, const unsigned int srcLine, MemoryManager* const memoryManager = 0); + void loadExceptText ( const XMLExcepts::Codes toLoad ); + }; + class XMLDeleter { + }; + class XMLPlatformUtils { + public : static MemoryManager* fgMemoryManager; + static inline size_t alignPointerForNewBlockAllocation(size_t ptrSize); + }; + inline size_t XMLPlatformUtils::alignPointerForNewBlockAllocation(size_t ptrSize) { + } + class HashBase : public XMemory { + public: + virtual bool equals(const void *const key1, const void *const key2) = 0; + virtual ~HashBase() { +}; + }; + class IllegalArgumentException : public XMLException { + public: +IllegalArgumentException(const char* const srcFile , const unsigned int srcLine , const XMLExcepts::Codes toThrow , MemoryManager* memoryManager = 0) : XMLException(srcFile, srcLine, memoryManager) { + loadExceptText(toThrow); + } + }; + class RuntimeException : public XMLException { + public: +RuntimeException(const char* const srcFile , const unsigned int srcLine , const XMLExcepts::Codes toThrow , MemoryManager* memoryManager = 0) : XMLException(srcFile, srcLine, memoryManager) { + loadExceptText(toThrow); + } + }; + class MemoryManager { + public: + virtual ~MemoryManager() { + } + virtual void* allocate(size_t size) = 0; + }; + template <class TElem> class BaseRefVectorOf : public XMemory { + BaseRefVectorOf ( const unsigned int maxElems , const bool adoptElems = true , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager ); + virtual ~BaseRefVectorOf(); + bool fAdoptedElems; + TElem** fElemList; + }; + template <class TElem> BaseRefVectorOf<TElem>::BaseRefVectorOf( const unsigned int maxElems , const bool adoptElems , MemoryManager* const manager) : fAdoptedElems(adoptElems) { + for (unsigned int index = 0; + index < maxElems; + index++) fElemList[index] = 0; + } + template <class TElem> BaseRefVectorOf<TElem>::~BaseRefVectorOf() { + } + class XMLString { + public: + static bool equals ( const XMLCh* const str1 , const XMLCh* const str2 ); + static void moveChars ( XMLCh* const targetStr , const XMLCh* const srcStr , const unsigned int count ); + }; + inline void XMLString::moveChars( XMLCh* const targetStr , const XMLCh* const srcStr , const unsigned int count) { + } + inline bool XMLString::equals( const XMLCh* const str1 , const XMLCh* const str2) { + const XMLCh* psz1 = str1; + const XMLCh* psz2 = str2; + if (psz1 == 0 || psz2 == 0) { + return true; + } + } + } + namespace xercesc_2_5 { + class HashPtr : public HashBase { + virtual bool equals(const void *const key1, const void *const key2); + }; + template <class TVal> struct DOMDeepNodeListPoolTableBucketElem : public XMemory { + void* fKey1; + XMLCh* fKey2; + XMLCh* fKey3; + }; + template <class TVal> class DOMDeepNodeListPool { + public: + DOMDeepNodeListPool ( const XMLSize_t modulus , const bool adoptElems , const XMLSize_t initSize = 128 ); + TVal* getByKey(const void* const key1, const XMLCh* const key2, const XMLCh* const key3); + DOMDeepNodeListPoolTableBucketElem<TVal>* findBucketElem(const void* const key1, const XMLCh* const key2, const XMLCh* const key3, XMLSize_t& hashVal); + bool fAdoptedElems; + DOMDeepNodeListPoolTableBucketElem<TVal>** fBucketList; + XMLSize_t fHashModulus; + HashBase* fHash; + TVal** fIdPtrs; + XMLSize_t fIdPtrsCount; + MemoryManager* fMemoryManager; + }; + template <class TVal> DOMDeepNodeListPool<TVal>::DOMDeepNodeListPool( const XMLSize_t modulus , const bool adoptElems , const XMLSize_t initSize) : fAdoptedElems(adoptElems) , fBucketList(0) , fHash(0) , fIdPtrs(0) { + fHash = new (fMemoryManager) HashPtr(); + fIdPtrs = (TVal**) fMemoryManager->allocate(fIdPtrsCount * sizeof(TVal*)); + if (modulus == 0) throw IllegalArgumentException("./xercesc/dom/impl/bad.c", 38, XMLExcepts::HshTbl_ZeroModulus, fMemoryManager); + } + template <class TVal> TVal* DOMDeepNodeListPool<TVal>::getByKey(const void* const key1, const XMLCh* const key2, const XMLCh* const key3) { + XMLSize_t hashVal; + DOMDeepNodeListPoolTableBucketElem<TVal>* findIt = findBucketElem(key1, key2, key3, hashVal); + } + template <class TVal> DOMDeepNodeListPoolTableBucketElem<TVal>* DOMDeepNodeListPool<TVal>:: findBucketElem(const void* const key1, const XMLCh* const key2, const XMLCh* const key3, XMLSize_t& hashVal) { + if (hashVal > fHashModulus) throw RuntimeException("./xercesc/dom/impl/bad.c", 64, XMLExcepts::HshTbl_BadHashFromKey, fMemoryManager); + DOMDeepNodeListPoolTableBucketElem<TVal>* curElem = fBucketList[hashVal]; + if (fHash->equals(key1, curElem->fKey1) && (XMLString::equals(key2, curElem->fKey2)) && (XMLString::equals(key3, curElem->fKey3))) { + return curElem; + } + } + class DOMDeepNodeListImpl; + class DOMDocumentImpl: public DOMDocument { + DOMNodeList* getElementsByTagName(const XMLCh * tagname) const; + DOMNodeList* getDeepNodeList(const DOMNode *rootNode, const XMLCh *tagName); + DOMNodeList* getDeepNodeList(const DOMNode *rootNode, const XMLCh *namespaceURI, const XMLCh *localName); + DOMDeepNodeListPool<DOMDeepNodeListImpl>* fNodeListPool; + }; + } + void * operator new(size_t amt, xercesc_2_5:: DOMDocument *doc); + namespace xercesc_2_5 { + class DOMNodeList { + }; + class DOMDeepNodeListImpl: public DOMNodeList { + }; + DOMNodeList *DOMDocumentImpl::getElementsByTagName(const XMLCh *tagname) const { + return ((DOMDocumentImpl*)this)->getDeepNodeList(this,tagname); + } + DOMNodeList *DOMDocumentImpl::getDeepNodeList(const DOMNode *rootNode, const XMLCh *tagName) { + if(!fNodeListPool) { + fNodeListPool = new (this) DOMDeepNodeListPool<DOMDeepNodeListImpl>(109, false); + } + DOMNodeList* retList = fNodeListPool->getByKey(rootNode, tagName, 0); + } + DOMNodeList *DOMDocumentImpl::getDeepNodeList(const DOMNode *rootNode, const XMLCh *namespaceURI, const XMLCh *localName) { + DOMNodeList* retList = fNodeListPool->getByKey(rootNode, localName, namespaceURI); + } + } + diff --git a/gcc/testsuite/g++.dg/torture/pr44357.C b/gcc/testsuite/g++.dg/torture/pr44357.C new file mode 100644 index 000000000..3380350e8 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr44357.C @@ -0,0 +1,228 @@ +/* { dg-do compile } */ +extern "C" +{ + typedef long unsigned int size_t; +} +namespace llvm +{ + namespace dont_use + { + template < typename T > double is_class_helper (...); + } + template < typename T > struct is_class + { + public:enum + { value = sizeof (char) == sizeof (dont_use::is_class_helper < T > (0)) }; + }; + template < typename T > struct isPodLike + { + static const bool value = !is_class < T >::value; + }; +} +namespace std __attribute__ ((__visibility__ ("default"))) +{ + template < typename _Iterator > struct iterator_traits + { + }; + template < typename _Tp > struct iterator_traits <_Tp * > + { + typedef _Tp value_type; + }; +} + +namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) +{ + template < typename _Tp > class new_allocator + { + public:typedef size_t size_type; + typedef const _Tp & const_reference; + }; +} + +namespace std __attribute__ ((__visibility__ ("default"))) +{ +template < typename _Tp > class allocator:public __gnu_cxx::new_allocator < + _Tp > + { + public:typedef size_t size_type; + template < typename _Tp1 > struct rebind + { + typedef allocator < _Tp1 > other; + }; + }; + template < typename _Tp, typename _Alloc > struct _Vector_base + { + typedef typename _Alloc::template rebind < _Tp >::other _Tp_alloc_type; + }; +template < typename _Tp, typename _Alloc = std::allocator < _Tp > >class vector:protected _Vector_base < _Tp, + _Alloc + > + { + typedef _Vector_base < _Tp, _Alloc > _Base; + typedef typename _Base::_Tp_alloc_type _Tp_alloc_type; + public:typedef _Tp value_type; + typedef typename _Tp_alloc_type::const_reference const_reference; + typedef size_t size_type; + size_type size () const + { + } const_reference operator[] (size_type __n) const + { + }}; +} + +namespace llvm +{ + struct LandingPadInfo; + class DwarfException + { + static bool PadLT (const LandingPadInfo * L, const LandingPadInfo * R); + struct CallSiteEntry + { + }; + void EmitExceptionTable (); + }; +} +namespace std __attribute__ ((__visibility__ ("default"))) +{ + template < typename _RandomAccessIterator, + typename _Compare > + void __unguarded_linear_insert (_RandomAccessIterator __last, + _Compare __comp) + { + typename iterator_traits < _RandomAccessIterator >::value_type __val = + (*__last); + _RandomAccessIterator __next = __last; + while (__comp (__val, *__next)) + { + } + } + template < typename _RandomAccessIterator, + typename _Compare > void __insertion_sort (_RandomAccessIterator __first, + _RandomAccessIterator __last, + _Compare __comp) + { + for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i) + { + if (__comp (*__i, *__first)) + { + } + else + std::__unguarded_linear_insert (__i, __comp); + } + } + enum + { _S_threshold = 16 }; + template < typename _RandomAccessIterator, + typename _Compare > + void __final_insertion_sort (_RandomAccessIterator __first, + _RandomAccessIterator __last, + _Compare __comp) + { + if (__last - __first > int (_S_threshold)) + { + std::__insertion_sort (__first, __first + int (_S_threshold), __comp); + } + } + template < typename _RandomAccessIterator, + typename _Compare > inline void sort (_RandomAccessIterator __first, + _RandomAccessIterator __last, + _Compare __comp) + { + if (__first != __last) + { + std::__final_insertion_sort (__first, __last, __comp); + } + } +} + +namespace llvm +{ + class SmallVectorBase + { + protected:void *BeginX, *EndX, *CapacityX; + struct U + { + } FirstEl; + protected: SmallVectorBase (size_t Size):BeginX (&FirstEl), EndX (&FirstEl), + CapacityX ((char *) &FirstEl + Size) + { + }}; +template < typename T > class SmallVectorTemplateCommon:public + SmallVectorBase + { + public: SmallVectorTemplateCommon (size_t Size):SmallVectorBase (Size) + { + } typedef size_t size_type; + typedef T *iterator; + iterator begin () + { + } iterator end () + { + } size_type size () const + { + }}; +template < typename T, bool isPodLike > class SmallVectorTemplateBase:public SmallVectorTemplateCommon < + T > + { + public: SmallVectorTemplateBase (size_t Size):SmallVectorTemplateCommon < T > + (Size) + { + }}; +template < typename T > class SmallVectorImpl:public SmallVectorTemplateBase < T, + isPodLike < T >::value > + { + typedef SmallVectorTemplateBase < T, isPodLike < T >::value > SuperClass; + public:typedef typename SuperClass::iterator iterator; + explicit SmallVectorImpl (unsigned N):SmallVectorTemplateBase < T, + isPodLike < T >::value > (N * sizeof (T)) + { + } + }; + template < typename T, + unsigned N > class SmallVector:public SmallVectorImpl < T > + { + typedef typename SmallVectorImpl < T >::U U; + enum + { MinUs = + (static_cast < unsigned int >(sizeof (T)) * N + static_cast < + unsigned int >(sizeof (U)) - 1) /static_cast < + unsigned int >(sizeof (U)), NumInlineEltsElts = + MinUs > 1 ? (MinUs - 1) : 1, NumTsAvailable = + (NumInlineEltsElts + 1) * static_cast < + unsigned int >(sizeof (U)) / static_cast < + unsigned int >(sizeof (T)) }; + public: SmallVector ():SmallVectorImpl < T > (NumTsAvailable) + { + } + }; + struct LandingPadInfo + { + std::vector < int >TypeIds; + union + { + } Contents; + }; +} + +using namespace llvm; +bool +DwarfException::PadLT (const LandingPadInfo * L, const LandingPadInfo * R) +{ + const std::vector < int >&LIds = L->TypeIds, &RIds = R->TypeIds; + unsigned LSize = LIds.size (), RSize = RIds.size (); + unsigned MinSize = LSize < RSize ? LSize : RSize; + for (unsigned i = 0; i != MinSize; ++i) + if (LIds[i] != RIds[i]) + return LIds[i] < RIds[i]; +} + +void +DwarfException::EmitExceptionTable () +{ + SmallVector < const LandingPadInfo *, 64 > LandingPads; + std::sort (LandingPads.begin (), LandingPads.end (), PadLT); + SmallVector < CallSiteEntry, 64 > CallSites; + for (unsigned i = 0, e = CallSites.size (); i < e; ++i) + { + } +} diff --git a/gcc/testsuite/g++.dg/torture/pr44492.C b/gcc/testsuite/g++.dg/torture/pr44492.C new file mode 100644 index 000000000..41669241e --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr44492.C @@ -0,0 +1,31 @@ +// PR middle-end/44492 +// { dg-do run } + +struct T { unsigned long p; }; +struct S { T a, b, c; unsigned d; }; + +__attribute__((noinline)) +void +bar (const T &x, const T &y) +{ + if (x.p != 0x2348 || y.p != 0x2346) + __builtin_abort (); +} + +__attribute__((noinline)) +void +foo (S &s, T e) +{ + unsigned long a = e.p; + unsigned long b = s.b.p; + __asm__ volatile ("" : : "rm" (a), "rm" (b)); + bar (e, s.b); +} + +int +main () +{ + S s = { { 0x2345 }, { 0x2346 }, { 0x2347 }, 6 }; + T t = { 0x2348 }; + foo (s, t); +} diff --git a/gcc/testsuite/g++.dg/torture/pr44535.C b/gcc/testsuite/g++.dg/torture/pr44535.C new file mode 100644 index 000000000..9126f3997 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr44535.C @@ -0,0 +1,34 @@ +/* { dg-do run } */ + +namespace FOO { + +template <typename T> +class A +{ +public: + void Enum(); + virtual void OnProv() = 0; + virtual ~A() { } +}; +typedef A<char> B; + +template<typename T> +void A<T>::Enum () +{ + OnProv (); +} +} // namespace FOO + +class C {}; + +class D: public C, public FOO::B { +public: + void OnProv() {} +}; + +int main(int argc, char *argv[]) +{ + D x; + x.Enum(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr44809.C b/gcc/testsuite/g++.dg/torture/pr44809.C new file mode 100644 index 000000000..b6615f23f --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr44809.C @@ -0,0 +1,6 @@ +// { dg-do compile } +unsigned int mEvictionRank[(1 << 5)]; +void Unswap(int i) +{ + mEvictionRank[i] = ({ unsigned int __v = i; __v; }); +} diff --git a/gcc/testsuite/g++.dg/torture/pr44813.C b/gcc/testsuite/g++.dg/torture/pr44813.C new file mode 100644 index 000000000..1dc01b06a --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr44813.C @@ -0,0 +1,60 @@ +typedef unsigned int PRUint32; +typedef int PRInt32; +typedef unsigned long PRUint64; +typedef int PRIntn; +typedef PRIntn PRBool; +struct nsRect { + nsRect(const nsRect& aRect) { } +}; +enum nsCompatibility { eCompatibility_NavQuirks = 3 }; +class gfxContext; +typedef PRUint64 nsFrameState; +class nsPresContext { +public: + nsCompatibility CompatibilityMode() const { } +}; +class nsStyleContext { +public: + PRBool HasTextDecorations() const; +}; +class nsIFrame { +public: + nsPresContext* PresContext() const; + nsStyleContext* GetStyleContext() const; + nsFrameState GetStateBits() const; + nsRect GetOverflowRect() const; +}; +class nsFrame : public nsIFrame { }; +class nsLineList_iterator { }; +class nsLineList { +public: + typedef nsLineList_iterator iterator; +}; +class gfxSkipCharsIterator { }; +class gfxTextRun { +public: + class PropertyProvider { }; +}; +class nsTextFrame : public nsFrame +{ + virtual nsRect ComputeTightBounds(gfxContext* aContext) const; + gfxSkipCharsIterator EnsureTextRun(gfxContext* aReferenceContext = 0L, + nsIFrame* aLineContainer = 0L, + const nsLineList::iterator* aLine = 0L, + PRUint32* aFlowEndInTextRun = 0L); +}; +class PropertyProvider : public gfxTextRun::PropertyProvider +{ +public: + PropertyProvider(nsTextFrame* aFrame, const gfxSkipCharsIterator& aStart); + PRInt32 mLength[64]; +}; +nsRect nsTextFrame::ComputeTightBounds(gfxContext* aContext) const +{ + if ((GetStyleContext()->HasTextDecorations() + && eCompatibility_NavQuirks == PresContext()->CompatibilityMode()) + || (GetStateBits() & (nsFrameState(1) << (23)))) + return GetOverflowRect(); + gfxSkipCharsIterator iter = const_cast<nsTextFrame*>(this)->EnsureTextRun(); + PropertyProvider provider(const_cast<nsTextFrame*>(this), iter); +} diff --git a/gcc/testsuite/g++.dg/torture/pr44826.C b/gcc/testsuite/g++.dg/torture/pr44826.C new file mode 100644 index 000000000..aece14070 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr44826.C @@ -0,0 +1,44 @@ +typedef unsigned short PRUint16; +typedef PRUint16 PRUnichar; +template <class CharT> struct nsCharTraits { +}; +class nsAString_internal { +public: + typedef PRUnichar char_type; +}; +class nsString : public nsAString_internal { +public: + typedef nsString self_type; + nsString( const self_type& str ); +}; +class nsDependentString : public nsString { +public: + explicit nsDependentString( const char_type* data ); +}; +typedef struct sqlite3_stmt sqlite3_stmt; +const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); +class nsIVariant { }; +template <typename DataType> struct variant_storage_traits { + typedef DataType ConstructorType; + typedef DataType StorageType; + static inline StorageType storage_conversion(ConstructorType aData) { + return aData; + } +}; +template <typename DataType> class Variant : public nsIVariant { +public: + Variant(typename variant_storage_traits<DataType>::ConstructorType aData) + : mData(variant_storage_traits<DataType>::storage_conversion(aData)) {} + typename variant_storage_traits<DataType>::StorageType mData; +}; +typedef Variant<nsString> TextVariant; +class Row { + void initialize(sqlite3_stmt *aStatement); +}; +void Row::initialize(sqlite3_stmt *aStatement) +{ + nsDependentString str(static_cast<const PRUnichar +*>(::sqlite3_column_text16(aStatement, 0))); + new TextVariant(str); +} + diff --git a/gcc/testsuite/g++.dg/torture/pr44900.C b/gcc/testsuite/g++.dg/torture/pr44900.C new file mode 100644 index 000000000..ad150d7fb --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr44900.C @@ -0,0 +1,76 @@ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-msse" } */ +/* { dg-require-effective-target sse_runtime } */ + +typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__)); +typedef float __v4sf __attribute__ ((__vector_size__ (16))); + +extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, +__artificial__)) +_mm_set_ps (const float __Z, const float __Y, const float __X, const float __W) +{ + return __extension__ (__m128)(__v4sf){ __W, __X, __Y, __Z }; +} + +struct vec +{ + union { + __m128 v; + float e[4]; + }; + + static const vec & zero() + { + static const vec v = _mm_set_ps(0, 0, 0, 0); + return v; + } + + vec() {} + vec(const __m128 & a) : v(a) {} + + operator const __m128&() const { return v; } +}; + +struct vec2 +{ + vec _v1; + vec _v2; + + vec2() {} + vec2(const vec & a, const vec & b) : _v1(a), _v2(b) {} + + static vec2 load(const float * a) + { + return vec2( + __builtin_ia32_loadups(&a[0]), + __builtin_ia32_loadups(&a[4])); + } + + const vec & v1() const { return _v1; } + const vec & v2() const { return _v2; } +}; + +extern "C" void abort(void); + + +inline bool operator==(const vec & a, const vec & b) +{ return 0xf == __builtin_ia32_movmskps(__builtin_ia32_cmpeqps(a, b)); } + +int main( int argc, char * argv[] ) +{ + __attribute__((aligned(16))) float data[] = + { 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5 }; + + float * p = &data[2]; + vec2 a; + + a = vec2::load(p); + + vec v1 = a.v1(); + vec v2 = a.v2(); + + if (v2.e[3] != 7.0) + abort(); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr44915.C b/gcc/testsuite/g++.dg/torture/pr44915.C new file mode 100644 index 000000000..ba7e96606 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr44915.C @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-findirect-inlining" } */ + +struct A; + +typedef void (A::*f_ptr) (); + +void dummy (f_ptr) { } + +void call_dummy (f_ptr cb) +{ + dummy (cb); +} diff --git a/gcc/testsuite/g++.dg/torture/pr44972.C b/gcc/testsuite/g++.dg/torture/pr44972.C new file mode 100644 index 000000000..e409148da --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr44972.C @@ -0,0 +1,142 @@ +/* { dg-do compile } */ + +#include<cassert> +#include<new> +#include<utility> + +namespace boost { + +template<class T> +class optional; + +class aligned_storage +{ + char data[ 1000 ]; + public: + void const* address() const { return &data[0]; } + void * address() { return &data[0]; } +} ; + + +template<class T> +class optional_base +{ + protected : + optional_base(){} + optional_base ( T const& val ) + { + construct(val); + } + + template<class U> + void assign ( optional<U> const& rhs ) + { + if (!is_initialized()) + if ( rhs.is_initialized() ) + construct(T()); + } + + public : + + bool is_initialized() const { return m_initialized ; } + + protected : + + void construct ( T const& val ) + { + new (m_storage.address()) T(val) ; + } + + T const* get_ptr_impl() const + { return static_cast<T const*>(m_storage.address()); } + + private : + + bool m_initialized ; + aligned_storage m_storage ; +} ; + + +template<class T> +class optional : public optional_base<T> +{ + typedef optional_base<T> base ; + + public : + + optional() : base() {} + optional ( T const& val ) : base(val) {} + optional& operator= ( optional const& rhs ) + { + this->assign( rhs ) ; + return *this ; + } + + T const& get() const ; + + T const* operator->() const { assert(this->is_initialized()) ; return this->get_ptr_impl() ; } + +} ; + + +} // namespace boost + + +namespace std +{ + + template<typename _Tp, std::size_t _Nm> + struct array + { + typedef _Tp value_type; + typedef const value_type* const_iterator; + + value_type _M_instance[_Nm]; + + }; +} + + +class NT +{ + double _inf, _sup; +}; + + +template < typename T > inline +std::array<T, 1> +make_array(const T& b1) +{ + std::array<T, 1> a = { { b1 } }; + return a; +} + +class V +{ + typedef std::array<NT, 1> Base; + Base base; + +public: + V() {} + V(const NT &x) + : base(make_array(x)) {} + +}; + +using boost::optional ; + +optional< std::pair< NT, NT > > + linsolve_pointC2() ; + +optional< V > construct_normal_offset_lines_isecC2 ( ) +{ + optional< std::pair<NT,NT> > ip; + + ip = linsolve_pointC2(); + + V a(ip->first) ; + return a; +} + + + diff --git a/gcc/testsuite/g++.dg/torture/pr45393.C b/gcc/testsuite/g++.dg/torture/pr45393.C new file mode 100644 index 000000000..5bf16b034 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr45393.C @@ -0,0 +1,38 @@ +// { dg-do compile } + +class FloatPoint; +class Path { +public: + ~Path(); + void moveTo(const FloatPoint&); + static void createEllipse(const FloatPoint& center, float rx, float ry); +}; +extern "C" { + extern float cosf (float); + extern float sinf (float); +} +const float piFloat = static_cast<float>(3.14159265358979323846); +class FloatPoint { +public: + FloatPoint(float x, float y) : m_x(x), m_y(y) { } + float x() const; + float y() const; + float m_x, m_y; +}; +void Path::createEllipse(const FloatPoint& center, float rx, float ry) +{ + float cx = center.x(); + float cy = center.y(); + Path path; + float x = cx; + float y = cy; + unsigned step = 0, num = 100; + while (1) { + float angle = static_cast<float>(step) / num * 2.0f * piFloat; + x = cx + cosf(angle) * rx; + y = cy + sinf(angle) * ry; + step++; + if (step == 1) + path.moveTo(FloatPoint(x, y)); + } +} diff --git a/gcc/testsuite/g++.dg/torture/pr45580.C b/gcc/testsuite/g++.dg/torture/pr45580.C new file mode 100644 index 000000000..c3af4910a --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr45580.C @@ -0,0 +1,50 @@ +// { dg-do compile } + +namespace std { + typedef __SIZE_TYPE__ size_t; +} +inline void* operator new(std::size_t, void* __p) throw() { + return __p; +} +class Noncopyable { }; +struct CollectorCell { }; +template<typename T> class PassRefPtr { +public: + T* releaseRef() const { } +}; +template <typename T> class NonNullPassRefPtr { +public: + template <class U> NonNullPassRefPtr(const PassRefPtr<U>& o) + : m_ptr(o.releaseRef()) { } + mutable T* m_ptr; +}; +struct ClassInfo; +class JSValue { }; +JSValue jsNull(); +class Structure; +class JSGlobalData { + static void storeVPtrs(); +}; +class JSCell : public Noncopyable { + friend class JSObject; + friend class JSGlobalData; + virtual ~JSCell(); +}; +class JSObject : public JSCell { +public: + explicit JSObject(NonNullPassRefPtr<Structure>); + static PassRefPtr<Structure> createStructure(JSValue prototype) { } +}; +class JSByteArray : public JSObject { + friend class JSGlobalData; + enum VPtrStealingHackType { VPtrStealingHack }; + JSByteArray(VPtrStealingHackType) + : JSObject(createStructure(jsNull())), m_classInfo(0) { } + const ClassInfo* m_classInfo; +}; +void JSGlobalData::storeVPtrs() { + CollectorCell cell; + void* storage = &cell; + JSCell* jsByteArray = new (storage) JSByteArray(JSByteArray::VPtrStealingHack); + jsByteArray->~JSCell(); +} diff --git a/gcc/testsuite/g++.dg/torture/pr45699.C b/gcc/testsuite/g++.dg/torture/pr45699.C new file mode 100644 index 000000000..828c1ef8e --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr45699.C @@ -0,0 +1,61 @@ +// { dg-do run } + +extern "C" void abort (); + +class A +{ +public: + virtual void foo () {abort();} +}; + +class B : public A +{ +public: + int z; + virtual void foo () {abort();} +}; + +class C : public A +{ +public: + void *a[32]; + unsigned long b; + long c[32]; + + virtual void foo () {abort();} +}; + +class D : public C, public B +{ +public: + D () : C(), B() + { + int i; + for (i = 0; i < 32; i++) + { + a[i] = (void *) 0; + c[i] = 0; + } + b = 0xaaaa; + } + + virtual void foo (); +}; + +void D::foo() +{ + if (b != 0xaaaa) + abort(); +} + +static inline void bar (B &b) +{ + b.foo (); +} + +int main() +{ + D d; + bar (d); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr45709-2.C b/gcc/testsuite/g++.dg/torture/pr45709-2.C new file mode 100644 index 000000000..1f6a2344f --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr45709-2.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +struct Region { + int storage[4]; + int count; +}; +static inline Region subtract(int lhs) +{ + Region reg; + int* storage = reg.storage; + int* storage2 = reg.storage; + if (lhs > 0) + storage++, storage2--; + reg.count = storage - reg.storage + storage2 - reg.storage; + return reg; +} +void bar(int a) +{ + const Region copyBack(subtract(a)); +} diff --git a/gcc/testsuite/g++.dg/torture/pr45709.C b/gcc/testsuite/g++.dg/torture/pr45709.C new file mode 100644 index 000000000..1584ec76a --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr45709.C @@ -0,0 +1,19 @@ +// { dg-do compile } + +struct Region { + int storage[4]; + int count; +}; +static inline Region subtract(int lhs) +{ + Region reg; + int* storage = reg.storage; + if (lhs > 0) + storage++; + reg.count = storage - reg.storage; + return reg; +} +void bar(int a) +{ + const Region copyBack(subtract(a)); +} diff --git a/gcc/testsuite/g++.dg/torture/pr45843.C b/gcc/testsuite/g++.dg/torture/pr45843.C new file mode 100644 index 000000000..f77b8cb01 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr45843.C @@ -0,0 +1,28 @@ +// PR target/45843 +// { dg-do run } + +#include <stdarg.h> + +extern "C" void abort (); +struct S { struct T { } a[14]; char b; }; +struct S arg, s; + +void +foo (int z, ...) +{ + char c; + va_list ap; + va_start (ap, z); + c = 'a'; + arg = va_arg (ap, struct S); + if (c != 'a') + abort (); + va_end (ap); +} + +int +main () +{ + foo (1, s); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr45854.C b/gcc/testsuite/g++.dg/torture/pr45854.C new file mode 100644 index 000000000..17ee006e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr45854.C @@ -0,0 +1,30 @@ +// { dg-do compile } + +template < typename = void > +struct X { } ; +struct Y +{ + Y () ; +} ; +template < typename = X < > > +struct T +{ + void f () + { + f () ; + } +} ; +struct S +{ + S ( X < > = X < > ()) ; + ~S () + { + T < > () . f () ; + } +} ; +struct Z +{ + S s ; + Y y ; +} a ; + diff --git a/gcc/testsuite/g++.dg/torture/pr45874.C b/gcc/testsuite/g++.dg/torture/pr45874.C new file mode 100644 index 000000000..70965ff57 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr45874.C @@ -0,0 +1,58 @@ +// { dg-do compile } + +typedef struct { +} IppLibraryVersion; +typedef unsigned char Ipp8u; +typedef unsigned int Ipp32u; +typedef signed int Ipp32s; +typedef enum e_vm_Status { + VM_OK = 0, VM_OPERATION_FAILED =-999, VM_NOT_INITIALIZED =-998, VM_TIMEOUT =-987, VM_NOT_ENOUGH_DATA =-996, VM_NULL_PTR =-995, VM_SO_CANT_LOAD =-994, VM_SO_INVALID_HANDLE =-993, VM_SO_CANT_GET_ADDR =-992 } + vm_status; + typedef Ipp32s Status; + class MediaReceiver { + }; +class MediaBuffer : public MediaReceiver { +}; +struct TrackInfo { +}; +struct Mpeg2TrackInfo : public TrackInfo { +}; +class BitstreamReader { +public: BitstreamReader(void); + virtual ~BitstreamReader(void) { + } + Ipp32u GetBits(Ipp32s iNum); + void SkipBits(Ipp32s iNum); +protected: virtual void Refresh(void); + Ipp32s m_iReadyBits; +}; +class FrameConstructor : public MediaBuffer { +}; +class VideoFrameConstructor : public FrameConstructor { +}; +class Mpeg2FrameConstructor : public VideoFrameConstructor { + static Status ParsePictureHeader(Ipp8u *buf, Ipp32s iLen, Mpeg2TrackInfo *pInfo); +}; +Status Mpeg2FrameConstructor::ParsePictureHeader(Ipp8u *buf, Ipp32s iLen, Mpeg2TrackInfo *pInfo) { + BitstreamReader bs; + bs.SkipBits(32 + 4 + 4 + 4 + 4 + 4 + 2); + bs.SkipBits(1 + 1 + 1 + 1 + 1 + 1 + 1); + bs.SkipBits(5); + bs.SkipBits(3); + Ipp8u source_format; + bs.SkipBits(22); + bs.SkipBits(8); + if (7 == source_format) { + Ipp8u ufep = (Ipp8u)bs.GetBits(3); + if (0x01 == ufep) { + bs.SkipBits(10); + } + } +} +void BitstreamReader::SkipBits(Ipp32s iNum) { + if (iNum <= m_iReadyBits) { + m_iReadyBits -= iNum; + Refresh(); + } +} +void BitstreamReader::Refresh(void) { } diff --git a/gcc/testsuite/g++.dg/torture/pr45875.C b/gcc/testsuite/g++.dg/torture/pr45875.C new file mode 100644 index 000000000..f1347f543 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr45875.C @@ -0,0 +1,25 @@ +// { dg-do compile } + +struct c1 {}; + +struct c10 : c1 +{ + virtual void foo (); +}; + +struct c11 : c10, c1 // // { dg-warning "" } +{ + virtual void f6 (); +}; + +struct c28 : virtual c11 +{ + void f6 (); +}; + +void check_c28 () +{ + c28 obj; + c11 *ptr = &obj; + ptr->f6 (); +} diff --git a/gcc/testsuite/g++.dg/torture/pr45877.C b/gcc/testsuite/g++.dg/torture/pr45877.C new file mode 100644 index 000000000..9af6ae999 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr45877.C @@ -0,0 +1,141 @@ +// { dg-do compile } + +namespace std __attribute__ ((__visibility__ ("default"))) +{ + typedef __SIZE_TYPE__ size_t; + template<typename _Alloc> class allocator; + template<class _CharT> struct char_traits; + template<typename _CharT, typename _Traits = char_traits<_CharT>, + typename _Alloc = allocator<_CharT> > + class basic_string; + typedef basic_string<char> string; + template<class _T1, class _T2> struct pair { }; + template<typename _Tp> class allocator { }; + template<typename _Arg1, typename _Arg2, typename _Result> + struct binary_function { + typedef _Arg1 first_argument_type; + typedef _Arg2 second_argument_type; + typedef _Result result_type; + }; + template<typename _CharT, typename _Traits, typename _Alloc> + class basic_string { + public: + basic_string(const _CharT* __s, const _Alloc& __a = _Alloc()); + }; + class type_info { + public: + const char* name() const; + }; + extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__, __artificial__)) + void * memcpy (void *__restrict __dest, __const void *__restrict __src, size_t __len) throw () + { + return __builtin___memcpy_chk (__dest, __src, __len, __builtin_object_size (__dest, 0)); + } + template <typename _Key, typename _Tp > + class map { + typedef _Key key_type; + typedef _Tp mapped_type; + public: + mapped_type& operator[](const key_type& __k); + }; +} +class CodeAlloc { }; +using namespace std; +typedef void *Stack; +class basicForEachType; +typedef const basicForEachType * aType; +extern map<const string,basicForEachType *> map_type; +class AnyTypeWithOutCheck { }; +typedef AnyTypeWithOutCheck AnyType; +template<typename T> AnyTypeWithOutCheck inline SetAny(const T & x) +{ + AnyTypeWithOutCheck any; + memcpy(&any,&x,sizeof(x)); +} +template<typename T> const T& GetAny(const AnyTypeWithOutCheck & x); +class E_F0; +class C_F0; +class Polymorphic; +typedef E_F0 * Expression; +class basicAC_F0; +extern Polymorphic * TheOperators, * TheRightOperators; +class basicForEachType : public CodeAlloc { +public: + virtual C_F0 CastTo(const C_F0 & e) const ; +}; +class E_F0 :public CodeAlloc { +public: + virtual AnyType operator()(Stack) const =0; +}; +class E_F0mps : public E_F0 { +}; +class ArrayOfaType : public CodeAlloc{ +protected: + aType * t; +}; +class OneOperator : public ArrayOfaType { +public: + OneOperator(aType rr,aType a,aType b); + virtual E_F0 * code(const basicAC_F0 &) const =0; +}; +class Polymorphic: public E_F0mps { +public: + void Add(const char * op,OneOperator * p0 ,OneOperator * p1=0) const; +}; +class C_F0 { +public: + operator E_F0 * () const; +}; +class basicAC_F0 { +public: + const C_F0 & operator [] (int i) const; +}; +struct OneBinaryOperatorMI { }; +struct evalE_F2 { }; +template<typename C,class MI=OneBinaryOperatorMI,class MIx=evalE_F2 > +class OneBinaryOperator : public OneOperator +{ + typedef typename C::result_type R; + typedef typename C::first_argument_type A; + typedef typename C::second_argument_type B; + aType t0,t1; + class Op : public E_F0 { + Expression a,b; + public: + AnyType operator()(Stack s) const { + return SetAny<R>(static_cast<R>(C::f( GetAny<A>((*a)(s)), + GetAny<B>((*b)(s))))); + } + Op(Expression aa,Expression bb) : a(aa),b(bb) { } + }; +public: + E_F0 * code(const basicAC_F0 & args) const { + return new Op(t0->CastTo(args[0]),t1->CastTo(args[1])); + } + OneBinaryOperator() + : OneOperator(map_type[typeid(R).name()], + map_type[typeid(A).name()], + map_type[typeid(B).name()]), t0(t[0]), t1(t[1]) { } +}; +struct NothingType { }; +class ShapeOfArray{ }; +template<class R> class KN_: public ShapeOfArray { }; +template <class T> struct affectation: binary_function<T, T, T> { }; +template<class K,class L,class OP> struct set_A_BI +: public binary_function<KN_<K>,pair<KN_<K>, KN_<L> > *,KN_<K> > +{ + static KN_<K> f(const KN_<K> & a, pair<KN_<K>, KN_<L> > * const & b); +}; +template<class K,class L,class OP> struct set_AI_B +: public binary_function<pair<KN_<K>, KN_<L> > * ,KN_<K>, NothingType > +{ + static NothingType f( pair<KN_<K>, KN_<L> > * const & b,const KN_<K> & a); +}; +template<class K,class Z> void ArrayOperator() +{ + TheOperators->Add("=", new OneBinaryOperator<set_A_BI< K,Z,affectation<K> > >, + new OneBinaryOperator<set_AI_B< K,Z,affectation<K> > >); +} +void initArrayOperatorlong() { + ArrayOperator<long,long>(); +} diff --git a/gcc/testsuite/g++.dg/torture/pr45934.C b/gcc/testsuite/g++.dg/torture/pr45934.C new file mode 100644 index 000000000..f43964107 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr45934.C @@ -0,0 +1,23 @@ +/* { dg-do run } */ + +extern "C" void abort (); + +struct B *b; + +struct B +{ + virtual void f () { } + ~B() { b->f(); } +}; + +struct D : public B +{ + virtual void f () { abort (); } +}; + +int main () +{ + D d; + b = &d; + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr46111.C b/gcc/testsuite/g++.dg/torture/pr46111.C new file mode 100644 index 000000000..df57d8d02 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr46111.C @@ -0,0 +1,32 @@ +// { dg-do compile } +// { dg-require-effective-target pthread } +// { dg-options "-ftree-parallelize-loops=2 -g" } + +struct A +{ + int zero () + { + return 0; + } +}; + +static inline void +bar (int) +{ +} + +struct B +{ + struct A a; + B (int n) + { + for (int i = 0; i < n; i++) + bar (a.zero ()); + } +}; + +void +foo (int n) +{ + struct B b (n); +} diff --git a/gcc/testsuite/g++.dg/torture/pr46149.C b/gcc/testsuite/g++.dg/torture/pr46149.C new file mode 100644 index 000000000..bdc3d7704 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr46149.C @@ -0,0 +1,51 @@ +// { dg-do run } +// { dg-options "-fno-tree-sra" } + +struct S +{ + S ():p ((char *) __builtin_calloc (1, 1)) + { + } + char *p; +}; + +template < class T > struct A +{ + A (const S & __m1, const T & __m2):m1 (__m1), m2 (__m2) + { + } + const S & m1; + const T & m2; +}; + +struct B:A < S > +{ + B (const S & __v):A < S > (__v, __v) + { + } +}; + +struct C:A < B > +{ + C (const S & __e1, const B & __e2):A < B > (__e1, __e2) + { + } +}; + +struct D +{ + D (const C & __c):c (__c) + { + } + const C c; +}; + +int +main () +{ + S s; + B b (s); + C c (s, b); + D d (c); + return d.c.m2.m2.p[0]; +} diff --git a/gcc/testsuite/g++.dg/torture/pr46154.C b/gcc/testsuite/g++.dg/torture/pr46154.C new file mode 100644 index 000000000..424b1fad8 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr46154.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-fipa-cp-clone" } */ + +struct S +{ + virtual int foo () + { + return foo () == 0; + } + virtual void baz (); +}; + +void A () +{ + S s; + s.foo (); +} diff --git a/gcc/testsuite/g++.dg/torture/pr46287.C b/gcc/testsuite/g++.dg/torture/pr46287.C new file mode 100644 index 000000000..fd201c48d --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr46287.C @@ -0,0 +1,66 @@ +// Check that indirect calls to thunks do not lead to errors. +// { dg-do run } + +extern "C" void abort (); + +class A +{ +public: + virtual void foo () {abort();} +}; + +class B : public A +{ +public: + int z; + virtual void foo () {abort();} +}; + +class C : public A +{ +public: + void *a[32]; + unsigned long b; + long c[32]; + + virtual void foo () {abort();} +}; + +class D : public C, public B +{ +public: + D () : C(), B() + { + int i; + for (i = 0; i < 32; i++) + { + a[i] = (void *) 0; + c[i] = 0; + } + b = 0xaaaa; + } + + virtual void foo (); +}; + +void D::foo() +{ + if (b != 0xaaaa) + abort(); +} + +static inline void bar (B &b) +{ + + b.foo (); +} + +int main() +{ + int i; + D d; + + for (i = 0; i < 5000; i++) + bar (d); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr46364.C b/gcc/testsuite/g++.dg/torture/pr46364.C new file mode 100644 index 000000000..8098991ac --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr46364.C @@ -0,0 +1,20 @@ +// { dg-do compile } +#include <string> + +void a() throw (int); +void b(std::string const &); + +void c(std::string *e) +{ + b(""); + + try { + a(); + } catch (...) { + *e = ""; + } +} + +void d() { + c(0); +} diff --git a/gcc/testsuite/g++.dg/torture/pr46367.C b/gcc/testsuite/g++.dg/torture/pr46367.C new file mode 100644 index 000000000..260b5c113 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr46367.C @@ -0,0 +1,11 @@ +#pragma interface +struct S +{ + S *s; + ~S () + { + delete s; + } +}; + +S s; diff --git a/gcc/testsuite/g++.dg/torture/pr46383.C b/gcc/testsuite/g++.dg/torture/pr46383.C new file mode 100644 index 000000000..2b610394b --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr46383.C @@ -0,0 +1,252 @@ +// { dg-do compile } + +namespace std { +template<class,class>struct pair{}; + template<typename _Tp> struct _Vector_base { + struct _Vector_impl + { + _Tp* _M_start; + _Tp* _M_finish; + _Tp* _M_end_of_storage; + }; + _Vector_impl _M_impl; + }; + template<typename _Tp > + struct vector : _Vector_base<_Tp> + { + vector(const vector& __x); + }; +} +namespace boost { +struct G{}; +template <class T, class U > +struct modable2 +: G +{ }; +} +namespace CGAL { +struct Rep { }; +struct Handle +{ + Handle() ; + Handle(const Handle& x) ; + Rep* PTR; +}; +template <typename ET_> class Lazy_exact_nt + : Handle + , boost::modable2< Lazy_exact_nt<ET_>, int > + , boost::modable2< Lazy_exact_nt<ET_>, double > +{ }; + struct CC_iterator { }; +struct Triangulation_data_structure_3 { + typedef CC_iterator Vertex_handle; + typedef CC_iterator Cell_handle; + typedef std::pair<Cell_handle, int> Facet; +}; +template < class GT, class Tds_ > struct Triangulation_3 { + typedef Tds_ Tds; + typedef typename GT::Point_3 Point; + typedef typename Tds::Facet Facet; + typedef typename Tds::Vertex_handle Vertex_handle; + enum Locate_type { VERTEX=0, EDGE, FACET, CELL, OUTSIDE_CONVEX_HULL, OUTSIDE_AFFINE_HULL }; + Tds _tds; + bool is_infinite(const Facet & f) const ; +}; +template < class Gt, class Tds_ > struct Delaunay_triangulation_3 : public Triangulation_3<Gt, Tds_> { }; + namespace Surface_mesher { enum Verbose_flag { VERBOSE, NOT_VERBOSE }; } +enum Mesher_level_conflict_status { NO_CONFLICT = 0, CONFLICT_BUT_ELEMENT_CAN_BE_RECONSIDERED, CONFLICT_AND_ELEMENT_SHOULD_BE_DROPPED }; +struct Null_mesher_level { + template <typename P, typename Z> Mesher_level_conflict_status test_point_conflict_from_superior(P, Z) ; +}; +template < class Tr, class Derived, class Element, class Previous, class Triangulation_traits > struct Mesher_level { + typedef Tr Triangulation; + typedef typename Triangulation::Point Point; + typedef typename Triangulation::Vertex_handle Vertex_handle; + typedef typename Triangulation_traits::Zone Zone; + typedef Previous Previous_level; + Derived& derived() { return static_cast<Derived&>(*this); } + Previous& previous_level; + Mesher_level(Previous_level& previous) + : previous_level(previous) + { } + Vertex_handle insert(Point p, Zone& z) ; + Zone conflicts_zone(const Point& p, Element e) ; + Element get_next_element() ; + template <class Mesh_visitor> void before_insertion(Element& e, const Point& p, Zone& zone, Mesh_visitor visitor) { + visitor.before_insertion(e, p, zone); + } + template <class Mesh_visitor> void after_insertion(Vertex_handle vh, Mesh_visitor visitor) { + derived().after_insertion_impl(vh); + } + template <class Mesh_visitor> void after_no_insertion(const Element& e, const Point& p, Zone& zone, Mesh_visitor visitor) { + visitor.after_no_insertion(e, p, zone); + } + template <class Mesh_visitor> void refine(Mesh_visitor visitor) + { + Element e = get_next_element(); + const Mesher_level_conflict_status result = try_to_refine_element(e, visitor); + } + template <class Mesh_visitor> Mesher_level_conflict_status try_to_refine_element(Element e, Mesh_visitor visitor) + { + Point p ; + Zone zone = conflicts_zone(p, e); + const Mesher_level_conflict_status result = test_point_conflict(p, zone); + before_insertion(e, p, zone, visitor); + Vertex_handle v = insert(p, zone); + after_insertion(v, visitor); + after_no_insertion(e, p, zone, visitor); + } + Mesher_level_conflict_status test_point_conflict(const Point& p, Zone& zone) + { + return previous_level.test_point_conflict_from_superior(p, zone); + } +}; +struct Null_mesh_visitor { + template <typename E, typename P, typename Z> void before_insertion(E, P, Z) const {} + template <typename E, typename P, typename Z> void after_no_insertion(E, P, Z) const {} +}; +template <class Tr> struct Triangulation_ref_impl { + Triangulation_ref_impl(Tr& t); +}; +template <typename Tr> struct Triangulation_mesher_level_traits_3 +: public Triangulation_ref_impl<Tr> +{ + typedef typename Tr::Facet Facet; + Triangulation_mesher_level_traits_3(Tr& t) + : Triangulation_ref_impl<Tr>(t) + { } + struct Zone { + typedef std::vector<int*> Cells; + typedef std::vector<Facet> Facets; + typedef typename Tr::Locate_type Locate_type; + Locate_type locate_type; + Cells cells; + Facets boundary_facets; + Facets internal_facets; + }; +}; + namespace Surface_mesher { + namespace details { + template <typename Base> struct Triangulation_generator { + typedef typename Base::Complex_2_in_triangulation_3 C2T3; + typedef typename C2T3::Triangulation Triangulation; + typedef Triangulation Type; + typedef Type type; + }; + template <typename Base> struct Facet_generator { + typedef typename Triangulation_generator<Base>::type Tr; + typedef typename Tr::Facet Type; + typedef Type type; + }; + template <typename Base, typename Self, typename Element, typename PreviousLevel = Null_mesher_level> struct Mesher_level_generator { + typedef typename Base::Complex_2_in_triangulation_3 C2T3; + typedef typename C2T3::Triangulation Triangulation; + typedef Triangulation_mesher_level_traits_3<Triangulation> Tr_m_l_traits_3; + typedef Mesher_level <Triangulation, Self, Element, PreviousLevel, Tr_m_l_traits_3> Type; + }; + } + template < class C2T3, class Surface_, class SurfaceMeshTraits, class Criteria_ > struct Surface_mesher_base + : public Triangulation_mesher_level_traits_3<typename C2T3::Triangulation> + { + typedef C2T3 Complex_2_in_triangulation_3; + typedef Surface_ Surface; + typedef SurfaceMeshTraits Surface_mesh_traits; + typedef Criteria_ Criteria; + typedef typename C2T3::Triangulation Tr; + typedef typename Tr::Vertex_handle Vertex_handle; + typedef typename Tr::Facet Facet; + Surface_mesher_base (C2T3& co, const Surface& s, const Surface_mesh_traits& mesh_traits, const Criteria& c) +: Triangulation_mesher_level_traits_3<Tr>(co.triangulation()), c2t3(co), tr(co.triangulation()), surf(s), meshtraits(mesh_traits), criteria(c) + { } + C2T3& c2t3; + Tr& tr; + const Surface& surf; + const Surface_mesh_traits& meshtraits; + const Criteria& criteria; + void after_insertion_impl(const Vertex_handle& v) { + after_insertion_handle_opposite_facet (Facet ()); + after_insertion_handle_incident_facet (Facet ()); + } + void after_insertion_handle_incident_facet (const Facet& f) { + tr.is_infinite(f) ; + new_facet<false>(f); + } + template <bool remove_from_complex_if_not_in_restricted_Delaunay> void new_facet (const Facet& f) ; + void after_insertion_handle_opposite_facet (const Facet& f) { + after_insertion_handle_incident_facet (f); + } + }; + template < typename Base, typename Element = typename details::Facet_generator<Base>::type, typename PreviousLevel = Null_mesher_level, Verbose_flag verbose = NOT_VERBOSE > struct Surface_mesher + : public Base , public details::Mesher_level_generator< Base, Surface_mesher<Base, Element, PreviousLevel, verbose>, Element, PreviousLevel >::Type + { + typedef typename Base::Complex_2_in_triangulation_3 C2T3; + typedef typename Base::Surface Surface; + typedef typename Base::Criteria Criteria; + typedef typename Base::Surface_mesh_traits Surface_mesh_traits; + typedef typename details::Mesher_level_generator< Base, Surface_mesher<Base, Element, PreviousLevel, verbose>, Element, PreviousLevel >::Type Mesher_lvl; + using Mesher_lvl::refine; + Null_mesher_level null_mesher_level; + Null_mesh_visitor null_visitor; + bool initialized; + Surface_mesher(C2T3& c2t3, const Surface& surface, const Surface_mesh_traits& mesh_traits, const Criteria& criteria) + : Base(c2t3, surface, mesh_traits, criteria), Mesher_lvl(null_mesher_level), initialized(false) + { } + void refine_mesh () { + refine(null_visitor); + } + }; + } +template <typename Surface> struct Surface_mesh_traits_generator_3 { + typedef typename Surface::Surface_mesher_traits_3 Type; + typedef Type type; +}; +template < class Tr, typename Edge_info_ = void > struct Complex_2_in_triangulation_3 { + typedef Tr Triangulation; + Triangulation& triangulation(); +}; +template <class Tr> struct Surface_mesh_complex_2_in_triangulation_3 +: public Complex_2_in_triangulation_3<Tr> +{ }; + struct Non_manifold_tag {}; + template < typename C2T3, typename SurfaceMeshTraits_3, typename Criteria, typename Tag > struct Make_surface_mesh_helper { + typedef Surface_mesher::Surface_mesher_base< C2T3, typename SurfaceMeshTraits_3::Surface_3, SurfaceMeshTraits_3, Criteria> Mesher_base; + }; + template <typename C2T3, typename SurfaceMeshTraits_3, typename Criteria, typename Tag, Surface_mesher::Verbose_flag verbosity = Surface_mesher::NOT_VERBOSE > struct Surface_mesher_generator { + typedef typename Make_surface_mesh_helper< C2T3, SurfaceMeshTraits_3, Criteria, Tag>::Mesher_base Mesher_base; + typedef Surface_mesher::Surface_mesher< Mesher_base, typename Surface_mesher::details::Facet_generator<Mesher_base>::type, Null_mesher_level, verbosity> Mesher; + typedef Mesher type; + }; +template <typename C2T3, typename SurfaceMeshTraits_3, typename Criteria> void make_surface_mesh(C2T3& c2t3, const typename SurfaceMeshTraits_3::Surface_3& surface, const SurfaceMeshTraits_3& surface_mesh_traits, const Criteria& criteria) { + typedef typename Surface_mesher_generator< C2T3, SurfaceMeshTraits_3, Criteria, Non_manifold_tag, Surface_mesher::NOT_VERBOSE >::type Mesher; + Mesher mesher(c2t3, surface, surface_mesh_traits, criteria); + mesher.refine_mesh(); +} +template <class Kernel> struct Surface_mesh_triangulation_generator_3 { + typedef CGAL::Triangulation_data_structure_3 Tds; + typedef CGAL::Delaunay_triangulation_3<Kernel, Tds> Type; +}; + namespace Surface_mesher { + namespace { struct Return_min { }; } + template < class GT, class Surface, class Unused = Return_min > struct Implicit_surface_oracle_3 { + typedef Surface Surface_3; + }; + } + template< typename GT> struct Implicit_surface_3 { + typedef GT Geom_traits; + typedef Implicit_surface_3<Geom_traits > Self; + typedef Surface_mesher::Implicit_surface_oracle_3< Geom_traits, Self> Surface_mesher_traits_3; + }; +} +struct K { +struct Point_3 { +CGAL::Lazy_exact_nt<double> a[3]; +}; +}; +typedef CGAL::Surface_mesh_triangulation_generator_3<K>::Type Tr; +typedef CGAL::Surface_mesh_complex_2_in_triangulation_3<Tr> C2T3; +typedef CGAL::Implicit_surface_3<K > Surface; +typedef CGAL::Surface_mesh_traits_generator_3<Surface>::type Traits; +void f() { + C2T3 c2t3 ; + CGAL::make_surface_mesh(c2t3, Surface(), Traits(), 3); +} diff --git a/gcc/testsuite/g++.dg/torture/pr46469.C b/gcc/testsuite/g++.dg/torture/pr46469.C new file mode 100644 index 000000000..8212ea4f9 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr46469.C @@ -0,0 +1,13 @@ +extern "C" __inline __attribute__ ((__gnu_inline__)) int pthread_equal () + { + } + +static + __typeof + (pthread_equal) + __gthrw_pthread_equal __attribute__ ((__weakref__ ("pthread_equal"))); + +int identifierByPthreadHandle () +{ + pthread_equal (); +} diff --git a/gcc/testsuite/g++.dg/torture/pr47290.C b/gcc/testsuite/g++.dg/torture/pr47290.C new file mode 100644 index 000000000..b739de5b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr47290.C @@ -0,0 +1,19 @@ +// PR tree-optimization/47290 +// { dg-do compile } + +struct V +{ + V (int = 0); + ~V () + { + for (;;) + ; + } + int size (); +}; + +struct S +{ + V a, b; + S () : b (a.size ()) {} +} s; diff --git a/gcc/testsuite/g++.dg/torture/pr47313.C b/gcc/testsuite/g++.dg/torture/pr47313.C new file mode 100644 index 000000000..c10f558a3 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr47313.C @@ -0,0 +1,53 @@ +// { dg-do compile } + +namespace internal { + template < class DSC, bool Const > struct CC_iterator { + typedef CC_iterator iterator; + typedef typename DSC::value_type value_type; + typedef const value_type* pointer; + CC_iterator () ; + CC_iterator (const iterator &it) { + } + pointer p; + pointer operator->() const ; + }; +} +template < class T > struct Compact_container { + typedef Compact_container <T> Self; + typedef T value_type; + typedef internal::CC_iterator<Self, false> iterator; +}; +template < typename TDS = void > struct Periodic_3_triangulation_ds_cell_base_3 { + typedef typename TDS::Vertex_handle Vertex_handle; + const Vertex_handle& vertex(int i) const { + } +}; +struct Triangulation_data_structure_3 { + typedef Triangulation_data_structure_3 Tds; + typedef Periodic_3_triangulation_ds_cell_base_3<Tds> Cell; + typedef Compact_container<Cell> Cell_range; + typedef Compact_container<int> Vertex_range; + typedef typename Cell_range::iterator Cell_handle; + typedef typename Vertex_range::iterator Vertex_handle; +}; +typedef Triangulation_data_structure_3 TDS1; +template < class > struct Periodic_3_Delaunay_triangulation_3 { + typedef TDS1::Vertex_handle Vertex_handle; + typedef TDS1::Cell_handle Cell_handle; + int compare_distance() const { + } + Vertex_handle nearest_vertex() const; +}; +template < class Tds > typename Periodic_3_Delaunay_triangulation_3<Tds>::Vertex_handle Periodic_3_Delaunay_triangulation_3<Tds>::nearest_vertex() const { + Cell_handle c ; + Vertex_handle nearest = c->vertex(0); + nearest = (compare_distance() == -1) ? nearest : c->vertex(0); + return nearest; +} +typedef Periodic_3_Delaunay_triangulation_3<TDS1> PDT1; +struct Periodic_3_triangulation_hierarchy_3 : PDT1 { + Vertex_handle nearest_vertex() const; +}; +Periodic_3_triangulation_hierarchy_3::Vertex_handle Periodic_3_triangulation_hierarchy_3:: nearest_vertex() const { + return PDT1::nearest_vertex(); +} diff --git a/gcc/testsuite/g++.dg/torture/pr47382.C b/gcc/testsuite/g++.dg/torture/pr47382.C new file mode 100644 index 000000000..a12dbe3fd --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr47382.C @@ -0,0 +1,30 @@ +// { dg-do run } + +extern "C" void abort (); + +struct A +{ + inline ~A (); + virtual void foo () {} +}; + +struct B : A +{ + virtual void foo () { abort(); } +}; + +static inline void middleman (A *a) +{ + a->foo (); +} + +inline A::~A () +{ + middleman (this); +} + +int main () +{ + B b; + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr47541.C b/gcc/testsuite/g++.dg/torture/pr47541.C new file mode 100644 index 000000000..350a05192 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr47541.C @@ -0,0 +1,27 @@ +/* { dg-do run } */ + +struct Dummy {}; +struct RefCount : public Dummy { + ~RefCount(); /* Has to be non-pod. */ + int *a; + int *b; +}; +RefCount::~RefCount(){} +struct Wrapper : public Dummy { RefCount ref; }; +void __attribute__((noinline,noclone)) +Push(Wrapper ptr) +{ + *ptr.ref.b = 0; +} +extern "C" void abort (void); +int main() +{ + int a = 1, b = 1; + Wrapper x; + x.ref.a = &a; + x.ref.b = &b; + Push(x); + if (b != 0) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr47559.C b/gcc/testsuite/g++.dg/torture/pr47559.C new file mode 100644 index 000000000..42dedee29 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr47559.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// { dg-options "-std=c++0x -fnon-call-exceptions" } + +void foo (int *k) noexcept +{ + for (;;) + *k = 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr47714.C b/gcc/testsuite/g++.dg/torture/pr47714.C new file mode 100644 index 000000000..4ff2eeef0 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr47714.C @@ -0,0 +1,16 @@ +struct A { virtual ~A () {} }; +struct B { virtual ~B () {} }; +struct C { virtual const A *foo (int) const = 0; }; +struct E : public B, public A { }; +struct F : public C +{ + virtual const E *foo (int) const; +}; +void bar (int &); + +const E * +F::foo (int x) const +{ + bar (x); + return __null; +} diff --git a/gcc/testsuite/g++.dg/torture/pr48165.C b/gcc/testsuite/g++.dg/torture/pr48165.C new file mode 100644 index 000000000..a42893f60 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr48165.C @@ -0,0 +1,38 @@ +/* { dg-do compile } */ + +typedef __SIZE_TYPE__ size_t; + +extern "C" { + extern __inline __attribute__ ((__always_inline__)) + __attribute__ ((__gnu_inline__, __artificial__)) void * + memcpy (void *__restrict __dest, __const void *__restrict __src, + size_t __len) throw () + { + return __builtin___memcpy_chk (__dest, __src, __len, + __builtin_object_size (__dest, 0)); + } +} + +typedef char TCODE[20]; +typedef TCODE TCODE_ARRAY[5]; +typedef struct PARAM +{ + TCODE_ARRAY tcode; +} PARAM; + +static void foo (void* p) +{ + char buffer[4+sizeof(PARAM)]; + PARAM *param = (PARAM *)(buffer + 4); + int i; + + for (i=0; i < 5; i++) + { + memcpy( param->tcode[i], p, 20 ); + } +} + +void bar (void* p) +{ + foo (p); +} diff --git a/gcc/testsuite/g++.dg/torture/pr48661.C b/gcc/testsuite/g++.dg/torture/pr48661.C new file mode 100644 index 000000000..8de2142f7 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr48661.C @@ -0,0 +1,77 @@ +// PR middle-end/48661 +// { dg-do run } + +extern "C" void abort (); + +__attribute__((noinline)) +double +foo (double x, double y) +{ + asm volatile ("" : : : "memory"); + return x + y; +} + +__attribute__((noinline, noclone)) +void +bar (int x) +{ + if (x != 123) + abort (); +} + +struct A +{ + double a1, a2; +}; + +struct B +{ + virtual int m () const = 0 ; +}; + +struct C +{ + virtual ~C () {} +}; + +struct D : virtual public B, public C +{ + explicit D (const A &x) : d(123) { foo (x.a2, x.a1); } + int m () const { return d; } + int d; +}; + +struct E +{ + E () : d(0) {} + virtual void n (const B &x) { d = x.m (); x.m (); x.m (); } + int d; +}; + +void +test () +{ + A a; + a.a1 = 0; + a.a2 = 1; + E p; + D q (a); + const B &b = q; + bar (b.m ()); + p.n (b); + bar (p.d); +} + +void +baz () +{ + A a; + D p2 (a); +} + +int +main () +{ + test (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr48695.C b/gcc/testsuite/g++.dg/torture/pr48695.C new file mode 100644 index 000000000..44e6c771d --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr48695.C @@ -0,0 +1,38 @@ +// { dg-do run } + +typedef __SIZE_TYPE__ size_t; + +inline void *operator new (size_t, void *__p) throw() { return __p; } + +struct _Vector_impl +{ + int *_M_start; + int *_M_finish; + _Vector_impl () :_M_start (0), _M_finish (0) {} +}; + +struct vector +{ + _Vector_impl _M_impl; + int *_M_allocate (size_t __n) + { + return __n != 0 ? new int[__n] : 0; + } + void push_back () + { + new (this->_M_impl._M_finish) int (); + this->_M_impl._M_finish = + this->_M_allocate (this->_M_impl._M_finish - this->_M_impl._M_start) + 1; + } +}; + +int +main () +{ + for (int i = 0; i <= 1; i++) + for (int j = 0; j <= 1; j++) + { + vector a[2]; + a[i].push_back (); + } +} diff --git a/gcc/testsuite/g++.dg/torture/pr49039.C b/gcc/testsuite/g++.dg/torture/pr49039.C new file mode 100644 index 000000000..f576cba42 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr49039.C @@ -0,0 +1,76 @@ +// PR tree-optimization/49039 +// { dg-do run } + +template <class T1, class T2> +struct pair +{ + T1 first; + T2 second; + pair (const T1 & a, const T2 & b):first (a), second (b) {} +}; + +template <class T1, class T2> +inline pair <T1, T2> +make_pair (T1 x, T2 y) +{ + return pair <T1, T2> (x, y); +} + +typedef __SIZE_TYPE__ size_t; +struct S +{ + const char *Data; + size_t Length; + static size_t min (size_t a, size_t b) { return a < b ? a : b; } + static size_t max (size_t a, size_t b) { return a > b ? a : b; } + S () :Data (0), Length (0) { } + S (const char *Str) : Data (Str), Length (__builtin_strlen (Str)) {} + S (const char *data, size_t length) : Data (data), Length (length) {} + bool empty () const { return Length == 0; } + size_t size () const { return Length; } + S slice (size_t Start, size_t End) const + { + Start = min (Start, Length); + End = min (max (Start, End), Length); + return S (Data + Start, End - Start); + } + pair <S, S> split (char Separator) const + { + size_t Idx = find (Separator); + if (Idx == ~size_t (0)) + return make_pair (*this, S ()); + return make_pair (slice (0, Idx), slice (Idx + 1, ~size_t (0))); + } + size_t find (char C, size_t From = 0) const + { + for (size_t i = min (From, Length), e = Length; i != e; ++i) + if (Data[i] == C) + return i; + return ~size_t (0); + } +}; + +void +Test (const char *arg) +{ + S Desc (arg); + while (!Desc.empty ()) + { + pair <S, S> Split = Desc.split ('-'); + S Token = Split.first; + Desc = Split.second; + if (Token.empty ()) + continue; + Split = Token.split (':'); + S Specifier = Split.first; + if (Specifier.empty ()) + __builtin_abort (); + } +} + +int +main () +{ + Test ("-"); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr49115.C b/gcc/testsuite/g++.dg/torture/pr49115.C new file mode 100644 index 000000000..c4cce21ba --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr49115.C @@ -0,0 +1,25 @@ +// { dg-do run } + +extern "C" void abort (void); +struct MyException {}; +struct Data { + int nr; + Data() : nr(66) {} +}; +Data __attribute__((noinline,noclone)) getData(int i) +{ + if (i) throw MyException(); + Data data; + data.nr = i; + return data; +} +int main(int, char **) +{ + Data data; + try { + data = getData(1); + } catch (MyException& e) { + if (data.nr != 66) + abort (); + } +} diff --git a/gcc/testsuite/g++.dg/torture/pr49309.C b/gcc/testsuite/g++.dg/torture/pr49309.C new file mode 100644 index 000000000..a34537792 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr49309.C @@ -0,0 +1,15 @@ +// PR tree-optimization/49309 +// { dg-do compile } +// { dg-options "-fpreprocessed -fmudflap" } + +struct A +{ + int i; + + A(); + A(const A&); +}; + +inline void foo(A a) { a = A(); } + +void bar() { foo(A()); } diff --git a/gcc/testsuite/g++.dg/torture/pr49615.C b/gcc/testsuite/g++.dg/torture/pr49615.C new file mode 100644 index 000000000..98a2f95b8 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr49615.C @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-g" } */ + +template <class T> +static inline bool Dispatch (T* obj, void (T::*func) ()) +{ + (obj->*func) (); +} +class C +{ + bool f (int); + void g (); +}; +bool C::f (int n) +{ + bool b; + switch (n) + { + case 0: + b = Dispatch (this, &C::g); + case 1: + b = Dispatch (this, &C::g); + } +} +void C::g () +{ + for (;;) { } +} + diff --git a/gcc/testsuite/g++.dg/torture/pr49628.C b/gcc/testsuite/g++.dg/torture/pr49628.C new file mode 100644 index 000000000..4bc6543a3 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr49628.C @@ -0,0 +1,37 @@ +/* { dg-do compile } */ + +#include <vector> + +template <int rank, int dim> class Tensor; +template <int dim> class Tensor<1,dim> { +public: + explicit Tensor (const bool initialize = true); + Tensor (const Tensor<1,dim> &); + Tensor<1,dim> & operator = (const Tensor<1,dim> &); + double values[(dim!=0) ? (dim) : 1]; +}; +template <int dim> +inline Tensor<1,dim> & Tensor<1,dim>::operator = (const Tensor<1,dim> &p) +{ + for (unsigned int i=0; i<dim; ++i) + values[i] = p.values[i]; +}; +template <int dim> class Quadrature { +public: + const unsigned int n_quadrature_points; +}; +class MappingQ1 +{ + class InternalData { + public: + std::vector<Tensor<1,3> > shape_derivatives; + unsigned int n_shape_functions; + }; + void compute_data (const Quadrature<3> &quadrature, InternalData &data) + const; +}; +void MappingQ1::compute_data (const Quadrature<3> &q, InternalData &data) const +{ + const unsigned int n_q_points = q.n_quadrature_points; + data.shape_derivatives.resize(data.n_shape_functions * n_q_points); +} diff --git a/gcc/testsuite/g++.dg/torture/pr49644.C b/gcc/testsuite/g++.dg/torture/pr49644.C new file mode 100644 index 000000000..5fb82e017 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr49644.C @@ -0,0 +1,17 @@ +// PR c/49644 +// { dg-do run } + +extern "C" void abort (); + +int +main () +{ + _Complex double a[12], *c = a, s = 3.0 + 1.0i; + double b[12] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }, *d = b; + int i; + for (i = 0; i < 6; i++) + *c++ = *d++ * s; + if (c != a + 6 || d != b + 6) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr49720.C b/gcc/testsuite/g++.dg/torture/pr49720.C new file mode 100644 index 000000000..c5da7ba67 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr49720.C @@ -0,0 +1,8 @@ +/* { dg-do compile } */ + +extern char t_start[], t_end[], t_size[]; +bool foo (void) +{ + long size = reinterpret_cast<long>(t_size); + return (size == t_end - t_start); +} diff --git a/gcc/testsuite/g++.dg/torture/pr50189.C b/gcc/testsuite/g++.dg/torture/pr50189.C new file mode 100644 index 000000000..06f1d3695 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr50189.C @@ -0,0 +1,121 @@ +// { dg-do run } +// { dg-options "-fstrict-enums" } + +extern "C" void abort (void); +class CCUTILS_KeyedScalarLevelPosition +{ +public: + + typedef enum + { + UNINITED = 0, + AT_BEGIN = 1, + AT_END = 2, + AT_KEY = 3 + + } position_t; + + bool is_init() const + { return(m_timestamp != UNINITED); } + + bool is_at_begin() const + { return(m_timestamp == AT_BEGIN); } + + position_t get_state() const + { + return((m_timestamp >= AT_KEY) + ? AT_KEY + : ((position_t)m_timestamp)); + } + + void set_at_begin() + { m_timestamp = AT_BEGIN; } + + unsigned int get_index() const + { return(m_index); } + + void set_pos(unsigned int a_index, unsigned int a_timestmap) + { + m_index = a_index; + m_timestamp = a_timestmap; + } + + bool check_pos(unsigned int a_num_entries, unsigned int a_timestamp) const + { + if (get_state() != AT_KEY) + return(false); + + if (m_timestamp != a_timestamp) + return(false); + + return(m_index < a_num_entries); + } + + void set_not_init() + { m_timestamp = 0; } + +private: + + unsigned int m_timestamp; + unsigned int m_index; + +}; + +class CCUTILS_KeyedScalarPosition +{ +public: + + CCUTILS_KeyedScalarLevelPosition m_L1; + CCUTILS_KeyedScalarLevelPosition m_L2; +}; + +class baz +{ +public: + int *n[20]; + unsigned int m_cur_array_len; + unsigned int m_timestamp; + + unsigned int _get_timestamp() const + { return(m_timestamp); } + + bool _check_L1_pos(const CCUTILS_KeyedScalarPosition &a_position) const + { + return(a_position.m_L1.check_pos( + m_cur_array_len, _get_timestamp())); + } + + void *next (CCUTILS_KeyedScalarPosition &); +}; + +void * baz::next (CCUTILS_KeyedScalarPosition &a_position) +{ + if (a_position.m_L1.is_at_begin() || (!a_position.m_L1.is_init())) + { + a_position.m_L1.set_pos(0, _get_timestamp()); + a_position.m_L2.set_at_begin(); + } + else if (!_check_L1_pos(a_position)) + return(0); + + return n[a_position.m_L1.get_index ()]; +} + +int main (int, char **) +{ + baz obj; + CCUTILS_KeyedScalarPosition a_pos; + void *ret; + int n[5]; + + obj.n[0] = n; + obj.m_cur_array_len = 1; + obj.m_timestamp = 42; + + a_pos.m_L1.set_pos (0, 42); + + ret = obj.next (a_pos); + if (ret == 0) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr51344.C b/gcc/testsuite/g++.dg/torture/pr51344.C new file mode 100644 index 000000000..07be919c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr51344.C @@ -0,0 +1,11 @@ +/* { dg-do compile { target { i?86-*-* && ilp32 } } } */ +class A; + +template <class T> +class B +{ + friend __attribute__((cdecl)) A& operator >>(A& a, B& b) + { + return a; + } +}; diff --git a/gcc/testsuite/g++.dg/torture/pr55355.C b/gcc/testsuite/g++.dg/torture/pr55355.C new file mode 100644 index 000000000..6d8f8b6be --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr55355.C @@ -0,0 +1,23 @@ +/* { dg-do compile } */ + +struct A +{ + void funcA(void); +}; + +struct B {}; + +struct C +{ + void funcC(void) { a_mp->funcA(); } + + char buf_ma[268435456]; + A *a_mp; + B b_m; +}; + +void +func(C *c_p) +{ + c_p->funcC(); +} diff --git a/gcc/testsuite/g++.dg/torture/pr56403.C b/gcc/testsuite/g++.dg/torture/pr56403.C new file mode 100644 index 000000000..27b6eeb88 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr56403.C @@ -0,0 +1,12 @@ +// PR c++/56403 +// { dg-do compile } + +#include <stdarg.h> + +struct S { va_list err_args; }; + +void * +foo () +{ + return new S (); +} diff --git a/gcc/testsuite/g++.dg/torture/predcom-1.C b/gcc/testsuite/g++.dg/torture/predcom-1.C new file mode 100644 index 000000000..c668cac60 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/predcom-1.C @@ -0,0 +1,29 @@ +/* Test for ICE in predictive commoning with empty loop header block + on arm-none-linux-gnueabi. */ + +struct Foo +{ + double *ptr; + + Foo (double *ptr_) + : ptr (ptr_) + { + } + + Foo PostInc () + { + return Foo (ptr++); + } +}; + +bool Baz (Foo first, double *last) +{ + Foo prev (first.ptr); + + first.ptr++; + + while (first.ptr != last) + if (*first.PostInc ().ptr < *prev.PostInc ().ptr) + return false; +} + diff --git a/gcc/testsuite/g++.dg/torture/pushpop_macro.C b/gcc/testsuite/g++.dg/torture/pushpop_macro.C new file mode 100644 index 000000000..98065e6ee --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pushpop_macro.C @@ -0,0 +1,19 @@ +/* Do the preprocessor push_macro/pop_macro test. */ + +/* { dg-do run } */ + +extern "C" void abort (); + +#define _ 2 +#pragma push_macro("_") +#undef _ +#define _ 1 +#pragma pop_macro("_") + +int main () +{ + if (_ != 2) + abort (); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/torture/stackalign/check.h b/gcc/testsuite/g++.dg/torture/stackalign/check.h new file mode 100644 index 000000000..af1988512 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/check.h @@ -0,0 +1,36 @@ +#include <stddef.h> +#ifdef DEBUG +#include <stdio.h> +#endif + +#ifdef __cplusplus +extern "C" void abort (void); +#else +extern void abort (void); +#endif + +int +check_int (int *i, int align) +{ + *i = 20; + if ((((ptrdiff_t) i) & (align - 1)) != 0) + { +#ifdef DEBUG + printf ("\nUnalign address (%d): %p!\n", align, i); +#endif + abort (); + } + return *i; +} + +void +check (void *p, int align) +{ + if ((((ptrdiff_t) p) & (align - 1)) != 0) + { +#ifdef DEBUG + printf ("\nUnalign address (%d): %p!\n", align, p); +#endif + abort (); + } +} diff --git a/gcc/testsuite/g++.dg/torture/stackalign/eh-alloca-1.C b/gcc/testsuite/g++.dg/torture/stackalign/eh-alloca-1.C new file mode 100644 index 000000000..89b0a6a67 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/eh-alloca-1.C @@ -0,0 +1,57 @@ +/* { dg-do run } */ +/* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } "*" "" } */ + +#include "check.h" + +#ifndef ALIGNMENT +#define ALIGNMENT 64 +#endif + +typedef int aligned __attribute__((aligned(ALIGNMENT))); + +int global; + +void +bar (char *p, int size) +{ + __builtin_strncpy (p, "good", size); +} + +class Base {}; + +struct A : virtual public Base +{ + A() {} +}; + +struct B {}; + +void +foo (int size) throw (B,A) +{ + char *p = (char*) __builtin_alloca (size + 1); + aligned i; + + bar (p, size); + if (__builtin_strncmp (p, "good", size) != 0) + { +#ifdef DEBUG + p[size] = '\0'; + printf ("Failed: %s != good\n", p); +#endif + abort (); + } + + if (check_int (&i, __alignof__(i)) != i) + abort (); + + throw A(); +} + +int +main() +{ + try { foo (5); } + catch (A& a) { } + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/stackalign/eh-fastcall-1.C b/gcc/testsuite/g++.dg/torture/stackalign/eh-fastcall-1.C new file mode 100644 index 000000000..4b849a2e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/eh-fastcall-1.C @@ -0,0 +1,43 @@ +/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ + +#include "check.h" + +#ifndef ALIGNMENT +#define ALIGNMENT 64 +#endif + +typedef int aligned __attribute__((aligned(ALIGNMENT))); + +int global; + +class Base {}; + +struct A : virtual public Base +{ + A() {} +}; + +struct B {}; + +__attribute__ ((fastcall)) +void +foo (int j, int k, int m, int n, int o) throw (B,A) +{ + aligned i; + + if (check_int (&i, __alignof__(i)) != i) + abort (); + + if (i != 20 || j != 1 || k != 2 || m != 3 || n != 4 || o != 5) + abort (); + + throw A(); +} + +int +main() +{ + try { foo (1, 2, 3, 4, 5); } + catch (A& a) { } + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/stackalign/eh-global-1.C b/gcc/testsuite/g++.dg/torture/stackalign/eh-global-1.C new file mode 100644 index 000000000..cc05ed04f --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/eh-global-1.C @@ -0,0 +1,40 @@ +/* { dg-do run } */ +/* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } "*" "" } */ + +#include "check.h" + +#ifndef ALIGNMENT +#define ALIGNMENT 64 +#endif + +typedef int aligned __attribute__((aligned(ALIGNMENT))); + +int global; + +class Base {}; + +struct A : virtual public Base +{ + A() {} +}; + +struct B {}; + +void +foo (void) throw (B,A) +{ + aligned i; + + if (check_int (&i, __alignof__(i)) != i) + abort (); + + throw A(); +} + +int +main() +{ + try { foo (); } + catch (A& a) { } + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/stackalign/eh-inline-1.C b/gcc/testsuite/g++.dg/torture/stackalign/eh-inline-1.C new file mode 100644 index 000000000..d2555f2e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/eh-inline-1.C @@ -0,0 +1,40 @@ +/* { dg-do run } */ +/* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } "*" "" } */ + +#include "check.h" + +#ifndef ALIGNMENT +#define ALIGNMENT 64 +#endif + +typedef int aligned __attribute__((aligned(ALIGNMENT))); + +int global; + +class Base {}; + +struct A : virtual public Base +{ + A() {} +}; + +struct B {}; + +static void +inline __attribute__((always_inline)) +foo (void) throw (B,A) +{ + aligned i; + + if (check_int (&i, __alignof__(i)) != i) + abort (); + throw A(); +} + +int +main() +{ + try { foo (); } + catch (A& a) { } + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/stackalign/eh-inline-2.C b/gcc/testsuite/g++.dg/torture/stackalign/eh-inline-2.C new file mode 100644 index 000000000..1cbc68cc4 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/eh-inline-2.C @@ -0,0 +1,58 @@ +/* { dg-do run } */ +/* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } "*" "" } */ + +#include "check.h" + +#ifndef ALIGNMENT +#define ALIGNMENT 64 +#endif + +typedef int aligned __attribute__((aligned(ALIGNMENT))); + +int global; + +void +bar (char *p, int size) +{ + __builtin_strncpy (p, "good", size); +} + +class Base {}; + +struct A : virtual public Base +{ + A() {} +}; + +struct B {}; + +static void +inline __attribute__((always_inline)) +foo (int size) throw (B,A) +{ + char *p = (char *) __builtin_alloca (size + 1); + aligned i; + + bar (p, size); + if (__builtin_strncmp (p, "good", size) != 0) + { +#ifdef DEBUG + p[size] = '\0'; + printf ("Failed: %s != good\n", p); +#endif + abort (); + } + + if (check_int (&i, __alignof__(i)) != i) + abort (); + + throw A(); +} + +int +main() +{ + try { foo (5); } + catch (A& a) { } + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/stackalign/eh-thiscall-1.C b/gcc/testsuite/g++.dg/torture/stackalign/eh-thiscall-1.C new file mode 100644 index 000000000..de9bed55c --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/eh-thiscall-1.C @@ -0,0 +1,43 @@ +/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ + +#include "check.h" + +#ifndef ALIGNMENT +#define ALIGNMENT 64 +#endif + +typedef int aligned __attribute__((aligned(ALIGNMENT))); + +int global; + +class Base {}; + +struct A : virtual public Base +{ + A() {} +}; + +struct B {}; + +__attribute__ ((thiscall)) +void +foo (int j, int k, int m, int n, int o) throw (B,A) +{ + aligned i; + + if (check_int (&i, __alignof__(i)) != i) + abort (); + + if (i != 20 || j != 1 || k != 2 || m != 3 || n != 4 || o != 5) + abort (); + + throw A(); +} + +int +main() +{ + try { foo (1, 2, 3, 4, 5); } + catch (A& a) { } + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/stackalign/eh-vararg-1.C b/gcc/testsuite/g++.dg/torture/stackalign/eh-vararg-1.C new file mode 100644 index 000000000..b9ba81b12 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/eh-vararg-1.C @@ -0,0 +1,73 @@ +/* { dg-do run } */ +/* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } "*" "" } */ + +#include <stdarg.h> +#include "check.h" + +#ifndef ALIGNMENT +#define ALIGNMENT 64 +#endif + +typedef int aligned __attribute__((aligned(ALIGNMENT))); + +int global; + +void +bar (char *p, int size) +{ + __builtin_strncpy (p, "good", size); +} + +class Base {}; + +struct A : virtual public Base +{ + A() {} +}; + +struct B {}; + +void +foo (const char *fmt, ...) throw (B,A) +{ + va_list arg; + char *p; + aligned i; + int size; + double x; + + va_start (arg, fmt); + size = va_arg (arg, int); + if (size != 5) + abort (); + p = (char *) __builtin_alloca (size + 1); + + x = va_arg (arg, double); + if (x != 5.0) + abort (); + + bar (p, size); + if (__builtin_strncmp (p, "good", size) != 0) + { +#ifdef DEBUG + p[size] = '\0'; + printf ("Failed: %s != good\n", p); +#endif + abort (); + } + + if (check_int (&i, __alignof__(i)) != i) + abort (); + + throw A(); + + va_end (arg); +} + +int +main() +{ + try { foo ("foo", 5, 5.0); } + catch (A& a) { } + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/stackalign/eh-vararg-2.C b/gcc/testsuite/g++.dg/torture/stackalign/eh-vararg-2.C new file mode 100644 index 000000000..5e282179c --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/eh-vararg-2.C @@ -0,0 +1,79 @@ +/* { dg-options "-Wno-abi" {target arm_eabi} } */ +/* { dg-do run } */ +/* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } "*" "" } */ + +#include <stdarg.h> +#include "check.h" + +#ifndef ALIGNMENT +#define ALIGNMENT 64 +#endif + +typedef int aligned __attribute__((aligned(ALIGNMENT))); + +int global; + +void +bar (char *p, int size) +{ + __builtin_strncpy (p, "good", size); +} + +class Base {}; + +struct A : virtual public Base +{ + A() {} +}; + +struct B {}; + +void +test (va_list arg) throw (B,A) +{ + char *p; + aligned i; + int size; + double x; + + size = va_arg (arg, int); + if (size != 5) + abort (); + + p = (char *) __builtin_alloca (size + 1); + + x = va_arg (arg, double); + if (x != 5.0) + abort (); + + bar (p, size); + if (__builtin_strncmp (p, "good", size) != 0) + { +#ifdef DEBUG + p[size] = '\0'; + printf ("Failed: %s != good\n", p); +#endif + abort (); + } + + if (check_int (&i, __alignof__(i)) != i) + abort (); + + throw A(); +} + +void +foo (const char *fmt, ...) +{ + va_list arg; + va_start (arg, fmt); + test (arg); + va_end (arg); +} +int +main() +{ + try { foo ("foo", 5, 5.0); } + catch (A& a) { } + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/stackalign/stackalign.exp b/gcc/testsuite/g++.dg/torture/stackalign/stackalign.exp new file mode 100644 index 000000000..3d0609fc4 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/stackalign.exp @@ -0,0 +1,35 @@ +# Copyright (C) 2008, 2010 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# This harness is for tests that should be run at all optimisation levels. + +load_lib g++-dg.exp +dg-init +set additional_flags "" + +# If automatic stack alignment is supported, force it on. +if { [check_effective_target_automatic_stack_alignment] } then { + lappend additional_flags "-mstackrealign" + lappend additional_flags "-mpreferred-stack-boundary=5" +} + +gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.C]] $additional_flags +if { [check_effective_target_fpic] } then { + lappend additional_flags "-fpic" + gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.C]] $additional_flags +} +dg-finish diff --git a/gcc/testsuite/g++.dg/torture/stackalign/stdcall-1.C b/gcc/testsuite/g++.dg/torture/stackalign/stdcall-1.C new file mode 100644 index 000000000..393b37e7b --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/stdcall-1.C @@ -0,0 +1,17 @@ +// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ilp32 } } } + +// This case is to detect an assertion failure in stack branch development. + +bool f(); +struct S { + __attribute__ ((stdcall)) ~S(); +}; +void g() { + for (;;) { + S s1, s2, s3; + if (f()) + continue; + if (f()) + return; + } +} diff --git a/gcc/testsuite/g++.dg/torture/stackalign/test-unwind.h b/gcc/testsuite/g++.dg/torture/stackalign/test-unwind.h new file mode 100644 index 000000000..ff5602784 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/test-unwind.h @@ -0,0 +1,142 @@ +#include "check.h" + + +#define ASMNAME(cname) ASMNAME2 (__USER_LABEL_PREFIX__, cname) +#define ASMNAME2(prefix, cname) STRING (prefix) cname +#define STRING(x) #x + +#ifdef __cplusplus +extern "C" void abort (void); +#else +extern void abort (void); +#endif + +extern void foo(void); + +#define INIT_EDI 1 +#define INIT_ESI 2 +#define INIT_EBX 3 + +/* Set DI/SI/BX to wrong value + Use following template so that RA will save/restore callee + save registers in prologue/epilogue */ +#define ALTER_REGS() \ + { \ + int dummy; \ + __asm__ __volatile__ (\ + "movl %1, %0" : "=D" (dummy) : "i" (-INIT_EDI)\ + );\ + __asm__ __volatile__ (\ + "movl %1, %0" : "=S" (dummy) : "i" (-INIT_ESI)\ + );\ + __asm__ __volatile__ (\ + "movl %1, %0" : "=b" (dummy) : "i" (-INIT_EBX)\ + );\ + } + +#if defined __PIC__ || defined __USING_SJLJ_EXCEPTIONS__ +int +main () +{ + return 0; +} +#else +void __attribute__ ((noinline)) +copy (char *p, int size) +{ + __builtin_strncpy (p, "good", size); +} + +int g_edi __attribute__((externally_visible)) =INIT_EDI; +int g_esi __attribute__((externally_visible)) =INIT_ESI; +int g_ebx __attribute__((externally_visible)) = INIT_EBX; +int g_ebp __attribute__((externally_visible)); +int g_esp __attribute__((externally_visible)); +int g_ebp_save __attribute__((externally_visible)); +int g_esp_save __attribute__((externally_visible)); +int n_error; + +int +main() +{ + int dummy; + // Init registers to correct value. + // Use following template so that RA will save/restore callee + // save registers in prologue/epilogue + __asm__ __volatile__ ( + "movl %1, %0" + : "=D" (dummy) + : "i" (INIT_EDI) + ); + __asm__ __volatile__ ( + "movl %1, %0" + : "=S" (dummy) + : "i" (INIT_ESI) + ); + __asm__ __volatile__ ( + "movl %1, %0" + : "=b" (dummy) + : "i" (INIT_EBX) + ); + __asm__ __volatile__ ( + "movl %ebp," ASMNAME("g_ebp_save")"\n\t" + "movl %esp," ASMNAME("g_esp_save")"\n\t" + ); + try { + foo(); + } + catch (...) + { + } + + // Get DI/SI/BX register value after exception caught + __asm__ __volatile__ ( + "movl %edi," ASMNAME("g_edi")"\n\t" + "movl %esi," ASMNAME("g_esi")"\n\t" + "movl %ebx," ASMNAME("g_ebx")"\n\t" + "movl %ebp," ASMNAME("g_ebp")"\n\t" + "movl %esp," ASMNAME("g_esp")"\n\t" + ); + + // Check if DI/SI/BX register value are the same as before calling + // foo. + if (g_edi != INIT_EDI) + { + n_error++; +#ifdef DEBUG + printf("edi=%d, correct value:%d\n", g_edi, INIT_EDI); +#endif + } + if (g_esi != INIT_ESI) + { + n_error++; +#ifdef DEBUG + printf("esi=%d, correct value:%d\n", g_esi, INIT_ESI); +#endif + } + if (g_ebx != INIT_EBX) + { + n_error++; +#ifdef DEBUG + printf("ebx=%d, correct value:%d\n", g_ebx, INIT_EBX); +#endif + } + if (g_ebp != g_ebp_save) + { + n_error++; +#ifdef DEBUG + printf("ebp=0x%x, correct value:0x%x\n", g_ebp, g_ebp_save); +#endif + } + if (g_esp != g_esp_save) + { + n_error++; +#ifdef DEBUG + printf("esp=0x%x, correct value:0x%x\n", g_esp, g_esp_save); +#endif + } + if (n_error !=0) + abort(); + return 0; +} +#endif diff --git a/gcc/testsuite/g++.dg/torture/stackalign/throw-1.C b/gcc/testsuite/g++.dg/torture/stackalign/throw-1.C new file mode 100644 index 000000000..3eddc1d02 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/throw-1.C @@ -0,0 +1,62 @@ +/* { dg-do run } */ +/* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } "*" "" } */ + +#include "check.h" + +#ifndef ALIGNMENT +#define ALIGNMENT 64 +#endif + +typedef int t_align __attribute__((aligned(ALIGNMENT))); + + +int global, global2; +void bar() +{ + volatile t_align a = 1; + int i,j,k,l,m,n; + i=j=k=0; + for (i=0; i < global; i++) + for (j=0; j < i; j++) + for (k=0; k < j; k++) + for (l=0; l < k; l++) + for (m=0; m < l; m++) + for (n=0; n < m; n++) + global2 = k; + if (check_int ((int *) &a, __alignof__(a)) != a) + abort (); + throw 0; +} + +void foo() +{ + bar(); +} + +int main() +{ + int ll = 1; + int i = 0,j = 1,k = 2,l = 3,m = 4,n = 5; + try { + for (; i < global; i++) + for (; j < i; j++) + for (; k < j; k++) + for (; l < k; l++) + for (; m < l; m++) + for (; n < m; n++) + global2 = k; + foo(); + } + catch (...) + { + } + ll = i+j+k+l+m+n; + if (ll != 15) + { +#ifdef DEBUG + printf("FAIL: sum %d != 15\n", ll); +#endif + abort(); + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/stackalign/throw-2.C b/gcc/testsuite/g++.dg/torture/stackalign/throw-2.C new file mode 100644 index 000000000..63a8c6e7c --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/throw-2.C @@ -0,0 +1,53 @@ +/* { dg-do run } */ +/* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } "*" "" } */ + +#include "check.h" + +#ifndef ALIGNMENT +#define ALIGNMENT 64 +#endif + +typedef int t_align __attribute__((aligned(ALIGNMENT))); + + +int global, global2; +void bar() +{ + volatile t_align a = 1; + int i,j,k; + i=j=k=0; + for (i=0; i < global; i++) + for (j=0; j < i; j++) + global2 = k; + if (check_int ((int *) &a, __alignof__(a)) != a) + abort (); + throw 0; +} + +int main() +{ + int ll = 1; + int i = 0,j = 1,k = 2,l = 3,m = 4,n = 5; + try { + for (; i < global; i++) + for (; j < i; j++) + for (; k < j; k++) + for (; l < k; l++) + for (; m < l; m++) + for (; n < m; n++) + global2 = k; + bar (); + } + catch (...) + { + } + ll = i+j+k+l+m+n; + if (ll != 15) + { +#ifdef DEBUG + printf("FAIL: sum %d != 15\n", ll); +#endif + abort(); + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/stackalign/throw-3.C b/gcc/testsuite/g++.dg/torture/stackalign/throw-3.C new file mode 100644 index 000000000..d3e53b829 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/throw-3.C @@ -0,0 +1,52 @@ +/* { dg-do run } */ + +#include "check.h" + +#ifndef ALIGNMENT +#define ALIGNMENT 64 +#endif + +typedef int t_align __attribute__((aligned(ALIGNMENT))); + + +int global, global2; +void bar() +{ + volatile t_align a = 1; + int i,j,k; + i=j=k=0; + for (i=0; i < global; i++) + for (j=0; j < i; j++) + global2 = k; + throw 0; + if (check_int ((int *) &a, __alignof__(a)) != a) + abort (); +} + +int main() +{ + int ll = 1; + int i = 0,j = 1,k = 2,l = 3,m = 4,n = 5; + try { + for (; i < global; i++) + for (; j < i; j++) + for (; k < j; k++) + for (; l < k; l++) + for (; m < l; m++) + for (; n < m; n++) + global2 = k; + bar (); + } + catch (...) + { + } + ll = i+j+k+l+m+n; + if (ll != 15) + { +#ifdef DEBUG + printf("FAIL: sum %d != 15\n", ll); +#endif + abort(); + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/stackalign/throw-4.C b/gcc/testsuite/g++.dg/torture/stackalign/throw-4.C new file mode 100644 index 000000000..52e6f7ff7 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/throw-4.C @@ -0,0 +1,55 @@ +/* { dg-do run } */ +/* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } "*" "" } */ + +#include "check.h" + +#ifndef ALIGNMENT +#define ALIGNMENT 64 +#endif + +typedef int t_align __attribute__((aligned(ALIGNMENT))); + + +int global, global2; +void bar() +{ + volatile t_align a = 1; + int i,j,k; + i=j=k=0; + for (i=0; i < global; i++) + for (j=0; j < i; j++) + { + global2 = k; + throw 0; + } + if (check_int ((int *) &a, __alignof__(a)) != a) + abort (); +} + +int main() +{ + int ll = 1; + int i = 0,j = 1,k = 2,l = 3,m = 4,n = 5; + try { + for (; i < global; i++) + for (; j < i; j++) + for (; k < j; k++) + for (; l < k; l++) + for (; m < l; m++) + for (; n < m; n++) + global2 = k; + bar (); + } + catch (...) + { + } + ll = i+j+k+l+m+n; + if (ll != 15) + { +#ifdef DEBUG + printf("FAIL: sum %d != 15\n", ll); +#endif + abort(); + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/stackalign/unwind-0.C b/gcc/testsuite/g++.dg/torture/stackalign/unwind-0.C new file mode 100644 index 000000000..f8166eb95 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/unwind-0.C @@ -0,0 +1,12 @@ +/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ + +#include "test-unwind.h" + +#if !defined __PIC__ && !defined __USING_SJLJ_EXCEPTIONS__ +void __attribute__ ((noinline)) foo() +{ + ALTER_REGS(); + // Throw the except and expect returning to main + throw 1; +} +#endif diff --git a/gcc/testsuite/g++.dg/torture/stackalign/unwind-1.C b/gcc/testsuite/g++.dg/torture/stackalign/unwind-1.C new file mode 100644 index 000000000..70dce7485 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/unwind-1.C @@ -0,0 +1,16 @@ +/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ + +#include "test-unwind.h" + +#if !defined __PIC__ && !defined __USING_SJLJ_EXCEPTIONS__ +/* Test situation 1: Stack really realign without DRAP */ +void __attribute__ ((noinline)) +foo () +{ + int __attribute__ ((aligned(64))) a=1; + if (check_int (&a, __alignof__(a)) != a) + abort (); + ALTER_REGS(); + throw a; +} +#endif diff --git a/gcc/testsuite/g++.dg/torture/stackalign/unwind-2.C b/gcc/testsuite/g++.dg/torture/stackalign/unwind-2.C new file mode 100644 index 000000000..791eeb551 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/unwind-2.C @@ -0,0 +1,29 @@ +/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ + +#include "test-unwind.h" + +#if !defined __PIC__ && !defined __USING_SJLJ_EXCEPTIONS__ +/* Test situation 2: stack really realign with DRAP reg CX */ +void __attribute__ ((noinline)) +foo () +{ + int __attribute__ ((aligned(64))) a=4; + char * s = (char *) __builtin_alloca (a + 1); + + copy (s, a); + if (__builtin_strncmp (s, "good", a) != 0) + { +#ifdef DEBUG + s[a] = '\0'; + printf ("Failed: %s != good\n", s); +#endif + abort (); + } + + if (check_int (&a, __alignof__(a)) != a) + abort (); + + ALTER_REGS(); + throw a; +} +#endif diff --git a/gcc/testsuite/g++.dg/torture/stackalign/unwind-3.C b/gcc/testsuite/g++.dg/torture/stackalign/unwind-3.C new file mode 100644 index 000000000..29dee2d5a --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/unwind-3.C @@ -0,0 +1,35 @@ +/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ + +#include "test-unwind.h" + +#if !defined __PIC__ && !defined __USING_SJLJ_EXCEPTIONS__ +/* Test situation 3: Stack realign really happen with DRAP reg DI */ +void __attribute__ ((noinline)) __attribute__ ((regparm(3))) +bar (int arg1, int arg2, int arg3) +{ + int __attribute__ ((aligned(64))) a=1; + char * s = (char *) __builtin_alloca (arg3 + 1); + + copy (s, arg3); + if (__builtin_strncmp (s, "good", arg3) != 0) + { +#ifdef DEBUG + s[arg3] = '\0'; + printf ("Failed: %s != good\n", s); +#endif + abort (); + } + + if (check_int (&a, __alignof__(a)) != a) + abort (); + + ALTER_REGS(); + throw arg1+arg2+arg3+a; +} + +void +foo() +{ + bar (1,2,3); +} +#endif diff --git a/gcc/testsuite/g++.dg/torture/stackalign/unwind-4.C b/gcc/testsuite/g++.dg/torture/stackalign/unwind-4.C new file mode 100644 index 000000000..a896176ae --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/unwind-4.C @@ -0,0 +1,17 @@ +/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ + +#include "test-unwind.h" + +#if !defined __PIC__ && !defined __USING_SJLJ_EXCEPTIONS__ +volatile int __attribute__ ((aligned(32))) g_a=1; +/* Test situation 4: no Drap and stack realign doesn't really happen */ +void __attribute__ ((noinline)) +foo() +{ + int i; + ALTER_REGS(); + for (i=0; i < 10; i++) + g_a++; + throw g_a; +} +#endif diff --git a/gcc/testsuite/g++.dg/torture/stackalign/unwind-5.C b/gcc/testsuite/g++.dg/torture/stackalign/unwind-5.C new file mode 100644 index 000000000..514e4e77a --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/unwind-5.C @@ -0,0 +1,31 @@ +/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ + +#include "test-unwind.h" + +#if !defined __PIC__ && !defined __USING_SJLJ_EXCEPTIONS__ +double g_f=1.0; +/* Test situation 5: Stack realign dosn't really happen with DRAP reg CX */ +void __attribute__ ((noinline)) __attribute__ ((regparm(2))) +bar(int arg1, int arg2, int arg3, int arg4) +{ + char * s = (char *) __builtin_alloca (arg4 + 1); + + copy (s, arg4); + if (__builtin_strncmp (s, "good", arg4) != 0) + { +#ifdef DEBUG + s[arg4] = '\0'; + printf ("Failed: %s != good\n", s); +#endif + abort (); + } + ALTER_REGS(); + if (g_f) throw arg1+arg2+arg3+ g_f; +} + +void __attribute__((noinline)) +foo() +{ + bar(1,2,3,4); +} +#endif diff --git a/gcc/testsuite/g++.dg/torture/stackalign/unwind-6.C b/gcc/testsuite/g++.dg/torture/stackalign/unwind-6.C new file mode 100644 index 000000000..a888ca1b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/stackalign/unwind-6.C @@ -0,0 +1,31 @@ +/* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ + +#include "test-unwind.h" + +#if !defined __PIC__ && !defined __USING_SJLJ_EXCEPTIONS__ +double g_f=1.0; +/* Test situation 6: Stack realign dosn't really happen with DRAP reg DI */ +void __attribute__ ((noinline)) __attribute__ ((regparm(3))) +bar(int arg1, int arg2, int arg3, int arg4) +{ + char * s = (char *) __builtin_alloca (arg4 + 1); + + copy (s, arg4); + if (__builtin_strncmp (s, "good", arg4) != 0) + { +#ifdef DEBUG + s[arg4] = '\0'; + printf ("Failed: %s != good\n", s); +#endif + abort (); + } + ALTER_REGS(); + if (g_f) throw arg1+arg2+arg3+ g_f; +} + +void __attribute__((noinline)) +foo() +{ + bar(1,2,3,4); +} +#endif diff --git a/gcc/testsuite/g++.dg/torture/str_empty.C b/gcc/testsuite/g++.dg/torture/str_empty.C new file mode 100644 index 000000000..e24f0b6ac --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/str_empty.C @@ -0,0 +1,15 @@ +// PR c++/31617 +// Segfault in integer_zerop +// Origin: Andrew Pinski <andrew_pinski@playstation.sony.com> +// { dg-do compile } + +struct polynomial { + ~polynomial (); +}; + +void spline_rep1 () +{ + new polynomial[0]; // { dg-bogus "allocating zero-element array" } +} + + diff --git a/gcc/testsuite/g++.dg/torture/type-generic-1.C b/gcc/testsuite/g++.dg/torture/type-generic-1.C new file mode 100644 index 000000000..4d82592af --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/type-generic-1.C @@ -0,0 +1,13 @@ +/* Do the type-generic tests. Unlike pr28796-2.c, we test these + without any fast-math flags. */ + +/* { dg-do run } */ +/* { dg-add-options ieee } */ +/* { dg-skip-if "No Inf/NaN support" { spu-*-* } } */ + +#include "../../gcc.dg/tg-tests.h" + +int main(void) +{ + return main_tests (); +} diff --git a/gcc/testsuite/g++.dg/tree-prof/indir-call-prof-2.C b/gcc/testsuite/g++.dg/tree-prof/indir-call-prof-2.C new file mode 100644 index 000000000..e20cc64d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-prof/indir-call-prof-2.C @@ -0,0 +1,35 @@ +/* { dg-options "-O" } */ + +int foo1(void) { return 0; } +int bar1(void) { throw 1; } +void foo2(void) { } +void bar2(void) { throw 1; } +void __attribute__((noinline,noclone)) test1(void (*f)(void)) { (*f)(); } +void __attribute__((noinline,noclone)) test2(void (*f)(void)) { (*f)(); } +int __attribute__((noinline,noclone)) test3(int (*f)(void)) { return (*f)(); } +int __attribute__((noinline,noclone)) test4(int (*f)(void)) { return (*f)(); } +int __attribute__((noinline,noclone)) test5(int (*f)(void), int x) { return x ? x : (*f)(); } +int __attribute__((noinline,noclone)) test6(int (*f)(void), int x) { return x ? x : (*f)(); } +void __attribute__((noinline,noclone)) test7(void (*f)(void)) { try { (*f)(); } catch (...) {} } +void __attribute__((noinline,noclone)) test8(void (*f)(void)) { try { (*f)(); } catch (...) {}} +int __attribute__((noinline,noclone)) test9(int (*f)(void)) { try { return (*f)(); } catch (...) {return 0;} } +int __attribute__((noinline,noclone)) test10(int (*f)(void)) { try { return (*f)(); } catch (...) {return 0;} } +int __attribute__((noinline,noclone)) test11(int (*f)(void), int x) { try { return x ? x : (*f)(); } catch (...) {return 0;} } +int __attribute__((noinline,noclone)) test12(int (*f)(void), int x) { try { return x ? x : (*f)(); } catch (...) {return 0;} } + +int main() +{ + for (int i = 0; i < 100; ++i) test1(foo2); + for (int i = 0; i < 100; ++i) try { test2(bar2); } catch (...) {} + for (int i = 0; i < 100; ++i) test3(foo1); + for (int i = 0; i < 100; ++i) try { test4(bar1); } catch (...) {} + for (int i = 0; i < 100; ++i) test5(foo1, 0); + for (int i = 0; i < 100; ++i) try { test6(bar1, 0); } catch (...) {} + for (int i = 0; i < 100; ++i) test7(foo2); + for (int i = 0; i < 100; ++i) try { test8(bar2); } catch (...) {} + for (int i = 0; i < 100; ++i) test9(foo1); + for (int i = 0; i < 100; ++i) try { test10(bar1); } catch (...) {} + for (int i = 0; i < 100; ++i) test11(foo1, 0); + for (int i = 0; i < 100; ++i) try { test12(bar1, 0); } catch (...) {} + return 0; +} diff --git a/gcc/testsuite/g++.dg/tree-prof/indir-call-prof.C b/gcc/testsuite/g++.dg/tree-prof/indir-call-prof.C new file mode 100644 index 000000000..80b41865c --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-prof/indir-call-prof.C @@ -0,0 +1,39 @@ +/* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-tree_profile_ipa" } */ + +struct A { + A () {} + + virtual int AA (void) + { return 0; } + +}; + +struct B : public A { + B () {} + + virtual int AA (void) + { return 1; } +}; + +void * __attribute__((noinline,noclone)) wrap (void *p) { return p; } +int +main (void) +{ + A a; + B b; + + A* p; + + p = (A *)wrap ((void *)&a); + p->AA (); + + p = (B *)wrap ((void *)&b); + p->AA (); + + return 0; +} + +/* { dg-final-use { scan-ipa-dump "Indirect call -> direct call.* AA transformation on insn" "tree_profile_ipa" } } */ +/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized" } } */ +/* { dg-final-use { cleanup-tree-dump "optimized" } } */ +/* { dg-final-use { cleanup-ipa-dump "tree_profile_ipa" } } */ diff --git a/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C b/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C new file mode 100644 index 000000000..e82a46ebf --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-prof/inline_mismatch_args.C @@ -0,0 +1,36 @@ +/* { dg-options "-O2 -fdump-tree-einline" } */ +class DocId { + public: + DocId() { } + DocId(const DocId &other) { } +}; + +int g; +class Base { + public: + virtual void Foo(DocId id) { g++; } +}; + +class Super: public Base { + public: + void Foo(DocId id) { } + void Bar(Base *base, DocId id) __attribute__((noinline)); +}; + +void Super::Bar(Base *base, DocId id) { + Super::Foo(id); // direct call is inlined + base->Foo(id); // indirect call is marked do not inline +} + +int main(void) +{ + Base bah; + Super baz; + DocId gid; + + baz.Bar(&baz, gid); + return 0; +} +/* { dg-final-use { scan-tree-dump "Inlining .*Super::Foo" "einline" } } */ +/* { dg-final-use { scan-tree-dump-not "mismatched arguments" "einline" } } */ +/* { dg-final-use { cleanup-tree-dump "einline" } } */ diff --git a/gcc/testsuite/g++.dg/tree-prof/partition1.C b/gcc/testsuite/g++.dg/tree-prof/partition1.C new file mode 100644 index 000000000..108803997 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-prof/partition1.C @@ -0,0 +1,54 @@ +/* { dg-require-effective-target freorder } */ +/* { dg-options "-O2 -freorder-blocks-and-partition" } */ +/* { dg-skip-if "PR target/47683" { mips-sgi-irix* } } */ + +struct A { A () __attribute__((noinline)); ~A () __attribute__((noinline)); }; +A::A () { asm volatile ("" : : : "memory"); } +A::~A () { asm volatile ("" : : : "memory"); } + +int bar () __attribute__((noinline)); +void foo () __attribute__((noinline)); + +volatile int k, l; + +int bar (int i) +{ + void *p = __builtin_alloca (i); + asm volatile ("" : : "r" (i), "r" (p) : "memory"); + if (k) throw 6; + return ++l; +} + +void foo () +{ + A a; + try { + A b; + int i = bar (5); + try { throw 6; } catch (int) {} + if (__builtin_expect (i < 4500, 0)) { + bar (7); + try { bar (8); } catch (long) {} + bar (10); + if (__builtin_expect (i < 0, 0)) { + try { bar (12); } catch (...) {} + bar (16); + bar (122); + } else { + try { bar (bar (7)); } catch (int) {} + } + } else { + try { bar (bar (bar (9))); } catch (...) {} + bar (5); + } + } catch (...) { + } +} + +int +main () +{ + int i; + for (i = 0; i < 10000; i++) + foo (); +} diff --git a/gcc/testsuite/g++.dg/tree-prof/partition2.C b/gcc/testsuite/g++.dg/tree-prof/partition2.C new file mode 100644 index 000000000..6715da57e --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-prof/partition2.C @@ -0,0 +1,16 @@ +// PR middle-end/45458 +// { dg-require-effective-target freorder } +// { dg-options "-fnon-call-exceptions -freorder-blocks-and-partition" } +// { dg-skip-if "PR target/47683" { mips-sgi-irix* } } + +int +main () +{ + try + { + throw 6; + } + catch (...) + { + } +} diff --git a/gcc/testsuite/g++.dg/tree-prof/partition3.C b/gcc/testsuite/g++.dg/tree-prof/partition3.C new file mode 100644 index 000000000..784698369 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-prof/partition3.C @@ -0,0 +1,18 @@ +// PR middle-end/45566 +// { dg-require-effective-target freorder } +// { dg-options "-O -fnon-call-exceptions -freorder-blocks-and-partition" } + +int k; + +int +main () +{ + try + { + if (k) + throw 6; + } + catch (...) + { + } +} diff --git a/gcc/testsuite/g++.dg/tree-prof/tree-prof.exp b/gcc/testsuite/g++.dg/tree-prof/tree-prof.exp new file mode 100644 index 000000000..92de03210 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-prof/tree-prof.exp @@ -0,0 +1,54 @@ +# Copyright (C) 2001, 2002, 2004, 2005, 2007, 2008 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# Test the functionality of programs compiled with profile-directed block +# ordering using -fprofile-generate followed by -fprofile-use. + +load_lib target-supports.exp + +# Some targets don't support tree profiling. +if { ![check_profiling_available ""] } { + return +} + +# The procedures in profopt.exp need these parameters. +set tool g++ +set prof_ext "gcda" + +# Override the list defined in profopt.exp. +set PROFOPT_OPTIONS [list {}] + +if $tracelevel then { + strace $tracelevel +} + +# Load support procs. +load_lib profopt.exp + +# These are globals used by profopt-execute. The first is options +# needed to generate profile data, the second is options to use the +# profile data. +set profile_option "-fprofile-generate" +set feedback_option "-fprofile-use" + +foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.C]] { + # If we're only testing specific files and this isn't one of them, skip it. + if ![runtest_file_p $runtests $src] then { + continue + } + profopt-execute $src +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/20040317-1.C b/gcc/testsuite/g++.dg/tree-ssa/20040317-1.C new file mode 100644 index 000000000..e2f3dcdce --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/20040317-1.C @@ -0,0 +1,38 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +/* Test provided by Brian Ryner in PR 14511. The alias analyzer was + not handling structures containing arrays properly. In this case, + the static cast was introducing two assignments of the form + + this_6->_vptr.IFoo = &_ZTV4IFoo[2]; + this_4->_vptr.IFoo = &_ZTV3Bar[2]; + + which were not considered to alias each other because the alias + analyzer was not computing a proper pointer to array elements. + Another related bug was the type based alias analyzer not computing + alias relations to _ZTV4IFoo and _ZTV3Bar. Since those variables + are read-only, it was disregarding alias information for them. + So, the memory tags for the two 'this' variables were not being + marked as aliased with these variables. Resulting in the two + assignments not aliasing each other. + + This was causing the optimizers to generate a call to the virtual + method Foo() instead of the overloaded version. */ + +struct IFoo +{ + virtual void Foo() = 0; +}; + +struct Bar : IFoo +{ + void Foo() { } +}; + +int main(int argc, char **argv) +{ + Bar* b = new Bar(); + static_cast<IFoo*>(b)->Foo(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/block1.C b/gcc/testsuite/g++.dg/tree-ssa/block1.C new file mode 100644 index 000000000..5573251cb --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/block1.C @@ -0,0 +1,11 @@ +// PR 13764: We were inserting an extra body block in all functions, but +// it's only really necessary for [cd]tors. +// { dg-options "-fdump-tree-gimple" } + +void bar (void) +{ + int a; +} + +// { dg-final { scan-tree-dump-times "\{" 1 "gimple" } } +// { dg-final { cleanup-tree-dump "gimple" } } diff --git a/gcc/testsuite/g++.dg/tree-ssa/builtin1.C b/gcc/testsuite/g++.dg/tree-ssa/builtin1.C new file mode 100644 index 000000000..76813cb8d --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/builtin1.C @@ -0,0 +1,10 @@ +// { dg-do link } + +extern void link_error(); + +int main() +{ + if (! __builtin_constant_p (&"Hello"[0])) + link_error(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/copyprop-1.C b/gcc/testsuite/g++.dg/tree-ssa/copyprop-1.C new file mode 100644 index 000000000..03f6b1207 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/copyprop-1.C @@ -0,0 +1,31 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-dce2" } */ + +/* Verify that we can eliminate the useless conversions to/from + const qualified pointer types + this_2 = o_1; + D.20003_4 = this_2->data_m; + this_5 = D.20003_4; + D.20005_6 = this_5->value; + copyprop should propagate o_1 and D.20003_4 to the loads of data_m + and value. dce removes all traces of this. */ + +struct Data { + int get() const { return value; } + int value; +}; + +struct Object { + int operator[](int i) const { return data_m->get(); } + Data *data_m; +}; + +int foo(Object&o) +{ + return o[0]; +} + +/* Remaining should be two loads. */ + +/* { dg-final { scan-tree-dump-times " = \[^\n\]*;" 2 "dce2" } } */ +/* { dg-final { cleanup-tree-dump "dce2" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/copyprop.C b/gcc/testsuite/g++.dg/tree-ssa/copyprop.C new file mode 100644 index 000000000..5ba193618 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/copyprop.C @@ -0,0 +1,739 @@ +// PR 39548 verify ssa ICE +// +// { dg-do compile { target { lp64 } } } +// { dg-options "-Wno-error -fno-exceptions -fno-tree-vrp -O2 -fprofile-generate -finline-limit=500" } +// + +#include <map> +#include <vector> +#include <iostream> +#include <cstdlib> +using namespace std; +template<typename _FIter, typename _Tp> _FIter lower_bound(_FIter, _FIter, _Tp&); +template<class _Key> struct hash { }; +template<class _Val> struct _Hashtable_node { + _Hashtable_node* _M_next; + _Val _M_val; +}; +static const unsigned long __stl_prime_list[] = { 2, 3, 5 }; +inline unsigned long prime(unsigned long __n) { + const unsigned long* __first = __stl_prime_list; + const unsigned long* __last = __stl_prime_list + 29; + const unsigned long* pos = lower_bound(__first, __last, __n); + return pos == __last ? *(__last - 1) : *pos; +} +template<class _Val, class _Key, class _HashFcn, class _ExtractKey, class _EqualKey, class _Alloc> struct hashtable { + typedef _Key key_type; + typedef _Val value_type; + typedef _HashFcn hasher; + typedef _EqualKey key_equal; + typedef size_t size_type; + typedef value_type& reference; + typedef _Hashtable_node<_Val> _Node; + typedef typename _Alloc::template rebind<value_type>::other allocator_type; + allocator_type get_allocator() const { } + typedef typename _Alloc::template rebind<_Node>::other _Node_Alloc; + typedef typename _Alloc::template rebind<_Node*>::other _Nodeptr_Alloc; + typedef vector<_Node*, _Nodeptr_Alloc> _Vector_type; + _Node_Alloc _M_node_allocator; + void _M_put_node(_Node* __p) { + _M_node_allocator.deallocate(__p, 1); + } + hasher _M_hash; + key_equal _M_equals; + _ExtractKey _M_get_key; + _Vector_type _M_buckets; + size_type _M_num_elements; + hashtable(size_type __n, const _HashFcn& __hf, const _EqualKey& __eql, const allocator_type& __a = allocator_type()) : _M_num_elements(0) { + _M_initialize_buckets(__n); + } + ~hashtable() { clear(); } + reference find_or_insert(const value_type& __obj); + size_type count(const key_type& __key) const { + const size_type __n = _M_bkt_num_key(__key); + size_type __result = 0; + for (const _Node* __cur = _M_buckets[__n]; __cur; __cur = __cur->_M_next) + if (_M_equals(_M_get_key(__cur->_M_val), __key)) ++__result; + } + size_type erase(const key_type& __key); + void clear(); + size_type _M_next_size(size_type __n) const { return prime(__n); } + void _M_initialize_buckets(size_type __n) { + const size_type __n_buckets = _M_next_size(__n); + _M_buckets.reserve(__n_buckets); + _M_buckets.insert(_M_buckets.end(), __n_buckets, (_Node*) 0); + } + size_type _M_bkt_num_key(const key_type& __key) const { + return _M_bkt_num_key(__key, _M_buckets.size()); + } + size_type _M_bkt_num_key(const key_type& __key, size_t __n) const { + return _M_hash(__key) % __n; + } + void _M_delete_node(_Node* __n) { + this->get_allocator().destroy(&__n->_M_val); + _M_put_node(__n); + } +}; +template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All> typename hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>::size_type hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>:: erase(const key_type& __key) { + const size_type __n = _M_bkt_num_key(__key); + _Node* __first = _M_buckets[__n]; + if (__first) _Node* __cur = __first; +} +template<class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All> void hashtable<_Val, _Key, _HF, _Ex, _Eq, _All>:: clear() { + for (size_type __i = 0; __i < _M_buckets.size(); ++__i) { + _Node* __cur = _M_buckets[__i]; + while (__cur != 0) { _M_delete_node(__cur); } + } +} +template<class _Key, class _Tp, class _HashFn = hash<_Key>, class _EqualKey = equal_to<_Key>, class _Alloc = allocator<_Tp> > struct hash_map { + typedef hashtable<pair<const _Key, _Tp>,_Key, _HashFn, _Select1st<pair<const _Key, _Tp> >, _EqualKey, _Alloc> _Ht; + _Ht _M_ht; + typedef typename _Ht::key_type key_type; + typedef typename _Ht::value_type value_type; + typedef typename _Ht::hasher hasher; + typedef typename _Ht::key_equal key_equal; + typedef typename _Ht::size_type size_type; + typedef typename _Ht::allocator_type allocator_type; + hash_map() : _M_ht(100, hasher(), key_equal(), allocator_type()) { } + _Tp& operator[](const key_type& __key) { + return _M_ht.find_or_insert(value_type(__key, _Tp())).second; + } + size_type count(const key_type& __key) const { return _M_ht.count(__key); } + size_type erase(const key_type& __key) { + return _M_ht.erase(__key); + } +}; +extern size_t strlen (__const char *__s); +template <class C> struct scoped_ptr { + explicit scoped_ptr(C* p = __null) : ptr_(p) { delete ptr_; } + void reset(C* p = __null) { + if (p != ptr_) { delete ptr_; } + } + C& operator*() const {} + C* operator->() const {} + bool operator==(C* p) const { return ptr_ == p; } + bool operator!=(C* p) const { return ptr_ != p; } + C* ptr_; +}; +namespace std { +class strstreambuf : public basic_streambuf<char, char_traits<char> > { +}; +class strstream : public basic_iostream<char> { + public: int pcount() const; + char* str(); + strstreambuf _M_buf; +}; +}; +const int INFO = 0, WARNING = 1, ERROR = 2, FATAL = 3, NUM_SEVERITIES = 4; +struct foo_1 { + foo_1(string* str) : str_(str) { } + operator bool() const { + return (__builtin_expect(str_ != __null, 0)); + } + string* str_; +}; +template<class t1, class t2> string* Makefoo_1(const t1& v1, const t2& v2, const char* names) { + strstream ss; + ss << names << " (" << v1 << " vs. " << v2 << ")"; + return new string(ss.str(), ss.pcount()); +} +template <class t1, class t2> inline string* Check_GTImpl(const t1& v1, const t2& v2, const char* names) { + if (v1 > v2) return __null; + else return Makefoo_1(v1, v2, names); +} +struct blah_54 { + blah_54(const char* file, int line, int severity); + ~blah_54(); + ostream& stream() { }; +}; +class blah_0 : public blah_54 { + public: blah_0(const char* file, int line); + blah_0(const char* file, int line, const foo_1& result); +}; +template <class Value, class Key, class HashFcn, class ExtractKey, class EqualKey, class Alloc> class dense_hashtable; +template <class V, class K, class HF, class ExK, class EqK, class A> struct dense_hashtable_iterator { + typedef V* pointer; + dense_hashtable_iterator(const dense_hashtable<V,K,HF,ExK,EqK,A> *h, pointer it, pointer it_end, bool advance) : ht(h), pos(it), end(it_end) { + if (advance) advance_past_empty_and_deleted(); + } + pointer operator->() const { } + void advance_past_empty_and_deleted() { + while ( pos != end && (ht->test_empty(*this) || ht->test_deleted(*this)) ) ++pos; + } + const dense_hashtable<V,K,HF,ExK,EqK,A> *ht; + pointer pos, end; +}; +template <class V, class K, class HF, class ExK, class EqK, class A> struct dense_hashtable_const_iterator { + typedef dense_hashtable_iterator<V,K,HF,ExK,EqK,A> iterator; + typedef dense_hashtable_const_iterator<V,K,HF,ExK,EqK,A> const_iterator; + typedef const V& reference; + typedef const V* pointer; + dense_hashtable_const_iterator(const dense_hashtable<V,K,HF,ExK,EqK,A> *h, pointer it, pointer it_end, bool advance) : ht(h), pos(it), end(it_end) { + if (advance) advance_past_empty_and_deleted(); + } + dense_hashtable_const_iterator(const iterator &it) : pos(it.pos), end(it.end) {} + reference operator*() const { return *pos; } + pointer operator->() const {} + void advance_past_empty_and_deleted() { + while ( pos != end && (ht->test_empty(*this) || ht->test_deleted(*this))) ++pos; + } + const_iterator& operator++() { } + bool operator!=(const const_iterator& it) const { } + const dense_hashtable<V,K,HF,ExK,EqK,A> *ht; + pointer pos, end; +}; +template <class Value, class Key, class HashFcn, class ExtractKey, class EqualKey, class Alloc> class dense_hashtable { + public: typedef Key key_type; + typedef Value value_type; + typedef HashFcn hasher; + typedef EqualKey key_equal; + typedef size_t size_type; + typedef dense_hashtable_iterator<Value, Key, HashFcn, ExtractKey, EqualKey, Alloc> iterator; + typedef dense_hashtable_const_iterator<Value, Key, HashFcn, ExtractKey, EqualKey, Alloc> const_iterator; + static const float HT_OCCUPANCY_FLT; + static const float HT_EMPTY_FLT; + static const size_t HT_MIN_BUCKETS = 32; + iterator end() { + return iterator(this, table + num_buckets, table + num_buckets, true); + } + const_iterator end() const { + return const_iterator(this, table + num_buckets, table+num_buckets,true); + } + void set_value(value_type* dst, const value_type& src) { + new(dst) value_type(src); + } + void destroy_buckets(size_type first, size_type last) { + for (; first != last; ++first) table[first].~value_type(); + } + private: void squash_deleted() { + if ( num_deleted ) { + dense_hashtable tmp(*this); + swap(tmp); + } + } + public: void set_deleted_key(const value_type &val) { squash_deleted(); } + bool test_deleted(size_type bucknum) const { + return (use_deleted && num_deleted > 0 && equals(get_key(delval), get_key(table[bucknum]))); + } + bool test_deleted(const const_iterator &it) const { + return (use_deleted && num_deleted > 0 && equals(get_key(delval), get_key(*it))); + } + bool set_deleted(const_iterator &it) { + set_value(const_cast<value_type*>(&(*it)), delval); + } + bool test_empty(size_type bucknum) const { + return equals(get_key(emptyval), get_key(table[bucknum])); + } + bool test_empty(const const_iterator &it) const { + return equals(get_key(emptyval), get_key(*it)); + } + void fill_range_with_empty(value_type* table_start, value_type* table_end) { + uninitialized_fill(table_start, table_end, emptyval); + } + void set_empty(size_type buckstart, size_type buckend) { + destroy_buckets(buckstart, buckend); + fill_range_with_empty(table + buckstart, table + buckend); + } + size_type size() const { + return num_elements - num_deleted; + } + size_type bucket_count() const { } + static const size_type ILLEGAL_BUCKET = size_type(-1); + size_type min_size(size_type num_elts, size_type min_buckets_wanted) { + size_type sz = HT_MIN_BUCKETS; + while ( sz < min_buckets_wanted || num_elts >= sz * enlarge_resize_percent ) sz *= 2; + } + void maybe_shrink() { + if (shrink_threshold > 0 && (num_elements-num_deleted) < shrink_threshold && bucket_count() > HT_MIN_BUCKETS ) { + size_type sz = bucket_count() / 2; + sz /= 2; + dense_hashtable tmp(*this, sz); + swap(tmp); + } + } + void resize_delta(size_type delta, size_type min_buckets_wanted = 0) { + if ( consider_shrink ) maybe_shrink(); + const size_type needed_size = min_size(num_elements + delta, min_buckets_wanted); + if ( needed_size > bucket_count() ) { + const size_type resize_to = min_size(num_elements - num_deleted + delta, min_buckets_wanted); + dense_hashtable tmp(*this, resize_to); + swap(tmp); + } + } + void copy_from(const dense_hashtable &ht, size_type min_buckets_wanted = 0) { + clear(); + const size_type resize_to = min_size(ht.size(), min_buckets_wanted); + num_elements++; + } + explicit dense_hashtable(size_type n = 0, const HashFcn& hf = HashFcn(), const EqualKey& eql = EqualKey(),const ExtractKey& ext = ExtractKey()) : num_deleted(0), use_deleted(false), use_empty(false), delval(), emptyval(), enlarge_resize_percent(HT_OCCUPANCY_FLT), shrink_resize_percent(HT_EMPTY_FLT), table(__null), num_buckets(min_size(0, n)), num_elements(0) { + reset_thresholds(); + } + dense_hashtable(const dense_hashtable& ht, size_type min_buckets_wanted = 0) : num_deleted(0), use_deleted(ht.use_deleted), use_empty(ht.use_empty), delval(ht.delval), emptyval(ht.emptyval), enlarge_resize_percent(ht.enlarge_resize_percent), shrink_resize_percent(ht.shrink_resize_percent), table(__null), num_buckets(0), num_elements(0) { + reset_thresholds(); + copy_from(ht, min_buckets_wanted); + set_value(&emptyval, ht.emptyval); + enlarge_resize_percent = ht.enlarge_resize_percent; + copy_from(ht); + } + ~dense_hashtable() { + if (table) { + destroy_buckets(0, num_buckets); + free(table); + } + } + void swap(dense_hashtable& ht) { + std::swap(equals, ht.equals); + { + value_type tmp; + set_value(&delval, ht.delval); + set_value(&ht.delval, tmp); + set_value(&ht.emptyval, tmp); + } + std::swap(table, ht.table); + std::swap(num_buckets, ht.num_buckets); + reset_thresholds(); + ht.reset_thresholds(); + } + void clear() { + if (table) destroy_buckets(0, num_buckets); + num_buckets = min_size(0,0); + set_empty(0, num_buckets); + } + pair<size_type, size_type> find_position(const key_type &key) const { + const size_type bucket_count_minus_one = bucket_count() - 1; + size_type bucknum = hash(key) & bucket_count_minus_one; + size_type insert_pos = ILLEGAL_BUCKET; + while ( 1 ) { + if ( test_empty(bucknum) ) { + if ( insert_pos == ILLEGAL_BUCKET ) return pair<size_type,size_type>(ILLEGAL_BUCKET, insert_pos); + } + else if ( test_deleted(bucknum) ) { + if ( insert_pos == ILLEGAL_BUCKET ) insert_pos = bucknum; + } + else if ( equals(key, get_key(table[bucknum])) ) { + return pair<size_type,size_type>(bucknum, ILLEGAL_BUCKET); + } + } + } + iterator find(const key_type& key) { + if ( size() == 0 ) return end(); + pair<size_type, size_type> pos = find_position(key); + if ( pos.first == ILLEGAL_BUCKET ) return end(); + return iterator(this, table + pos.first, table + num_buckets, false); + } + const_iterator find(const key_type& key) const { + if ( size() == 0 ) return end(); + pair<size_type, size_type> pos = find_position(key); + if ( pos.first == ILLEGAL_BUCKET ) return end(); + return const_iterator(this, table + pos.first, table+num_buckets, false); + } + size_type count(const key_type &key) const { + pair<size_type, size_type> pos = find_position(key); } + pair<iterator, bool> insert_noresize(const value_type& obj) { + const pair<size_type,size_type> pos = find_position(get_key(obj)); + if ( pos.first != ILLEGAL_BUCKET) { + return pair<iterator,bool>(iterator(this, table + pos.first, table + num_buckets, false), false); + } + else { + if ( test_deleted(pos.second) ) { ++num_elements; } + return pair<iterator,bool>(iterator(this, table + pos.second, table + num_buckets, false), true); + } + } + pair<iterator, bool> insert(const value_type& obj) { + resize_delta(1); + return insert_noresize(obj); + } + size_type erase(const key_type& key) { + const_iterator pos = find(key); + if ( pos != end() ) { + set_deleted(pos); + } + } + hasher hash; + key_equal equals; + ExtractKey get_key; + size_type num_deleted; + bool use_deleted; + bool use_empty; + value_type delval; + value_type emptyval; + float enlarge_resize_percent; + float shrink_resize_percent; + size_type shrink_threshold; + size_type enlarge_threshold; + value_type *table; + size_type num_buckets; + size_type num_elements; + bool consider_shrink; + void reset_thresholds() { + enlarge_threshold = static_cast<size_type>(num_buckets * shrink_resize_percent); + } +}; +template<> struct hash<long> { + size_t operator()(long x) const { + } +}; +template<> struct hash<unsigned long> { + size_t operator()(unsigned long x) const { + } +}; +template <class Key, class T, class HashFcn = hash<Key>, class EqualKey = equal_to<Key>, class Alloc = allocator<T> > class dense_hash_map { + struct SelectKey { + const Key& operator()(const pair<const Key, T>& p) const { + return p.first; + } + }; + typedef dense_hashtable<pair<const Key, T>, Key, HashFcn, SelectKey, EqualKey, Alloc> ht; + ht rep; + public: typedef typename ht::key_type key_type; + typedef T data_type; + typedef typename ht::value_type value_type; + typedef typename ht::size_type size_type; + typedef typename ht::iterator iterator; + typedef typename ht::const_iterator const_iterator; + iterator end() { + return rep.end(); + } + iterator find(const key_type& key) { return rep.find(key); } + data_type& operator[](const key_type& key) { + iterator it = find(key); + return insert(value_type(key, data_type())).first->second; + } + pair<iterator, bool> insert(const value_type& obj) { + return rep.insert(obj); + } + void set_deleted_key(const key_type& key) { + rep.set_deleted_key(value_type(key, data_type())); + } + size_type erase(const key_type& key) { return rep.erase(key); } +}; +template <class Value, class HashFcn = hash<Value>, class EqualKey = equal_to<Value>, class Alloc = allocator<Value> > class dense_hash_set { + struct Identity { + const Value& operator()(const Value& v) const { return v; } + }; + typedef dense_hashtable<Value, Value, HashFcn, Identity, EqualKey, Alloc> ht; + ht rep; + public: typedef typename ht::key_type key_type; + typedef typename ht::value_type value_type; + typedef typename ht::size_type size_type; + typedef typename ht::const_iterator iterator; + size_type count(const key_type& key) const { + return rep.count(key); + } + pair<iterator, bool> insert(const value_type& obj) { + pair<typename ht::iterator, bool> p = rep.insert(obj); + } + size_type erase(const key_type& key) { + return rep.erase(key); + } +}; +class linked_ptr_internal { + public: bool depart() { if (next_ == this) return true; } + mutable linked_ptr_internal const* next_; +}; +template <typename T> class linked_ptr { + public: explicit linked_ptr(T* ptr = __null) { + } + ~linked_ptr() { depart(); } + T& operator*() const { } + T* value_; + linked_ptr_internal link_; + void depart() { + if (link_.depart()) delete value_; + } +}; +class blah_3 { + const char* ptr_; + int length_; + public: blah_3(const char* str) : ptr_(str), length_((str == __null) ? 0 : static_cast<int>(strlen(str))) { } +}; +class blah_5; +class Bitmap { + public: Bitmap(unsigned int size) : array_size_(RequiredArraySize(size)) { } + static unsigned int RequiredArraySize(unsigned int num_bits) { return (num_bits + 31) >> 5; } + unsigned int array_size_; +}; +enum blah_31 { CREATIVE_FORMAT_TEXT_NARROW, kNumblah_31s }; +enum blah_33 { BLACKLISTED }; +template <typename EnumT> class blah_55; +typedef blah_55<blah_31> blah_31Set; +enum blah_36 { APPROVAL_STATUS_APPROVED, APPROVAL_STATUS_UNKNOWN }; +enum blah_37 { hahah_INVALID, hahah_KEYWORD }; +template<typename EnumT> class blah_55 { + public: blah_55(int enum_size); + bool Insert(EnumT x); + const int enum_size_; + Bitmap elements_; +}; +template<typename EnumT> blah_55<EnumT>::blah_55(int enum_size) :enum_size_(enum_size), elements_(enum_size) { + while (foo_1 _result = Check_GTImpl(1, 0, "enum_size" " " ">" " " "0")) blah_0(".h", 1902, _result).stream(); +}; +enum blah_38 { + ttttttt_9, }; +class blah_46 { + public: blah_46() : hahaha_id_(0), type_(hahah_INVALID), approval_status_(APPROVAL_STATUS_APPROVED) { + } + blah_46(long cid) : hahaha_id_(cid), type_(hahah_INVALID), approval_status_(APPROVAL_STATUS_APPROVED) { + } + long id() const { + return (static_cast<long>(hahaha_id_) << 16) >> 16; + } + static const blah_46 kBlacklistedID; + bool operator == (const blah_46& x) const { return id() == x.id(); } + bool operator < (const blah_46& x) const { return id() < x.id(); } + long hahaha_id_ : 48; + blah_37 type_ : 8; + blah_36 approval_status_ : 4; +}; +template <> struct hash<blah_46> { + size_t operator()(const blah_46 &x) const { + return size_t(x.id()); + } +}; +class blah_57 { + public: blah_57(); + void AddReason(blah_33 reason, const blah_3& debug_str, const blah_46& hahaha_id, bool ); + void set_collects_multiple_reasons(bool t) { } + private: struct foo_3 { + string reject_desc; + }; + foo_3 first_reason_; +}; +template <class T> struct foo_5 : public unary_function<T*, long> { + long operator()(const T* p) const { + long id = reinterpret_cast<long>(p); + if (id < 2) return -id; + } +}; +template <class T> class DensePtrSet : public dense_hashtable<T*, long, hash<long>, foo_5<T>, equal_to<long>, allocator<T*> > { + public: DensePtrSet() { + this->set_deleted_key(reinterpret_cast<T*>(1)); + } + const T* Find(long key) const { + typename DensePtrSet<T>::const_iterator it = this->find(key); + return it != this->end() ? *it : __null; + } +}; +struct foo_7 { + foo_7(bool spell_correction, bool query_broadening, bool previous_query, bool near_aaaaa, bool same_length, float mult, float exp_score) : shengmo_0(spell_correction), shengmo_1(query_broadening), shengmo_2(previous_query), shengmo_3(near_aaaaa), shengmo_4(same_length), multiplier(mult), expansion_score(exp_score) { + } + int CompareSameKeywordMatch(const foo_7& compare) const; + bool shengmo_0, shengmo_1, shengmo_2, shengmo_3, shengmo_4; + float multiplier, expansion_score; +}; +enum blah_41 { + ACP_ECPM_EARLY = 2 }; +struct foo_8 { unsigned int packed_ctr1; }; +struct foo_9 { foo_9() {}}; +class blah_16; +class blah_17; +class foo_12 { public: foo_12() {} + unsigned long hahaha_id() const {} + unsigned int qbb_score() const {} + private: static const vector<blah_46> hmmmmh_4; + long hahaha_id_ : 40; +}; +class foo_13 { + public: typedef dense_hash_map<long, int> BestMap; + foo_13() { best_rrrrrrr_.set_deleted_key(-1); } + void erase(long ad_group_id) { + best_rrrrrrr_.erase(ad_group_id); + } + typedef BestMap::iterator iterator; + typedef BestMap::const_iterator const_iterator; + const_iterator begin() const { } + iterator end() { return best_rrrrrrr_.end(); } + iterator find(long ad_group_id) { return best_rrrrrrr_.find(ad_group_id); } + const foo_12& GetMatch(const_iterator it) const {} + void hmmmmh_27(long ad_group_id, const foo_12& addme); + private: BestMap best_rrrrrrr_; + vector<foo_12> rrrrrrr_buffer_; +}; +struct foo_10 : public dense_hash_set<blah_46> {}; +class foo_9Set : public DensePtrSet<foo_9> {}; +typedef map<blah_46, foo_7*> foo_6Data; +typedef hash_map<long, linked_ptr<blah_57> > RejectedAdGroupMap; +enum blah_43 {}; +class foo_14 { + public: foo_14(const unsigned int, const blah_16*, const int*); + bool GathersMultipleRejectionReasons() const; + void hmmmmh_30(blah_46 hahaha_id, blah_38 type); + const foo_7* Insertfoo_6(const blah_46 hahaha_id, bool shengmo_0, bool shengmo_1, bool shengmo_2, bool shengmo_3, bool shengmo_4_rewrite, float multiplier, float context_score); + void hmmmmh_7(blah_46 hahaha_id, blah_38 type); + foo_9* Insertfoo_9(); + bool hmmmmh_8(long ad_group_id, const foo_12 &entry); + void hmmmmh_9(long ad_group_id); + foo_13::iterator hmmmmh_0(long ad_group_id); + bool hmmmmh_8(long ad_group_id, foo_13::iterator best, const foo_12& entry); + void hmmmmh_5(const blah_46 hahaha_id); + void hmmmmh_29(const blah_46 hahaha_id); + bool hmmmmh_12(const blah_46 hahaha_id) const; + bool hmmmmh_13(const blah_46 hahaha_id) const; + const foo_9* Getfoo_9(const blah_46 hahaha_id) const; + bool Gathersfoo_9() const {} + const foo_10* rrrrrrr_type_data() const {} + const foo_10* negative_rrrrrrr_type_data() const {} + const foo_10* positive_rrrrrrr_type_data() const {} + const foo_9Set* kw_info_set() const { } + const foo_6Data* rewrite_data() const {} + const vector<blah_17>& query_rectangles() const {} + void hmmmmh_14(); + void AddQueryRectangle(const blah_17& query_rectangle); + void hmmmmh_15(long ad_group_id, const blah_46 hahaha_id, blah_33 reject_class, const char* reject_desc = __null); + void hmmmmh_16(const vector<long>& rejected_sssr_ids); + void Copy(const foo_14& cmi); + void hmmmmh_10(); + private: const blah_16* ad_request_; + const int* cr_query_; + blah_43 gather_flags_; + vector<blah_17> query_rectangles_; + foo_10 rrrrrrr_type_data_; + foo_9Set kw_info_set_; + foo_6Data rewrite_data_; + scoped_ptr<RejectedAdGroupMap> rejected_sssr_map_; + foo_13 ad_group_rrrrrrr_data_; + vector<blah_46> geo_hahaha_; + bool geo_hahaha_is_sorted_; + foo_10 negative_rrrrrrr_type_data_, positive_rrrrrrr_type_data_; + scoped_ptr<foo_10> extra_hahaha_set_; + int dimension_id_; + blah_31Set creative_formats_; + scoped_ptr<dense_hash_set<unsigned long> > near_aaaaa_rrrrrrr_fps_; + blah_41 comparison_policy_; + blah_46 next_virtual_hahaha_id_; + vector<void*>* sub_queries_; + bool allow_only_whitelisted_customers_, automatic_hahaha_rrrrrrr_; + scoped_ptr<blah_5> kw_arena_, expanded_rrrrrrr_arena_; +}; +class blah_19 { + void hmmmmh_3(); + enum blah_45 {}; +}; +void blah_19::hmmmmh_3() {} +class blah_16 { + public: int near_aaaaa_rrrrrrr_fps_size() const {} + unsigned long near_aaaaa_rrrrrrr_fps(int i) const {} +}; +class blah_21 { + protected: blah_21(char* first_block, const size_t block_size, bool align_to_page); + void* GetMemoryFallback(const size_t size, const int align); + void* GetMemory(const size_t size, const int align) { + if ( size > 0 && size < remaining_ && align == 1 ) { + last_alloc_ = freestart_; + } + return GetMemoryFallback(size, align); + } + char* freestart_; + char* last_alloc_; + size_t remaining_; +}; +class blah_5 : blah_21 { + public: char* Alloc(const size_t size) { + return reinterpret_cast<char*>(GetMemory(size, 1)); + } +}; +class blah_25 { + public: virtual ~blah_25(); +}; +class blah_17 : blah_25 { }; +void Fillfoo_8(const foo_12& x2, struct foo_8* out) { + out->packed_ctr1 = x2.qbb_score(); +} +const vector<blah_46> foo_12::hmmmmh_4; +foo_14::foo_14(const unsigned int gather_flags, const blah_16* ad_request, const int* cr_query): ad_request_(ad_request), cr_query_(cr_query), gather_flags_(static_cast<blah_43>(gather_flags)), geo_hahaha_is_sorted_(false), dimension_id_(0), creative_formats_(kNumblah_31s), comparison_policy_(ACP_ECPM_EARLY), sub_queries_(new vector<void*>()), allow_only_whitelisted_customers_(false), automatic_hahaha_rrrrrrr_(false) { + hmmmmh_10(); +} +void foo_14::hmmmmh_5(const blah_46 hahaha_id) { + negative_rrrrrrr_type_data_.insert(hahaha_id); +} +void foo_14::hmmmmh_7(blah_46 hahaha_id, blah_38 type) { } +foo_13::iterator foo_14::hmmmmh_0( long ad_group_id) { + return ad_group_rrrrrrr_data_.find(ad_group_id); +} +bool foo_14::hmmmmh_8(long ad_group_id, foo_13::iterator best, const foo_12& entry) { + rejected_sssr_map_->erase(ad_group_id); + ad_group_rrrrrrr_data_.hmmmmh_27(ad_group_id, entry); +} +bool foo_14::hmmmmh_8(long ad_group_id, const foo_12& entry) { + foo_13::iterator best = hmmmmh_0(ad_group_id); +} +void foo_14::hmmmmh_9(long ad_group_id) { + ad_group_rrrrrrr_data_.erase(ad_group_id); +} +void foo_14::hmmmmh_10() { + if (near_aaaaa_rrrrrrr_fps_ != __null) { + blah_54(".cc", 226, WARNING).stream() << ""; + for (int j = 0; + j < ad_request_->near_aaaaa_rrrrrrr_fps_size(); j++) { + near_aaaaa_rrrrrrr_fps_->insert(ad_request_->near_aaaaa_rrrrrrr_fps(j)); + } + } +} +const foo_7* foo_14::Insertfoo_6(const blah_46 hahaha_id, bool shengmo_0, bool shengmo_1, bool shengmo_2, bool shengmo_3, bool shengmo_4_rewrite, float multiplier, float context_score) { + if (rrrrrrr_type_data_.count(hahaha_id) > 0) return __null; + foo_7* new_info = new(expanded_rrrrrrr_arena_->Alloc(sizeof(foo_7))) foo_7(shengmo_0,shengmo_1, shengmo_2, shengmo_3, shengmo_4_rewrite, multiplier, context_score); + pair<foo_6Data::iterator, bool> status = rewrite_data_.insert( make_pair(hahaha_id, new_info)); + foo_7* inserted = status.first->second; + if (!status.second) { + if (inserted->CompareSameKeywordMatch(*new_info) < 0) *inserted = *new_info; + } +} +foo_9* foo_14::Insertfoo_9() { + foo_9* info = new(kw_arena_->Alloc(sizeof(foo_9))) foo_9; + if (Gathersfoo_9()) kw_info_set_.insert(info); + creative_formats_.Insert(CREATIVE_FORMAT_TEXT_NARROW); +} +bool foo_14::hmmmmh_12(const blah_46 hahaha_id) const { + if (rrrrrrr_type_data_.count(hahaha_id)) return true; +} +bool foo_14::hmmmmh_13(const blah_46 hahaha_id) const { + if (positive_rrrrrrr_type_data_.count(hahaha_id)) return true; +} +const foo_9* foo_14::Getfoo_9(const blah_46 hahaha_id) const { + if (Gathersfoo_9()) return kw_info_set_.Find(hahaha_id.id()); + static int occurrences_383 = 0, occurrences_mod_n_383 = 0; + if (++occurrences_mod_n_383 > 1000) occurrences_mod_n_383 -= 1000; +} +void foo_14::hmmmmh_15(long ad_group_id, const blah_46 hahaha_id, blah_33 reject_class, const char* reject_desc) { + if (rejected_sssr_map_ == __null) { + blah_54("a.cc", 413, ERROR).stream() << "re NULL"; + rejected_sssr_map_.reset(new RejectedAdGroupMap); + } + if (rejected_sssr_map_->count(ad_group_id) == 0) { + blah_57* ad_rejection = new blah_57(); + ad_rejection->set_collects_multiple_reasons( GathersMultipleRejectionReasons()); + (*rejected_sssr_map_)[ad_group_id] = linked_ptr<blah_57>(ad_rejection); + } + blah_57& ad_rejection = *(*rejected_sssr_map_)[ad_group_id]; + ad_rejection.AddReason(reject_class, reject_desc, hahaha_id, false); +} +void foo_14::hmmmmh_16(const vector<long>& rejected_sssr_ids) { + for (vector<long>::const_iterator it = rejected_sssr_ids.begin(); + it != rejected_sssr_ids.end(); ++it) { + ad_group_rrrrrrr_data_.erase(*it); + for (foo_13::const_iterator it = ad_group_rrrrrrr_data_.begin(); + it != ad_group_rrrrrrr_data_.end(); ++it) { + hmmmmh_15(it->first, ad_group_rrrrrrr_data_.GetMatch(it).hahaha_id(), BLACKLISTED); + } + } + hmmmmh_30(blah_46::kBlacklistedID, ttttttt_9); +} +void foo_14::Copy(const foo_14& cmi) { + rrrrrrr_type_data_ = *cmi.rrrrrrr_type_data(); + negative_rrrrrrr_type_data_ = *cmi.negative_rrrrrrr_type_data(); + positive_rrrrrrr_type_data_ = *cmi.positive_rrrrrrr_type_data(); + if (cmi.Gathersfoo_9()) { + kw_info_set_ = *cmi.kw_info_set(); + rewrite_data_ = *cmi.rewrite_data(); + } + hmmmmh_14(); + for (int i = 0; i < cmi.query_rectangles().size(); + ++i) AddQueryRectangle(cmi.query_rectangles()[i]); +} +void foo_13::hmmmmh_27(long ad_group_id, const foo_12& addme) { + int& best_index = best_rrrrrrr_[ad_group_id]; + rrrrrrr_buffer_.push_back(addme); +} +void foo_14::hmmmmh_29(const blah_46 hahaha_id) { + if (extra_hahaha_set_ != __null) extra_hahaha_set_->erase(hahaha_id); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/dom-invalid.C b/gcc/testsuite/g++.dg/tree-ssa/dom-invalid.C new file mode 100644 index 000000000..5513d3650 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/dom-invalid.C @@ -0,0 +1,52 @@ +// PR tree-optimization/39557 +// invalid post-dom info leads to infinite loop +// { dg-do run } +// { dg-options "-Wall -fno-exceptions -O2 -fprofile-use -fno-rtti" } + +struct C +{ + virtual const char *bar () const; +}; + +struct D +{ + D () : d1 (0) { } + C *d2[4]; + int d1; + inline const C & baz (int i) const { return *d2[i]; } +}; + +struct E +{ + unsigned char e1[2]; + D e2; + bool foo () const { return (e1[1] & 1) != 0; } + virtual const char *bar () const __attribute__ ((noinline)); +}; + +const char * +C::bar () const +{ + return 0; +} + +C c; + +const char * +E::bar () const +{ + const char *e = __null; + if (foo () && (e = c.C::bar ())) + return e; + for (int i = 0, n = e2.d1; i < n; i++) + if ((e = e2.baz (i).C::bar ())) + return e; + return e; +} + +int +main () +{ + E e; + e.bar (); +} // { dg-message "note: file" "" } diff --git a/gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C b/gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C new file mode 100644 index 000000000..8dfaa52b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C @@ -0,0 +1,24 @@ +// { dg-options "-O2 -fdump-tree-ehcleanup1-details" } +extern void can_throw (); +class a +{ +public: + ~a () + { + if (0) + can_throw (); + } +}; +void +t (void) +{ + class a a; + can_throw (); +} +// We ought to remove implicit cleanup, since destructor is empty. +// { dg-final { scan-tree-dump-times "Empty EH handler" 1 "ehcleanup1" } } +// +// And as a result also contained control flow. +// { dg-final { scan-tree-dump-times "Removing unreachable" 2 "ehcleanup1" } } +// +// { dg-final { cleanup-tree-dump "ehcleanup1" } } diff --git a/gcc/testsuite/g++.dg/tree-ssa/empty-1.C b/gcc/testsuite/g++.dg/tree-ssa/empty-1.C new file mode 100644 index 000000000..6a6e452be --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/empty-1.C @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +struct S {}; +S bar (const S &a) +{ + S s; + s = a; + return s; +} + +/* Test whether memcpy call has been optimized out. */ +/* { dg-final { scan-tree-dump-times "memcpy" 0 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/empty-2.C b/gcc/testsuite/g++.dg/tree-ssa/empty-2.C new file mode 100644 index 000000000..01b77b4fb --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/empty-2.C @@ -0,0 +1,15 @@ +// PR c++/45307 +// { dg-options "-fdump-tree-gimple -fdump-tree-optimized -O" } + +struct fallible_t { }; +const fallible_t fallible = fallible_t(); + +void t(void) +{ +} + +// { dg-final { scan-tree-dump-not "fallible" "gimple" } } +// Whole constructor should be optimized away. +// { dg-final { scan-tree-dump-not "int" "optimized" } } +// { dg-final { cleanup-tree-dump "gimple" } } +// { dg-final { cleanup-tree-dump "optimized" } } diff --git a/gcc/testsuite/g++.dg/tree-ssa/fold-compare.C b/gcc/testsuite/g++.dg/tree-ssa/fold-compare.C new file mode 100644 index 000000000..2b4c41103 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/fold-compare.C @@ -0,0 +1,28 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +struct ExtentsBase { + ExtentsBase() : startx_(), endx_() { } + ExtentsBase(const ExtentsBase &b) { + *this = b; + } + + const ExtentsBase & operator=(const ExtentsBase &b) { + if (this != &b) { + startx_ = b.startx_; + } + return *this; + } + + int startx_; + int endx_; +}; + +int f(const ExtentsBase &e1) { + ExtentsBase my_extents = e1; + return my_extents.startx_; +} + +/* { dg-final { scan-tree-dump-not "&my_extents" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ + diff --git a/gcc/testsuite/g++.dg/tree-ssa/fwprop-align.C b/gcc/testsuite/g++.dg/tree-ssa/fwprop-align.C new file mode 100644 index 000000000..69f260216 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/fwprop-align.C @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-forwprop2" } */ + +struct A +{ + void foo () + { + } +}; + +int main() +{ + void (A::* const p)() = & A::foo; + A a; + (a.*p)(); +} + +/* We should eliminate the check if p points to a virtual function. */ +/* { dg-final { scan-tree-dump-times "& 1" 0 "forwprop2" } } */ +/* { dg-final { cleanup-tree-dump "forwprop2" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-1.C b/gcc/testsuite/g++.dg/tree-ssa/inline-1.C new file mode 100644 index 000000000..95b7d0609 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/inline-1.C @@ -0,0 +1,36 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-einline" } */ +/* { dg-add-options bind_pic_locally } */ + +namespace std { + extern "C" void puts(const char *s); +} + +template <class T, class E> void +foreach (T b, T e, void (*ptr)(E)) +{ + for (; b != e; b++) + ptr(*b); +} + +void +inline_me (char *x) +{ + std::puts(x); +} + +static void +inline_me_too (char *x) +{ + std::puts(x); +} + +int main(int argc, char **argv) +{ + foreach (argv, argv + argc, inline_me); + foreach (argv, argv + argc, inline_me_too); +} + +/* { dg-final { scan-tree-dump-times "Inlining void inline_me\\(" 1 "einline"} } */ +/* { dg-final { scan-tree-dump-times "Inlining void inline_me_too\\(" 1 "einline"} } */ +/* { dg-final { cleanup-tree-dump "einline" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-2.C b/gcc/testsuite/g++.dg/tree-ssa/inline-2.C new file mode 100644 index 000000000..656cba031 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/inline-2.C @@ -0,0 +1,36 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-einline" } */ +/* { dg-add-options bind_pic_locally } */ + +namespace std { + extern "C" void puts(const char *s); +} + +template <class T, class E> void +foreach (T b, T e, E ptr) +{ + for (; b != e; b++) + ptr(*b); +} + +void +inline_me (char *x) +{ + std::puts(x); +} + +static void +inline_me_too (char *x) +{ + std::puts(x); +} + +int main(int argc, char **argv) +{ + foreach (argv, argv + argc, inline_me); + foreach (argv, argv + argc, inline_me_too); +} + +/* { dg-final { scan-tree-dump-times "Inlining void inline_me\\(" 1 "einline"} } */ +/* { dg-final { scan-tree-dump-times "Inlining void inline_me_too\\(" 1 "einline"} } */ +/* { dg-final { cleanup-tree-dump "einline" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-3.C b/gcc/testsuite/g++.dg/tree-ssa/inline-3.C new file mode 100644 index 000000000..f01f26caf --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/inline-3.C @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-einline" } */ +/* { dg-add-options bind_pic_locally } */ + +#include <algorithm> + +void foo(const char *s); + +void +inline_me (char *x) +{ + foo(x); +} + +static void +inline_me_too (char *x) +{ + foo(x); +} + +int main(int argc, char **argv) +{ + std::for_each (argv, argv + argc, inline_me); + std::for_each (argv, argv + argc, inline_me_too); +} + +/* { dg-final { scan-tree-dump-times "Inlining void inline_me\\(" 1 "einline"} } */ +/* { dg-final { scan-tree-dump-times "Inlining void inline_me_too\\(" 1 "einline"} } */ +/* { dg-final { cleanup-tree-dump "einline" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/ivopts-1.C b/gcc/testsuite/g++.dg/tree-ssa/ivopts-1.C new file mode 100644 index 000000000..0eaa0fb25 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/ivopts-1.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-ivopts" } */ + +struct Foo { + Foo() : s(1) {} + int s; +}; +void foo(Foo&); +void bar(void) +{ + Foo x[4]; + foo(x[0]); +} + +/* { dg-final { scan-tree-dump-not "-&x" "ivopts" } } */ +/* { dg-final { scan-tree-dump-not "offset: (4294967292|0x0f+fc)" "ivopts" } } */ +/* { dg-final { scan-tree-dump-not "&x\\\[5\\\]" "ivopts" } } */ +/* { dg-final { cleanup-tree-dump "ivopts" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/ivopts-2.C b/gcc/testsuite/g++.dg/tree-ssa/ivopts-2.C new file mode 100644 index 000000000..908299d98 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/ivopts-2.C @@ -0,0 +1,11 @@ +/* { dg-do compile { target { i?86-*-* x86_64-*-* } } } */ +/* { dg-options "-O2 -fdump-tree-ivopts-details" } */ + +void test (int *b, int *e, int stride) + { + for (int *p = b; p != e; p += stride) + *p = 1; + } + +/* { dg-final { scan-tree-dump-times "PHI <p" 1 "ivopts"} } */ +/* { dg-final { cleanup-tree-dump "ivopts" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/new1.C b/gcc/testsuite/g++.dg/tree-ssa/new1.C new file mode 100644 index 000000000..a859f0ac3 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/new1.C @@ -0,0 +1,42 @@ +// PR c++/36633 + +/* { dg-do compile } */ +/* { dg-options "-O2 -Wall -fdump-tree-forwprop1" } */ +// No particular reason for choosing forwprop1 dump to look at. + +struct B { ~B() {} }; +struct D : public B {}; +//struct D {}; + +struct my_deleter +{ + void operator()(D * d) + { + // delete [] d; + } +}; + +struct smart_ptr +{ + smart_ptr(D * ptr) : p(ptr) { } + ~smart_ptr() { d(p); } + D * p; + my_deleter d; +}; + +int +test01() +{ + smart_ptr p(new D[7]); + + return 0; +} + +int main() +{ + test01(); + return 0; +} + +/* { dg-final { scan-tree-dump-not "= .* \\+ -" "forwprop1" } } */ +/* { dg-final { cleanup-tree-dump "forwprop1" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/nothrow-1.C b/gcc/testsuite/g++.dg/tree-ssa/nothrow-1.C new file mode 100644 index 000000000..33462946a --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/nothrow-1.C @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fdump-tree-cfg" } */ +/* { dg-add-options bind_pic_locally } */ + +double a; +void t() +{ + a=1; +} +void t1(void); +void abort(void); + +void q() +{ + try { + t(); + } + catch (...) {abort();} +} +/* We shouldnotice nothrow attribute. */ +/* { dg-final { scan-tree-dump-times "exception" 0 "cfg"} } */ +/* { dg-final { cleanup-tree-dump "cfg" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/obj-type-ref.C b/gcc/testsuite/g++.dg/tree-ssa/obj-type-ref.C new file mode 100644 index 000000000..9854d32e8 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/obj-type-ref.C @@ -0,0 +1,19 @@ +/* { dg-do compile } */ + +/* This used to fail with type-checking enabled because we didn't + expect OBJ_TYPE_REF expressions. */ + +class QObject {}; +class Pile : public QObject { +public: + virtual void setVisible(void); +}; +class Spider { + void dealRow(); + Pile *redeals[5]; + int m_redeal; +}; +void Spider::dealRow() +{ + redeals[m_redeal++]->setVisible(); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pointer-reference-alias.C b/gcc/testsuite/g++.dg/tree-ssa/pointer-reference-alias.C new file mode 100644 index 000000000..777656d59 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pointer-reference-alias.C @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fdump-tree-optimized" } */ + +int f(int *a) +{ + int &b = *a; + b = 0; + return *a; +} + +/* There should be only one dereferencing of a. */ +/* { dg-final { scan-tree-dump-times "\\*a" 1 "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr13146.C b/gcc/testsuite/g++.dg/tree-ssa/pr13146.C new file mode 100644 index 000000000..22baf03d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr13146.C @@ -0,0 +1,77 @@ +/* { dg-do link } */ +/* { dg-options "-O -fstrict-aliasing" } */ + +class first +{ +public: + double d; + int f1; +}; + +class middle : public first +{ +}; + +class second : public middle +{ +public: + int f2; + short a; +}; + +class third +{ +public: + char a; + char b; +}; + +class multi: public third, public second +{ +public: + short s; + /* The following field used to be of type char but that causes + class multi to effectively get alias-set zero which we end + up not optimizing because of the fix for PR44164. */ + int f3; +}; + +extern void link_error (); + +void +foo (first *s1, second *s2) +{ + s1->f1 = 0; + s2->f2 = 0; + s1->f1++; + s2->f2++; + s1->f1++; + s2->f2++; + if (s1->f1 != 2) + link_error (); +} + +void +bar (first *s1, multi *s3) +{ + s1->f1 = 0; + s3->f3 = 0; + s1->f1++; + s3->f3++; + s1->f1++; + s3->f3++; + if (s1->f1 != 2) + link_error (); +} + + +int +main() +{ + first a; + second b; + multi c; + foo (&a, &b); + bar (&a, &c); + return 0; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr14703.C b/gcc/testsuite/g++.dg/tree-ssa/pr14703.C new file mode 100644 index 000000000..58705277e --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr14703.C @@ -0,0 +1,49 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized -fno-ipa-reference" } */ +#include <iostream> + +namespace { +template <unsigned long long L> class fib { + public: + static const unsigned long long value = fib<L - 1>::value + fib<L - 2>::value; +}; + +template <> class fib<0> { + public: + static const unsigned long long value = 1; +}; + +template <> class fib<1> { + public: + static const unsigned long long value = 1; +}; + +template<unsigned long long L> inline unsigned long long fibconst() +{ + return fibconst<L - 1>() + fibconst<L - 2>(); +} + +template <> inline unsigned long long fibconst<0>() +{ + return 1ull; +} + +template <> inline unsigned long long fibconst<1>() +{ + return 1ull; +} + +template <> inline unsigned long long fibconst<2>() +{ + return 2ull; +} + +} + +int main() +{ + ::std::cerr << "fib<90>::value == " << fib<90>::value << "\n"; + ::std::cerr << "fibcst<90>() == " << fibconst<90>() << "\n"; +} +// { dg-final { scan-tree-dump-not "fibconst" "optimized" } } +// { dg-final { cleanup-tree-dump "optimized" } } diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr14814.C b/gcc/testsuite/g++.dg/tree-ssa/pr14814.C new file mode 100644 index 000000000..59e3c9bc9 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr14814.C @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-forwprop2" } */ + +class YY { public: + YY(const YY &v) { e[0] = v.e[0]; e[1] = v.e[1]; e[2] = v.e[2]; } + double &y() { return e[1]; } + double e[3]; }; + +class XX { public: + YY direction() const { return v; } + YY v; }; + +int foo(XX& r) { + if (r.direction().y() < 0.000001) return 0; + return 1; } + +/* { dg-final { scan-tree-dump-times "&this" 0 "forwprop2" } } */ +/* { dg-final { scan-tree-dump-times "&r" 0 "forwprop2" } } */ +/* { dg-final { cleanup-tree-dump "forwprop2" } } */ + diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr15791-1.C b/gcc/testsuite/g++.dg/tree-ssa/pr15791-1.C new file mode 100644 index 000000000..68f14adad --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr15791-1.C @@ -0,0 +1,25 @@ +/* { dg-do link } */ + +void link_error (); + +int main () +{ + struct { int b[2]; } x; + int b[2]; + if (&b[1] != &b[1]) + link_error (); + if (&b[0] != b) + link_error (); + if (b == &b[2]) + link_error (); + if (b != b) + link_error (); + if (&x.b[1] == &x.b[0]) + link_error (); + if (x.b != &x.b[0]) + link_error (); + if (&x.b[1] == x.b) + link_error (); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr15791-2.C b/gcc/testsuite/g++.dg/tree-ssa/pr15791-2.C new file mode 100644 index 000000000..fb8cbbe4c --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr15791-2.C @@ -0,0 +1,13 @@ +/* { dg-do link } */ +/* { dg-options "" } */ + +void link_error (); +struct a {}; +int main () +{ + struct a b[2]; + if (&b[0] == &b[1]) + link_error (); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr15791-3.C b/gcc/testsuite/g++.dg/tree-ssa/pr15791-3.C new file mode 100644 index 000000000..2fd03e2e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr15791-3.C @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-fdump-tree-gimple" } */ + +int f(int i, unsigned j) +{ + int b[2]; + if (&b[i] == &b[j]) + return 1; + return 0; +} + +/* { dg-final { scan-tree-dump-times "i == j" 0 "gimple" } } */ +/* { dg-final { cleanup-tree-dump "gimple" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr15791-4.C b/gcc/testsuite/g++.dg/tree-ssa/pr15791-4.C new file mode 100644 index 000000000..82be2e33a --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr15791-4.C @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-fdump-tree-gimple" } */ + +int f(int i, int j) +{ + int b[2][2]; + if (&b[1][i] == &b[0][j]) + return 1; + return 0; +} + +/* { dg-final { scan-tree-dump-times "i == j" 0 "gimple" } } */ +/* { dg-final { cleanup-tree-dump "gimple" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr15791-5.C b/gcc/testsuite/g++.dg/tree-ssa/pr15791-5.C new file mode 100644 index 000000000..06ce523a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr15791-5.C @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-fdump-tree-gimple" } */ + +int foo(int i, int j) +{ + char g[16]; + if (&g[i] == &g[j]) + return 1; + return 0; +} + +/* { dg-final { scan-tree-dump-times "i == j" 1 "gimple" } } */ +/* { dg-final { cleanup-tree-dump "gimple" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr16688.C b/gcc/testsuite/g++.dg/tree-ssa/pr16688.C new file mode 100644 index 000000000..ce88bc2b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr16688.C @@ -0,0 +1,273 @@ +/* PR 16688. Test provided by Wolfgang Bangerth. The alias analyzer + was aborting when trying to group aliases. */ + +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +template<typename _Tp> +struct iterator_traits; + +template<typename _Tp> +struct iterator_traits<_Tp*> { + typedef _Tp& reference; +}; + +template<typename _Iterator> struct NI { + _Iterator current; + + typedef typename iterator_traits<_Iterator>::reference reference; + + NI() { } + + NI(const _Iterator& __i) : current(__i) { } + + reference operator*() const { return *current; } + + NI& operator++() { return *this; } + + const _Iterator& base() const { return current; } +}; + +template<typename _IteratorL, typename _IteratorR> +inline int +operator-(const NI<_IteratorL>& __lhs, + const NI<_IteratorR>& __rhs) +{ return __lhs.base() - __rhs.base(); } + + +template<typename _II, typename _OI> +inline _OI +__copy_aux(_II __first, _II __last, _OI __result) +{ + struct __copy { + static _OI + copy(_II __first, _II __last, _OI __result) + { + for (; __first != __last; ++__result, ++__first) + *__result = *__first; + return __result; + } + }; + + return __copy::copy(__first, __last, __result); +} + +struct __copy_normal +{ + template<typename _II, typename _OI> + static _OI + copy_n(_II __first, _II __last, _OI __result) + { + return __copy_aux(__first, __last, __result); + } +}; +template<typename _InputIterator, typename _OutputIterator> +inline _OutputIterator +copy(_InputIterator __first, _InputIterator __last, + _OutputIterator __result) +{ + return __copy_normal::copy_n(__first, __last, __result); +} + +template <typename T, typename U, typename V> +void uninitialized_fill_n(T,U,V); + + +template<typename _Tp> +struct _Vector_base { + struct _Vector_impl { + _Tp* start; + _Tp* finish; + _Tp* end_of_storage; + _Vector_impl() : start(0), finish(0), end_of_storage(0) + { } + } impl; + + _Vector_base(unsigned __n) { + impl.start = allocate(__n); + impl.finish = impl.start; + impl.end_of_storage = impl.start + __n; + } + + ~_Vector_base() { + deallocate(impl.start, + impl.end_of_storage - impl.start); + } + + _Tp* allocate(unsigned __n); + + void deallocate(_Tp* __p, unsigned __n); + + NI<_Tp*> begin() { return NI<_Tp*> (impl.start); } +}; + + +template<typename _Tp> +struct vector : _Vector_base<_Tp> +{ + vector(int __n) + : _Vector_base<_Tp>(__n) + { + uninitialized_fill_n(this->impl.start, __n, _Tp()); + } +}; + + + +struct Tensor +{ + Tensor (); + Tensor (const Tensor &); + + double values[2]; +}; + + +inline +Tensor::Tensor (const Tensor &p) +{ + for (unsigned int i=0; i<2; ++i) + values[i] = p.values[i]; +} + + +struct TriaAccessor +{ + typedef void * AccessorData; + + void copy_from (const TriaAccessor &); + void operator = (const TriaAccessor *); + + TriaAccessor & operator = (const TriaAccessor &); + + bool operator == (const TriaAccessor &) const; + + bool operator != (const TriaAccessor &) const; + void operator ++ (); + + int state () const; + bool used () const; + + int present_level; + int present_index; + int** levels; +}; + +inline int TriaAccessor::state () const { + if ((present_level>=0) && (present_index>=0)) + return 0; + else + if ((present_level==-1) && (present_index==-1)) + return 1; + else + return 2; +} + + +inline +void TriaAccessor::operator ++ () { + ++this->present_index; + + while (this->present_index >= + static_cast<int>(*this->levels[this->present_level])) + { + ++this->present_level; + this->present_index = 0; + + if (this->present_level >= static_cast<int>(1)) + { + + this->present_level = this->present_index = -1; + return; + } + } +} + +struct MGDoFObjectAccessor : TriaAccessor {}; + + + +struct TriaRawIterator +{ + TriaRawIterator (); + + TriaRawIterator (const TriaRawIterator &); + TriaRawIterator (const MGDoFObjectAccessor &a); + const MGDoFObjectAccessor & operator * () const; + + MGDoFObjectAccessor & operator * (); + const MGDoFObjectAccessor * operator -> () const; + + MGDoFObjectAccessor * operator -> (); + + TriaRawIterator & operator = (const TriaRawIterator &); + + bool operator == (const TriaRawIterator &) const; + bool operator != (const TriaRawIterator &) const; + bool operator < (const TriaRawIterator &) const; + MGDoFObjectAccessor accessor; + + TriaRawIterator & operator ++ (); +}; + +struct TriaIterator : TriaRawIterator +{ + TriaIterator (); + + TriaIterator (const TriaIterator &i); + + TriaIterator & + operator = (const TriaIterator &); + + TriaIterator & + operator = (const TriaRawIterator &); +}; + + +inline +TriaRawIterator::TriaRawIterator (const TriaRawIterator &i) : + accessor (i.accessor) {} + +inline +TriaIterator::TriaIterator (const TriaIterator &i) : + TriaRawIterator (static_cast<TriaRawIterator >(i)) {} + +inline +TriaRawIterator & TriaRawIterator::operator ++ () { + while (++accessor, (this->accessor.state() == 0)) + if (this->accessor.used() == true) + return *this; + return *this; +} + +struct Comp { + Comp (const Tensor &dir) : dir(dir) {} + + bool operator () (const TriaIterator &c1, const TriaIterator &c2) const; + const Tensor dir; +}; + + +template<typename Iter> +void x1(Iter first, Iter last, int i, Comp comp) +{ + x1(Iter(), last, i, comp); +} + +template<typename Iter> +inline void x2(Iter first, Iter last, Comp comp) +{ + if (first.base() != last.base()) + x1(first, last, (last - first), comp); +} + +void downstream_dg (const Tensor& direction) +{ + vector<TriaIterator> ordered_cells(13); + const Comp comparator(direction); + + TriaIterator begin, end; + + copy (begin, end, ordered_cells.begin()); + x2 (ordered_cells.begin(), ordered_cells.begin(), comparator); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr17153.C b/gcc/testsuite/g++.dg/tree-ssa/pr17153.C new file mode 100644 index 000000000..658225e6e --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr17153.C @@ -0,0 +1,17 @@ +/* The alias analyzer was marking RETVAL non-addressable, but RETVAL + is a special variable that's available across different functions. */ +void foo(const char*); + +struct A {}; + +struct B : A +{ + B(){} + B bar() + { + foo(__PRETTY_FUNCTION__); + return B(); + } +}; + +B b=B().bar(); diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr17400.C b/gcc/testsuite/g++.dg/tree-ssa/pr17400.C new file mode 100644 index 000000000..a6619a84f --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr17400.C @@ -0,0 +1,53 @@ +// Test PR 17400. Test case provided by Serge Belyshev. + +/* { dg-do compile } */ +/* { dg-options "-O1" } */ + + +void inc (int &); +bool dec_test (int &); + +struct A +{ + int c; + + friend void AddRef (A * p) + { + inc (p->c); + } + + friend void Release (A * p) + { + if(dec_test (p->c)) + delete p; + } +}; + +struct B +{ + B (A *p) : obj(p) + { + AddRef (obj); + } + + ~B() + { + Release (obj); + } + + void swap (B &rhs) + { + A * tmp = obj; + obj = rhs.obj; + rhs.obj = tmp; + } + + A *obj; +}; + +void bar (A *p1, A* p2) +{ + B px (p1); + B px2 (p2); + px.swap (px2); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr17517.C b/gcc/testsuite/g++.dg/tree-ssa/pr17517.C new file mode 100644 index 000000000..bcd5e91db --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr17517.C @@ -0,0 +1,32 @@ +// Test PR 17517. Test case provided by Serge Belyshev. + + /* { dg-do compile } */ + /* { dg-options "-O2" } */ + + +extern void foo (); + +struct Ptr { + int * ptr; + Ptr () { ptr = 0; } + ~Ptr() { delete ptr; } + Ptr &operator= (int * p) { ptr = p; return *this; } +}; + +int *new_checker () { foo (); return 0; } + +void pipe (int c) +{ + Ptr checker; + + foo (); + for (;;) + { + switch (c) + { + case '-': + checker = new_checker (); + break; + } + } +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr18178.C b/gcc/testsuite/g++.dg/tree-ssa/pr18178.C new file mode 100644 index 000000000..9223e8323 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr18178.C @@ -0,0 +1,47 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-vrp1" } */ + +// Define this to see it work. +// #define WORK_WORK_WORK + +#define THIRD + +#ifdef THIRD +#define FIRST i < 0 || +#define ORIG int +#define CAST +#else + +#define FIRST +#ifdef WORK_WORK_WORK +#define ORIG unsigned int +#define CAST +#else +#define ORIG int +#define CAST (unsigned) +#endif // WORK_WORK_WORK + +#endif // THIRD + +struct array +{ + const ORIG len; + int *data; +}; + +extern void call (ORIG); + +void doit (array *a) +{ + for (ORIG i = 0; i < a->len; ++i) + { + if (FIRST CAST (i) >= CAST (a->len)) + throw 5; + call (a->data[i]); + } +} + +/* VRP should remove all but 1 if() in the loop. */ + +/* { dg-final { scan-tree-dump-times "if " 1 "vrp1"} } */ +/* { dg-final { cleanup-tree-dump "vrp1" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr19637.C b/gcc/testsuite/g++.dg/tree-ssa/pr19637.C new file mode 100644 index 000000000..2d1dcceba --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr19637.C @@ -0,0 +1,33 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-dom1" } */ + +#include <new> + +struct Foo { + Foo() { i[0] = 1; } + int i[2]; +}; + +int foo_char(void) +{ + int i[2]; + new (reinterpret_cast<char *>(i)) Foo(); + return reinterpret_cast<Foo *>(i)->i[0]; +} + +int foo_void(void) +{ + int i[2]; + new (reinterpret_cast<void *>(i)) Foo(); + return reinterpret_cast<Foo *>(i)->i[0]; +} + +int foo_void_offset(void) +{ + int i[2]; + new (reinterpret_cast<void *>(&i[0])) Foo(); + return reinterpret_cast<Foo *>(&i[0])->i[0]; +} + +/* { dg-final { scan-tree-dump-times "return 1;" 3 "dom1" } } */ +/* { dg-final { cleanup-tree-dump "dom1" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr19786.C b/gcc/testsuite/g++.dg/tree-ssa/pr19786.C new file mode 100644 index 000000000..faaecdfd9 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr19786.C @@ -0,0 +1,48 @@ +// { dg-do run } +/* { dg-options "-O2" } */ + +// We used to get alias grouping wrong on this one, hoisting accesses +// to the vector's end out of the loop. + +#include <vector> +#include <cassert> + +struct A +{ + double unused; // If I remove it => it works. + std::vector<int> v; + + A() : v(1) {} +}; + +inline // If not inline => it works. +A g() +{ + A r; + r.v.resize(2); + r.v[0] = 1; + + while (!r.v.empty() && r.v.back() == 0) + r.v.pop_back(); + + return r; +} + +A f(const A &a) +{ + if (a.v.empty()) return a; + if (a.v.empty()) return a; + + // A z = g(); return z; // If I return like this => it works. + return g(); +} + +int main() +{ + A a; + A b; + A r = f(a); + assert(r.v.size() != 0); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr19807.C b/gcc/testsuite/g++.dg/tree-ssa/pr19807.C new file mode 100644 index 000000000..bba79a9d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr19807.C @@ -0,0 +1,30 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +int a[4]; +int *x, *y, *z; + +void foo(void) +{ + x = &a[3] - 1; + y = &a[1] + 1; + z = 1 + &a[1]; +} + +void bar(int i) +{ + x = &a[i] - 1; + y = &a[i] + 1; + z = 1 + &a[i]; +} + +/* { dg-final { scan-tree-dump-times "&a\\\[2\\\]" 3 "optimized" } } */ + +/* We want &a[D.bla + 1] and &a[D.foo - 1] in the final code, but + tuples mean that the offset is calculated in a separate instruction. + Simply test for the existence of +1 and -1 once, which also ensures + the above. If the addition/subtraction would be applied to the + pointer we would instead see +-4 (or 8, depending on sizeof(int)). */ +/* { dg-final { scan-tree-dump-times "\\\+ -1;" 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "\\\+ 1;" 1 "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr19952.C b/gcc/testsuite/g++.dg/tree-ssa/pr19952.C new file mode 100644 index 000000000..54589a294 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr19952.C @@ -0,0 +1,24 @@ +/* PR 19952 */ +/* { dg-do compile } */ +/* { dg-options "-ftree-vectorize -O2" } */ + +int i; + +struct A +{ + ~A() { ++i; } +}; + +struct B +{ + A a; +}; + +void foo() +{ + for (int i=0; i<2; ++i) + { + B *p; + if (p) p->~B(); + } +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr20280.C b/gcc/testsuite/g++.dg/tree-ssa/pr20280.C new file mode 100644 index 000000000..ec4dad706 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr20280.C @@ -0,0 +1,63 @@ +// PR c++/20280 + +// { dg-do compile } + +// Gimplification of the COND_EXPR used to fail because it had an +// addressable type, and create_tmp_var rejected that. + +struct A +{ + ~A(); +}; + +struct B : A {}; + +A& foo(); + +void bar(bool b) +{ + (B&) (b ? foo() : foo()); +} + +// Make sure bit-fields and addressable types don't cause crashes. +// These were not in the original bug report. + +// Added by Alexandre Oliva <aoliva@redhat.com> + +// Copyright 2005 Free Software Foundation + +struct X +{ + long i : 32, j, k : 32; +}; + +void g(long&); +void h(const long&); + +void f(X &x, bool b) +{ + (b ? x.i : x.j) = 1; + (b ? x.j : x.k) = 2; + (b ? x.i : x.k) = 3; + + (void)(b ? x.i : x.j); + (void)(b ? x.i : x.k); + (void)(b ? x.j : x.k); + + g (b ? x.i : x.j); // { dg-error "cannot bind bitfield" } + g (b ? x.i : x.k); // { dg-error "cannot bind bitfield" } + g (b ? x.j : x.k); // { dg-error "cannot bind bitfield" } + + // It's not entirely clear whether these should be accepted. The + // conditional expressions are lvalues for sure, and 8.5.3/5 exempts + // lvalues for bit-fields, but it's not clear that conditional + // expressions that are lvalues and that have at least one possible + // result that is a bit-field lvalue meets this condition. + h (b ? x.i : x.j); + h (b ? x.i : x.k); + h (b ? x.j : x.k); + + (long &)(b ? x.i : x.j); // { dg-error "address of bit-field" } + (long &)(b ? x.i : x.k); // { dg-error "address of bit-field" } + (long &)(b ? x.j : x.k); // { dg-error "address of bit-field" } +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr20458.C b/gcc/testsuite/g++.dg/tree-ssa/pr20458.C new file mode 100644 index 000000000..d4e7d1a1a --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr20458.C @@ -0,0 +1,37 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +/* The tail call optimization would inapproriately tail call the + destructors due to not recognizing a call clobbered variable */ +namespace std +{ + class locale + { + public: + locale(); + ~locale(); + }; +} + +struct B +{ + std::locale _M_buf_locale; + virtual ~B() {} +}; + +struct C : public B +{ + char *s; +}; + +void foo () +{ + C c; +} + +int main() +{ + foo (); + return 0; +} + diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr20489.C b/gcc/testsuite/g++.dg/tree-ssa/pr20489.C new file mode 100644 index 000000000..0a1a569d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr20489.C @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +struct A +{ + ~A(); +}; + +/* If we don't create SFT's for the "empty" structure A, bad things + will happen, and we will fail verification. */ +struct B +{ + int i; + A a; + + void foo() {} +}; + +void bar() +{ + B().foo(); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr20920.C b/gcc/testsuite/g++.dg/tree-ssa/pr20920.C new file mode 100644 index 000000000..02edd2827 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr20920.C @@ -0,0 +1,26 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +/* This was causing a failure in the out of SSA pass because VRP was + trying to insert assertions for SSA names that flow through + abnormal edges. */ +void f(int) __attribute__((__noreturn__)); +int d(const char *); +char * j (); + +char * +foo (int x) +{ + char *path = __null; + try + { + path = j (); + if (path != __null) + if (d (path) != 0) + f (127); + f (127); + } + catch (...) { } + + return path; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr20963.C b/gcc/testsuite/g++.dg/tree-ssa/pr20963.C new file mode 100644 index 000000000..d8f91e1be --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr20963.C @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +/* This was causing PRE to insert the value of the ADDR variable, to + remove the invariant cast but in doing so, it was creating a + non-invariant expression out of the invariant one, causing a later + failure in PRE. */ +struct sMCB { + unsigned char type; +}; + +extern void foo (void); +unsigned char mem_readb(char *pt) __attribute__((nothrow)); + +void DOS_FreeProcessMemory(unsigned short pspseg) { + while (1) { + if (pspseg) + foo (); + char *addr = (char*)(&((sMCB*)0)->type); + if (mem_readb(addr)==0x5a) break; + } +}; + diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr21082.C b/gcc/testsuite/g++.dg/tree-ssa/pr21082.C new file mode 100644 index 000000000..d6c2fa1d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr21082.C @@ -0,0 +1,14 @@ +/* { dg-do link } */ +/* { dg-options "-fstrict-overflow" } */ + +void link_error(); + +int a[4]; +__INTPTR_TYPE__ b, c; + +int main() +{ + if (&a[b] - &a[c] != b - c) + link_error(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr21407.C b/gcc/testsuite/g++.dg/tree-ssa/pr21407.C new file mode 100644 index 000000000..561dc707a --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr21407.C @@ -0,0 +1,8 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ +extern "C" void abort(void); +struct T1 {int a, b; virtual void f(){}}; +struct T : T1 { struct T1 w; int b; }; +void foo (struct T1 *p) { struct T *q = dynamic_cast<T*>(p); if (q->b != 2) abort (); } +/* We shouldn't kill the store to c.b, because foo uses it. */ +int main () { struct T c; c.b = 2; foo (&c); return 0; } diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr21463.C b/gcc/testsuite/g++.dg/tree-ssa/pr21463.C new file mode 100644 index 000000000..6d6ee93ba --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr21463.C @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-phiopt1" } */ + +template<class T> static inline const T &ref_max(const T &a, const T &b) +{ return a<b ? b : a; } +template<class T> static inline const T &ref_min(const T &a, const T &b) +{ return a<b ? a : b; } + +template<class T> struct foo_t { + T a0, a1; + T bar_ref(const T b, const T c) { + return ref_max(ref_min(a0, c), ref_min(ref_max(a1, c), b)); + } +}; + +template struct foo_t<int>; + +/* { dg-final { scan-tree-dump-times "MIN_EXPR" 2 "phiopt1" } } */ +/* { dg-final { scan-tree-dump-times "MAX_EXPR" 2 "phiopt1" } } */ +/* { dg-final { cleanup-tree-dump "phiopt1" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr21584-1.C b/gcc/testsuite/g++.dg/tree-ssa/pr21584-1.C new file mode 100644 index 000000000..2c96d1027 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr21584-1.C @@ -0,0 +1,38 @@ +extern "C" { + +extern char *strcpy (char *__restrict __dest, __const char *__restrict __src) + throw () __attribute__ ((__nonnull__ (1, 2))); + +extern char *foo (char *__restrict __s) throw (); +} + +class cset { +public: + cset(); + int operator()(unsigned char) const; +private: + char v[(127 * 2 + 1)+1]; +}; + +inline int cset::operator()(unsigned char c) const +{ + return v[c]; +} + +extern cset csspace; + +void baz() +{ + char *vec; + char buf[512]; + + char *p = buf; + while (csspace(*p)) + p++; + + if (*p != '#' && (p = foo(buf)) != 0) { + vec = new char[10+ 1]; + strcpy(vec, p); + } +} + diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr21584-2.C b/gcc/testsuite/g++.dg/tree-ssa/pr21584-2.C new file mode 100644 index 000000000..6246e8d4c --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr21584-2.C @@ -0,0 +1,22 @@ +extern char *strcpy (char *__restrict __dest, __const char *__restrict __src); + +extern char *foo (void); +extern void *malloc(__SIZE_TYPE__) __attribute__((malloc)); + +char v[100]; + +void baz() +{ + char *vec; + char buf[512]; + + char *p = buf; + while (v[(*p)]) + p++; + + if (*p != '#' && (p = foo()) != 0) { + strcpy ((char*)malloc(10), p); + } +} + + diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr22005.C b/gcc/testsuite/g++.dg/tree-ssa/pr22005.C new file mode 100644 index 000000000..cdaac2b88 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr22005.C @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +struct cl_string +{ + union{ int i; }; + cl_string (); +}; +struct cl_print_univpoly_flags { cl_string univpoly_varname; }; +struct cl_print_flags: cl_print_univpoly_flags {int i;}; +cl_print_flags default_print_flags; diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr22037.C b/gcc/testsuite/g++.dg/tree-ssa/pr22037.C new file mode 100644 index 000000000..11fc1b038 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr22037.C @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +extern double sqrt (double) throw (); + +void foo(double& d, int n) +{ + double e=0; + for(int i=0; i<n; i++); + for(int i=0; i<n; i++) e=1; + d = sqrt(e); + + for(int i=0; i<n; i++); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr22071.C b/gcc/testsuite/g++.dg/tree-ssa/pr22071.C new file mode 100644 index 000000000..719aed374 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr22071.C @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +/* This code ends up taking the address of part of the structure that is padding, + and because there is no real field there, the structure alias analyzer would + abort. */ +struct empty_class {}; +struct class1 : empty_class +{ + class1() {} + empty_class value_; +}; +struct lambda : class1 { }; +lambda _1; diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr22279.C b/gcc/testsuite/g++.dg/tree-ssa/pr22279.C new file mode 100644 index 000000000..0e17f08ec --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr22279.C @@ -0,0 +1,43 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +struct string +{ + long long _M_p; + long long i; + string(); + int begin(); + int end(); + string(int, int); +}; +struct symbol +{ + int type; + string name; + long long raw_name; + long long demangled_name; + long long version_name; + int version_status; + int status; + void init(); +}; +void symbol::init() { name = string(); } +struct pair +{ + symbol first; + symbol second; + pair(const symbol& __a, const symbol& __b) : first(__a), second(__b) { } +}; +struct vector +{ + void push_back(const pair& __x); +}; +/* This ends up with two RHS deref copies, and we need to get the offsets right on them. */ +void f(vector incompatible) +{ + symbol base; + incompatible.push_back(pair(base, base)); +} + + + diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr22404.C b/gcc/testsuite/g++.dg/tree-ssa/pr22404.C new file mode 100644 index 000000000..2c6b8cd27 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr22404.C @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +/* We were not getting the offset of a in B and a in C::B correct, + causing an abort. */ +struct A { A(); }; + +struct B : A +{ + A a; +}; + +struct C : B { }; + +C c; diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr22444.C b/gcc/testsuite/g++.dg/tree-ssa/pr22444.C new file mode 100644 index 000000000..7df4b9cce --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr22444.C @@ -0,0 +1,141 @@ +// PR tree-optimization/22444 +// When creating SFT's, we shouldn't add the original variable +// to the addressable vars list, because this may cause false aliasing +// with the subvars leading to the subvars not being renamed when they should +// { dg-do compile } +// { dg-options "-O2" } +__extension__ typedef __PTRDIFF_TYPE__ ptrdiff_t; +__extension__ typedef __SIZE_TYPE__ size_t; +namespace std +{ + template<class _T1, class _T2> struct pair + { + _T1 first; + _T2 second; + pair(const _T1& __a, const _T2& __b) : first(__a), second(__b) { } + }; +} +namespace __gnu_internal +{ + typedef char __one; + template<typename _Tp> __one __test_type(int _Tp::*); +} +namespace std +{ + template<typename _Tp> struct ___is_pod + { + enum { __value = (sizeof(__gnu_internal::__test_type<_Tp>(0))!= sizeof(__gnu_internal::__one)) }; + }; + template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t, typename _Pointer = _Tp*, typename _Reference = _Tp&> struct iterator + { }; + template<typename _Iterator> struct iterator_traits + { + typedef typename _Iterator::difference_type difference_type; + }; + template<typename _Iterator> class reverse_iterator : public iterator<typename iterator_traits<_Iterator>::iterator_category, typename iterator_traits<_Iterator>::value_type, typename iterator_traits<_Iterator>::difference_type, typename iterator_traits<_Iterator>::pointer, typename iterator_traits<_Iterator>::reference> + { + typedef _Iterator iterator_type; + typedef typename iterator_traits<_Iterator>::difference_type difference_type; + typedef typename iterator_traits<_Iterator>::reference reference; + reverse_iterator operator+(difference_type __n) const {} + reverse_iterator& operator+=(difference_type __n) { } + reference operator[](difference_type __n) const { } + }; +} +namespace __gnu_cxx +{ + template<bool _Thread> class __pool; + template<template <bool> class _PoolTp, bool _Thread> struct __common_pool_policy; + template<typename _Tp> class __mt_alloc_base + { + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + }; + template<typename _Tp, typename _Poolp = __common_pool_policy<__pool, true> > class __mt_alloc : public __mt_alloc_base<_Tp> + { + typedef size_t size_type; + }; +} +namespace std +{ + template<typename _Tp> struct allocator:public __gnu_cxx::__mt_alloc<_Tp> + { + template<typename _Tp1> struct rebind + { + typedef allocator<_Tp1> other; + }; + }; + template <class _Arg, class _Result> struct unary_function { }; + template <class _Arg1, class _Arg2, class _Result> struct binary_function + { + typedef _Arg2 second_argument_type; + }; + template <class _Tp> struct less : public binary_function<_Tp, _Tp, bool> + { + bool operator()(const _Tp& __x, const _Tp& __y) const { } + }; + template <class _Tp> struct _Identity : public unary_function<_Tp,_Tp> { }; + struct _Rb_tree_node_base + { + typedef _Rb_tree_node_base* _Base_ptr; + typedef const _Rb_tree_node_base* _Const_Base_ptr; + _Base_ptr _M_right; + static _Base_ptr _S_minimum(_Base_ptr __x) { } + static _Base_ptr _S_maximum(_Base_ptr __x) { } + }; + template<typename _Val> struct _Rb_tree_node { }; + template<typename _Tp> struct _Rb_tree_iterator + { + typedef _Tp* pointer; + typedef _Rb_tree_iterator<_Tp> _Self; + typedef _Rb_tree_node_base::_Base_ptr _Base_ptr; + pointer operator->() const { } + _Self operator++(int) { } + _Base_ptr _M_node; + }; + template<typename _Tp> struct _Rb_tree_const_iterator + { + typedef const _Tp* pointer; + typedef _Rb_tree_iterator<_Tp> iterator; + typedef _Rb_tree_node_base::_Const_Base_ptr _Base_ptr; + _Rb_tree_const_iterator(const iterator& __it) : _M_node(__it._M_node) { } + _Base_ptr _M_node; + }; + template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc = allocator<_Val> > struct _Rb_tree + { + typedef typename _Alloc::template rebind<std::_Rb_tree_node<_Val> >::other _Node_allocator; + typedef _Rb_tree_node_base* _Base_ptr; + typedef const _Rb_tree_node_base* _Const_Base_ptr; + typedef std::_Rb_tree_node<_Val> _Rb_tree_node; + typedef _Key key_type; + typedef _Val value_type; + typedef value_type* pointer; + typedef _Rb_tree_node* _Link_type; + template<typename _Key_compare, bool _Is_pod_comparator = std::___is_pod<_Key_compare>::__value> struct _Rb_tree_impl + : _Node_allocator + { + _Rb_tree_node_base _M_header; + }; + _Rb_tree_impl<_Compare> _M_impl; + typedef _Rb_tree_iterator<value_type> iterator; + typedef _Rb_tree_const_iterator<value_type> const_iterator; + typedef std::reverse_iterator<iterator> reverse_iterator; + pair<iterator,bool> insert_unique(const value_type& __x); + }; + template<class _Key, class _Compare, class _Alloc> class set + { + typedef _Key key_type; + typedef _Key value_type; + typedef _Compare key_compare; + typedef typename _Alloc::template rebind<_Key>::other _Key_alloc_type; + typedef _Rb_tree<_Key, value_type, _Identity<value_type>, key_compare, _Key_alloc_type> _Rep_type; + _Rep_type _M_t; + typedef typename _Rep_type::const_iterator iterator; + std::pair<iterator,bool> insert(const value_type& __x) + { + std::pair<typename _Rep_type::iterator, bool> __p = _M_t.insert_unique(__x); + return std::pair<iterator, bool>(__p.first, __p.second); + } + }; +} +template class std::set<int, std::less<int>, std::allocator<char> >; diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr22488.C b/gcc/testsuite/g++.dg/tree-ssa/pr22488.C new file mode 100644 index 000000000..9063b067a --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr22488.C @@ -0,0 +1,33 @@ +// PR tree-optimization/22488 +// This testcase is really a C++ FE bug in represnting virtual inheritance +// It gives the appearance to the middle end that the fields exist twice +// which resulted in a very confused structure analyzer +// { dg-do compile } +// { dg-options "-O" } +struct X +{ + int i0, i1; + char c; +}; + +struct A +{ + int i; + char c0, c1; + + virtual ~A(); +}; + +struct B : virtual A {}; + +struct C : B +{ + X x; + + void bar(X y) { x = y; } +}; + +void foo() +{ + C().bar(X()); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr22550.C b/gcc/testsuite/g++.dg/tree-ssa/pr22550.C new file mode 100644 index 000000000..5f5577620 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr22550.C @@ -0,0 +1,28 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +class X { +public: + int mfunc1 () { + return 1; + } + int mfunc2 () { + return 2; + } + X (int a, int b) { } +}; + +typedef int (X::*memfunc_p_t) (); + +memfunc_p_t mf_arr[2] = { &X::mfunc1, &X::mfunc2 }; + +int +main () +{ + // Get pntr to the array of pointers to member-funcs + memfunc_p_t (*mf_arr_p)[2] = &mf_arr; + // Compare indirect against direct access to an array element + if ((*mf_arr_p)[0] != mf_arr[0]) + return 1; + return 0; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr22615.C b/gcc/testsuite/g++.dg/tree-ssa/pr22615.C new file mode 100644 index 000000000..a8936c4cb --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr22615.C @@ -0,0 +1,28 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +/* Ensure that we don't crash when people decide to return the address of padding. */ + +struct A +{ + char c; + int i; +}; + +A a; + +struct B +{ + char c, d; +}; + +union C +{ + A *p; + B *q; + + C() : p(&a) {} + char& foo() { return q->d; } +}; +void bar() { C().foo() = 0; } + diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr23046.C b/gcc/testsuite/g++.dg/tree-ssa/pr23046.C new file mode 100644 index 000000000..eb8f39558 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr23046.C @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +enum eumtype { ENUM1, ENUM2 }; +void g(const eumtype kind ); +void f(long i); +void g(const eumtype kind) +{ + if ((kind != ENUM1) && (kind != ENUM2)) + f(kind); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr23164.C b/gcc/testsuite/g++.dg/tree-ssa/pr23164.C new file mode 100644 index 000000000..2318a309c --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr23164.C @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +bool f(); +struct S { + S(); + ~S(); +}; +void g() { + for (;;) { + S s1, s2, s3, s4, s5, s6; + if (f()) + continue; + if (f()) + return; + } +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr23624.C b/gcc/testsuite/g++.dg/tree-ssa/pr23624.C new file mode 100644 index 000000000..769d690ce --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr23624.C @@ -0,0 +1,8 @@ +/* { dg-do compile } */ + +template <int> +void f() +{ + int *t, i; + t[i ? 0 : i]; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr23948.C b/gcc/testsuite/g++.dg/tree-ssa/pr23948.C new file mode 100644 index 000000000..c34161409 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr23948.C @@ -0,0 +1,19 @@ +/* { dg-options "-O1 -ffast-math -fdump-tree-recip" } */ +/* { dg-do compile } */ + +struct MIOFILE { + ~MIOFILE(); +}; +double potentially_runnable_resource_share(); +void f1(double); +int make_scheduler_request(double a, double b) +{ + MIOFILE mf; + double prrs = potentially_runnable_resource_share(); + f1(a/prrs); + f1(1/prrs); + f1(b/prrs); +} + +/* { dg-final { scan-tree-dump-times " / " 1 "recip" } } */ +/* { dg-final { cleanup-tree-dump "recip" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr24172.C b/gcc/testsuite/g++.dg/tree-ssa/pr24172.C new file mode 100644 index 000000000..245186a3c --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr24172.C @@ -0,0 +1,11 @@ +// { dg-options "-O2" } +void IOException( char); +inline int* dummy( const char* const mode ) +{ + IOException(*mode+*mode); +} + +void prepare_inpaint( ) +{ + dummy ("rb"); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr24231-1.C b/gcc/testsuite/g++.dg/tree-ssa/pr24231-1.C new file mode 100644 index 000000000..d3c053efd --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr24231-1.C @@ -0,0 +1,42 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* FRE testcase for PR 24231, problem with PRE coalescing abnormal phis. */ +struct f +{ + int i; +}; +struct h{h();}; +int g(void); +int g1(void) throw(); +int h2222(f*); +void ghh(int); + +int main(void) +{ + int i; + f t; + try + { + i = g1(); + try + { + i = g(); + }catch(...) + {} + int j = i; + try + { t.i = i; + i = g(); + }catch(...) + {} + i = 2; + int h = t.i; + ghh (h); + + g(); + }catch(...) + {} + return i; +} + + diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr24231-2.C b/gcc/testsuite/g++.dg/tree-ssa/pr24231-2.C new file mode 100644 index 000000000..188b1a26b --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr24231-2.C @@ -0,0 +1,41 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* FRE testcase for PR 24231, problem with PRE coalescing abnormal phis. */ +struct f +{ + int i; +}; +struct h{h();}; +int g(void); +int g1(void) throw(); +int h2222(f*); +void ghh(int); + +int main(void) +{ + int i; + f t; + try + { + i = g1(); + try + { + i = g(); + }catch(...) + {} + int j = i; + try + { + i = g(); + }catch(...) + {} + t.i = j; + i = 2; + int h = t.i; + ghh (h); + + g(); + }catch(...) + {} + return i; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr24231-3.C b/gcc/testsuite/g++.dg/tree-ssa/pr24231-3.C new file mode 100644 index 000000000..a9ea58b11 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr24231-3.C @@ -0,0 +1,28 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* PRE testcase for PR 24231, problem with PRE coalescing abnormal phis. */ +struct MemoryManager { + virtual void deallocate() = 0; +}; +struct XalanVector { + ~XalanVector() { + m_memoryManager->deallocate(); + } + void swap(XalanVector& theOther) { + MemoryManager* const theTempManager = m_memoryManager; + m_memoryManager = theOther.m_memoryManager; + theOther.m_memoryManager = theTempManager; + theOther.m_size = 0; + } + void push_back() { + XalanVector theTemp(*this); + theTemp.push_back(); + swap(theTemp); + } + MemoryManager* m_memoryManager; + int m_size; +}; +void f(void) { + XalanVector tempVector; + tempVector.push_back(); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr24238.C b/gcc/testsuite/g++.dg/tree-ssa/pr24238.C new file mode 100644 index 000000000..3fdd5784e --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr24238.C @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +typedef struct SDL_Rect { + unsigned short w, h; +}SDL_Rect; +SDL_Rect *location(); +SDL_Rect inner_location() +{ + SDL_Rect r = *location(); + r.w -= 1; + return r; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr24351-1.C b/gcc/testsuite/g++.dg/tree-ssa/pr24351-1.C new file mode 100644 index 000000000..40959effa --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr24351-1.C @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +struct adaptor_base { +}; +struct bound_argument { + bound_argument(); +}; +template <class T_functor> struct adaptor_functor : public adaptor_base { + explicit adaptor_functor(const T_functor& _A_functor) : functor_(_A_functor) +{ + } + T_functor functor_; + bound_argument bound_; +}; +template <class T_functor> struct adapts : public adaptor_base { + explicit adapts(const T_functor& _A_functor) : functor_(_A_functor) { + } + adaptor_functor<T_functor> functor_; +}; +int main() { + adapts<adapts<int> > a (adapts<int>(1)); +} + + diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr24351-2.C b/gcc/testsuite/g++.dg/tree-ssa/pr24351-2.C new file mode 100644 index 000000000..cfc0e4a4c --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr24351-2.C @@ -0,0 +1,25 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +struct adaptor_base {}; +struct bound_argument { + bound_argument(); +}; +struct adaptor_functorint : public adaptor_base {}; +struct adaptsint : public adaptor_base { + adaptsint(const int& _A_functor); + adaptor_functorint functor_; +}; +struct adaptor_functor_adaptsint { + adaptor_functor_adaptsint(const adaptsint& _A_functor) : functor_(_A_functor) + {} + adaptsint functor_; + bound_argument bound_; +}; +struct adapts_adaptsint { + adapts_adaptsint(const adaptsint& _A_functor) : functor_(_A_functor) + {} + adaptor_functor_adaptsint functor_; +}; +int main() { + adapts_adaptsint a (adaptsint(1)); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr24351-3.C b/gcc/testsuite/g++.dg/tree-ssa/pr24351-3.C new file mode 100644 index 000000000..09a3f9462 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr24351-3.C @@ -0,0 +1,101 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +namespace sigc { + template <class T_type> struct type_trait { + typedef T_type& pass; + typedef const T_type& take; + typedef T_type* pointer; + }; + template <class T_type> struct type_trait<T_type&> { + typedef T_type& pass; + }; + template<> struct type_trait<void> { + typedef void pass; + }; + template <class T_base, class T_derived> struct is_base_and_derived { + struct big { + char memory[64]; + }; + static big is_base_class_(...); + static char is_base_class_(typename type_trait<T_base>::pointer); + static const bool value = sizeof(is_base_class_(reinterpret_cast<typename type_trait<T_derived>::pointer>(0))) == sizeof(char); + }; + struct nil; + struct functor_base { + }; + template <class T_functor, bool I_derives_functor_base=is_base_and_derived<functor_base,T_functor>::value> struct functor_trait { + typedef typename T_functor::result_type result_type; + typedef T_functor functor_type; + }; + struct adaptor_base : public functor_base { + }; + template <class T_functor, class T_arg1=void,class T_arg2=void,class T_arg3=void,class T_arg4=void,class T_arg5=void,class T_arg6=void,class T_arg7=void, bool I_derives_adaptor_base=is_base_and_derived<adaptor_base,T_functor>::value> struct deduce_result_type { + typedef typename functor_trait<T_functor>::result_type type; + }; + template <class T_functor> struct adaptor_functor + : public adaptor_base { + template <class T_arg1=void,class T_arg2=void,class T_arg3=void,class T_arg4=void,class T_arg5=void,class T_arg6=void,class T_arg7=void> struct deduce_result_type { + typedef typename sigc::deduce_result_type<T_functor, T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::type type; + }; + typedef typename functor_trait<T_functor>::result_type result_type; + template <class T_arg1,class T_arg2> typename deduce_result_type<T_arg1,T_arg2>::type operator()(T_arg1 _A_arg1,T_arg2 _A_arg2) const { + return functor_(_A_arg1,_A_arg2); + } + explicit adaptor_functor(const T_functor& _A_functor) : functor_(_A_functor) { + } + mutable T_functor functor_; + }; + template <class T_functor, bool I_isadaptor = is_base_and_derived<adaptor_base, T_functor>::value> struct adaptor_trait; + template <class T_functor> struct adaptor_trait<T_functor, true> { + typedef T_functor adaptor_type; + }; + template <class T_functor> struct adaptor_trait<T_functor, false> { + typedef typename functor_trait<T_functor>::functor_type functor_type; + typedef adaptor_functor<functor_type> adaptor_type; + }; + template <class T_functor> struct adapts + : public adaptor_base { + typedef typename adaptor_trait<T_functor>::adaptor_type adaptor_type; + explicit adapts(const T_functor& _A_functor) : functor_(_A_functor) { + } + mutable adaptor_type functor_; + }; + template <class T_type> struct unwrap_reference { + typedef T_type type; + }; + template <class T_type> class bound_argument { + public: + bound_argument(const T_type& _A_argument) : visited_(_A_argument) { + } + inline T_type& invoke() { + } + T_type visited_; + }; + template <int I_location, class T_functor, class T_type1=nil,class T_type2=nil,class T_type3=nil,class T_type4=nil,class T_type5=nil,class T_type6=nil,class T_type7=nil> struct bind_functor; + template <class T_functor, class T_bound> struct bind_functor<0, T_functor, T_bound, nil,nil,nil,nil,nil,nil> : public adapts<T_functor> { + typedef typename adapts<T_functor>::adaptor_type adaptor_type; + template <class T_arg1=void,class T_arg2=void,class T_arg3=void,class T_arg4=void,class T_arg5=void,class T_arg6=void,class T_arg7=void> struct deduce_result_type { + typedef typename adaptor_type::template deduce_result_type<typename type_trait<typename unwrap_reference<T_bound>::type>::pass, typename type_trait<T_arg1>::pass, typename type_trait<T_arg2>::pass, typename type_trait<T_arg3>::pass, typename type_trait<T_arg4>::pass, typename type_trait<T_arg5>::pass, typename type_trait<T_arg6>::pass>::type type; + }; + typedef typename adaptor_type::result_type result_type; + result_type operator()() { + return this->functor_.template operator()<typename type_trait<typename unwrap_reference<T_bound>::type>::pass> (bound_.invoke()); + } + template <class T_arg1> typename deduce_result_type<T_arg1>::type operator()(T_arg1 _A_arg1) { + return this->functor_.template operator()<typename type_trait<typename unwrap_reference<T_bound>::type>::pass, typename type_trait<T_arg1>::pass> (bound_.invoke(), _A_arg1); + } + bind_functor(typename type_trait<T_functor>::take _A_func, typename type_trait<T_bound>::take _A_bound) : adapts<T_functor>(_A_func), bound_(_A_bound) { + } + bound_argument<T_bound> bound_; + }; + template <int I_location, class T_bound1, class T_functor> inline bind_functor<I_location, T_functor, T_bound1> bind(const T_functor& _A_func, T_bound1 _A_b1) { + return bind_functor<I_location, T_functor, T_bound1>(_A_func, _A_b1); + }; +} +struct foo { + typedef int result_type; + int operator()(int i, int j); +}; +int main() { + sigc::bind<0>(sigc::bind<0>(foo(),7),8)(); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr24439.C b/gcc/testsuite/g++.dg/tree-ssa/pr24439.C new file mode 100644 index 000000000..74576b5f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr24439.C @@ -0,0 +1,10 @@ +/* { dg-do compile } */ + +/* We used to ICE in invert_truthvalue on the void type + 2nd argument of the COND_EXPR. */ + +void foo(void) +{ + int value=1; + !(value?true:throw); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr25771.C b/gcc/testsuite/g++.dg/tree-ssa/pr25771.C new file mode 100644 index 000000000..6823494ea --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr25771.C @@ -0,0 +1,33 @@ +/* { dg-do compile } */ +int ggggg(); +struct string { + static int _S_empty_rep_storage[]; + void _M_destroy(); + char* _M_rep; + ~string() + { + if (_M_rep != (char*)&_S_empty_rep_storage ) + if (ggggg() <= 0) + _M_destroy(); + } +}; +extern void SDL_FreeSurface(int surface); +struct scoped_resource { + ~scoped_resource() { + SDL_FreeSurface(1); + } +}; +struct surface { + scoped_resource surface_; +}; +struct button { + string help_text_; + string label_; + surface image_; +}; +struct scrollbar { + string help_text_; + button uparrow_; +}; +scrollbar a; + diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr26140.C b/gcc/testsuite/g++.dg/tree-ssa/pr26140.C new file mode 100644 index 000000000..3e3743fbd --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr26140.C @@ -0,0 +1,15 @@ +/* { dg-do compile } */ + +struct Pitch +{ + int notename_; +}; +struct Audio_note +{ + Audio_note (Pitch p); +}; +void create_audio_elements () +{ + Pitch *pit; + new Audio_note (*pit); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr26406.C b/gcc/testsuite/g++.dg/tree-ssa/pr26406.C new file mode 100644 index 000000000..c2d160508 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr26406.C @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +int *f(int *b) +{ + int * a = new int[104]; + *a = 1; + if (a == 0) + return b; + return a; +} + +/* { dg-final { scan-tree-dump-not "if" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr26443.C b/gcc/testsuite/g++.dg/tree-ssa/pr26443.C new file mode 100644 index 000000000..1db87ab87 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr26443.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +struct A +{ + double x[4]; +}; + +struct B +{ + A y[2]; +}; + +A foo(B *p) +{ + for ( int i=0; i<4; ++i ) + p->y[1].x[i]=0; + + A a; + return a; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr26757.C b/gcc/testsuite/g++.dg/tree-ssa/pr26757.C new file mode 100644 index 000000000..4d124e3c4 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr26757.C @@ -0,0 +1,44 @@ +// PR c++/26757 +// { dg-do run } +// { dg-options "-O" } + +extern "C" void abort (); + +typedef struct A +{ + int c; + int d; +} A; + +A *b; + +void +foo () +{ + b->c++; + extern A *b; + b->d++; + +} + +void +bar () +{ + if (b->d) + b->c++; +} + + +int +main () +{ + A a = { 0, 0 }; + b = &a; + foo (); + bar (); + if (b->c != 2) + abort (); + if (b->d != 1) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr27090.C b/gcc/testsuite/g++.dg/tree-ssa/pr27090.C new file mode 100644 index 000000000..0fb46f35d --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr27090.C @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +template <class T> +struct Bar +{ + int get() { return static_cast<T*>(this)->get2(); } +}; +struct Foo : public Bar<Foo> +{ + int get2() { return x; } + int x; +}; + +int foo(Foo& f) +{ + return f.get(); +} + +/* { dg-final { scan-tree-dump "f_..D.->x;" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr27283.C b/gcc/testsuite/g++.dg/tree-ssa/pr27283.C new file mode 100644 index 000000000..224ea6a9b --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr27283.C @@ -0,0 +1,57 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +namespace Gambit +{ + template < class T > class Array + { + protected:int mindex, maxdex; + T *data; + int InsertAt (const T & t, int n) + { + T *new_data = new T[++this->maxdex - this->mindex + 1] - this->mindex; + int i; + for (i = this->mindex; i <= n - 1; i++) + new_data[i] = this->data[i]; + } + public: Array (unsigned int len = 0):mindex (1), maxdex (len), + data ((len) ? new T[len] - + 1 : 0) + { + } + virtual ~ Array () + { + if (maxdex >= mindex) + delete[](data + mindex); + } + const T & operator[] (int index) const + { + } + int Append (const T & t) + { + return InsertAt (t, this->maxdex + 1); + } + }; +} +class gIndexOdometer +{ +private:Gambit::Array < int >MinIndices; + Gambit::Array < int >CurIndices; + gIndexOdometer (const Gambit::Array < int >, const Gambit::Array < int >); + void SetIndex (const int &, const int &); + int NoIndices () const; + gIndexOdometer AfterExcisionOf (int &) const; +}; +gIndexOdometer +gIndexOdometer::AfterExcisionOf (int &to_be_zapped) const +{ + Gambit::Array < int >NewMins, NewMaxs; + int i; + for (i = 1; i <= NoIndices (); i++) + { + NewMins.Append (MinIndices[i]); + } + gIndexOdometer NewOdo (NewMins, NewMaxs); + NewOdo.SetIndex (i, CurIndices[i]); +} + diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr27291.C b/gcc/testsuite/g++.dg/tree-ssa/pr27291.C new file mode 100644 index 000000000..b8b5e136a --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr27291.C @@ -0,0 +1,363 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +namespace std +{ + template < class _T1, class _T2 > struct pair + { + }; +} +extern "C" +{ + extern "C" + { + typedef int int32_t __attribute__ ((__mode__ (__SI__))); + struct _pthread_fastlock + { + } + pthread_mutexattr_t; + } +} +namespace std +{ + struct __numeric_limits_base + { + }; + template < typename _Tp > + struct numeric_limits:public __numeric_limits_base + { + static const bool is_integer = true; + }; +}; +typedef unsigned int uint32_t; +namespace std +{ + template < typename _Alloc > class allocator; + template < class _CharT > struct char_traits; + template < typename _CharT, typename _Traits = + char_traits < _CharT >, typename _Alloc = + allocator < _CharT > >class basic_string; + typedef basic_string < char >string; +} +namespace __gnu_cxx +{ + template < typename _Tp > class new_allocator + { + }; +} +namespace std +{ + template < typename _Tp > class allocator:public __gnu_cxx::new_allocator < + _Tp > + { + }; + template < typename _CharT, typename _Traits, + typename _Alloc > class basic_string + { + public:inline basic_string (); + basic_string (const _CharT * __s, const _Alloc & __a = _Alloc ()); + }; +} +namespace boost +{ + template < class T > class integer_traits:public std::numeric_limits < T > + { + }; + namespace detail + { + template < class T, T min_val, T max_val > class integer_traits_base + { + }; + } + template <> class integer_traits < int >:public std::numeric_limits < int >, + public detail::integer_traits_base < int, (-2147483647 - 1), 2147483647 > + { + }; + namespace random + { + template < class IntType, IntType m > class const_mod + { + public:static IntType add (IntType x, IntType c) + { + } + static IntType mult (IntType a, IntType x) + { + return mult_schrage (a, x); + } + static IntType mult_add (IntType a, IntType x, IntType c) + { + return add (mult (a, x), c); + } + static IntType mult_schrage (IntType a, IntType value) + { + for (;;) + { + if (value > 0) + break; + value += m; + } + } + }; + template < class IntType, IntType a, IntType c, IntType m, + IntType val > class linear_congruential + { + public:typedef IntType result_type; + static const IntType modulus = m; + explicit linear_congruential (IntType x0 = 1):_modulus (modulus), + _x (_modulus ? (x0 % _modulus) : + x0) + { + } + IntType operator () () + { + _x = const_mod < IntType, m >::mult_add (a, _x, c); + } + private:IntType _modulus; + IntType _x; + }; + } + typedef random::linear_congruential < int32_t, 16807, 0, 2147483647, + 1043618065 > minstd_rand0; + namespace random + { + namespace detail + { + template < class T > struct ptr_helper + { + typedef T value_type; + typedef T & reference_type; + typedef const T & rvalue_type; + static reference_type ref (T & r) + { + } + }; + template < class T > struct ptr_helper <T & > + { + typedef T value_type; + typedef T & rvalue_type; + }; + } + } + template < class UniformRandomNumberGenerator, class RealType = + double >class uniform_01 + { + public:typedef UniformRandomNumberGenerator base_type; + typedef RealType result_type; + explicit uniform_01 (base_type rng):_rng (rng), + _factor (result_type (1) / + (result_type ((_rng.max) () - (_rng.min) ()) + + result_type (std::numeric_limits < + base_result >::is_integer ? 1 : 0))) + { + } + result_type operator () () + { + return result_type (_rng () - (_rng.min) ()) * _factor; + } + private:typedef typename base_type::result_type base_result; + base_type _rng; + result_type _factor; + }; + namespace random + { + namespace detail + { + template < class UniformRandomNumberGenerator > + class pass_through_engine + { + private:typedef ptr_helper < UniformRandomNumberGenerator > + helper_type; + public:typedef typename helper_type::value_type base_type; + typedef typename base_type::result_type result_type; + explicit pass_through_engine (UniformRandomNumberGenerator + rng):_rng (static_cast < + typename helper_type:: + rvalue_type > (rng)) + { + } + result_type min () const + { + } + result_type max () const + { + } + base_type & base () + { + } + result_type operator () () + { + return base ()(); + } + private:UniformRandomNumberGenerator _rng; + }; + } + template < class RealType, int w, unsigned int p, + unsigned int q > class lagged_fibonacci_01 + { + public:typedef RealType result_type; + static const unsigned int long_lag = p; + lagged_fibonacci_01 () + { + seed (); + } + public:void seed (uint32_t value = 331u) + { + minstd_rand0 intgen (value); + seed (intgen); + } + template < class Generator > void seed (Generator & gen) + { + typedef detail::pass_through_engine < Generator & >ref_gen; + uniform_01 < ref_gen, RealType > gen01 = + uniform_01 < ref_gen, RealType > (ref_gen (gen)); + for (unsigned int j = 0; j < long_lag; ++j) + x[j] = gen01 (); + } + RealType x[long_lag]; + }; + } + typedef random::lagged_fibonacci_01 < double, 48, 607, + 273 > lagged_fibonacci607; + namespace random + { + namespace detail + { + template < bool have_int, bool want_int > struct engine_helper; + template <> struct engine_helper <true, true > + { + template < class Engine, class DistInputType > struct impl + { + typedef pass_through_engine < Engine > type; + }; + }; + } + } + template < class Engine, class Distribution > class variate_generator + { + private:typedef random::detail::pass_through_engine < Engine > + decorated_engine; + public:typedef typename decorated_engine::base_type engine_value_type; + typedef Distribution distribution_type; + variate_generator (Engine e, Distribution d):_eng (decorated_engine (e)), + _dist (d) + { + } + private:enum + { + have_int = + std::numeric_limits < + typename decorated_engine::result_type >::is_integer, want_int = + std::numeric_limits < typename Distribution::input_type >::is_integer + }; + typedef typename random::detail::engine_helper < have_int, + want_int >::template impl < decorated_engine, + typename Distribution::input_type >::type internal_engine_type; + internal_engine_type _eng; + distribution_type _dist; + }; + template < class RealType = double >class uniform_real + { + public:typedef RealType input_type; + }; +} +namespace alps +{ + class BufferedRandomNumberGeneratorBase + { + }; + template < class RNG > + class BufferedRandomNumberGenerator:public + BufferedRandomNumberGeneratorBase + { + public: BufferedRandomNumberGenerator ():rng_ (), gen_ (rng_, + boost:: + uniform_real <> ()) + { + } + protected: RNG rng_; + boost::variate_generator < RNG &, boost::uniform_real <> >gen_; + }; +} +namespace boost +{ + namespace detail + { + class sp_counted_base + { + }; + class shared_count + { + private:sp_counted_base * pi_; + public:shared_count ():pi_ (0) + { + } + template < class Y > explicit shared_count (Y * p):pi_ (0) + { + } + }; + } + template < class T > class shared_ptr + { + public:typedef T element_type; + template < class Y > explicit shared_ptr (Y * p):px (p), pn (p) + { + } + T *px; + detail::shared_count pn; + }; +} +namespace std +{ + template < typename _Key, typename _Tp, typename _Compare = + std::allocator < std::pair < const _Key, _Tp > > > class map + { + public:typedef _Key key_type; + typedef _Tp mapped_type; + mapped_type & operator[] (const key_type & __k) + { + } + }; +} +namespace alps +{ + namespace detail + { + template < class BASE > class abstract_creator + { + public:typedef BASE base_type; + virtual base_type *create () const = 0; + }; + template < class BASE, + class T > class creator:public abstract_creator < BASE > + { + public:typedef BASE base_type; + base_type *create () const + { + return new T (); + } + }; + } + template < class KEY, class BASE > class factory + { + public:typedef BASE base_type; + typedef KEY key_type; + typedef boost::shared_ptr < detail::abstract_creator < base_type > + >pointer_type; + template < class T > bool register_type (key_type k) + { + creators_[k] = pointer_type (new detail::creator < BASE, T > ()); + } + private:typedef std::map < key_type, pointer_type > map_type; + map_type creators_; + }; + class RNGFactory:public factory < std::string, + BufferedRandomNumberGeneratorBase > + { + public:RNGFactory (); + }; +} +alps::RNGFactory::RNGFactory () +{ + register_type < BufferedRandomNumberGenerator < boost::lagged_fibonacci607 > + >("lagged_fibonacci607"); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr27548.C b/gcc/testsuite/g++.dg/tree-ssa/pr27548.C new file mode 100644 index 000000000..d23b959a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr27548.C @@ -0,0 +1,60 @@ +// PR tree-optimization/27548 +// { dg-do compile } +// { dg-options "-O1" } + +namespace Gambit +{ + template < class T > class Array + { + protected:int mindex, maxdex; + T *data; + int InsertAt (const T & t, int n) + { + T *new_data = new T[++this->maxdex - this->mindex + 1] - this->mindex; + int i; + for (i = this->mindex; i <= n - 1; i++) + new_data[i] = this->data[i]; + new_data[i++] = t; + } + public: Array (unsigned int len = 0):mindex (1), maxdex (len), + data ((len) ? new T[len] - + 1 : 0) + { + } + virtual ~ Array () + { + if (maxdex >= mindex) + delete[](data + mindex); + } + const T & operator[] (int index) const + { + } + int Append (const T & t) + { + return InsertAt (t, this->maxdex + 1); + } + }; +} + +class gIndexOdometer +{ +private:Gambit::Array < int >MinIndices; + Gambit::Array < int >CurIndices; + gIndexOdometer (const Gambit::Array < int >, const Gambit::Array < int >); + void SetIndex (const int &, const int &); + int NoIndices () const; + gIndexOdometer AfterExcisionOf (int &) const; +}; +gIndexOdometer +gIndexOdometer::AfterExcisionOf (int &to_be_zapped) const +{ + Gambit::Array < int >NewMins, NewMaxs; + int i; + for (i = 1; i <= NoIndices (); i++) + { + NewMins.Append (MinIndices[i]); + } + gIndexOdometer NewOdo (NewMins, NewMaxs); + for (i = 1; i < to_be_zapped; i++) + NewOdo.SetIndex (i, CurIndices[i]); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr27549.C b/gcc/testsuite/g++.dg/tree-ssa/pr27549.C new file mode 100644 index 000000000..cd5944d24 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr27549.C @@ -0,0 +1,79 @@ +// PR tree-optimization/27549 +// { dg-do compile } +// { dg-options "-O2" } + +typedef __SIZE_TYPE__ size_t; + +struct E +{ + virtual ~E () {} + virtual size_t e () const = 0; + virtual void f (char *x) const = 0; +}; + +struct F : public E +{ + F () {} + virtual ~F () {} + virtual size_t e () const { return 0; } + virtual void f (char *x) const { *x = '\0'; } +}; + +struct S +{ + S () { a = new char[32]; b = 32; c = 0; a[0] = 0; } + void s (const char *x, size_t y) { v (c + y + 1); __builtin_memcpy(a + c, x, y); c += y; a[c] = '\0'; } + void s (const E *x) { size_t l = x->e(); v (c + l + 1); x->f (a + c); c += l; } + const char *t () { return a; } + void v (size_t n) + { + if (b >= n) return; + + size_t b2 = b; + char *a2 = a; + + for (;;) + { + b *= 2; + if (b >= n) + break; + } + + a = new char[b]; + + if (b2) + { + __builtin_memcpy(a, a2, c); + a2[0] = 0; + for (size_t i = 1; i < b2; i++) + a2[i] = a2[i - 1]; + delete[] a2; + } + } + + ~S () + { + if (b) + { + a[0] = 0; + for (size_t i = 1; i < b; i++) + a[i] = a[i - 1]; + } + delete[] a; + } + char * a; + size_t b, c; +}; + +const char *p; +size_t q; +const F u; + +const char * +foo () +{ + S s; + s.s (p, q); + s.s (&u); + return s.t (); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr27830.C b/gcc/testsuite/g++.dg/tree-ssa/pr27830.C new file mode 100644 index 000000000..01c7fc187 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr27830.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O" } */ + +struct gc{}; +struct transform:public gc +{ + double x, y, z, t; + transform (void){} +}; +inline transform f (void) +{ + return transform (); +}; +void transformed (void) +{ + new transform (f()); +} + diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr27894.C b/gcc/testsuite/g++.dg/tree-ssa/pr27894.C new file mode 100644 index 000000000..ac97a35f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr27894.C @@ -0,0 +1,82 @@ +// PR c++/27894 +// { dg-do compile } +// { dg-options "-O" } + +class A; +struct B +{ + B (unsigned long); + int b2 () const; + A *b1 () const; +}; + +enum { P = 0 }; +enum O { Q = 75, }; +class C; +struct D { A *d; }; +struct E +{ + B e1 (int) const; + A *e2 (const B &) const; + D e3[4096]; +}; + +inline A * +E::e2 (const B & x) const +{ + const D *w = &e3[x.b2 ()]; + return (A *) w->d; +} + +extern E *e; + +inline A * +B::b1 () const +{ + extern E *e; + return e->e2 (*this); +} + +template <class T> struct F : public B +{ + F (const B &); + T *b1 () const; +}; + +template < class T > inline T * F <T>::b1 () const +{ + return (T *) B::b1 (); +}; + +typedef F <C> N; + +class G {}; +class H : public G {}; +class I : public H {}; +class J {}; +class K {}; +struct L +{ + void l (J *, C *, int, const char *, O); +}; +class M : public K, public I +{ + void m (J &, int, const char *); + void m (J &, int, int, const char *, float); +}; + +void +M::m (J &x, int y, const char *z) +{ + L *w = new L; + N v = e->e1 (y); + w->l (&x, v.b1 (), P, z, Q); +} + +void +M::m (J &x, int y, int s, const char *z, float t) +{ + L *w = new L; + N v = e->e1 (y); + w->l (&x, v.b1 (), s, z, (O) (int) ((t) ? (50 + 20 / (float) t) : 0)); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr28003.C b/gcc/testsuite/g++.dg/tree-ssa/pr28003.C new file mode 100644 index 000000000..ff260bcf4 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr28003.C @@ -0,0 +1,31 @@ +// PR tree-optimization/28003 +// Alias grouping needs to be computed after call clobbering, because it +// changes around the tags and variables in a way that makes our +// call clobbering computation incorrect. +// { dg-do run } +// { dg-options "-O2" } +extern "C" void abort(void); +struct A +{ + int i, j[9]; + A() : i(1) { j[0]=j[1]=j[2]=j[3]=j[4]=j[5]=j[6]=j[7]=j[8]=0; } +}; + +struct B +{ + A a; +}; + +B b[] = +{ + {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, + {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, + {}, {}, {}, {}, {} +}; + +int main() +{ + if (1 - b[sizeof(b)/sizeof(B) - 1].a.i != 0) + abort(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr28238.C b/gcc/testsuite/g++.dg/tree-ssa/pr28238.C new file mode 100644 index 000000000..97e388fbd --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr28238.C @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-O" } */ + +struct iterator{}; +struct ByteIterator : iterator +{ + ByteIterator (){} + int a[1024]; +}; +inline ByteIterator f () +{ + return ByteIterator (); +} +class ConfLexerCore +{ + ConfLexerCore (); + ByteIterator m_matchStart; +}; +ConfLexerCore::ConfLexerCore () +: m_matchStart (f ()) +{ } + diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr29902.C b/gcc/testsuite/g++.dg/tree-ssa/pr29902.C new file mode 100644 index 000000000..838a41169 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr29902.C @@ -0,0 +1,19 @@ +/* { dg-do compile { target i?86-*-* } } */ +/* { dg-options "-O1 -fprefetch-loop-arrays -march=athlon" } */ +/* { dg-require-effective-target ilp32 } */ + +int length1(); +int g(int); +void f(int capacity_, char *old_storage) +{ + try { + length1(); + int old_capacity = capacity_; + capacity_ *= 2; + g(capacity_); + for (int i = 1; i < old_capacity; i++) + old_storage[i] = old_storage[i - 1]; + } catch (...) { + for (int i = 1; i < capacity_; i++){old_storage[i] = 0;} + } +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr30738.C b/gcc/testsuite/g++.dg/tree-ssa/pr30738.C new file mode 100644 index 000000000..b9d735e81 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr30738.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-phiopt1" } */ + +template <class T> +static inline const T& +min_ref (const T &x, const T &y) +{ + return x < y ? x : y; +} + +int test_min_ref (int x, int y) +{ + return min_ref (x, y); +} + +/* { dg-final { scan-tree-dump "MIN_EXPR" "phiopt1" } } */ +/* { dg-final { cleanup-tree-dump "phiopt1" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr31146-2.C b/gcc/testsuite/g++.dg/tree-ssa/pr31146-2.C new file mode 100644 index 000000000..d2edb1953 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr31146-2.C @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-forwprop1" } */ + +#include <new> + +template <class T> +struct Vec +{ + Vec() + { + for (int i=0; i<3; ++i) + new (&a[i]) T(0); + } + T a[3]; +}; + +double foo (void) +{ + Vec<double> v; + return v.a[2]; +} + +/* { dg-final { scan-tree-dump "Replaced .* != 0B. with .1" "forwprop1" } } */ +/* { dg-final { cleanup-tree-dump "forwprop1" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr31146.C b/gcc/testsuite/g++.dg/tree-ssa/pr31146.C new file mode 100644 index 000000000..478a488e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr31146.C @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-forwprop" } */ + +/* We should be able to optimize this to i[j] = 1 during + early optimizations. */ + +int i[5]; +void foo (int j) +{ + void *p = &i[j]; + int *q = (int *)p; + *q = 1; +} + +/* { dg-final { scan-tree-dump "MEM\\\[.*&i\\\]\\\[j.*\\\] =.* 1;" "forwprop1" } } */ +/* { dg-final { cleanup-tree-dump "forwprop?" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr31307.C b/gcc/testsuite/g++.dg/tree-ssa/pr31307.C new file mode 100644 index 000000000..bdfe5bd5a --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr31307.C @@ -0,0 +1,40 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +union MY_M128 +{ + double i; +}; + +struct RegFile +{ + MY_M128 dst[4]; +}; + +__inline__ __attribute__((always_inline)) static void +MEM_OPT_LOAD(MY_M128* reg, double* mem) +{ + reg[0].i = *mem; +} + +void _ia32_movntdq (double *, double); + +__inline__ __attribute__((always_inline)) static void +MEM_OPT_STORE(MY_M128* reg, double* mem) +{ + _ia32_movntdq ((double*)mem, (double)reg[0].i); +} + +double _mm_adds_epu8 (double __A, double __B); + +int test(unsigned char *d) +{ + RegFile r; + MEM_OPT_LOAD((r.dst) , ((double*) d)); + r.dst[0].i = _mm_adds_epu8(r.dst[0].i, r.dst[0].i); + MEM_OPT_STORE((r.dst), (double*) d); + return 0; +} + +/* { dg-final { scan-tree-dump-not "r.dst" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr33593.C b/gcc/testsuite/g++.dg/tree-ssa/pr33593.C new file mode 100644 index 000000000..f5497407f --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr33593.C @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fnon-call-exceptions -fdump-tree-optimized" } */ + +#include <stdio.h> + +void foo (int) { printf ("Bar\n"); } + +int +main (void) +{ + int a = 1 / 0; // { dg-warning "division by zero" } + printf ("Foo\n"); + foo (a); +} + +// The expression 1 / 0 should not be propagated into the call to foo() if it +// may trap. +// { dg-final { scan-tree-dump-times "foo \\(1 \\/ 0\\)" 0 "optimized" } } +// { dg-final { cleanup-tree-dump "optimized" } } diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr33604.C b/gcc/testsuite/g++.dg/tree-ssa/pr33604.C new file mode 100644 index 000000000..7e820d3ef --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr33604.C @@ -0,0 +1,48 @@ +/* { dg-do run } */ +/* { dg-options "-O -fdump-tree-optimized-vops" } */ + +struct Value +{ + double value; + Value(double value_) : value (value_) {} + operator double() const { return value; } + Value& operator=(double other) { value = other; } +}; + +struct Ref +{ + const Value& m; + Ref(const Value& m_) : m(m_) {} + operator double() const { return m; } +}; + +struct Diff +{ + const Ref lhs, rhs; + Diff(const Value& lhs_, const Value& rhs_) : lhs(lhs_), rhs(rhs_) {} + operator double() const { return lhs - rhs; } +}; + +extern "C" void abort (void); +int main(int argc, char *argv[]) +{ + Value I(1), m(4); + for(int a = 0; a < 1000; a++) + m = Diff (I, m); + + if (!(m / 4 == I)) + abort (); + return 0; +} + +/* Check that we propagate + D.2182_13 = (struct Ref *) &D.2137.lhs; + to + D.2182_13->lhs.m ={v} &I; + yielding + D.2137.lhs.m ={v} &I; + so that SRA can promote all locals to registers and we end up + referencing a single virtual operand at abort () after optimization. */ + +/* { dg-final { scan-tree-dump-times ".MEM_\[0-9\]*\\\(D\\\)" 1 "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr33615-2.C b/gcc/testsuite/g++.dg/tree-ssa/pr33615-2.C new file mode 100644 index 000000000..542731a60 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr33615-2.C @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fnon-call-exceptions -fdump-tree-pre-details -w" } */ + +extern volatile int y; + +double +foo (double a, int x) +{ + while (x--) + { + y++; + a += 1.0 / 0.0; + } + return a; +} + +// The expression 1.0 / 0.0 should not be treated as a loop invariant +// if it may throw an exception. +// { dg-final { scan-tree-dump-times "Replaced 1\\\.0e\\\+0 / 0\\\.0" 0 "pre" } } +// { dg-final { cleanup-tree-dump "pre" } } diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr33615.C b/gcc/testsuite/g++.dg/tree-ssa/pr33615.C new file mode 100644 index 000000000..4b0754282 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr33615.C @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fnon-call-exceptions -fdump-tree-lim-details -w" } */ + +extern volatile int y; + +double +foo (double a, int x) +{ + while (x--) + { + y++; + a += 1.0 / 0.0; + } + return a; +} + +// The expression 1.0 / 0.0 should not be treated as a loop invariant +// if it may throw an exception. +// { dg-final { scan-tree-dump-times "invariant up to" 0 "lim1" } } +// { dg-final { cleanup-tree-dump "lim\[1-2\]" } } diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr34063.C b/gcc/testsuite/g++.dg/tree-ssa/pr34063.C new file mode 100644 index 000000000..994920bb9 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr34063.C @@ -0,0 +1,25 @@ +// { PR tree-optimization/34063 } +// { dg-do compile } +// { dg-options "-O2" } + +struct S +{ + double e[9]; + + double const & + operator() (int r, int c) const + { + return e[r * 3 + c]; + } +}; + +void +foo() +{ + S r; + double *p; + for (int j = 0; j < 3; j++) + for (int k = 0; k < 3; k++) + for (int l = k + 1; l < 3; l++) + *p++ = r (k, 0) * r (l, j) + r (k, j) * r (l, 0); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr34355.C b/gcc/testsuite/g++.dg/tree-ssa/pr34355.C new file mode 100644 index 000000000..978ed75df --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr34355.C @@ -0,0 +1,27 @@ +// { dg-do compile } +// { dg-require-effective-target pthread } +// { dg-options "-O3 -ftree-parallelize-loops=4" } + +typedef double EXPRESS[5]; + +extern int Terms; + +void Parse_Rel_Factor (EXPRESS Express, int *Terms) +{ + EXPRESS Local_Express = {5.0, 4.0, 3.0, 2.0, 1.0}; + int Local_Terms = 5; + + int i; + + for (i = (*Terms); i < Local_Terms; i++) + Express[i] = 0.0; + + Express[i] += Local_Express[i]; +} + +double Parse_Float () +{ + EXPRESS Express = {1.0, 2.0, 3.0, 4.0, 5.0}; + + Parse_Rel_Factor (Express, &Terms); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr35144.C b/gcc/testsuite/g++.dg/tree-ssa/pr35144.C new file mode 100644 index 000000000..f0bb7bb63 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr35144.C @@ -0,0 +1,30 @@ +// PR c++/35144 +// { dg-do compile } +// { dg-options "-O2" } + +struct A +{ + int baz (); +}; + +typedef int (A::*P) (); + +struct B +{ + B (); + int foo (P x, int y = 0); +}; + +struct C +{ + typedef int (B::*Q) (P, int); + void bar (Q x) { c = x; } + Q c; +}; + +extern C c; + +B::B () +{ + c.bar ((C::Q) &B::foo); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr36766.C b/gcc/testsuite/g++.dg/tree-ssa/pr36766.C new file mode 100644 index 000000000..37e0d517e --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr36766.C @@ -0,0 +1,31 @@ +// PR tree-optimization/36766 +// { dg-do compile } +// { dg-options "-O -fnon-call-exceptions" } + +struct A +{ + ~A () + { + int *a = this->b; + } + int *b; +}; + +struct B : A +{ + B () + { + int *a = this->b; + } + ~B () + { + int *a = this->b; + } +}; + +void +foo () +{ + B *c = new B; + delete c; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr37084.C b/gcc/testsuite/g++.dg/tree-ssa/pr37084.C new file mode 100644 index 000000000..8fceb0cbb --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr37084.C @@ -0,0 +1,16 @@ +// PR tree-optimization/37084 +// { dg-do compile } +// { dg-options "-O" } + +struct A +{ + A (); +}; + +inline A +foo () +{ + return A (); +} + +const A a (foo ()); diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr37284.C b/gcc/testsuite/g++.dg/tree-ssa/pr37284.C new file mode 100644 index 000000000..26ddc1a05 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr37284.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-fstrict-aliasing" } */ + +void* operator new(__SIZE_TYPE__, void* __p) throw() +{ + return __p; +} + +class PatternDriverTop; + +typedef const PatternDriverTop* _Tp; + +void construct(_Tp* __p, const _Tp& __val) +{ + ::new((void *)__p) _Tp(__val); +} + diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr37337.C b/gcc/testsuite/g++.dg/tree-ssa/pr37337.C new file mode 100644 index 000000000..5b8521df8 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr37337.C @@ -0,0 +1,37 @@ +// PR middle-end/37337 +// { dg-do compile } +// { dg-options "-O2" } + +extern "C" +{ + typedef struct _IO_FILE FILE; + extern int __fprintf_chk (FILE *, int, const char *, ...); + extern inline __attribute__ ((always_inline, gnu_inline, artificial)) + int fprintf (FILE *s, const char *f, ...) + { + return __fprintf_chk (s, 1, f, __builtin_va_arg_pack ()); + } +} + +extern int a; +struct A +{ + virtual ~A (void) + { + } +}; + +struct B : public A +{ + B (); + FILE *b; +}; + +void f (int *); +B::B () +{ + f (&a); + for (int i = 0; i < 6; i++) + fprintf (b, "%02x", 0xff); + fprintf (b, "\n--\n"); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr37356.C b/gcc/testsuite/g++.dg/tree-ssa/pr37356.C new file mode 100644 index 000000000..45b99a037 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr37356.C @@ -0,0 +1,34 @@ +// PR middle-end/37356 */ +// { dg-do compile } +// { dg-options "-O" } + +bool foo (); +int bar (); + +bool +baz (int v) +{ + return v == bar (); +} + +struct A +{ + A () { baz (1) || foo (); } +}; + +struct B +{ + static A get () { return A (); } + B (const int &x) { } + B () : b (get ()) { } + A b; +}; + +B c; + +void +test () +{ + int d; + c = d; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr37393.C b/gcc/testsuite/g++.dg/tree-ssa/pr37393.C new file mode 100644 index 000000000..2f9281c96 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr37393.C @@ -0,0 +1,27 @@ +// PR middle-end/37393 +// { dg-do compile } +// { dg-options "-O2" } + +struct A +{ + ~A (); + bool foo () const; +}; + +extern "C" +{ + extern void bar (const char *, ...) __attribute__ ((noreturn)); + extern inline __attribute__ ((always_inline, gnu_inline, artificial)) void + baz (const char *fmt, ...) + { + bar (fmt, __builtin_va_arg_pack ()); + } +}; + +void +test () +{ + A a; + if (a.foo ()) + baz ("foo"); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr38104.C b/gcc/testsuite/g++.dg/tree-ssa/pr38104.C new file mode 100644 index 000000000..6523a5e17 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr38104.C @@ -0,0 +1,19 @@ +// PR tree-optimization/38104 +// { dg-do compile } +// { dg-options "-O3" } + +struct S { int foo; }; + +void f0 (); + +void +f1 (struct S s) +{ + f0 (); +} + +void +f2 () +{ + f1 (*(struct S *) (0)); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr38572.C b/gcc/testsuite/g++.dg/tree-ssa/pr38572.C new file mode 100644 index 000000000..89d228f02 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr38572.C @@ -0,0 +1,32 @@ +// PR tree-optimization/38572 +// { dg-do compile } +// { dg-options "-O2" } + +// Crash caused by the out-of-bounds enum values (all the remaining cruft +// is needed only to trigger the appropriate code path in tree-vrp.c). +enum JSOp +{ + JSOP_GETELEM = 5, + JSOP_LIMIT +}; +extern void g (); +void f (char *pc, char *endpc, int format, char ***fp, enum JSOp op) +{ + while (pc <= endpc) + { + if ((fp && *fp && pc == **fp) || pc == endpc) + { + if (format == 1) + op = (JSOp) 256; + else if (format == 2) + op = (JSOp) 257; + else + op = JSOP_GETELEM; + } + if (op >= JSOP_LIMIT) + { + if (format) + g (); + } + } +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr38632.C b/gcc/testsuite/g++.dg/tree-ssa/pr38632.C new file mode 100644 index 000000000..04fca2280 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr38632.C @@ -0,0 +1,22 @@ +// { dg-do compile } +// { dg-require-effective-target pthread } +// { dg-options "-O -ftree-parallelize-loops=2" } + +void foo(); + +void bar(int n, char *p) +{ + try + { + foo(); + ++n; + foo(); + for (int i = 0; i < n-1; ++i) + p[i] = 0; + } + catch (...) + { + for (int i = 0; i < n; ++i) + p[i] = 0; + } +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr41186.C b/gcc/testsuite/g++.dg/tree-ssa/pr41186.C new file mode 100644 index 000000000..91f21a8c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr41186.C @@ -0,0 +1,35 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-fre-details" } */ + +struct Foo { + Foo() {}; + int i; + short f; +}; +struct Bar : public Foo { + Bar() {}; + short b; +}; + +extern "C" void abort(void); + +int main() +{ + Bar b1, b2; + b2.i = 0; + b1.f = 0; + b1.b = 1; + b2.f = 1; + b2.b = 2; + static_cast<Foo&>(b1) = static_cast<Foo&>(b2); + if (b1.i != 0 || b1.b != 1) + abort (); + if (b1.f != 1) + abort (); + return 0; +} + +/* { dg-final { scan-tree-dump "Replaced b1.b with 1" "fre" } } */ +/* { dg-final { scan-tree-dump "Replaced b1.i with 0" "fre" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump "Replaced b1.f with 1" "fre" { xfail *-*-* } } } */ +/* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr41275.C b/gcc/testsuite/g++.dg/tree-ssa/pr41275.C new file mode 100644 index 000000000..d9b3dce8f --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr41275.C @@ -0,0 +1,16 @@ +// PR middle-end/41275 +// { dg-do compile } +// { dg-options "-O2" } +// this used to ICE +struct ErrmsgWindow +{ + virtual ~ErrmsgWindow() + { + extern int _switch_mode_errorstr; + _switch_mode_errorstr = 42; + } +}; +void ShowErrorMessage(void) +{ + ErrmsgWindow w; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr41428.C b/gcc/testsuite/g++.dg/tree-ssa/pr41428.C new file mode 100644 index 000000000..32716cad1 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr41428.C @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-ccp1-details" } */ + +extern "C" void abort (void); +inline void *operator new (__SIZE_TYPE__, void *__p) throw () { return __p; } + +int foo(void) +{ + float f = 0; + int *i = new (&f) int (1); + return *(int *)&f; +} + +/* { dg-final { scan-tree-dump "Folded into: if \\\(1 != 0\\\)" "ccp1" } } */ +/* { dg-final { cleanup-tree-dump "ccp1" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr41905.C b/gcc/testsuite/g++.dg/tree-ssa/pr41905.C new file mode 100644 index 000000000..4424ce8d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr41905.C @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +int foo() __attribute__((noreturn)); +int bar() { return foo(); } diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr41906.C b/gcc/testsuite/g++.dg/tree-ssa/pr41906.C new file mode 100644 index 000000000..321d33aea --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr41906.C @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-fpermissive -w" } */ +/* We aren't interested in the warning, but in the ICE. */ +void foo(); +extern void abort (void); + +void bar() +{ + try { foo(); } + catch (...) {} + catch (int) {abort ();} +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr41961.C b/gcc/testsuite/g++.dg/tree-ssa/pr41961.C new file mode 100644 index 000000000..229e7d4b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr41961.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// { dg-require-effective-target pthread } +// { dg-options "-O3 -ftree-parallelize-loops=2" } + +struct A +{ + char c[17]; + void foo(); +}; + +void A::foo() +{ + for (int i = 0; i < 17; ++i) + c[i] = 0; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr42337.C b/gcc/testsuite/g++.dg/tree-ssa/pr42337.C new file mode 100644 index 000000000..8abd4b2d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr42337.C @@ -0,0 +1,173 @@ +// PR tree-optimize/42337 +// { dg-do compile } +// { dg-options "-O2" } + +template<class _T1, class _T2> struct pair { + _T2 second; +}; +template<typename _Tp> +inline const _Tp& max(const _Tp& __a, const _Tp& __b) { } + +template<typename _ForwardIterator, typename _Tp, typename _Compare> _ForwardIterator +lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __val, _Compare __comp) { } +template<class _CharT> struct char_traits {}; + +template<typename _Iterator, typename _Container> class __normal_iterator { + public: typedef _Iterator iterator_type; + __normal_iterator& operator++() { + } +}; +template<typename _IteratorL, typename _IteratorR, typename _Container> +inline bool operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs, const __normal_iterator<_IteratorR, _Container>& __rhs) { } +template<typename _Tp> class new_allocator { + public: + typedef _Tp* pointer; + typedef const _Tp* const_pointer; +}; + +template<typename _Tp> +class allocator: public new_allocator<_Tp> { + public: + template<typename _Tp1> struct rebind { + typedef allocator<_Tp1> other; + }; +}; + +template<typename _Arg, typename _Result> struct unary_function { }; +template<typename _Arg1, typename _Arg2, typename _Result> struct binary_function { }; +template<typename _Tp> struct less : public binary_function<_Tp, _Tp, bool> { }; +template<typename _Pair> struct _Select1st : public unary_function<_Pair, typename _Pair::first_type> { }; +template<typename _Tp> struct _Rb_tree_iterator { + typedef _Tp* pointer; + pointer operator->() const { + } +}; +template<typename _Key, typename _Val, typename _KeyOfValue, typename _Compare, typename _Alloc = allocator<_Val> > +class _Rb_tree { + typedef _Val value_type; + public: typedef _Rb_tree_iterator<value_type> iterator; +}; +template <typename _Key, typename _Tp, typename _Compare = less<_Key>, typename _Alloc = allocator<pair<const _Key, _Tp> > > +class map { + public: typedef _Key key_type; + typedef pair<const _Key, _Tp> value_type; + typedef _Compare key_compare; + private: typedef typename _Alloc::template rebind<value_type>::other _Pair_alloc_type; + typedef _Rb_tree<key_type, value_type, _Select1st<value_type>, key_compare, _Pair_alloc_type> _Rep_type; + public: typedef typename _Pair_alloc_type::pointer pointer; + typedef typename _Rep_type::iterator iterator; + iterator find(const key_type& __x) { } +}; + +template<typename _Tp, typename _Alloc> struct _Vector_base { + typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type; +}; +template<typename _Tp, typename _Alloc = allocator<_Tp> > +class vector : protected _Vector_base<_Tp, _Alloc> { + typedef _Vector_base<_Tp, _Alloc> _Base; + typedef typename _Base::_Tp_alloc_type _Tp_alloc_type; + public: + typedef typename _Tp_alloc_type::pointer pointer; + typedef typename _Tp_alloc_type::const_pointer const_pointer; + typedef __normal_iterator<pointer, vector> iterator; + typedef __normal_iterator<const_pointer, vector> const_iterator; + iterator begin() { } + const_iterator begin() const { } + const_iterator end() const { } + unsigned long size() const { } +}; + +class SSC { + public: + SSC () {} + SSC (const int& cs); +}; +extern int flag; + +struct TP { + const int cl_; + const vector<int> &its_; + int max_s_; + }; + +double foo(TP *p); +map<int, int> cs_; + +template <typename T> class vector32 { + public: + typedef T& reference; + typedef T* iterator; + typedef const T* const_iterator; + iterator begin() { return data_; } + iterator end() { return data_ + size_; } + long unsigned int size() const { return size_; } + T* data_; + unsigned size_; +}; + +struct SF : public pair<unsigned long long, double> { }; + +template<typename KEY, typename VALUE> class SFVT { + private: typedef vector32<SF> Container; + typedef typename Container::const_iterator CI; + mutable Container v_; + mutable bool sorted_; + struct Cmp : public binary_function<SF, SF, bool> { + }; + __attribute__((always_inline)) VALUE IS(const SFVT &sfv) const { + if (sfv.v_.size() < v_.size()) { + return sfv.IS(*this); + } + else { + VALUE sum = 0.0; + CI beg = sfv.v_.begin(); + CI end = sfv.v_.end(); + for (CI i = v_.begin(); + i != v_.end(); + ++i) { beg = lower_bound(beg, end, *i, Cmp()); if (beg == end) { return sum; } } + } + } + public: explicit SFVT(const int capacity = 0) : sorted_(true) { } + long unsigned int size() const { } + __attribute__((always_inline)) VALUE DP(const SFVT &sfv) const { + return IS(sfv); + } +}; +class SFV : public SFVT<unsigned long long, double> { }; + +class Edge; +extern int flag2; + +double foo(TP *p) { + int nbests_requested = max(p->max_s_, flag); + map<int, int>::iterator it = cs_.find(p->cl_); + int* c = &it->second; + for (vector<int>::const_iterator iter = p->its_.begin(); + iter != p->its_.end(); + ++iter) { + } + vector<int*> fb; + vector<double> w; + int *hg = 0; + if (flag2 == 10) { + hg = &flag2; + } + int nr = 0; + for (vector<int*>::iterator iter = fb.begin(); + (iter != fb.end() && nr < nbests_requested); + ++iter) { + } + if (hg) { + SFV s_weights; + for (int i = 0; + i < w.size(); + ++i) { + } + SFV uw; + for (int i = 0, j = 0; + i < uw.size() && j < s_weights.size(); + ) { + } + const double tc = uw.DP(s_weights); + } +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr43411.C b/gcc/testsuite/g++.dg/tree-ssa/pr43411.C new file mode 100644 index 000000000..476e16ad2 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr43411.C @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +class P { public: virtual int val() { return 123; } }; +class Psub : public P { }; + +extern int sink1, sink2; + +void test() { + Psub p; + P &pRef = p; + sink1 = p.val(); + sink2 = pRef.val(); +} + + +inline int v(P &p) { return p.val(); } + +void testInlineP() { + P p; + sink1 = v(p); +} + +void testInlinePsub() { + Psub p; + sink1 = v(p); +} + +// { dg-final { scan-tree-dump-not "OBJ_TYPE_REF" "optimized" { xfail *-*-* } } } +// { dg-final { cleanup-tree-dump "optimized" } } diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr44706.C b/gcc/testsuite/g++.dg/tree-ssa/pr44706.C new file mode 100644 index 000000000..39904d8b9 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr44706.C @@ -0,0 +1,46 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-tree-fnsplit" } */ +class MemoryManager; +class XMLExcepts { +public : + enum Codes { + AttrList_BadIndex + }; +}; +class XMLException { +public: + XMLException(const char* const srcFile, const unsigned int srcLine, +MemoryManager* const memoryManager = 0); +}; +class ArrayIndexOutOfBoundsException : public XMLException { +public: + ArrayIndexOutOfBoundsException(const char* const srcFile , const unsigned +int srcLine , const XMLExcepts::Codes toThrow , MemoryManager* memoryManager = +0) : XMLException(srcFile, srcLine, memoryManager) { + } +}; +class XMLAttDef { + bool fExternalAttribute; +}; +class XMLAttDefList { +public: + MemoryManager* getMemoryManager() const; +}; +class DTDAttDef : public XMLAttDef { +}; +class DTDAttDefList : public XMLAttDefList { + virtual const XMLAttDef &getAttDef(unsigned int index) const ; + DTDAttDef** fArray; + unsigned int fCount; +}; +const XMLAttDef &DTDAttDefList::getAttDef(unsigned int index) const { + if(index >= fCount) + throw ArrayIndexOutOfBoundsException("foo.cpp", 0, +XMLExcepts::AttrList_BadIndex, getMemoryManager()); + return *(fArray[index]); +} + +/* Mistake in branch prediction caused us to split away real body of the function keeping + only throw () invokation. This is bad idea. */ +/* { dg-final { scan-tree-dump-not "Splitting function" "fnsplit"} } */ +/* { dg-final { cleanup-tree-dump "fnsplit" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr44914.C b/gcc/testsuite/g++.dg/tree-ssa/pr44914.C new file mode 100644 index 000000000..57ca7e83f --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr44914.C @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fipa-sra -fnon-call-exceptions" } */ + +struct A +{ + ~A () { } +}; + +struct B +{ + A a; + int i; + void f (int) { } + B () + { + f (i); + } +}; + +B b; diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr45453.C b/gcc/testsuite/g++.dg/tree-ssa/pr45453.C new file mode 100644 index 000000000..78c6460f7 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr45453.C @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +struct S +{ + S(); + virtual inline void foo () + { + foo(); + } +}; + +void +B () +{ + S().foo (); +} +/* We should inline foo and devirtualize call to foo in the inlined version. */ +// { dg-final { scan-tree-dump-times "OBJ_TYPE_REF" 1 "optimized" } } +// { dg-final { cleanup-tree-dump "optimized" } } diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr45605.C b/gcc/testsuite/g++.dg/tree-ssa/pr45605.C new file mode 100644 index 000000000..861b122e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr45605.C @@ -0,0 +1,37 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fdump-tree-ssa" } */ +extern "C" void abort(); +bool destructor_called = false; + +struct B { + virtual void Run(){}; +}; + +struct D : public B { + virtual void Run() + { + struct O { + ~O() { destructor_called = true; }; + } o; + + struct Raiser { + Raiser() throw( int ) {throw 1;}; + } raiser; + }; +}; + +int main() { + try { + D d; + static_cast<B&>(d).Run(); + } catch (...) {} + + if (!destructor_called) + abort (); +} + + + +/* We should devirtualize call to D::Run */ +/* { dg-final { scan-tree-dump-times "D::Run \\(" 1 "ssa" { xfail *-*-* } } } */ +/* { dg-final { cleanup-tree-dump "ssa" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr46228.C b/gcc/testsuite/g++.dg/tree-ssa/pr46228.C new file mode 100644 index 000000000..a720dbe3b --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr46228.C @@ -0,0 +1,23 @@ +// { dg-options "-fdump-tree-optimized -Os" } +#include <set> +#include <stdio.h> + +int main() +{ + static const int array[] = { 1,2,3,4,5,6,7,8,9,10,6 }; + std::set<int> the_set; + int count = 0; + for (unsigned i = 0; i < sizeof(array)/sizeof(*array); i++) + { + std::pair<std::set<int>::iterator, bool> result = + the_set.insert(array[i]); + if (result.second) + count++; + } + printf("%d unique items in array.\n", count); + return 0; +} + +// This function is small enough to be inlined even at -Os. +// { dg-final { scan-tree-dump-not "_ZNSt8_Rb_treeIiiSt9_IdentityIiESt4lessIiESaIiEED2Ev" "optimized" } } +// { dg-final { cleanup-tree-dump "optimized" } } diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr46734.C b/gcc/testsuite/g++.dg/tree-ssa/pr46734.C new file mode 100644 index 000000000..e95c62089 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr46734.C @@ -0,0 +1,34 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fipa-sra" } */ + +struct A +{ + int *p; + A() {p = (int *) -1;} + ~A() {if (p && p != (int *) -1) *p = 0;} +}; + +struct B +{ + A a; + char data[23]; + B() : a() {data[0] = 0;} +}; + +extern A ga; +extern int *gi; +extern void *gz; +extern B *gb; + +static int * __attribute__ ((noinline)) foo (B *b, void *z) +{ + __builtin_memcpy (gz, z, 28); + ga = b->a; + return b->a.p; +} + +int *bar (B *b, void *z) +{ + gb = b; + return foo (b, z); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr46987.C b/gcc/testsuite/g++.dg/tree-ssa/pr46987.C new file mode 100644 index 000000000..7163915a2 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr46987.C @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-O" } */ + +struct A { + virtual A *getThis(); +}; + +struct B { + virtual B *getThis(); +}; + +struct AB : public A, public B { + virtual AB *getThis() { return 0; } +}; + +void foo () +{ + AB ab; + B *b = &ab; + b->getThis(); +} + diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr47707.C b/gcc/testsuite/g++.dg/tree-ssa/pr47707.C new file mode 100644 index 000000000..98852de17 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr47707.C @@ -0,0 +1,29 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fno-tree-vrp" } */ +#include <assert.h> + +struct CH +{ + unsigned char ch : 3; +} ch; + +__attribute__((noinline)) void MakeCheckOp (unsigned int *v1, unsigned int *v2) +{ + assert (*v1 == *v2); + +} + +int main (void) +{ + + int len; + + for (len = 4; len >= 1; len--) + { + unsigned v1, v2; + ch.ch = len; + v1 = ch.ch; + v2 = len; + MakeCheckOp (&v1, &v2); + } +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr49516.C b/gcc/testsuite/g++.dg/tree-ssa/pr49516.C new file mode 100644 index 000000000..2c6fd0496 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr49516.C @@ -0,0 +1,86 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +extern "C" void abort (void); + +typedef int int32; +typedef unsigned int uint32; +typedef unsigned long long uint64; +typedef short int16; + +class Tp { + public: + Tp(int, const int segment, const int index) __attribute__((noinline)); + + inline bool operator==(const Tp& other) const; + inline bool operator!=(const Tp& other) const; + int GetType() const { return type_; } + int GetSegment() const { return segment_; } + int GetIndex() const { return index_; } + private: + inline static bool IsValidSegment(const int segment); + static const int kSegmentBits = 28; + static const int kTypeBits = 4; + static const int kMaxSegment = (1 << kSegmentBits) - 1; + + union { + + struct { + int32 index_; + uint32 segment_ : kSegmentBits; + uint32 type_ : kTypeBits; + }; + struct { + int32 dummy_; + uint32 type_and_segment_; + }; + uint64 value_; + }; +}; + +Tp::Tp(int t, const int segment, const int index) + : index_(index), segment_(segment), type_(t) {} + +inline bool Tp::operator==(const Tp& other) const { + return value_ == other.value_; +} +inline bool Tp::operator!=(const Tp& other) const { + return value_ != other.value_; +} + +class Range { + public: + inline Range(const Tp& position, const int count) __attribute__((always_inline)); + inline Tp GetBeginTokenPosition() const; + inline Tp GetEndTokenPosition() const; + private: + Tp position_; + int count_; + int16 begin_index_; + int16 end_index_; +}; + +inline Range::Range(const Tp& position, + const int count) + : position_(position), count_(count), begin_index_(0), end_index_(0) + { } + +inline Tp Range::GetBeginTokenPosition() const { + return position_; +} +inline Tp Range::GetEndTokenPosition() const { + return Tp(position_.GetType(), position_.GetSegment(), + position_.GetIndex() + count_); +} + +int main () +{ + Range range(Tp(0, 0, 3), 0); + if (!(range.GetBeginTokenPosition() == Tp(0, 0, 3))) + abort (); + + if (!(range.GetEndTokenPosition() == Tp(0, 0, 3))) + abort(); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr49911.C b/gcc/testsuite/g++.dg/tree-ssa/pr49911.C new file mode 100644 index 000000000..520a7750d --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr49911.C @@ -0,0 +1,41 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fstrict-enums -fno-rtti -fno-exceptions -fno-strict-aliasing -fdump-tree-vrp2" } */ + + +extern void JS_Assert(); +typedef enum { +eax, ecx, edx, ebx, esp, ebp, +esi, edi } +RegisterID; +union StateRemat { + RegisterID reg_; + int offset_; +}; +static StateRemat FromRegister(RegisterID reg) { + StateRemat sr; + sr.reg_ = reg; + return sr; +} +static StateRemat FromAddress3(int address) { + StateRemat sr; + sr.offset_ = address; + //sr.offset_ = 0; + if (address < 46 && address >= 0) { + JS_Assert(); + } + return sr; +} +struct FrameState { + StateRemat dataRematInfo2(bool y, int z) { + if (y) return FromRegister(RegisterID(1)); + return FromAddress3(z); + } +}; +FrameState frame; +StateRemat x; +void jsop_setelem(bool y, int z) { + x = frame.dataRematInfo2(y, z); +} + +/* { dg-final { scan-tree-dump-times "Folding predicate.*45" 0 "vrp2"} } */ +/* { dg-final { cleanup-tree-dump "vrp2" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr50622.C b/gcc/testsuite/g++.dg/tree-ssa/pr50622.C new file mode 100644 index 000000000..d7f4fa74b --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr50622.C @@ -0,0 +1,30 @@ +// { dg-do compile } +// { dg-options "-O2" } + +typedef __complex__ double Value; +struct LorentzVector +{ + LorentzVector & operator+=(const LorentzVector & a) { + theX += a.theX; + theY += a.theY; + theZ += a.theZ; + theT += a.theT; + return *this; + } + + Value theX; + Value theY; + Value theZ; + Value theT; +}; + +inline LorentzVector +operator+(LorentzVector a, const LorentzVector & b) { + return a += b; +} + +Value ex, et; +LorentzVector sum() { + LorentzVector v1; v1.theX =ex; v1.theY =ex+et; v1.theZ =ex-et; v1.theT =et; + return v1+v1; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr54515.C b/gcc/testsuite/g++.dg/tree-ssa/pr54515.C new file mode 100644 index 000000000..11ed46893 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr54515.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// { dg-options "-O2" } + +template < typename T > T h2le (T) +{ + T a; + unsigned short &b = a; + short c = 0; + unsigned char (&d)[2] = reinterpret_cast < unsigned char (&)[2] > (c); + unsigned char (&e)[2] = reinterpret_cast < unsigned char (&)[2] > (b); + e[0] = d[0]; + return a; +} + +void +bar () +{ + h2le ((unsigned short) 0); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr8781.C b/gcc/testsuite/g++.dg/tree-ssa/pr8781.C new file mode 100644 index 000000000..a9d279af7 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr8781.C @@ -0,0 +1,28 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-fre-details" } */ + +int f(); + +template<typename predicate> +class noop_t { + const predicate &pred; +public: + explicit noop_t(const predicate &p) : pred(p) {} + + int operator()() const { return pred(); } +}; + +template<typename predicate> +inline noop_t<predicate> noop(const predicate pred) { + return noop_t<predicate>(pred); +} + +int x() +{ + return (noop(noop(noop(noop(noop(noop(noop(noop(noop(f)))))))))()); +} + +/* We should optimize this to a direct call. */ + +/* { dg-final { scan-tree-dump "Replacing call target with f" "fre" } } */ +/* { dg-final { cleanup-tree-dump "fre" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/ptrmemfield.C b/gcc/testsuite/g++.dg/tree-ssa/ptrmemfield.C new file mode 100644 index 000000000..c32ebba00 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/ptrmemfield.C @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +// { dg-options "-O2 -fdump-tree-optimized" } + + +struct f +{ + char m; + char m1; +}; + +static inline char f:: *g(int a) +{ + return a?0:&f::m; +} + +int h(void) +{ + char f:: *a = g(0); + return a == 0; +} + +/* We should have no cast to offset_type. */ +/* { dg-final { scan-tree-dump-times "offset_type" 0 "optimized"} } */ +// And we should optimized this code to just return 0 +/* { dg-final { scan-tree-dump-times "return 0" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ + diff --git a/gcc/testsuite/g++.dg/tree-ssa/restrict1.C b/gcc/testsuite/g++.dg/tree-ssa/restrict1.C new file mode 100644 index 000000000..dc120b1e8 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/restrict1.C @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-lim-details" } */ + +struct Foo +{ + Foo(); + Foo(const Foo&); + int n; + int * __restrict__ p; +}; +void bar(Foo f, int * __restrict__ q) +{ + for (int i = 0; i < f.n; ++i) + { + *q += f.p[i]; + } +} + +/* { dg-final { scan-tree-dump "Executing store motion" "lim1" } } */ +/* { dg-final { cleanup-tree-dump "lim1" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/sra-1.C b/gcc/testsuite/g++.dg/tree-ssa/sra-1.C new file mode 100644 index 000000000..e3e3918eb --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/sra-1.C @@ -0,0 +1,29 @@ +/* https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=223576 */ + +/* SRA failed to canonicalize bit-field types, introducing type + mismatches. */ + +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +struct A +{ + int a:16; + /* These dummy bit-fields are here to prevent GCC 4.2+ from merging + the bit-field compares into a single word compare, which disables + SRA. */ + int a2:16; + int a3:16; + int a4:16; + int b:8; + bool operator==(A const x) const + { + return (this->a == x.a && this->b == x.b); + } +}; + +bool +foo (A const x, A const y) +{ + return x == y; +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/ssa-cast-1.C b/gcc/testsuite/g++.dg/tree-ssa/ssa-cast-1.C new file mode 100644 index 000000000..4e953220f --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/ssa-cast-1.C @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fdump-tree-optimized" } */ + +int &f(int *a) +{ + return *a; +} + +/* There should be no cast as pointer and references are + considered the same type. */ +/* { dg-final { scan-tree-dump-times "\\(int &\\)" 0 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-1.C b/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-1.C new file mode 100644 index 000000000..b2d5f4b05 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-1.C @@ -0,0 +1,61 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fdump-tree-optimized" } */ + +void link_error(); + + +struct State { + int p0, p1, p2; + inline State(){p0=0;p1=0;p2=0;} + inline State(const State &s) { + p0 = s.p0; + p1 = s.p1; + p2 = s.p2; + } + + inline void operator =(const State &s) { + p0 = s.p0; + p1 = s.p1; + p2 = s.p2; + } + + inline void step(void) { + p0 = p1+p2; + p1 = p0*p1+p2; + p2 = p0-p2; + } +}; + + +inline void iterate_ok(State &inS1, State &inS2, unsigned int n) +{ + State s1 = inS1; + for (unsigned int i = 0; i < n; i++) { + s1.step(); + } + inS1 = s1; +} + +void temp() +{ + State s1; + s1.p0 = 0; + s1.p1 = 0; + s1.p2 = 0; + State s2; + s2.p0 = 0; + s2.p1 = 0; + s2.p2 = 0; + iterate_ok (s1, s2, 1); + if (s1.p0) + link_error(); + if (s1.p0) + link_error(); + if (s1.p0) + link_error(); +} + +/* We should have removed the casts from pointers to references and caused SRA to happen. */ + +/* { dg-final { scan-tree-dump-times "link_error" 0 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-2.C b/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-2.C new file mode 100644 index 000000000..d73787018 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-2.C @@ -0,0 +1,52 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fdump-tree-optimized" } */ + +void link_error(); + +struct OOf { + int value; + OOf() {value = 0;} +}; +inline OOf operator+(OOf op1, OOf op2) +{ + OOf f; + f.value = op1.value + op2.value; + return f; +} +inline OOf operator*(OOf op1, OOf op2) +{ + OOf f; + f.value = op1.value * op2.value; + return f; +} +inline OOf operator-(OOf op1, OOf op2) +{ + OOf f; + f.value = op1.value - op2.value; + return f; +} +inline OOf test_func( + OOf a, + OOf b, + OOf c +) +{ + OOf d, e; + OOf result; + d = a * b + b * c; + e = a * c - b * d; + result = d * e; + return result; +} + +void test() +{ + OOf a, b, c; + OOf d = test_func (a,b,c); + if (d.value) + link_error(); +} + +/* We should have removed the casts from pointers to references and caused SRA to happen. */ +/* { dg-final { scan-tree-dump-times "link_error" 0 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-3.C b/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-3.C new file mode 100644 index 000000000..2a2d89c63 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-3.C @@ -0,0 +1,83 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* Test check use_block_copy bit propagation in sra element hierarchy. */ + +typedef unsigned char UINT8 ; +typedef unsigned int UINT ; +class C4 +{ +public: + int xy[2]; +}; + +class C3 +{ +public: + inline void + Reset() + { + C4 const mvMax = {0x7fff, 0x7fff}; + + m42(0,mvMax); + m42(1,mvMax); + m43(0); + }; + + inline void m42 (UINT i, C4 mv) + { + mMv[i] = mv; + }; + + + + inline void m43(UINT j) + { + m44 (j); + d41 = j + 1; + }; + +private: + + C4 mMv[2]; + UINT8 d41; + inline void m44 (UINT j) const {}; +}; + +class C2 +{ +private: + bool valid; +}; + +class C1 +{ +public: + void m1(C3 *c); + +private: + const C2 * d1[2]; + void m2(C3 *m); +}; + +void C1::m1 (C3 *r) +{ + C3 x; + m2(&x); +} +void C1::m2(C3 *x) +{ + C3 m3; + int i; + m3.Reset (); + for(i=0; i<2; i++) + { + const C2 * r = d1[i]; + if (r!=__null) + { + C4 const c400 = {0,0}; + m3.m42 (i, c400); + + } + } +} + diff --git a/gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C b/gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C new file mode 100644 index 000000000..06e9b1e35 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +class bar +{ +public: + static const int conststaticvariable; +}; + + +int f(void) +{ + return bar::conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it may + be overriden at link time. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/tmmti-2.C b/gcc/testsuite/g++.dg/tree-ssa/tmmti-2.C new file mode 100644 index 000000000..808b5ab27 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/tmmti-2.C @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options { -O -fdump-tree-optimized } } */ + +int a[4][8]; + +int foo(long i) +{ + return *(&a[0][0] + i*8); // a[i][0] +} + +struct Foo { double x, y; }; + +Foo b[4]; + +double bar(long i) +{ + return *(&b[0].x + i*2); // b[i].x +} + +/* { dg-final { scan-tree-dump "a\\\[.*i.*\\\]\\\[0\\\]" "optimized" { xfail *-*-* } } } */ +/* { dg-final { scan-tree-dump "b\\\[.*i.*\\\].x" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/tree-ssa/tmmti.C b/gcc/testsuite/g++.dg/tree-ssa/tmmti.C new file mode 100644 index 000000000..111127b0d --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/tmmti.C @@ -0,0 +1,7 @@ +/* { dg-do compile } */ + +void bar(unsigned int i) +{ + int a[4]; + char *p = (char*)&a[1] + 4*i; +} diff --git a/gcc/testsuite/g++.dg/uninit-pred-1_a.C b/gcc/testsuite/g++.dg/uninit-pred-1_a.C new file mode 100644 index 000000000..58bb9c5d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/uninit-pred-1_a.C @@ -0,0 +1,63 @@ +/* { dg-do compile } */ +/* { dg-options "-Wuninitialized -O2" } */ + +typedef long long int64; +void incr (); +bool is_valid (int); +int get_time (); + +class A +{ +public: + A (); + ~A () { + if (I) delete I; + } + +private: + int* I; +}; + +bool get_url (A *); + +class M { + + public: +__attribute__ ((always_inline)) int GetC (int *c) { + + A details_str; + if (!get_url (&details_str)) + { + incr (); + return 1; + } + + *c = get_time (); + return -1; + } + + void do_sth(); + void do_sth2(); + + void P (int64 t) + { + int cc; /* { dg-bogus "uninitialized" "uninitialized variable warning" } */ + if (GetC (&cc) >= 0 ) + return; + + if (t && cc <= 0 ) /* { dg-bogus "uninitialized" "uninitialized variable warning" } */ + { + this->do_sth(); + return; + } + + do_sth2(); + } +}; + +M* m; +void foo(int x) +{ + m = new M; + m->P(x); +} diff --git a/gcc/testsuite/g++.dg/uninit-pred-1_b.C b/gcc/testsuite/g++.dg/uninit-pred-1_b.C new file mode 100644 index 000000000..94a444d21 --- /dev/null +++ b/gcc/testsuite/g++.dg/uninit-pred-1_b.C @@ -0,0 +1,63 @@ +/* { dg-do compile } */ +/* { dg-options "-Wuninitialized -O2" } */ + +typedef long long int64; +void incr (); +bool is_valid (int); +int get_time (); + +class A +{ +public: + A (); + ~A () { + if (I) delete I; + } + +private: + int* I; +}; + +bool get_url (A *); + +class M { + + public: +__attribute__ ((always_inline)) int GetC (int *c) { + + A details_str; + if (!get_url (&details_str)) + { + incr (); + return 1; + } + + *c = get_time (); + return -1; + } + + void do_sth(); + void do_sth2(); + + void P (int64 t) + { + int cc; /* { dg-message "note: 'cc' was declared here" } */ + if (GetC (&cc) <= 0 ) /* return flag checked wrongly */ + return; + + if (t && cc <= 0 ) /* { dg-warning "uninitialized" "uninitialized variable warning" } */ + { + this->do_sth(); + return; + } + + do_sth2(); + } +}; + +M* m; +void foo(int x) +{ + m = new M; + m->P(x); +} diff --git a/gcc/testsuite/g++.dg/uninit-pred-2_a.C b/gcc/testsuite/g++.dg/uninit-pred-2_a.C new file mode 100644 index 000000000..918c94375 --- /dev/null +++ b/gcc/testsuite/g++.dg/uninit-pred-2_a.C @@ -0,0 +1,62 @@ +/* { dg-do compile } */ +/* { dg-options "-Wuninitialized -O2" } */ + +typedef long long int64; +void incr (); +bool is_valid (int); +int get_time (); + +class A +{ +public: + A (); + ~A () { + if (I) delete I; + } + +private: + int* I; +}; + +bool get_url (A *); + +class M { + + public: +__attribute__ ((always_inline)) bool GetC (int *c) { + + A details_str; + if (get_url (&details_str)) + { + *c = get_time (); + return true; + } + + return false; + } + + void do_sth(); + void do_sth2(); + + void P (int64 t) + { + int cc; + if (!GetC (&cc)) /* return flag checked properly */ + return; + + if (cc <= 0) /* { dg-bogus "uninitialized" "uninitialized variable warning" } */ + { + this->do_sth(); + return; + } + + do_sth2(); + } +}; + +M* m; +void foo(int x) +{ + m = new M; + m->P(x); +} diff --git a/gcc/testsuite/g++.dg/uninit-pred-2_b.C b/gcc/testsuite/g++.dg/uninit-pred-2_b.C new file mode 100644 index 000000000..5023fc50b --- /dev/null +++ b/gcc/testsuite/g++.dg/uninit-pred-2_b.C @@ -0,0 +1,62 @@ +/* { dg-do compile } */ +/* { dg-options "-Wuninitialized -O2" } */ + +typedef long long int64; +void incr (); +bool is_valid (int); +int get_time (); + +class A +{ +public: + A (); + ~A () { + if (I) delete I; + } + +private: + int* I; +}; + +bool get_url (A *); + +class M { + + public: +__attribute__ ((always_inline)) bool GetC (int *c) { + + A details_str; + if (get_url (&details_str)) + { + *c = get_time (); + return true; + } + + return false; + } + + void do_sth(); + void do_sth2(); + + void P (int64 t) + { + int cc; /* { dg-message "note: 'cc' was declared here" } */ + if (GetC (&cc)) /* return flag checked wrongly */ + return; + + if (cc <= 0) /* { dg-warning "uninitialized" "uninitialized variable warning" } */ + { + this->do_sth(); + return; + } + + do_sth2(); + } +}; + +M* m; +void foo(int x) +{ + m = new M; + m->P(x); +} diff --git a/gcc/testsuite/g++.dg/uninit-pred-3_a.C b/gcc/testsuite/g++.dg/uninit-pred-3_a.C new file mode 100644 index 000000000..910140790 --- /dev/null +++ b/gcc/testsuite/g++.dg/uninit-pred-3_a.C @@ -0,0 +1,77 @@ +/* { dg-do compile } */ +/* { dg-options "-Wuninitialized -O2" } */ + +/* Multiple initialization paths. */ + +typedef long long int64; +void incr (); +bool is_valid (int); +int get_time (); + +class A +{ +public: + A (); + ~A () { + if (I) delete I; + } + +private: + int* I; +}; + +bool get_url (A *); +bool get_url2 (A *); + +class M { + + public: + __attribute__ ((always_inline)) + bool GetC (int *c) { + + A details_str; + /* Intialization path 1 */ + if (get_url (&details_str)) + { + *c = get_time (); + return true; + } + + /* insert dtor calls (inlined) into following return paths */ + A tmp_str; + + /* Intializtion path 2 */ + if (get_url2 (&details_str)) + { + *c = get_time (); + return true; + } + + return false; + } + + void do_sth(); + void do_sth2(); + + void P (int64 t) + { + int cc; + if (!GetC (&cc)) /* return flag checked properly */ + return; + + if (cc <= 0) /* { dg-bogus "uninitialized" "uninitialized variable warning" } */ + { + this->do_sth(); + return; + } + + do_sth2(); + } +}; + +M* m; +void test(int x) +{ + m = new M; + m->P(x); +} diff --git a/gcc/testsuite/g++.dg/uninit-pred-3_b.C b/gcc/testsuite/g++.dg/uninit-pred-3_b.C new file mode 100644 index 000000000..cfe2113bb --- /dev/null +++ b/gcc/testsuite/g++.dg/uninit-pred-3_b.C @@ -0,0 +1,87 @@ +/* { dg-do compile } */ +/* { dg-options "-Wuninitialized -O2" } */ + +/* Multiple initialization paths. */ + +typedef long long int64; +void incr (); +bool is_valid (int); +int get_time (); + +class A +{ +public: + A (); + ~A () { + if (I) delete I; + } + +private: + int* I; +}; + +bool get_url (A *); +bool get_url2 (A *); +bool get_url3 (A *); + +class M { + + public: + __attribute__ ((always_inline)) + bool GetC (int *c) { + + A details_str; + + /* Initialization path 1 */ + if (get_url (&details_str)) + { + *c = get_time (); + return true; + } + + /* Destructor call before return*/ + A tmp_str; + + /* Initialization path 2 */ + if (get_url2 (&details_str)) + { + *c = get_time (); + return true; + } + + /* Fail to initialize in this path but + still returns true */ + if (get_url2 (&details_str)) + { + /* Fail to initialize *c */ + return true; + } + + return false; + } + + void do_sth(); + void do_sth2(); + + void P (int64 t) + { + int cc; /* { dg-excess-errors "note: 'cc' was declared here" } */ + if (!GetC (&cc)) + return; + + if (cc <= 0) /* { dg-warning "uninitialized" "uninitialized variable warning" } */ + { + this->do_sth(); + return; + } + + do_sth2(); + } +}; + +M* m; +void test(int x) +{ + m = new M; + m->P(x); +} diff --git a/gcc/testsuite/g++.dg/uninit-pred-loop-1_a.cc b/gcc/testsuite/g++.dg/uninit-pred-loop-1_a.cc new file mode 100644 index 000000000..835cdbae3 --- /dev/null +++ b/gcc/testsuite/g++.dg/uninit-pred-loop-1_a.cc @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-Wuninitialized -O2" } */ + +extern int bar(); +int foo(void) +{ + for (;;) { + int err = ({int _err; /* { dg-bogus "uninitialized" "false warning" } */ + for (int i = 0; i < 16; ++i) { + _err = 17; + _err = bar(); + } + _err; /* { dg-bogus "uninitialized" "false warning" } */ + }); + + if (err == 0) return 17; + } + + return 18; +} + diff --git a/gcc/testsuite/g++.dg/uninit-pred-loop-1_b.cc b/gcc/testsuite/g++.dg/uninit-pred-loop-1_b.cc new file mode 100644 index 000000000..e4ef3d22c --- /dev/null +++ b/gcc/testsuite/g++.dg/uninit-pred-loop-1_b.cc @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-Wuninitialized -O2" } */ + +extern int bar(); +int foo(int n) +{ + for (;;) { + int err = ({int _err; + for (int i = 0; i < n; ++i) { + _err = 17; + _err = bar(); + } + _err; + }); /* { dg-warning "uninitialized" "warn on _err" } */ + + if (err == 0) return 17; + } + + return 18; +} + diff --git a/gcc/testsuite/g++.dg/uninit-pred-loop-1_c.cc b/gcc/testsuite/g++.dg/uninit-pred-loop-1_c.cc new file mode 100644 index 000000000..7f6b41d31 --- /dev/null +++ b/gcc/testsuite/g++.dg/uninit-pred-loop-1_c.cc @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-Wuninitialized -O2" } */ + +extern int bar(); +int foo(int n, int m) +{ + for (;;) { + int err = ({int _err; + for (int i = 0; i < 16; ++i) { + if (m+i > n) + break; + _err = 17; + _err = bar(); + } + _err; + }); + + if (err == 0) return 17; }); /* { dg-warning "uninitialized" "warn on _err" } */ + } + + return 18; +} + diff --git a/gcc/testsuite/g++.dg/uninit-pred-loop_1.cc b/gcc/testsuite/g++.dg/uninit-pred-loop_1.cc new file mode 100644 index 000000000..835cdbae3 --- /dev/null +++ b/gcc/testsuite/g++.dg/uninit-pred-loop_1.cc @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-Wuninitialized -O2" } */ + +extern int bar(); +int foo(void) +{ + for (;;) { + int err = ({int _err; /* { dg-bogus "uninitialized" "false warning" } */ + for (int i = 0; i < 16; ++i) { + _err = 17; + _err = bar(); + } + _err; /* { dg-bogus "uninitialized" "false warning" } */ + }); + + if (err == 0) return 17; + } + + return 18; +} + diff --git a/gcc/testsuite/g++.dg/vect/param-max-aliased-pr26197.cc b/gcc/testsuite/g++.dg/vect/param-max-aliased-pr26197.cc new file mode 100644 index 000000000..198cd6b53 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/param-max-aliased-pr26197.cc @@ -0,0 +1,24 @@ +/* { dg-do compile } */ + +void g(const void*); +struct B +{ + int* x[2]; + int *p; + B() + { + for (int** p=x; p<x+4; ++p) + *p = 0; + } + ~B() + { + g(p); + } +}; +void bar() +{ + const B &b = B(); + g(&b); +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/g++.dg/vect/pr19951.cc b/gcc/testsuite/g++.dg/vect/pr19951.cc new file mode 100644 index 000000000..a6acf99ff --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr19951.cc @@ -0,0 +1,19 @@ +/* { dg-do compile } */ + +struct A +{ + ~A(); +}; + +void foo(); + +void bar() +{ + A a; + + foo(); + for (;;) + foo(); +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/g++.dg/vect/pr21218.cc b/gcc/testsuite/g++.dg/vect/pr21218.cc new file mode 100644 index 000000000..73331d227 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr21218.cc @@ -0,0 +1,18 @@ +/* { dg-do compile } */ + +struct A +{ + double d[2]; + double foo(int i) { return d[i]; } +}; + +struct B : public A {}; + +void bar(B& b) +{ + for (int i=0; i<2; ++i) + b.d[i] = b.foo(i); +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ + diff --git a/gcc/testsuite/g++.dg/vect/pr21734_1.cc b/gcc/testsuite/g++.dg/vect/pr21734_1.cc new file mode 100644 index 000000000..c65d9fcaa --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr21734_1.cc @@ -0,0 +1,20 @@ +/* { dg-do compile } */ + +struct A +{ + int a[4]; + int& operator[](int i) { return a[i]; } +}; + +struct B : public A +{ + int& operator[](int i) { return A::operator[](i); } +}; + +void foo(B &b) +{ + for (int i=0; i<4; ++i) + b[i] = 0; +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/g++.dg/vect/pr21734_2.cc b/gcc/testsuite/g++.dg/vect/pr21734_2.cc new file mode 100644 index 000000000..58efedf18 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr21734_2.cc @@ -0,0 +1,16 @@ +/* { dg-do compile } */ + +struct A +{ + int a[4]; + int* operator[](int i) { return &a[i]; } +}; + +void foo(A a1, A &a2) +{ + a1[1][1]=0; + for (int i=0; i<4; ++i) + a2.a[i]=0; +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/g++.dg/vect/pr22543.cc b/gcc/testsuite/g++.dg/vect/pr22543.cc new file mode 100644 index 000000000..f5e55f195 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr22543.cc @@ -0,0 +1,38 @@ +/* { dg-do compile } */ + +struct A +{ + int i, j; + + A() : i(), j() {} + ~A() {} + + operator int() { return 0; } +}; + +struct B +{ + A foo() const { return A(); } +}; + +struct X { ~X(); }; + +struct C +{ + C(); + + int z[4]; +}; + +C::C() +{ + for (int i=0; i<4; ++i) + z[i]=0; + + X x; + + for (int i=0; i<4; ++i) + int j = B().foo(); +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/g++.dg/vect/pr33834_1.cc b/gcc/testsuite/g++.dg/vect/pr33834_1.cc new file mode 100644 index 000000000..715ff0dda --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr33834_1.cc @@ -0,0 +1,50 @@ +/* { dg-do compile } */ + +/* Testcase by Martin Michlmayr <tbm@cyrius.com> */ + +extern double cos (double x); +extern double sin (double x); + +class bend_class +{ + double *s_A; +public: + void set_s_A (double s_A0) + { + s_A[0] = s_A0; + } +}; +class bend_set +{ + bend_class *bend_array; +public: + void set_s_A (int index, double s_A0) + { + bend_array[index].set_s_A (s_A0); + } + void compute_s (void) + { + int i, j; + double val; + double tmp[3]; + for (i = 0; i < 5; ++i) + { + val = i; + for (j = 0; j < 2; ++j) + tmp[j] = cos (val); + set_s_A (i, tmp[0]); + tmp[j] = cos (val) / sin (val); + } + } +}; +class internals +{ + bend_set bend; + void compute_s (void); +}; +void +internals::compute_s (void) +{ + bend.compute_s (); +} +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/g++.dg/vect/pr33834_2.cc b/gcc/testsuite/g++.dg/vect/pr33834_2.cc new file mode 100644 index 000000000..1230ca314 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr33834_2.cc @@ -0,0 +1,32 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -ftree-vectorize" } */ + +/* Testcase by Martin Michlmayr <tbm@cyrius.com> */ + +extern int sscanf (__const char *__restrict __s, + __const char *__restrict __format, ...); +unsigned char got_elevation_pattern; +struct site +{ + float antenna_pattern[361][1001]; +} +LR; +void +LoadPAT (char *filename) +{ + int x, y; + char string[255]; + float elevation, amplitude, elevation_pattern[361][1001]; + for (x = 0; filename[x] != '.' ; x++) + sscanf (string, "%f %f", &elevation, &litude); + for (y = 0; y <= 1000; y++) + { + if (got_elevation_pattern) + elevation = elevation_pattern[x][y]; + else + elevation = 1.0; + LR.antenna_pattern[x][y] = elevation; + } +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/g++.dg/vect/pr33835.cc b/gcc/testsuite/g++.dg/vect/pr33835.cc new file mode 100644 index 000000000..1ab4c7e8d --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr33835.cc @@ -0,0 +1,50 @@ +/* { dg-do compile } */ + +/* Testcase by Martin Michlmayr <tbm@cyrius.com> */ + +extern double cos (double x); + +class bend_class +{ + double *s_A; +public: + void set_s_A (double s_A0) + { + s_A[0] = s_A0; + } +}; +class bend_set +{ + bend_class *bend_array; +public: + void set_s_A (int index, double s_A0) + { + bend_array[index].set_s_A (s_A0); + } + void compute_s (void) + { + int i, j; + double val; + double tmp[3]; + for (i = 0; i < 5; ++i) + { + val = i; + for (j = 0; j < 2; ++j) + tmp[j] = cos (val); + set_s_A (i, tmp[0]); + tmp[j] = cos (val); + } + } +}; +class internals +{ + bend_set bend; + void compute_s (void); +}; +void +internals::compute_s (void) +{ + bend.compute_s (); +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/g++.dg/vect/pr33860.cc b/gcc/testsuite/g++.dg/vect/pr33860.cc new file mode 100644 index 000000000..e70ec674e --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr33860.cc @@ -0,0 +1,25 @@ +/* { dg-do compile } */ +/* Testcase by Martin Michlmayr <tbm@cyrius.com> */ + +class Matrix +{ + public: + double data[4][4]; + Matrix operator* (const Matrix matrix) const; + void makeRotationAboutVector (void); +}; +void Matrix::makeRotationAboutVector (void) +{ + Matrix irx; + *this = irx * (*this); +} +Matrix Matrix::operator* (const Matrix matrix) const +{ + Matrix ret; + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + ret.data[j][i] = matrix.data[j][2] + matrix.data[j][3]; + return ret; +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/g++.dg/vect/pr33860a.cc b/gcc/testsuite/g++.dg/vect/pr33860a.cc new file mode 100644 index 000000000..77e28226a --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr33860a.cc @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-Wno-psabi" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ + +/* Testcase by Martin Michlmayr <tbm@cyrius.com> */ + +class Matrix +{ + public: + float data[4][4] __attribute__ ((__aligned__(16))); + Matrix operator* (const Matrix matrix) const; + void makeRotationAboutVector (void); +}; +void Matrix::makeRotationAboutVector (void) +{ + Matrix irx; + *this = irx * (*this); +} +Matrix Matrix::operator* (const Matrix matrix) const +{ + Matrix ret; + for (int i = 0; i < 4; i++) + for (int j = 0; j < 4; j++) + ret.data[j][i] = matrix.data[j][2] + matrix.data[j][3]; + return ret; +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/g++.dg/vect/pr36648.cc b/gcc/testsuite/g++.dg/vect/pr36648.cc new file mode 100644 index 000000000..6306b4d65 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr36648.cc @@ -0,0 +1,24 @@ +/* { dg-require-effective-target vect_float } */ + +struct vector +{ + vector() : x(0), y(0), z(0) { } + float x,y,z; +}; + +struct Foo +{ + int dummy; + /* Misaligned access. */ + vector array_of_vectors[4]; +}; + +Foo foo; + +int main() { } + +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target { ! vect_no_align } } } } */ +/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "vect" { target { ! vect_no_align } } } } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ + + diff --git a/gcc/testsuite/g++.dg/vect/pr37143.C b/gcc/testsuite/g++.dg/vect/pr37143.C new file mode 100644 index 000000000..70cdfd29b --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr37143.C @@ -0,0 +1,21 @@ +/* { dg-do compile } */ + +void +f(int NumberOfSideSets, int *ssNumDFperSide, float *ssDF) +{ + int i; + float *newssDF = __null; + int *newssNumDF = new int [NumberOfSideSets]; + int ndf, nextDF, numNewDF = 0; + int ii=0; + for (i=0; i<NumberOfSideSets; i++) + numNewDF += newssNumDF[i]; + if (numNewDF > 0) + newssDF = new float [numNewDF]; + nextDF = 0; + ndf = ssNumDFperSide[ii]; + for (i=0; i<ndf; i++) + newssDF[nextDF++] = ssDF[i]; +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/g++.dg/vect/pr37174.cc b/gcc/testsuite/g++.dg/vect/pr37174.cc new file mode 100644 index 000000000..d720e4bfe --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr37174.cc @@ -0,0 +1,23 @@ +/* { dg-do compile } */ + +int* getFoo(); +struct Bar { + Bar(); + int* foo1; + int* foo2; + int* table[4][4][4]; +}; +Bar::Bar() { + foo1 = getFoo(); + foo2 = getFoo(); + for (int a = 0; a < 4; ++a) { + for (int b = 0; b < 4; ++b) { + for (int c = 0; c < 4; ++c) { + table[a][b][c] = foo1; + } + } + } +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ + diff --git a/gcc/testsuite/g++.dg/vect/pr43771.cc b/gcc/testsuite/g++.dg/vect/pr43771.cc new file mode 100644 index 000000000..1a2d09aae --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr43771.cc @@ -0,0 +1,14 @@ +/* { dg-do compile } */ + +void KWayNodeRefine__(int nparts, int *gpwgts, int *badminpwgt, int +*badmaxpwgt) +{ + int i; + + for (i=0; i<nparts; i+=2) { + badminpwgt[i] = badminpwgt[i+1] = gpwgts[i]+gpwgts[i+1]; + badmaxpwgt[i] = badmaxpwgt[i+1] = gpwgts[i]+gpwgts[i+1]; + } +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/g++.dg/vect/pr44861.cc b/gcc/testsuite/g++.dg/vect/pr44861.cc new file mode 100644 index 000000000..07c59a138 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr44861.cc @@ -0,0 +1,34 @@ +// { dg-do compile } + +bool f(); + +struct counted_base { + virtual void destroy() { } + void release() { if (f()) destroy(); } +}; + +struct shared_count { + shared_count() { } + ~shared_count() { if (pi) pi->release(); } + shared_count(shared_count& r) : pi(r.pi) { if (pi) pi->release(); } + counted_base* pi; +}; + +struct Foo; + +struct shared_ptr { + Foo& operator*() { return *ptr; } + Foo* ptr; + shared_count refcount; +}; + +struct Bar { + Bar(Foo&, shared_ptr); +}; + +void g() { + shared_ptr foo; + new Bar(*foo, foo); +} + +// { dg-final { cleanup-tree-dump "vect" } } diff --git a/gcc/testsuite/g++.dg/vect/pr45470-a.cc b/gcc/testsuite/g++.dg/vect/pr45470-a.cc new file mode 100644 index 000000000..474f3d647 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr45470-a.cc @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -ftree-vectorize -fnon-call-exceptions" } */ + +struct A +{ + A (): a (0), b (0), c (0) + { + }; + ~A (); + int a, b, c; +}; + +struct B +{ + B (); + A a1; + A a2; +}; + +B::B () +{ +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/g++.dg/vect/pr45470-b.cc b/gcc/testsuite/g++.dg/vect/pr45470-b.cc new file mode 100644 index 000000000..279a1899c --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr45470-b.cc @@ -0,0 +1,52 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -ftree-vectorize -fno-vect-cost-model -fnon-call-exceptions" } */ + +template < typename _Tp > struct new_allocator +{ + typedef _Tp * pointer; + template < typename > struct rebind + { + typedef new_allocator other; + }; + +}; + +template < typename _Tp > struct allocator:public new_allocator < _Tp > +{}; + +template < typename _Tp, typename _Alloc > struct _Vector_base +{ + typedef typename _Alloc::template rebind < _Tp >::other _Tp_alloc_type; + struct + { + typename _Tp_alloc_type::pointer _M_start; + typename _Tp_alloc_type::pointer _M_finish; + typename _Tp_alloc_type::pointer _M_end_of_storage; + }; + +}; + +template + < + typename + _Tp, + typename + _Alloc = allocator < _Tp > >struct vector:_Vector_base < _Tp, _Alloc > +{ + typedef _Vector_base < _Tp, _Alloc > _Base; + vector ():_Base () + {} + ~vector (); +} +; +struct LoadGraph +{ + LoadGraph (int); + vector < struct _GdkColor >colors; + vector < float >data_block; +}; + +LoadGraph::LoadGraph (int) +{} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/g++.dg/vect/pr51485.cc b/gcc/testsuite/g++.dg/vect/pr51485.cc new file mode 100644 index 000000000..d57d7596d --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr51485.cc @@ -0,0 +1,14 @@ +/* { dg-do compile } */ + +struct A { A (); unsigned int a; }; +double bar (A a) throw () __attribute__((pure)); + +void +foo (unsigned int x, double *y, A *z) +{ + unsigned int i; + for (i = 0; i < x; i++) + y[i] = bar (z[i]); +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/testsuite/g++.dg/vect/slp-pr50413.cc b/gcc/testsuite/g++.dg/vect/slp-pr50413.cc new file mode 100644 index 000000000..e7bdf1f1c --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/slp-pr50413.cc @@ -0,0 +1,165 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target vect_int } */ + +typedef unsigned long long UInt64; + +typedef struct struct128 +{ + UInt64 uint64_lower; + UInt64 uint64_upper; +} +STRUCT_128; + +typedef union uint128_bitmap +{ + STRUCT_128 uint128; + + struct + { + UInt64 b00 : 1; + UInt64 b01 : 1; + UInt64 b02 : 1; + UInt64 b03 : 1; + UInt64 b04 : 1; + UInt64 b05 : 1; + UInt64 b06 : 1; + UInt64 b07 : 1; + UInt64 b08 : 1; + UInt64 b09 : 1; + UInt64 b10 : 1; + UInt64 b11 : 1; + UInt64 b12 : 1; + UInt64 b13 : 1; + UInt64 b14 : 1; + UInt64 b15 : 1; + UInt64 b16 : 1; + UInt64 b17 : 1; + UInt64 b18 : 1; + UInt64 b19 : 1; + UInt64 b20 : 1; + UInt64 b21 : 1; + UInt64 b22 : 1; + UInt64 b23 : 1; + UInt64 b24 : 1; + UInt64 b25 : 1; + UInt64 b26 : 1; + UInt64 b27 : 1; + UInt64 b28 : 1; + UInt64 b29 : 1; + UInt64 b30 : 1; + UInt64 b31 : 1; + UInt64 b32 : 1; + UInt64 b33 : 1; + UInt64 b34 : 1; + UInt64 b35 : 1; + UInt64 b36 : 1; + UInt64 b37 : 1; + UInt64 b38 : 1; + UInt64 b39 : 1; + UInt64 b40 : 1; + UInt64 b41 : 1; + UInt64 b42 : 1; + UInt64 b43 : 1; + UInt64 b44 : 1; + UInt64 b45 : 1; + UInt64 b46 : 1; + UInt64 b47 : 1; + UInt64 b48 : 1; + UInt64 b49 : 1; + UInt64 b50 : 1; + UInt64 b51 : 1; + UInt64 b52 : 1; + UInt64 b53 : 1; + UInt64 b54 : 1; + UInt64 b55 : 1; + UInt64 b56 : 1; + UInt64 b57 : 1; + UInt64 b58 : 1; + UInt64 b59 : 1; + UInt64 b60 : 1; + UInt64 b61 : 1; + UInt64 b62 : 1; + UInt64 b63 : 1; + UInt64 b64 : 1; + UInt64 b65 : 1; + UInt64 b66 : 1; + UInt64 b67 : 1; + UInt64 b68 : 1; + UInt64 b69 : 1; + UInt64 b70 : 1; + UInt64 b71 : 1; + UInt64 b72 : 1; + UInt64 b73 : 1; + UInt64 b74 : 1; + UInt64 b75 : 1; + UInt64 b76 : 1; + UInt64 b77 : 1; + UInt64 b78 : 1; + UInt64 b79 : 1; + UInt64 b80 : 1; + UInt64 b81 : 1; + UInt64 b82 : 1; + UInt64 b83 : 1; + UInt64 b84 : 1; + UInt64 b85 : 1; + UInt64 b86 : 1; + UInt64 b87 : 1; + UInt64 b88 : 1; + UInt64 b89 : 1; + UInt64 b90 : 1; + UInt64 b91 : 1; + UInt64 b92 : 1; + UInt64 b93 : 1; + UInt64 b94 : 1; + UInt64 b95 : 1; + UInt64 b96 : 1; + UInt64 b97 : 1; + UInt64 b98 : 1; + UInt64 b99 : 1; + UInt64 b100 : 1; + UInt64 b101 : 1; + UInt64 b102 : 1; + UInt64 b103 : 1; + UInt64 b104 : 1; + UInt64 b105 : 1; + UInt64 b106 : 1; + UInt64 b107 : 1; + UInt64 b108 : 1; + UInt64 b109 : 1; + UInt64 b110 : 1; + UInt64 b111 : 1; + UInt64 b112 : 1; + UInt64 b113 : 1; + UInt64 b114 : 1; + UInt64 b115 : 1; + UInt64 b116 : 1; + UInt64 b117 : 1; + UInt64 b118 : 1; + UInt64 b119 : 1; + UInt64 b120 : 1; + UInt64 b121 : 1; + UInt64 b122 : 1; + UInt64 b123 : 1; + UInt64 b124 : 1; + UInt64 b125 : 1; + UInt64 b126 : 1; + UInt64 b127 : 1; + } + bitmap; +} +UInt128_BITMAP; + +UInt128_BITMAP V; + +void shift(unsigned char t) +{ + V.uint128.uint64_lower = (V.uint128.uint64_lower >> 1); + V.bitmap.b63 = V.bitmap.b64; + V.uint128.uint64_upper = (V.uint128.uint64_upper >> 1); + + V.bitmap.b96 = t; +} + +/* { dg-final { scan-tree-dump-times "basic block vectorized using SLP" 0 "slp" } } */ +/* { dg-final { cleanup-tree-dump "slp" } } */ + diff --git a/gcc/testsuite/g++.dg/vect/vect.exp b/gcc/testsuite/g++.dg/vect/vect.exp new file mode 100644 index 000000000..ac22f4b01 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/vect.exp @@ -0,0 +1,81 @@ +# Copyright (C) 2004, 2007, 2008, 2010 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# GCC testsuite that uses the 'dg.exp' driver. + +# There's a bunch of headers we need. +if [is_remote host] { + foreach header [glob -nocomplain $srcdir/$subdir/*.{h,def} ] { + remote_download host $header + } +} + +# Load support procs. +load_lib g++-dg.exp +load_lib target-supports.exp + +# If the target system supports vector instructions, the default action +# for a test is 'run', otherwise it's 'compile'. Save current default. +# Executing vector instructions on a system without hardware vector support +# is also disabled by a call to check_vect, but disabling execution here is +# more efficient. +global dg-do-what-default +set save-dg-do-what-default ${dg-do-what-default} + +# Set up flags used for tests that don't specify options. +global DEFAULT_VECTCFLAGS +set DEFAULT_VECTCFLAGS "" + +# These flags are used for all targets. +lappend DEFAULT_VECTCFLAGS "-O2" "-ftree-vectorize" "-fno-vect-cost-model" + +set VECT_SLP_CFLAGS $DEFAULT_VECTCFLAGS + +lappend DEFAULT_VECTCFLAGS "-fdump-tree-vect-details" +lappend VECT_SLP_CFLAGS "-fdump-tree-slp-details" + + +# Skip these tests for targets that do not support generating vector +# code. Set additional target-dependent vector flags, which can be +# overridden by using dg-options in individual tests. +if ![check_vect_support_and_set_flags] { + return +} + +# Initialize `dg'. +dg-init + +# Main loop. +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/pr*.{c,cc,S} ]] \ + "" $DEFAULT_VECTCFLAGS +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/slp-pr*.{c,cc,S} ]] \ + "" $VECT_SLP_CFLAGS + +#### Tests with special options +global SAVED_DEFAULT_VECTCFLAGS +set SAVED_DEFAULT_VECTCFLAGS $DEFAULT_VECTCFLAGS + +# --param max-aliased-vops=0 +set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS +lappend DEFAULT_VECTCFLAGS "--param max-aliased-vops=0" +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/param-max-aliased*.\[cS\]]] \ + "" $DEFAULT_VECTCFLAGS + +# Clean up. +set dg-do-what-default ${save-dg-do-what-default} + +# All done. +dg-finish diff --git a/gcc/testsuite/g++.dg/warn/Wall-write-strings.C b/gcc/testsuite/g++.dg/warn/Wall-write-strings.C new file mode 100644 index 000000000..e380b321b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wall-write-strings.C @@ -0,0 +1,7 @@ +// PR 8586 +// { dg-do compile } +// { dg-options "-Wall" } + +char* foo = "foo"; // { dg-warning "" } +const char* bar = "bar"; + diff --git a/gcc/testsuite/g++.dg/warn/Walways-true-1.C b/gcc/testsuite/g++.dg/warn/Walways-true-1.C new file mode 100644 index 000000000..ae6f9dc83 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Walways-true-1.C @@ -0,0 +1,57 @@ +// Test -Waddress for testing an address against NULL. +// Origin: Ian Lance Taylor <iant@google.com> + +// { dg-do compile } +// { dg-options "-Waddress" } + +extern int foo (int); + +int i; + +void +bar (int a) +{ + lab: + if (foo) // { dg-warning "always evaluate as" "correct warning" } + foo (0); + if (foo (1)) + ; + if (&i) // { dg-warning "always evaluate as" "correct warning" } + foo (2); + if (i) + foo (3); + if (&a) // { dg-warning "always evaluate as" "correct warning" } + foo (4); + if (a) + foo (5); + if (&&lab) // { dg-warning "always evaluate as" "correct warning" } + foo (6); + if (foo == 0) // { dg-warning "never be NULL" "correct warning" } + foo (7); + if (foo (1) == 0) + foo (8); + if (&i == 0) // { dg-warning "never be NULL" "correct warning" } + foo (9); + if (i == 0) + foo (10); + if (&a == 0) // { dg-warning "never be NULL" "correct warning" } + foo (11); + if (a == 0) + foo (12); + if (&&lab == 0) // { dg-warning "never be NULL" "correct warning" } + foo (13); + if (0 == foo) // { dg-warning "never be NULL" "correct warning" } + foo (14); + if (0 == foo (1)) + foo (15); + if (0 == &i) // { dg-warning "never be NULL" "correct warning" } + foo (16); + if (0 == i) + foo (17); + if (0 == &a) // { dg-warning "never be NULL" "correct warning" } + foo (18); + if (0 == a) + foo (19); + if (0 == &&lab) // { dg-warning "never be NULL" "correct warning" } + foo (20); +} diff --git a/gcc/testsuite/g++.dg/warn/Walways-true-2.C b/gcc/testsuite/g++.dg/warn/Walways-true-2.C new file mode 100644 index 000000000..f1573470e --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Walways-true-2.C @@ -0,0 +1,60 @@ +// Make sure we don't assume that a weak symbol is always non-NULL. +// This is just like Walways-true-1.C, except that it uses a weak +// symbol. +// Origin: Ian Lance Taylor <iant@google.com> + +// { dg-do compile } +// { dg-options "-Waddress" } +// { dg-require-weak "" } + +extern int foo (int) __attribute__ ((weak)); + +int i __attribute__ ((weak)); + +void +bar (int a) +{ + lab: + if (foo) + foo (0); + if (foo (1)) + ; + if (&i) + foo (2); + if (i) + foo (3); + if (&a) // { dg-warning "always evaluate as" "correct warning" } + foo (4); + if (a) + foo (5); + if (&&lab) // { dg-warning "always evaluate as" "correct warning" } + foo (6); + if (foo == 0) + foo (7); + if (foo (1) == 0) + foo (8); + if (&i == 0) + foo (9); + if (i == 0) + foo (10); + if (&a == 0) // { dg-warning "never be NULL" "correct warning" } + foo (11); + if (a == 0) + foo (12); + if (&&lab == 0) // { dg-warning "never be NULL" "correct warning" } + foo (13); + if (0 == foo) + foo (14); + if (0 == foo (1)) + foo (15); + if (0 == &i) + foo (16); + if (0 == i) + foo (17); + if (0 == &a) // { dg-warning "never be NULL" "correct warning" } + foo (18); + if (0 == a) + foo (19); + if (0 == &&lab) // { dg-warning "never be NULL" "correct warning" } + foo (20); +} diff --git a/gcc/testsuite/g++.dg/warn/Warray-bounds-2.C b/gcc/testsuite/g++.dg/warn/Warray-bounds-2.C new file mode 100644 index 000000000..796483e0e --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Warray-bounds-2.C @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* Test that -Warray-bounds is enabled by -Wall */ +/* { dg-options "-O2 -Wall" } */ + +int a[10]; + +int* f(void) { + + a[-1] = 0; /* { dg-warning "array subscript" } */ + + return a; +} + diff --git a/gcc/testsuite/g++.dg/warn/Warray-bounds-3.C b/gcc/testsuite/g++.dg/warn/Warray-bounds-3.C new file mode 100644 index 000000000..a85857179 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Warray-bounds-3.C @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wall" } */ + +extern void function(void * x); + +struct A { + long x; + char d[0]; +}; + + +void test(A * a) { + function((char *)a - 4); /* { dg-bogus "below array bounds" } */ +} + diff --git a/gcc/testsuite/g++.dg/warn/Warray-bounds-4.C b/gcc/testsuite/g++.dg/warn/Warray-bounds-4.C new file mode 100644 index 000000000..319038a73 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Warray-bounds-4.C @@ -0,0 +1,37 @@ +// { dg-do compile } +// { dg-options "-O2 -Warray-bounds" } + +class String +{ +public: + virtual unsigned long length() const = 0; + virtual char get(unsigned long index) const = 0; + virtual void set(unsigned long index, char value) = 0; + virtual char& operator[] (unsigned long value) = 0; + virtual ~String() {}; +}; + +template<unsigned long size> class FixedString : public String +{ +private: + char contents[size]; + +public: + virtual unsigned long length() const { return size; } + virtual char get(unsigned long index) const { return contents[index]; } + virtual void set(unsigned long index, char value) { contents[index] = value; } + virtual char& operator[] (unsigned long index) { return contents[index]; } + + FixedString() { contents[0] = '\0'; } // { dg-warning "above array bounds" } +}; + +void print_length (const String& string); + +int main() +{ + const FixedString<0> empty; + + print_length(empty); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/Warray-bounds-5.C b/gcc/testsuite/g++.dg/warn/Warray-bounds-5.C new file mode 100644 index 000000000..06d776a40 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Warray-bounds-5.C @@ -0,0 +1,24 @@ +// { dg-do compile } +// { dg-options "-O2 -Warray-bounds" } + +void f(); + +int c[3]; +int result; + +struct Vector { + static int get(int i) { + if (i >= 3) + f(); + return c[i]; + } +}; + +void g() +{ + for (int i = 0; i < 3; ++i) { + const int index = i % 3; + result = Vector::get(index) + Vector::get(index); + } +} + diff --git a/gcc/testsuite/g++.dg/warn/Warray-bounds.C b/gcc/testsuite/g++.dg/warn/Warray-bounds.C new file mode 100644 index 000000000..61c7c5d8e --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Warray-bounds.C @@ -0,0 +1,92 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Warray-bounds" } */ + +int a[10]; + +extern "C" __SIZE_TYPE__ strlen(const char *s); + +static inline int n(void) { + return strlen("12345"); +} + +void g(int *p); +void h(int p); + +int* f(void) { + int b[10]; + int i; + struct { + int c[10]; + } c; + + a[-1] = 0; /* { dg-warning "array subscript" } */ + a[ 0] = 0; + a[ 1] = 0; + + + a[ 9] = 0; + a[10] = 0; /* { dg-warning "array subscript" } */ + a[11] = 0; /* { dg-warning "array subscript" } */ + a[2 * n() - 11] = 1; /* { dg-warning "array subscript" } */ + a[2 * n() - 10] = 1; + a[2 * n() - 1] = 1; + a[2 * n() - 0] = 1; /* { dg-warning "array subscript" } */ + + b[-1] = 0; /* { dg-warning "array subscript" } */ + b[ 0] = 0; + b[ 1] = 0; + b[ 9] = 0; + b[10] = 0; /* { dg-warning "array subscript" } */ + b[11] = 0; /* { dg-warning "array subscript" } */ + b[2 * n() - 11] = 1; /* { dg-warning "array subscript" } */ + b[2 * n() - 10] = 1; + b[2 * n() - 1] = 1; + b[2 * n() - 0] = 1; /* { dg-warning "array subscript" } */ + + c.c[-1] = 0; /* { dg-warning "array subscript" } */ + c.c[ 0] = 0; + c.c[ 1] = 0; + c.c[ 9] = 0; + c.c[10] = 0; /* { dg-warning "array subscript" } */ + c.c[11] = 0; /* { dg-warning "array subscript" } */ + c.c[2 * n() - 11] = 1; /* { dg-warning "array subscript" } */ + c.c[2 * n() - 10] = 1; + c.c[2 * n() - 1] = 1; + c.c[2 * n() - 0] = 1; /* { dg-warning "array subscript" } */ + + g(&a[8]); + g(&a[9]); + g(&a[10]); + g(&a[11]); /* { dg-warning "array subscript" } */ + g(&a[-30]+10); /* { dg-warning "array subscript" } */ + g(&a[-30]+30); + + g(&b[10]); + g(&c.c[10]); + g(&a[11]); /* { dg-warning "array subscript" } */ + g(&b[11]); /* { dg-warning "array subscript" } */ + g(&c.c[11]); /* { dg-warning "array subscript" } */ + + g(&a[0]); + g(&b[0]); + g(&c.c[0]); + + g(&a[-1]); /* { dg-warning "array subscript" } */ + g(&b[-1]); /* { dg-warning "array subscript" } */ + h(sizeof a[-1]); + h(sizeof a[10]); + h(sizeof b[-1]); + h(sizeof b[10]); + h(sizeof c.c[-1]); + h(sizeof c.c[10]); + + if (10 < 10) + a[10] = 0; + if (10 < 10) + b[10] = 0; + if (-1 >= 0) + c.c[-1] = 0; + + return a; +} + diff --git a/gcc/testsuite/g++.dg/warn/Wbraces1.C b/gcc/testsuite/g++.dg/warn/Wbraces1.C new file mode 100644 index 000000000..0efce7be3 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wbraces1.C @@ -0,0 +1,3 @@ +// PR c++/19755 +// { dg-options "-Wmissing-braces" } +int a[2][2] = { 0, 1 , 2, 3 }; // { dg-warning "" } diff --git a/gcc/testsuite/g++.dg/warn/Wbraces2.C b/gcc/testsuite/g++.dg/warn/Wbraces2.C new file mode 100644 index 000000000..6d54ede9b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wbraces2.C @@ -0,0 +1,15 @@ +// PR c++/20175 +// { dg-options "-Wmissing-braces" } +int a[2][2] = { 0, 1, 2, 3 }; // { dg-warning "missing braces" } +int b[2][2] = { { 0, 1 }, { 2, 3 } }; +int c[2][2] = { { { 0 }, 1 }, { 2, 3 } }; // { dg-error "braces around scalar" } +struct S { char s[6]; int i; }; +S d = { "hello", 1 }; +S e = { { "hello" }, 1 }; +S f = { { { "hello" } }, 1 }; // { dg-error "braces around scalar" } +S g = { 'h', 'e', 'l', 'l', 'o', '\0', 1 }; // { dg-warning "missing braces" } +struct T { wchar_t s[6]; int i; }; +T i = { L"hello", 1 }; +T j = { { L"hello" }, 1 }; +T k = { { { L"hello" } }, 1 }; // { dg-error "braces around scalar" } +T l = { L'h', L'e', L'l', L'l', L'o', L'\0', 1 };// { dg-warning "missing braces" } diff --git a/gcc/testsuite/g++.dg/warn/Wcast-qual1.C b/gcc/testsuite/g++.dg/warn/Wcast-qual1.C new file mode 100644 index 000000000..e6ad4f6a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wcast-qual1.C @@ -0,0 +1,7 @@ +// PR c++/24667 +// { dg-options "-Wcast-qual" } + +int main(int, char**) { + const int foo[2] = {1,1}; + ((int*)foo)[0] = 0; // { dg-warning "cast" } +} diff --git a/gcc/testsuite/g++.dg/warn/Wcast-qual2.C b/gcc/testsuite/g++.dg/warn/Wcast-qual2.C new file mode 100644 index 000000000..88fdcfb38 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wcast-qual2.C @@ -0,0 +1,167 @@ +/* { dg-do compile } */ +/* { dg-options "-Wcast-qual" } */ + +/* The files gcc.dg/cast-qual-3.c and g++.dg/warn/Wcast-qual2.c are + duals. they are intended to show that gcc -Wcast-qual and g++ + -Wcast-qual emit warnings in the same cases. If you change this + file, please also change the other one. */ + +void +f1 (void *bar) +{ + const void *p1 = (const void *) bar; + const char *p2 = (const char *) bar; + const void **p3 = (const void **) bar; + const char **p4 = (const char **) bar; + const void * const *p5 = (const void * const *) bar; + const char * const *p6 = (const char * const *) bar; + void * const *p7 = (void * const *) bar; + char * const *p8 = (char * const *) bar; + const void ***p9 = (const void ***) bar; + const char ***p10 = (const char ***) bar; + void * const **p11 = (void * const **) bar; + char * const **p12 = (char * const **) bar; + void ** const *p13 = (void ** const *) bar; + char ** const *p14 = (char ** const *) bar; + const void * const **p15 = (const void * const **) bar; + const char * const **p16 = (const char * const **) bar; + const void ** const *p17 = (const void ** const *) bar; + const char ** const *p18 = (const char ** const *) bar; + void * const * const * p19 = (void * const * const *) bar; + char * const * const * p20 = (char * const * const *) bar; + const void * const * const *p21 = (const void * const * const *) bar; + const char * const * const *p22 = (const char * const * const *) bar; +} + +void +f2 (void **bar) +{ + const void *p1 = (const void *) bar; + const char *p2 = (const char *) bar; + const void **p3 = (const void **) bar; /* { dg-warning "cast" } */ + const char **p4 = (const char **) bar; + const void * const *p5 = (const void * const *) bar; + const char * const *p6 = (const char * const *) bar; + void * const *p7 = (void * const *) bar; + char * const *p8 = (char * const *) bar; + const void ***p9 = (const void ***) bar; + const char ***p10 = (const char ***) bar; + void * const **p11 = (void * const **) bar; + char * const **p12 = (char * const **) bar; + void ** const *p13 = (void ** const *) bar; + char ** const *p14 = (char ** const *) bar; + const void * const **p15 = (const void * const **) bar; + const char * const **p16 = (const char * const **) bar; + const void ** const *p17 = (const void ** const *) bar; + const char ** const *p18 = (const char ** const *) bar; + void * const * const * p19 = (void * const * const *) bar; + char * const * const * p20 = (char * const * const *) bar; + const void * const * const *p21 = (const void * const * const *) bar; + const char * const * const *p22 = (const char * const * const *) bar; +} + +void +f3 (void ***bar) +{ + const void *p1 = (const void *) bar; + const char *p2 = (const char *) bar; + const void **p3 = (const void **) bar; + const char **p4 = (const char **) bar; + const void * const *p5 = (const void * const *) bar; + const char * const *p6 = (const char * const *) bar; + void * const *p7 = (void * const *) bar; + char * const *p8 = (char * const *) bar; + const void ***p9 = (const void ***) bar; /* { dg-warning "cast" } */ + const char ***p10 = (const char ***) bar; + void * const **p11 = (void * const **) bar; /* { dg-warning "cast" } */ + char * const **p12 = (char * const **) bar; + void ** const *p13 = (void ** const *) bar; + char ** const *p14 = (char ** const *) bar; + const void * const **p15 = (const void * const **) bar; /* { dg-warning "cast" } */ + const char * const **p16 = (const char * const **) bar; + const void ** const *p17 = (const void ** const *) bar; /* { dg-warning "cast" } */ + const char ** const *p18 = (const char ** const *) bar; + void * const * const * p19 = (void * const * const *) bar; + char * const * const * p20 = (char * const * const *) bar; + const void * const * const *p21 = (const void * const * const *) bar; + const char * const * const *p22 = (const char * const * const *) bar; +} + +void +f4 (void * const **bar) +{ + const void ***p9 = (const void ***) bar; /* { dg-warning "cast" } */ + void * const **p11 = (void * const **) bar; + void ** const *p13 = (void ** const *) bar; /* { dg-warning "cast" } */ + const void * const **p15 = (const void * const **) bar; /* { dg-warning "cast" } */ + const void ** const *p17 = (const void ** const *) bar; /* { dg-warning "cast" } */ + void * const * const * p19 = (void * const * const *) bar; + const void * const * const *p21 = (const void * const * const *) bar; +} + +void +f5 (char ***bar) +{ + volatile const char ***p9 = (volatile const char ***) bar; /* { dg-warning "cast" } */ + volatile char * const **p11 = (volatile char * const **) bar; /* { dg-warning "cast" } */ + volatile char ** const *p13 = (volatile char ** const *) bar; /* { dg-warning "cast" } */ + volatile const char * const **p15 = (volatile const char * const **) bar; /* { dg-warning "cast" } */ + volatile const char ** const *p17 = (volatile const char ** const *) bar; /* { dg-warning "cast" } */ + volatile char * const * const * p19 = (volatile char * const * const *) bar; + volatile const char * const * const *p21 = (volatile const char * const * const *) bar; +} + +void +f6 (char ***bar) +{ + const char * volatile **p9 = (const char * volatile **) bar; /* { dg-warning "cast" } */ + char * volatile const **p11 = (char * volatile const **) bar; /* { dg-warning "cast" } */ + char * volatile * const *p13 = (char * volatile * const *) bar; + const char * volatile const **p15 = (const char * volatile const **) bar; /* { dg-warning "cast" } */ + const char * volatile * const *p17 = (const char * volatile * const *) bar; /* { dg-warning "cast" } */ + char * volatile const * const * p19 = (char * volatile const * const *) bar; + const char * volatile const * const *p21 = (const char * volatile const * const *) bar; +} + +void +f7 (char ***bar) +{ + const char ** volatile *p9 = (const char ** volatile *) bar; /* { dg-warning "cast" } */ + char * const * volatile *p11 = (char * const * volatile *) bar; /* { dg-warning "cast" } */ + char ** volatile const *p13 = (char ** volatile const *) bar; + const char * const * volatile *p15 = (const char * const * volatile *) bar; /* { dg-warning "cast" } */ + const char ** volatile const *p17 = (const char ** volatile const *) bar; /* { dg-warning "cast" } */ + char * const * volatile const * p19 = (char * const * volatile const *) bar; + const char * const * volatile const *p21 = (const char * const * volatile const *) bar; +} + +typedef int (intfn) (int); +typedef intfn *pintfn; +typedef const intfn *constfn; + +void +f8 (constfn ***bar) +{ + const constfn *p1 = (const constfn *) bar; + const pintfn *p2 = (const pintfn *) bar; + const constfn **p3 = (const constfn **) bar; + const pintfn **p4 = (const pintfn **) bar; + const constfn * const *p5 = (const constfn * const *) bar; + const pintfn * const *p6 = (const pintfn * const *) bar; + constfn * const *p7 = (constfn * const *) bar; + pintfn * const *p8 = (pintfn * const *) bar; + const constfn ***p9 = (const constfn ***) bar; /* { dg-warning "cast" } */ + const pintfn ***p10 = (const pintfn ***) bar; /* { dg-warning "cast" } */ + constfn * const **p11 = (constfn * const **) bar; /* { dg-warning "cast" } */ + pintfn * const **p12 = (pintfn * const **) bar; /* { dg-warning "cast" } */ + constfn ** const *p13 = (constfn ** const *) bar; + pintfn ** const *p14 = (pintfn ** const *) bar; + const constfn * const **p15 = (const constfn * const **) bar; /* { dg-warning "cast" } */ + const pintfn * const **p16 = (const pintfn * const **) bar; /* { dg-warning "cast" } */ + const constfn ** const *p17 = (const constfn ** const *) bar; /* { dg-warning "cast" } */ + const pintfn ** const *p18 = (const pintfn ** const *) bar; /* { dg-warning "cast" } */ + constfn * const * const * p19 = (constfn * const * const *) bar; + pintfn * const * const * p20 = (pintfn * const * const *) bar; + const constfn * const * const *p21 = (const constfn * const * const *) bar; + const pintfn * const * const *p22 = (const pintfn * const * const *) bar; +} diff --git a/gcc/testsuite/g++.dg/warn/Wchar-subscripts-2.C b/gcc/testsuite/g++.dg/warn/Wchar-subscripts-2.C new file mode 100644 index 000000000..2170cb206 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wchar-subscripts-2.C @@ -0,0 +1,15 @@ +/* PR c++/16307 */ +// { dg-do compile } +// { dg-options "-Wchar-subscripts" } + +extern volatile char bla; + +char foo (const char *s) +{ + return s [bla]; // { dg-warning "array subscript" } +} + +int main () +{ + foo ("\x80"); +} diff --git a/gcc/testsuite/g++.dg/warn/Wchar-subscripts.C b/gcc/testsuite/g++.dg/warn/Wchar-subscripts.C new file mode 100644 index 000000000..bc38585d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wchar-subscripts.C @@ -0,0 +1,12 @@ +/* Copyright (C) 2005 Free Software Foundation. + + by Gabriel Dos Reis <gdr@integrable-solutions.net> */ + +// { dg-do compile } +// { dg-options "-Wchar-subscripts" } + +int main() +{ + int ary[256] = { 0 }; + return ary['a']; +} diff --git a/gcc/testsuite/g++.dg/warn/Wconversion-integer.C b/gcc/testsuite/g++.dg/warn/Wconversion-integer.C new file mode 100644 index 000000000..42d9cb000 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wconversion-integer.C @@ -0,0 +1,94 @@ +/* Test for diagnostics for implicit conversions between integer types + C++ equivalent of gcc/testsuite/gcc.dg/Wconversion-integer.c */ + +// { dg-do compile } +// { dg-options "-fsigned-char -Wconversion" } + +#include <limits.h> + +void fsc (signed char sc); +void fuc (unsigned char uc); +unsigned fui (unsigned int ui); +void fsi (signed int ui); + +void h (int x) +{ + unsigned int ui = 3; + int si = 3; + unsigned char uc = 3; + signed char sc = 3; + + uc = ui; /* { dg-warning "conversion" } */ + uc = si; /* { dg-warning "conversion" } */ + sc = ui; /* { dg-warning "conversion" } */ + sc = si; /* { dg-warning "conversion" } */ + fuc (ui); /* { dg-warning "conversion" } */ + fuc (si); /* { dg-warning "conversion" } */ + fsc (ui); /* { dg-warning "conversion" } */ + fsc (si); /* { dg-warning "conversion" } */ + + fsi (si); + fui (ui); + fsi (uc); + si = uc; + fui (uc); + ui = uc; + fui ('A'); + ui = 'A'; + fsi ('A'); + si = 'A'; + fuc ('A'); + uc = 'A'; + + uc = x ? 1U : -1; /* { dg-warning "conversion" } */ + uc = x ? SCHAR_MIN : 1U; /* { dg-warning "conversion" } */ + uc = x ? 1 : -1; /* Warned by -Wsign-conversion. */ + uc = x ? SCHAR_MIN : 1; /* Warned by -Wsign-conversion. */ + ui = x ? 1U : -1; /* Warned by -Wsign-conversion. */ + ui = x ? INT_MIN : 1U; /* Warned by -Wsign-conversion. */ + ui = ui ? SCHAR_MIN : 1U; /* Warned by -Wsign-conversion. */ + ui = 1U * -1; /* Warned by -Wsign-conversion. */ + ui = ui + INT_MIN; /* Warned by -Wsign-conversion. */ + ui = x ? 1 : -1; /* Warned by -Wsign-conversion. */ + ui = ui ? SCHAR_MIN : 1; /* Warned by -Wsign-conversion. */ + + fuc (-1); /* Warned by -Wsign-conversion. */ + uc = -1; /* Warned by -Wsign-conversion. */ + fui (-1); /* Warned by -Wsign-conversion. */ + ui = -1; /* Warned by -Wsign-conversion. */ + fuc ('\xa0'); /* Warned by -Wsign-conversion. */ + uc = '\xa0'; /* Warned by -Wsign-conversion. */ + fui ('\xa0'); /* Warned by -Wsign-conversion. */ + ui = '\xa0'; /* Warned by -Wsign-conversion. */ + fsi (0x80000000); /* Warned by -Wsign-conversion. */ + si = 0x80000000; /* Warned by -Wsign-conversion. */ + + + fsi (UINT_MAX - 1); /* Warned by -Wsign-conversion. */ + si = UINT_MAX - 1; /* Warned by -Wsign-conversion. */ + fsi (UINT_MAX - 1U); /* Warned by -Wsign-conversion. */ + si = UINT_MAX - 1U; /* Warned by -Wsign-conversion. */ + fsi (UINT_MAX/3U); + si = UINT_MAX/3U; + fsi (UINT_MAX/3); + si = UINT_MAX/3; + fui (UINT_MAX - 1); + ui = UINT_MAX - 1; + + uc = (unsigned char) -1; + ui = -1 * (1 * -1); + ui = (unsigned) -1; + + fsc (uc); /* Warned by -Wsign-conversion. */ + sc = uc; /* Warned by -Wsign-conversion. */ + fuc (sc); /* Warned by -Wsign-conversion. */ + uc = sc; /* Warned by -Wsign-conversion. */ + fsi (ui); /* Warned by -Wsign-conversion. */ + si = ui; /* Warned by -Wsign-conversion. */ + fui (si); /* Warned by -Wsign-conversion. */ + ui = si; /* Warned by -Wsign-conversion. */ + fui (sc); /* Warned by -Wsign-conversion. */ + ui = sc; /* Warned by -Wsign-conversion. */ +} + +unsigned fui (unsigned a) { return a + -1; } /* Warned by -Wsign-conversion. */ diff --git a/gcc/testsuite/g++.dg/warn/Wconversion-null-2.C b/gcc/testsuite/g++.dg/warn/Wconversion-null-2.C new file mode 100644 index 000000000..c3050f612 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wconversion-null-2.C @@ -0,0 +1,49 @@ +// { dg-do link } +// { dg-options "" } + +#include <cstddef> + +void g(int) {} +void g(long) {} +void g(long long) {} +extern void g(void*); + +template <int I> +void h() {} + +void k(int) {} + +template <class T> +void l(T); + +template <> +void l(int) {} + +template <> +void l(long) {} + +template <> +void l(long long) {} + +int main() +{ + int i = NULL; // { dg-warning "" } converting NULL to non-pointer type + float z = NULL; // { dg-warning "" } converting NULL to non-pointer type + int a[2]; + + i != NULL; // { dg-warning "" } NULL used in arithmetic + NULL != z; // { dg-warning "" } NULL used in arithmetic + k != NULL; // No warning: decay conversion + NULL != a; // Likewise. + -NULL; // { dg-warning "" } converting NULL to non-pointer type + +NULL; // { dg-warning "" } converting NULL to non-pointer type + ~NULL; // { dg-warning "" } converting NULL to non-pointer type + a[NULL] = 3; // { dg-warning "" } converting NULL to non-pointer-type + i = NULL; // { dg-warning "" } converting NULL to non-pointer type + z = NULL; // { dg-warning "" } converting NULL to non-pointer type + k(NULL); // { dg-warning "" } converting NULL to int + g(NULL); // { dg-warning "" } converting NULL to int + h<NULL>(); // No warning: NULL bound to integer template parameter + l(NULL); // { dg-warning "" } converting NULL to int + NULL && NULL; // No warning: converting NULL to bool is OK +} diff --git a/gcc/testsuite/g++.dg/warn/Wconversion-null.C b/gcc/testsuite/g++.dg/warn/Wconversion-null.C new file mode 100644 index 000000000..e2ca13e51 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wconversion-null.C @@ -0,0 +1,49 @@ +// { dg-do link } +// { dg-options "-Wconversion -Wno-conversion-null -Wno-pointer-arith" } + +#include <cstddef> + +void g(int) {} +void g(long) {} +void g(long long) {} +extern void g(void*); + +template <int I> +void h() {} + +void k(int) {} + +template <class T> +void l(T); + +template <> +void l(int) {} + +template <> +void l(long) {} + +template <> +void l(long long) {} + +int main() +{ + int i = NULL; // converting NULL to non-pointer type + float z = NULL; // converting NULL to non-pointer type + int a[2]; + + i != NULL; // NULL used in arithmetic + NULL != z; // NULL used in arithmetic + k != NULL; // No warning: decay conversion + NULL != a; // Likewise. + -NULL; // converting NULL to non-pointer type + +NULL; // converting NULL to non-pointer type + ~NULL; // converting NULL to non-pointer type + a[NULL] = 3; // converting NULL to non-pointer-type + i = NULL; // converting NULL to non-pointer type + z = NULL; // converting NULL to non-pointer type + k(NULL); // converting NULL to int + g(NULL); // converting NULL to int + h<NULL>(); // No warning: NULL bound to integer template parameter + l(NULL); // converting NULL to int + NULL && NULL; // No warning: converting NULL to bool is OK +} diff --git a/gcc/testsuite/g++.dg/warn/Wconversion-pr34389.C b/gcc/testsuite/g++.dg/warn/Wconversion-pr34389.C new file mode 100644 index 000000000..43df8f902 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wconversion-pr34389.C @@ -0,0 +1,54 @@ +/* PR 34389 */ +/* { dg-do compile } */ +/* { dg-options "-Wconversion -Wsign-conversion" } */ +/* { dg-require-effective-target int32plus } */ +short mask1(short x) +{ + short y = 0x7fff; + return x & y; /* { dg-bogus "conversion" "bogus warning" } */ +} + +short mask2(short ssx) +{ + short ssy; + short ssz; + + ssz = ((int)ssx) & 0x7fff; + ssy = ((int)ssx) | 0x7fff; + ssz = ((int)ssx) ^ 0x7fff; + return ssx & 0x7fff; +} + +short mask3(int si, unsigned int ui) +{ + short ss; + unsigned short us; + + ss = si & 0x7fff; + ss = si & 0xAAAA; /* { dg-warning "conversion" } */ + ss = ui & 0x7fff; + ss = ui & 0xAAAA; /* { dg-warning "conversion" } */ + + us = si & 0x7fff; + us = si & 0xAAAA; /* { dg-warning "conversion" } */ + us = ui & 0x7fff; + us = ui & 0xAAAA; /* 0xAAAA is zero-extended, thus it masks the + upper bits of 'ui' making it fit in 'us'. */ + + return ss; +} + +short mask4(int x, int y) +{ + return x & y; /* { dg-warning "conversion" } */ +} + +short mask5(int x) +{ + return x & -1; /* { dg-warning "conversion" } */ +} + +short mask6(short x) +{ + return x & -1; +} diff --git a/gcc/testsuite/g++.dg/warn/Wconversion-real-integer.C b/gcc/testsuite/g++.dg/warn/Wconversion-real-integer.C new file mode 100644 index 000000000..282ac13da --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wconversion-real-integer.C @@ -0,0 +1,112 @@ +/* Test for diagnostics for Wconversion between floating-point and + integers. C++ equivalent of + gcc/testsuite/gcc.dg/Wconversion-real-integer.c */ + +/* { dg-do compile } +/* { dg-options "-Wconversion" } */ +/* { dg-require-effective-target int32plus } */ +#include <limits.h> + +void fsi (signed int x); +void fui (unsigned int x); +void ffloat (float x); +void fdouble (double x); + +float vfloat; +double vdouble; + +void h (void) +{ + unsigned int ui = 3; + int si = 3; + unsigned char uc = 3; + signed char sc = 3; + float f = 3; + double d = 3; + + fsi (3.1f); /* { dg-warning "conversion" } */ + si = 3.1f; /* { dg-warning "conversion" } */ + fsi (3.1); /* { dg-warning "conversion" } */ + si = 3.1; /* { dg-warning "conversion" } */ + fsi (d); /* { dg-warning "conversion" } */ + si = d; /* { dg-warning "conversion" } */ + fui (-1.0); /* { dg-warning "overflow" } */ + ui = -1.0; /* { dg-warning "overflow" } */ + ffloat (INT_MAX); /* { dg-warning "conversion" } */ + vfloat = INT_MAX; /* { dg-warning "conversion" } */ + ffloat (16777217); /* { dg-warning "conversion" } */ + vfloat = 16777217; /* { dg-warning "conversion" } */ + ffloat (si); /* { dg-warning "conversion" } */ + vfloat = si; /* { dg-warning "conversion" } */ + ffloat (ui); /* { dg-warning "conversion" } */ + vfloat = ui; /* { dg-warning "conversion" } */ + + fsi (3); + si = 3; + fsi (3.0f); + si = 3.0f; + fsi (3.0); + si = 3.0; + fsi (16777217.0f); + si = 16777217.0f; + fsi ((int) 3.1); + si = (int) 3.1; + ffloat (3U); + vfloat = 3U; + ffloat (3); + vfloat = 3; + ffloat (INT_MIN); + vfloat = INT_MIN; + ffloat (uc); + vfloat = uc; + ffloat (sc); + vfloat = sc; + + fdouble (UINT_MAX); + vdouble = UINT_MAX; + fdouble (ui); + vdouble = ui; + fdouble (si); + vdouble = si; +} + + +void fss (signed short x); +void fus (unsigned short x); +void fsc (signed char x); +void fuc (unsigned char x); + +void h2 (void) +{ + unsigned short int us; + short int ss; + unsigned char uc; + signed char sc; + + fss (4294967294.0); /* { dg-warning "conversion" } */ + ss = 4294967294.0; /* { dg-warning "conversion" } */ + fss (-4294967294.0); /* { dg-warning "conversion" } */ + ss = -4294967294.0; /* { dg-warning "conversion" } */ + fus (4294967294.0); /* { dg-warning "conversion" } */ + us = 4294967294.0; /* { dg-warning "conversion" } */ + fus (-4294967294.0); /* { dg-warning "conversion" } */ + us = -4294967294.0; /* { dg-warning "conversion" } */ + + fsc (500.0); /* { dg-warning "conversion" } */ + sc = 500.0; /* { dg-warning "conversion" } */ + fsc (-500.0); /* { dg-warning "conversion" } */ + sc = -500.0; /* { dg-warning "conversion" } */ + fuc (500.0); /* { dg-warning "conversion" } */ + uc = 500.0; /* { dg-warning "conversion" } */ + fuc (-500.0); /* { dg-warning "conversion" } */ + uc = -500.0; /* { dg-warning "conversion" } */ + + fss (500.0); + ss = 500.0; + fss (-500.0); + ss = -500.0; + fus (500.0); + us = 500.0; + fus (-500.0); /* { dg-warning "conversion" } */ + us = -500.0; /* { dg-warning "conversion" } */ +} diff --git a/gcc/testsuite/g++.dg/warn/Wconversion-real.C b/gcc/testsuite/g++.dg/warn/Wconversion-real.C new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wconversion-real.C diff --git a/gcc/testsuite/g++.dg/warn/Wconversion1.C b/gcc/testsuite/g++.dg/warn/Wconversion1.C new file mode 100644 index 000000000..48e319ad6 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wconversion1.C @@ -0,0 +1,12 @@ +// { dg-options "-fsigned-char -Wsign-conversion" } + +char c1 = 1024; // { dg-warning "overflow" } +char c2 = char(1024); +char c3 = (char) 1024; +char c4 = static_cast<char>(1024); + +unsigned char uc1 = -129; // { dg-warning "unsigned" } + +bool b1 = -3; + +int i1 = 0x80000000; // { dg-warning "conversion" } diff --git a/gcc/testsuite/g++.dg/warn/Wconversion2.C b/gcc/testsuite/g++.dg/warn/Wconversion2.C new file mode 100644 index 000000000..226dd852b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wconversion2.C @@ -0,0 +1,3 @@ +// { dg-options "-Wconversion-null" } +void foo(const char *); +void bar() { foo(false); } // { dg-warning "pointer type for argument" } diff --git a/gcc/testsuite/g++.dg/warn/Wconversion3.C b/gcc/testsuite/g++.dg/warn/Wconversion3.C new file mode 100644 index 000000000..24202b7d9 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wconversion3.C @@ -0,0 +1,35 @@ +// PR c++/34198 +// { dg-do compile } +// { dg-options "-O2 -Wconversion -Wsign-conversion" } + +signed char sc; +unsigned char uc; +short int ss; +unsigned short int us; +int si; +unsigned int ui; + +void test1 (void) +{ + int a = uc & 0xff; + int b = sc & 0x7f; + int c = 0xff & uc; + int d = 0x7f & sc; + int e = uc & sc; + unsigned char f = (int) uc; + signed char g = (int) sc; + unsigned char h = (unsigned int) (short int) uc; + signed char i = (int) (unsigned short int) sc; // { dg-warning "may alter its value" } + unsigned char j = (unsigned int) (short int) us; // { dg-warning "may alter its value" } + signed char k = (int) (unsigned short int) ss; // { dg-warning "may alter its value" } +} + +void test2 (void) +{ + signed char a = (unsigned char) sc; // { dg-warning "may change the sign" } + unsigned char b = (signed char) uc; // { dg-warning "may change the sign" } + signed char c = (int) (unsigned char) sc; // { dg-warning "may change the sign" } + unsigned char d = (int) (signed char) uc; // { dg-warning "may change the sign" } + int e = (unsigned int) si; // { dg-warning "may change the sign" } + unsigned int f = (int) ui; // { dg-warning "may change the sign" } +} diff --git a/gcc/testsuite/g++.dg/warn/Wctor-dtor.C b/gcc/testsuite/g++.dg/warn/Wctor-dtor.C new file mode 100644 index 000000000..15efb6b57 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wctor-dtor.C @@ -0,0 +1,13 @@ +// PR c++/21347 +// { dg-options "-Wctor-dtor-privacy" } + +class A { +public: + int x; + int getX() { return x; } // comment out to avoid warning +}; + +int foo() { + A a; // accepted: clearly the ctor is not private + return a.x; +} diff --git a/gcc/testsuite/g++.dg/warn/Wdiv-by-zero.C b/gcc/testsuite/g++.dg/warn/Wdiv-by-zero.C new file mode 100644 index 000000000..7dc77667c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wdiv-by-zero.C @@ -0,0 +1,7 @@ +// test that division by zero warnings are enabled by default +int breakme() +{ + int x = 0; + x /= 0; // { dg-warning "division by" } + return x; +} diff --git a/gcc/testsuite/g++.dg/warn/Wdouble-promotion.C b/gcc/testsuite/g++.dg/warn/Wdouble-promotion.C new file mode 100644 index 000000000..9b4044f77 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wdouble-promotion.C @@ -0,0 +1,99 @@ +/* { dg-do compile } */ +/* { dg-options "-Wdouble-promotion" } */ + +#include <stddef.h> + +/* Some targets do not provide <complex.h> so we define I ourselves. */ +#define I 1.0iF +#define ID ((_Complex double)I) + +float f; +double d; +int i; +long double ld; +_Complex float cf; +_Complex double cd; +_Complex long double cld; +size_t s; + +extern void varargs_fn (int, ...); +extern void double_fn (double); +extern float float_fn (void); + +void +usual_arithmetic_conversions(void) +{ + float local_f; + _Complex float local_cf; + + /* Values of type "float" are implicitly converted to "double" or + "long double" due to use in arithmetic with "double" or "long + double" operands. */ + local_f = f + 1.0; /* { dg-warning "implicit" } */ + local_f = f - d; /* { dg-warning "implicit" } */ + local_f = 1.0f * 1.0; /* { dg-warning "implicit" } */ + local_f = 1.0f / d; /* { dg-warning "implicit" } */ + + local_cf = cf + 1.0; /* { dg-warning "implicit" } */ + local_cf = cf - d; /* { dg-warning "implicit" } */ + local_cf = cf + 1.0 * ID; /* { dg-warning "implicit" } */ + local_cf = cf - cd; /* { dg-warning "implicit" } */ + + local_f = i ? f : d; /* { dg-warning "implicit" } */ + i = f == d; /* { dg-warning "implicit" } */ + i = d != f; /* { dg-warning "implicit" } */ +} + +void +default_argument_promotion (void) +{ + /* Because "f" is part of the variable argument list, it is promoted + to "double". */ + varargs_fn (1, f); /* { dg-warning "implicit" } */ +} + +/* There is no warning when an explicit cast is used to perform the + conversion. */ + +void +casts (void) +{ + float local_f; + _Complex float local_cf; + + local_f = (double)f + 1.0; /* { dg-bogus "implicit" } */ + local_f = (double)f - d; /* { dg-bogus "implicit" } */ + local_f = (double)1.0f + 1.0; /* { dg-bogus "implicit" } */ + local_f = (double)1.0f - d; /* { dg-bogus "implicit" } */ + + local_cf = (_Complex double)cf + 1.0; /* { dg-bogus "implicit" } */ + local_cf = (_Complex double)cf - d; /* { dg-bogus "implicit" } */ + local_cf = (_Complex double)cf + 1.0 * ID; /* { dg-bogus "implicit" } */ + local_cf = (_Complex double)cf - cd; /* { dg-bogus "implicit" } */ + + local_f = i ? (double)f : d; /* { dg-bogus "implicit" } */ + i = (double)f == d; /* { dg-bogus "implicit" } */ + i = d != (double)f; /* { dg-bogus "implicit" } */ +} + +/* There is no warning on conversions that occur in assignment (and + assignment-like) contexts. */ + +void +assignments (void) +{ + d = f; /* { dg-bogus "implicit" } */ + double_fn (f); /* { dg-bogus "implicit" } */ + d = float_fn (); /* { dg-bogus "implicit" } */ +} + +/* There is no warning in non-evaluated contexts. */ + +void +non_evaluated (void) +{ + s = sizeof (f + 1.0); /* { dg-bogus "implicit" } */ + s = __alignof__ (f + 1.0); /* { dg-bogus "implicit" } */ + d = (__typeof__(f + 1.0))f; /* { dg-bogus "implicit" } */ + s = sizeof (i ? f : d); /* { dg-bogus "implicit" } */ +} diff --git a/gcc/testsuite/g++.dg/warn/Wdtor1.C b/gcc/testsuite/g++.dg/warn/Wdtor1.C new file mode 100644 index 000000000..34c8a7edc --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wdtor1.C @@ -0,0 +1,22 @@ +// PR c++/20145 +// { dg-options "-Wnon-virtual-dtor" } +# 1 "t.cc" +# 1 "<built-in>" +# 1 "<command line>" +# 1 "t.cc" +# 1 "include/t.h" 1 3 4 +// Declare the template with explicit C++ linkage in case system +// headers have implicit C linkage. +extern "C++" { +template <int> class t +{ + virtual void f(); +}; +} +# 2 "t.cc" 2 + +void f(void) +{ + t<1> h; +} + diff --git a/gcc/testsuite/g++.dg/warn/Weff1.C b/gcc/testsuite/g++.dg/warn/Weff1.C new file mode 100644 index 000000000..a00dc29bf --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Weff1.C @@ -0,0 +1,5 @@ +// { dg-options "-Weffc++" } + +struct S {}; +/* Base classes should have virtual destructors. */ +struct T : public S {}; // { dg-warning "" } diff --git a/gcc/testsuite/g++.dg/warn/Wenum-compare-no.C b/gcc/testsuite/g++.dg/warn/Wenum-compare-no.C new file mode 100644 index 000000000..7dc27d3fe --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wenum-compare-no.C @@ -0,0 +1,10 @@ +/* Test disabling -Wenum-compare (on by default). See PR27975. */ +/* { dg-do compile } */ +/* { dg-options "-Wno-enum-compare" } */ +enum E1 { a }; +enum E2 { b }; + +int foo (E1 e1, E2 e2) +{ + return e1 == e2; /* { dg-bogus "comparison between" } */ +} diff --git a/gcc/testsuite/g++.dg/warn/Wenum-compare.C b/gcc/testsuite/g++.dg/warn/Wenum-compare.C new file mode 100644 index 000000000..f60080039 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wenum-compare.C @@ -0,0 +1,10 @@ +/* Test that we get the -Wenum-compare by default. See PR27975. */ +/* { dg-do compile } */ +/* { dg-options "" } */ +enum E1 { a }; +enum E2 { b }; + +int foo (E1 e1, E2 e2) +{ + return e1 == e2; /* { dg-warning "comparison between" } */ +} diff --git a/gcc/testsuite/g++.dg/warn/Wextra-1.C b/gcc/testsuite/g++.dg/warn/Wextra-1.C new file mode 100644 index 000000000..c75a6b087 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wextra-1.C @@ -0,0 +1,12 @@ +// { dg-options "-Wextra" } + +struct T { + // If the implicitly-declared default constructor for "T" is + // required, an error will be issued because "i" cannot be + // initialized. And, this class is not an aggregate, so it cannot + // be brace-initialized. Thus, there is no way to create an object + // of this class. We issue a warning with -Wextra. + const int i; // { dg-warning "const" } +private: + int j; +}; diff --git a/gcc/testsuite/g++.dg/warn/Wextra-2.C b/gcc/testsuite/g++.dg/warn/Wextra-2.C new file mode 100644 index 000000000..5ca41c39d --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wextra-2.C @@ -0,0 +1,15 @@ +// { dg-options "-Wextra" } + +struct S { + S(); +}; + +struct T { +private: + int i; +public: + // There should be no warning about this data member because the + // default constructor for "T" will invoke the default constructor + // for "S", even though "S" is "const". + const S s; // { dg-bogus "const" } +}; diff --git a/gcc/testsuite/g++.dg/warn/Wfloat-equal-1.C b/gcc/testsuite/g++.dg/warn/Wfloat-equal-1.C new file mode 100644 index 000000000..36b3fa53f --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wfloat-equal-1.C @@ -0,0 +1,10 @@ +/* PR c/19999 */ +/* { dg-do compile } */ +/* { dg-options "-Wfloat-equal" } */ + +double a, b; +_Complex double c, d; +int f(void) { return a == b; } /* { dg-warning "comparing floating point" } */ +int g(void) { return c == d; } /* { dg-warning "comparing floating point" } */ +int h(void) { return a != b; } /* { dg-warning "comparing floating point" } */ +int i(void) { return c != d; } /* { dg-warning "comparing floating point" } */ diff --git a/gcc/testsuite/g++.dg/warn/Winline-1.C b/gcc/testsuite/g++.dg/warn/Winline-1.C new file mode 100644 index 000000000..e1a7e832a --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Winline-1.C @@ -0,0 +1,10 @@ +// { dg-options "-Winline -O2" } + +static inline int foo(int x); + +int main() +{ + return(foo(17)); +} + +inline int foo(int x) { return(x); } diff --git a/gcc/testsuite/g++.dg/warn/Winline-2.C b/gcc/testsuite/g++.dg/warn/Winline-2.C new file mode 100644 index 000000000..69af34351 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Winline-2.C @@ -0,0 +1,5 @@ +// PR c++/10929 +// { dg-options "-Winline -O3" } + +int foo (); +int bar () { return foo (); } diff --git a/gcc/testsuite/g++.dg/warn/Winline-3.C b/gcc/testsuite/g++.dg/warn/Winline-3.C new file mode 100644 index 000000000..1c226d1b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Winline-3.C @@ -0,0 +1,10 @@ +// { dg-options "-Winline -O" } + +#include <vector> + +using namespace std; + +int main(void) +{ + vector<int> v(10); +} diff --git a/gcc/testsuite/g++.dg/warn/Winline-4.C b/gcc/testsuite/g++.dg/warn/Winline-4.C new file mode 100644 index 000000000..188ab5aa8 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Winline-4.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-O2 -Winline" } +// Origin: <markus at oberhumer dot com> +// PR 17115: We should not emit -Winline warning for functions marked with +// noinline + +struct Foo { + __attribute__((noinline)) int a(int r) { return r & 1; } + virtual __attribute__((noinline)) int b(int r) { return r & 1; } + static __attribute__((noinline)) int c(int r) { return r & 1; } +}; + +int bar(int r) { + Foo f; + int k = 1; k &= f.a(r); k &= f.b(r); k &= f.a(r); + return k; +} diff --git a/gcc/testsuite/g++.dg/warn/Wlogical-op-1.C b/gcc/testsuite/g++.dg/warn/Wlogical-op-1.C new file mode 100644 index 000000000..e5b19afbe --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wlogical-op-1.C @@ -0,0 +1,66 @@ +// { dg-do compile } +// { dg-options "-Wlogical-op" } + +enum { a, b1, b2 }; + +enum testenum { t1, t2}; + +extern int c; +extern bool bool_a, bool_b; + +template<typename Enum> +class QFlags +{ +public: + typedef void **Zero; + int i; + inline QFlags(Enum f) : i(f) {} + + inline operator int() const + { return i;} + +}; + +QFlags<testenum> f(t2); +extern void do_something(int); + +extern testenum testa(); + +void foo() +{ + if ( f && b2 ) // { dg-warning "logical" } + do_something(1); + if ( c && b2 ) // { dg-warning "logical" } + do_something(2); + + if ( b2 && c == a ) // { dg-bogus "logical" } + do_something(101); + if ( 1 && c ) + do_something(102); // { dg-bogus "logical" } + if ( t2 && b2 ) // { dg-bogus "logical" } + do_something(103); + if ( true && c == a ) // { dg-bogus "logical" } + do_something(104); + if ( b2 && true ) // { dg-bogus "logical" } + do_something(105); +} + + +void bar() +{ + if ( f || b2 ) // { dg-warning "logical" } + do_something(1); + if ( c || b2 ) // { dg-warning "logical" } + do_something(2); + + if ( b2 || c == a ) // { dg-bogus "logical" } + do_something(101); + if ( 1 || c ) + do_something(102); // { dg-bogus "logical" } + if ( t2 || b2 ) // { dg-bogus "logical" } + do_something(103); + if ( true || c == a ) // { dg-bogus "logical" } + do_something(104); + if ( b2 || true ) // { dg-bogus "logical" } + do_something(105); +} diff --git a/gcc/testsuite/g++.dg/warn/Wmissing-declarations-1.C b/gcc/testsuite/g++.dg/warn/Wmissing-declarations-1.C new file mode 100644 index 000000000..894432519 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wmissing-declarations-1.C @@ -0,0 +1,45 @@ +// { dg-options "-Wmissing-declarations" } + +void fn1() { } // { dg-warning "no previous declaration" } +namespace ns { + void fn2() { } // { dg-warning "no previous declaration" } +} +namespace { + void fn3() { } +} +static void fn4() { } + +void fn5(); +namespace ns { + void fn6(); +} + +void fn5() { } +namespace ns { + void fn6() { } +} + +inline void fn7() { } + +class c { + void cfn1() { } + static void cfn2() { } + void cfn3(); + static void cfn4(); +}; + +void c::cfn3() { } +void c::cfn4() { } + +static struct { + void sfn1() { } + static void sfn2() { } +} s; + +template<typename C> +void tfn1() { } + +template void tfn1<c>(); + +class d { }; +template<> void tfn1<d>() { } diff --git a/gcc/testsuite/g++.dg/warn/Wno-div-by-zero.C b/gcc/testsuite/g++.dg/warn/Wno-div-by-zero.C new file mode 100644 index 000000000..937628ee9 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wno-div-by-zero.C @@ -0,0 +1,8 @@ +// { dg-options "-Wno-div-by-zero" } + +int breakme() +{ + int x = 0; + x /= 0; + return x; +} diff --git a/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C b/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C new file mode 100644 index 000000000..d40de3d7c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C @@ -0,0 +1,54 @@ +// PR c++/7302 +// { dg-do compile } +// { dg-options "-Wnon-virtual-dtor" } + +// Warn when a class has virtual functions and accessible non-virtual +// destructor, in which case it would be possible but unsafe to delete +// an instance of a derived class through a pointer to the base class. + +struct A // { dg-bogus "non-virtual destructor" } +{ +protected: + ~A(); +public: + virtual void f() = 0; +}; + +struct B // { dg-bogus "non-virtual destructor" } +{ +private: + ~B(); +public: + virtual void f() = 0; +}; + +struct C // { dg-warning "non-virtual destructor" } +{ + virtual void f() = 0; +}; + +struct D // { dg-warning "non-virtual destructor" } +{ + ~D(); + virtual void f() = 0; +}; + +struct E; + +struct F // { dg-warning "non-virtual destructor" } +{ +protected: + friend class E; + ~F(); +public: + virtual void f() = 0; +}; + +struct G // { dg-warning "non-virtual destructor" } +{ +private: + friend class E; + ~G(); +public: + virtual void f() = 0; +}; diff --git a/gcc/testsuite/g++.dg/warn/Wnvdtor.C b/gcc/testsuite/g++.dg/warn/Wnvdtor.C new file mode 100644 index 000000000..b04fdcbe6 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wnvdtor.C @@ -0,0 +1,10 @@ +// { dg-options "-Wnon-virtual-dtor" } + +extern "Java" +{ + class Foo + { + public: + virtual void bar( void); + }; +} diff --git a/gcc/testsuite/g++.dg/warn/Woverflow-1.C b/gcc/testsuite/g++.dg/warn/Woverflow-1.C new file mode 100644 index 000000000..064af4561 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Woverflow-1.C @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +#include <limits.h> + +int foo = INT_MAX + 1; /* { dg-warning "integer overflow" } */ + diff --git a/gcc/testsuite/g++.dg/warn/Woverflow-2.C b/gcc/testsuite/g++.dg/warn/Woverflow-2.C new file mode 100644 index 000000000..44368b66f --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Woverflow-2.C @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Woverflow" } */ + +#include <limits.h> + +int foo = INT_MAX + 1; /* { dg-warning "integer overflow" } */ + diff --git a/gcc/testsuite/g++.dg/warn/Woverflow-3.C b/gcc/testsuite/g++.dg/warn/Woverflow-3.C new file mode 100644 index 000000000..73a021b59 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Woverflow-3.C @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wno-overflow" } */ + +#include <limits.h> + +int foo = INT_MAX + 1; + diff --git a/gcc/testsuite/g++.dg/warn/Woverloaded-1.C b/gcc/testsuite/g++.dg/warn/Woverloaded-1.C new file mode 100644 index 000000000..65a408b47 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Woverloaded-1.C @@ -0,0 +1,17 @@ +/* { dg-options "-Woverloaded-virtual" } */ + +class Base { +public: + virtual ~Base() { + } +}; + +class Derived: public Base { +public: + int Base() { // There should be no error here. + return 5; + } +}; + +int main() { +} diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-1.C b/gcc/testsuite/g++.dg/warn/Wparentheses-1.C new file mode 100644 index 000000000..34cb58fc7 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-1.C @@ -0,0 +1,68 @@ +// Test operation of -Wparentheses. Warnings for assignments used as +// truth-values. Essentially the same as gcc.dg/Wparentheses-3.c. +// Origin: Joseph Myers <jsm@polyomino.org.uk> + +// { dg-do compile } +// { dg-options "-Wparentheses" } + +int foo (int); + +int a, b, c; +bool d; + +void +bar (void) +{ + if (a = b) // { dg-warning "assignment" "correct warning" } + foo (0); + if ((a = b)) + foo (1); + if (a = a) // { dg-warning "assignment" "correct warning" } + foo (2); + if ((a = a)) + foo (3); + if (b = c) // { dg-warning "assignment" "correct warning" } + foo (4); + else + foo (5); + if ((b = c)) + foo (6); + else + foo (7); + if (b = b) // { dg-warning "assignment" "correct warning" } + foo (8); + else + foo (9); + if ((b = b)) + foo (10); + else + foo (11); + while (c = b) // { dg-warning "assignment" "correct warning" } + foo (12); + while ((c = b)) + foo (13); + while (c = c) // { dg-warning "assignment" "correct warning" } + foo (14); + while ((c = c)) + foo (15); + do foo (16); while (a = b); // { dg-warning "assignment" "correct warning" } + do foo (17); while ((a = b)); + do foo (18); while (a = a); // { dg-warning "assignment" "correct warning" } + do foo (19); while ((a = a)); + for (;c = b;) // { dg-warning "assignment" "correct warning" } + foo (20); + for (;(c = b);) + foo (21); + for (;c = c;) // { dg-warning "assignment" "correct warning" } + foo (22); + for (;(c = c);) + foo (23); + d = a = b; // { dg-warning "assignment" "correct warning" } + foo (24); + d = (a = b); + foo (25); + d = a = a; // { dg-warning "assignment" "correct warning" } + foo (26); + d = (a = a); + foo (27); +} diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-10.C b/gcc/testsuite/g++.dg/warn/Wparentheses-10.C new file mode 100644 index 000000000..c30df090f --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-10.C @@ -0,0 +1,119 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +// C++ version of gcc.dg/Wparentheses-7.c + +int foo (int); + +int +bar (int a, int b, int c) +{ + foo (a & b ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((a & b) ^ c); + foo (a & (b ^ c)); + foo (1 & 2 ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) ^ c); + foo (1 & (2 ^ c)); + foo (1 & 2 ^ 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) ^ 3); + foo (1 & (2 ^ 3)); + foo (a ^ b & c); // { dg-warning "parentheses" "correct warning" } + foo ((a ^ b) & c); + foo (a ^ (b & c)); + foo (1 ^ 2 & c); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) & c); + foo (1 ^ (2 & c)); + foo (1 ^ 2 & 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) & 3); + foo (1 ^ (2 & 3)); + foo (a + b ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((a + b) ^ c); + foo (a + (b ^ c)); + foo (1 + 2 ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) ^ c); + foo (1 + (2 ^ c)); + foo (1 + 2 ^ 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) ^ 3); + foo (1 + (2 ^ 3)); + foo (a ^ b + c); // { dg-warning "parentheses" "correct warning" } + foo ((a ^ b) + c); + foo (a ^ (b + c)); + foo (1 ^ 2 + c); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) + c); + foo (1 ^ (2 + c)); + foo (1 ^ 2 + 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) + 3); + foo (1 ^ (2 + 3)); + foo (a - b ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((a - b) ^ c); + foo (a - (b ^ c)); + foo (1 - 2 ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((1 - 2) ^ c); + foo (1 - (2 ^ c)); + foo (1 - 2 ^ 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 - 2) ^ 3); + foo (1 - (2 ^ 3)); + foo (a ^ b - c); // { dg-warning "parentheses" "correct warning" } + foo ((a ^ b) - c); + foo (a ^ (b - c)); + foo (1 ^ 2 - c); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) - c); + foo (1 ^ (2 - c)); + foo (1 ^ 2 - 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) - 3); + foo (1 ^ (2 - 3)); + foo (a >= b ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((a >= b) ^ c); + foo (a >= (b ^ c)); + foo (1 >= 2 ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((1 >= 2) ^ c); + foo (1 >= (2 ^ c)); + foo (1 >= 2 ^ 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 >= 2) ^ 3); + foo (1 >= (2 ^ 3)); + foo (a ^ b >= c); // { dg-warning "parentheses" "correct warning" } + foo ((a ^ b) >= c); + foo (a ^ (b >= c)); + foo (1 ^ 2 >= c); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) >= c); + foo (1 ^ (2 >= c)); + foo (1 ^ 2 >= 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) >= 3); + foo (1 ^ (2 >= 3)); + foo (a == b ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((a == b) ^ c); + foo (a == (b ^ c)); + foo (1 == 2 ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((1 == 2) ^ c); + foo (1 == (2 ^ c)); + foo (1 == 2 ^ 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 == 2) ^ 3); + foo (1 == (2 ^ 3)); + foo (a ^ b == c); // { dg-warning "parentheses" "correct warning" } + foo ((a ^ b) == c); + foo (a ^ (b == c)); + foo (1 ^ 2 == c); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) == c); + foo (1 ^ (2 == c)); + foo (1 ^ 2 == 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) == 3); + foo (1 ^ (2 == 3)); + foo (a < b ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((a < b) ^ c); + foo (a < (b ^ c)); + foo (1 < 2 ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((1 < 2) ^ c); + foo (1 < (2 ^ c)); + foo (1 < 2 ^ 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 < 2) ^ 3); + foo (1 < (2 ^ 3)); + foo (a ^ b < c); // { dg-warning "parentheses" "correct warning" } + foo ((a ^ b) < c); + foo (a ^ (b < c)); + foo (1 ^ 2 < c); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) < c); + foo (1 ^ (2 < c)); + foo (1 ^ 2 < 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) < 3); + foo (1 ^ (2 < 3)); +} diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-11.C b/gcc/testsuite/g++.dg/warn/Wparentheses-11.C new file mode 100644 index 000000000..912c3b7ae --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-11.C @@ -0,0 +1,101 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +// C++ version of gcc.dg/Wparentheses-8.c + +int foo (int); + +int +bar (int a, int b, int c) +{ + foo (a + b & c); // { dg-warning "parentheses" "correct warning" } + foo ((a + b) & c); + foo (a + (b & c)); + foo (1 + 2 & c); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) & c); + foo (1 + (2 & c)); + foo (1 + 2 & 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) & 3); + foo (1 + (2 & 3)); + foo (a & b + c); // { dg-warning "parentheses" "correct warning" } + foo ((a & b) + c); + foo (a & (b + c)); + foo (1 & 2 + c); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) + c); + foo (1 & (2 + c)); + foo (1 & 2 + 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) + 3); + foo (1 & (2 + 3)); + foo (a - b & c); // { dg-warning "parentheses" "correct warning" } + foo ((a - b) & c); + foo (a - (b & c)); + foo (1 - 2 & c); // { dg-warning "parentheses" "correct warning" } + foo ((1 - 2) & c); + foo (1 - (2 & c)); + foo (1 - 2 & 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 - 2) & 3); + foo (1 - (2 & 3)); + foo (a & b - c); // { dg-warning "parentheses" "correct warning" } + foo ((a & b) - c); + foo (a & (b - c)); + foo (1 & 2 - c); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) - c); + foo (1 & (2 - c)); + foo (1 & 2 - 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) - 3); + foo (1 & (2 - 3)); + foo (a < b & c); // { dg-warning "parentheses" "correct warning" } + foo ((a < b) & c); + foo (a < (b & c)); + foo (1 < 2 & c); // { dg-warning "parentheses" "correct warning" } + foo ((1 < 2) & c); + foo (1 < (2 & c)); + foo (1 < 2 & 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 < 2) & 3); + foo (1 < (2 & 3)); + foo (a & b < c); // { dg-warning "parentheses" "correct warning" } + foo ((a & b) < c); + foo (a & (b < c)); + foo (1 & 2 < c); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) < c); + foo (1 & (2 < c)); + foo (1 & 2 < 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) < 3); + foo (1 & (2 < 3)); + foo (a == b & c); // { dg-warning "parentheses" "correct warning" } + foo ((a == b) & c); + foo (a == (b & c)); + foo (1 == 2 & c); // { dg-warning "parentheses" "correct warning" } + foo ((1 == 2) & c); + foo (1 == (2 & c)); + foo (1 == 2 & 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 == 2) & 3); + foo (1 == (2 & 3)); + foo (a & b == c); // { dg-warning "parentheses" "correct warning" } + foo ((a & b) == c); + foo (a & (b == c)); + foo (1 & 2 == c); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) == c); + foo (1 & (2 == c)); + foo (1 & 2 == 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) == 3); + foo (1 & (2 == 3)); + foo (a != b & c); // { dg-warning "parentheses" "correct warning" } + foo ((a != b) & c); + foo (a != (b & c)); + foo (1 != 2 & c); // { dg-warning "parentheses" "correct warning" } + foo ((1 != 2) & c); + foo (1 != (2 & c)); + foo (1 != 2 & 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 != 2) & 3); + foo (1 != (2 & 3)); + foo (a & b != c); // { dg-warning "parentheses" "correct warning" } + foo ((a & b) != c); + foo (a & (b != c)); + foo (1 & 2 != c); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) != c); + foo (1 & (2 != c)); + foo (1 & 2 != 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) != 3); + foo (1 & (2 != 3)); +} diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-12.C b/gcc/testsuite/g++.dg/warn/Wparentheses-12.C new file mode 100644 index 000000000..b04529827 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-12.C @@ -0,0 +1,60 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +// C++ version of gcc.dg/Wparentheses-9.c + +int foo (int); + +int a, b, c; + +int +bar (void) +{ + if (a) + foo (0); + if (b) + foo (1); + else + foo (2); + if (c) // { dg-warning "ambiguous" "correct warning" } + if (a) + foo (3); + else + foo (4); + if (a) + if (c) + foo (5); + if (a) + if (b) // { dg-warning "ambiguous" "correct warning" } + if (c) + foo (6); + else + foo (7); + if (a) // { dg-warning "ambiguous" "correct warning" } + if (b) + if (c) + foo (8); + else + foo (9); + else + foo (10); + if (a) + if (b) + if (c) + foo (11); + else + foo (12); + else + foo (13); + else + foo (14); + if (a) { + if (b) + if (c) + foo (15); + else + foo (16); + else + foo (17); + } +} diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-13.C b/gcc/testsuite/g++.dg/warn/Wparentheses-13.C new file mode 100644 index 000000000..ebe8f426a --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-13.C @@ -0,0 +1,69 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +// Template version of Wparentheses-1.C. + +int foo (int); + +int a, b, c; +bool d; + +template<class T> +void +bar (T) +{ + if (a = b) // { dg-warning "assignment" "correct warning" } + foo (0); + if ((a = b)) + foo (1); + if (a = a) // { dg-warning "assignment" "correct warning" } + foo (2); + if ((a = a)) + foo (3); + if (b = c) // { dg-warning "assignment" "correct warning" } + foo (4); + else + foo (5); + if ((b = c)) + foo (6); + else + foo (7); + if (b = b) // { dg-warning "assignment" "correct warning" } + foo (8); + else + foo (9); + if ((b = b)) + foo (10); + else + foo (11); + while (c = b) // { dg-warning "assignment" "correct warning" } + foo (12); + while ((c = b)) + foo (13); + while (c = c) // { dg-warning "assignment" "correct warning" } + foo (14); + while ((c = c)) + foo (15); + do foo (16); while (a = b); // { dg-warning "assignment" "correct warning" } + do foo (17); while ((a = b)); + do foo (18); while (a = a); // { dg-warning "assignment" "correct warning" } + do foo (19); while ((a = a)); + for (;c = b;) // { dg-warning "assignment" "correct warning" } + foo (20); + for (;(c = b);) + foo (21); + for (;c = c;) // { dg-warning "assignment" "correct warning" } + foo (22); + for (;(c = c);) + foo (23); + d = a = b; // { dg-warning "assignment" "correct warning" } + foo (24); + d = (a = b); + foo (25); + d = a = a; // { dg-warning "assignment" "correct warning" } + foo (26); + d = (a = a); + foo (27); +} + +template void bar<int> (int); // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-14.C b/gcc/testsuite/g++.dg/warn/Wparentheses-14.C new file mode 100644 index 000000000..67bd43ec5 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-14.C @@ -0,0 +1,43 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +// Template version of Wparentheses-2.C. + +int foo (int); + +int a, b, c; +bool d; + +template<class T> +void +bar (T) +{ + if (a += b) + foo (0); + if (a -= a) + foo (1); + if (b *= c) + foo (2); + else + foo (3); + if (b /= b) + foo (4); + else + foo (5); + while (c %= b) + foo (6); + while (c <<= c) + foo (7); + do foo (8); while (a >>= b); + do foo (9); while (a &= a); + for (;c ^= b;) + foo (10); + for (;c |= c;) + foo (11); + d = a += b; + foo (12); + d = a -= a; + foo (13); +} + +template void bar<int> (int); diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-15.C b/gcc/testsuite/g++.dg/warn/Wparentheses-15.C new file mode 100644 index 000000000..db73d430a --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-15.C @@ -0,0 +1,68 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +// Template version of Wparentheses-6.C. + +int foo (int); + +template<class T> +void +bar (T a, T b, T c) +{ + foo (a <= b <= c); // { dg-warning "comparison" "correct warning" } + foo ((a <= b) <= c); + foo (a <= (b <= c)); + foo (1 <= 2 <= c); // { dg-warning "comparison" "correct warning" } + foo ((1 <= 2) <= c); + foo (1 <= (2 <= c)); + foo (1 <= 2 <= 3); // { dg-warning "comparison" "correct warning" } + foo ((1 <= 2) <= 3); + foo (1 <= (2 <= 3)); + foo (a > b > c); // { dg-warning "comparison" "correct warning" } + foo ((a > b) > c); + foo (a > (b > c)); + foo (1 > 2 > c); // { dg-warning "comparison" "correct warning" } + foo ((1 > 2) > c); + foo (1 > (2 > c)); + foo (1 > 2 > 3); // { dg-warning "comparison" "correct warning" } + foo ((1 > 2) > 3); + foo (1 > (2 > 3)); + foo (a < b <= c); // { dg-warning "comparison" "correct warning" } + foo ((a < b) <= c); + foo (a < (b <= c)); + foo (1 < 2 <= c); // { dg-warning "comparison" "correct warning" } + foo ((1 < 2) <= c); + foo (1 < (2 <= c)); + foo (1 < 2 <= 3); // { dg-warning "comparison" "correct warning" } + foo ((1 < 2) <= 3); + foo (1 < (2 <= 3)); + foo (a <= b > c); // { dg-warning "comparison" "correct warning" } + foo ((a <= b) > c); + foo (a <= (b > c)); + foo (1 <= 2 > c); // { dg-warning "comparison" "correct warning" } + foo ((1 <= 2) > c); + foo (1 <= (2 > c)); + foo (1 <= 2 > 3); // { dg-warning "comparison" "correct warning" } + foo ((1 <= 2) > 3); + foo (1 <= (2 > 3)); + foo (a <= b == c); // { dg-warning "comparison" "correct warning" } + foo ((a <= b) == c); + foo (a <= (b == c)); + foo (1 <= 2 == c); // { dg-warning "comparison" "correct warning" } + foo ((1 <= 2) == c); + foo (1 <= (2 == c)); + foo (1 <= 2 == 3); // { dg-warning "comparison" "correct warning" } + foo ((1 <= 2) == 3); + foo (1 <= (2 == 3)); + foo (a != b != c); // { dg-warning "comparison" "correct warning" } + foo ((a != b) != c); + foo (a != (b != c)); + foo (1 != 2 != c); // { dg-warning "comparison" "correct warning" } + foo ((1 != 2) != c); + foo (1 != (2 != c)); + foo (1 != 2 != 3); // { dg-warning "comparison" "correct warning" } + foo ((1 != 2) != 3); + foo (1 != (2 != 3)); +} + +template void bar<int> (int, int, int); // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-16.C b/gcc/testsuite/g++.dg/warn/Wparentheses-16.C new file mode 100644 index 000000000..638155237 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-16.C @@ -0,0 +1,86 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +// Template version of Wparentheses-7.C. + +int foo (int); + +template<class T> +void +bar (T a, T b, T c) +{ + foo (a + b << c); // { dg-warning "parentheses" "correct warning" } + foo ((a + b) << c); + foo (a + (b << c)); + foo (1 + 2 << c); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) << c); + foo (1 + (2 << c)); + foo (1 + 2 << 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) << 3); + foo (1 + (2 << 3)); + foo (a << b + c); // { dg-warning "parentheses" "correct warning" } + foo ((a << b) + c); + foo (a << (b + c)); + foo (1 << 2 + c); // { dg-warning "parentheses" "correct warning" } + foo ((1 << 2) + c); + foo (1 << (2 + c)); + foo (1 << 2 + 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 << 2) + 3); + foo (1 << (2 + 3)); + foo (a + b >> c); // { dg-warning "parentheses" "correct warning" } + foo ((a + b) >> c); + foo (a + (b >> c)); + foo (1 + 2 >> c); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) >> c); + foo (1 + (2 >> c)); + foo (1 + 2 >> 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) >> 3); + foo (1 + (2 >> 3)); + foo (a >> b + c); // { dg-warning "parentheses" "correct warning" } + foo ((a >> b) + c); + foo (a >> (b + c)); + foo (1 >> 2 + c); // { dg-warning "parentheses" "correct warning" } + foo ((1 >> 2) + c); + foo (1 >> (2 + c)); + foo (1 >> 2 + 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 >> 2) + 3); + foo (1 >> (2 + 3)); + foo (a - b << c); // { dg-warning "parentheses" "correct warning" } + foo ((a - b) << c); + foo (a - (b << c)); + foo (6 - 5 << c); // { dg-warning "parentheses" "correct warning" } + foo ((6 - 5) << c); + foo (6 - (5 << c)); + foo (6 - 5 << 4); // { dg-warning "parentheses" "correct warning" } + foo ((6 - 5) << 4); + foo (6 - (5 << 4)); + foo (a << b - c); // { dg-warning "parentheses" "correct warning" } + foo ((a << b) - c); + foo (a << (b - c)); + foo (6 << 5 - c); // { dg-warning "parentheses" "correct warning" } + foo ((6 << 5) - c); + foo (6 << (5 - c)); + foo (6 << 5 - 4); // { dg-warning "parentheses" "correct warning" } + foo ((6 << 5) - 4); + foo (6 << (5 - 4)); + foo (a - b >> c); // { dg-warning "parentheses" "correct warning" } + foo ((a - b) >> c); + foo (a - (b >> c)); + foo (6 - 5 >> c); // { dg-warning "parentheses" "correct warning" } + foo ((6 - 5) >> c); + foo (6 - (5 >> c)); + foo (6 - 5 >> 4); // { dg-warning "parentheses" "correct warning" } + foo ((6 - 5) >> 4); + foo (6 - (5 >> 4)); + foo (a >> b - c); // { dg-warning "parentheses" "correct warning" } + foo ((a >> b) - c); + foo (a >> (b - c)); + foo (6 >> 5 - c); // { dg-warning "parentheses" "correct warning" } + foo ((6 >> 5) - c); + foo (6 >> (5 - c)); + foo (6 >> 5 - 4); // { dg-warning "parentheses" "correct warning" } + foo ((6 >> 5) - 4); + foo (6 >> (5 - 4)); +} + +template void bar<int> (int, int, int); // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-17.C b/gcc/testsuite/g++.dg/warn/Wparentheses-17.C new file mode 100644 index 000000000..1af1e2e03 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-17.C @@ -0,0 +1,32 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +// Template version of Wparentheses-8.C. + +int foo (int); + +template<class T> +void +bar (T a, T b, T c) +{ + foo (a && b || c); // { dg-warning "parentheses" "correct warning" } + foo ((a && b) || c); + foo (a && (b || c)); + foo (1 && 2 || c); // { dg-warning "parentheses" "correct warning" } + foo ((1 && 2) || c); + foo (1 && (2 || c)); + foo (1 && 2 || 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 && 2) || 3); + foo (1 && (2 || 3)); + foo (a || b && c); // { dg-warning "parentheses" "correct warning" } + foo ((a || b) && c); + foo (a || (b && c)); + foo (1 || 2 && c); // { dg-warning "parentheses" "correct warning" } + foo ((1 || 2) && c); + foo (1 || (2 && c)); + foo (1 || 2 && 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 || 2) && 3); + foo (1 || (2 && 3)); +} + +template void bar<int> (int, int, int); // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-18.C b/gcc/testsuite/g++.dg/warn/Wparentheses-18.C new file mode 100644 index 000000000..d562315f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-18.C @@ -0,0 +1,122 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +// Template version of Wparentheses-9.C. + +int foo (int); + +template<class T> +void +bar (T a, T b, T c) +{ + foo (a & b | c); // { dg-warning "parentheses" "correct warning" } + foo ((a & b) | c); + foo (a & (b | c)); + foo (1 & 2 | c); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) | c); + foo (1 & (2 | c)); + foo (1 & 2 | 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) | 3); + foo (1 & (2 | 3)); + foo (a | b & c); // { dg-warning "parentheses" "correct warning" } + foo ((a | b) & c); + foo (a | (b & c)); + foo (1 | 2 & c); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) & c); + foo (1 | (2 & c)); + foo (1 | 2 & 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) & 3); + foo (1 | (2 & 3)); + foo (a ^ b | c); // { dg-warning "parentheses" "correct warning" } + foo ((a ^ b) | c); + foo (a ^ (b | c)); + foo (1 ^ 2 | c); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) | c); + foo (1 ^ (2 | c)); + foo (1 ^ 2 | 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) | 3); + foo (1 ^ (2 | 3)); + foo (a | b ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((a | b) ^ c); + foo (a | (b ^ c)); + foo (1 | 2 ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) ^ c); + foo (1 | (2 ^ c)); + foo (1 | 2 ^ 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) ^ 3); + foo (1 | (2 ^ 3)); + foo (a + b | c); // { dg-warning "parentheses" "correct warning" } + foo ((a + b) | c); + foo (a + (b | c)); + foo (1 + 2 | c); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) | c); + foo (1 + (2 | c)); + foo (1 + 2 | 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) | 3); + foo (1 + (2 | 3)); + foo (a | b + c); // { dg-warning "parentheses" "correct warning" } + foo ((a | b) + c); + foo (a | (b + c)); + foo (1 | 2 + c); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) + c); + foo (1 | (2 + c)); + foo (1 | 2 + 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) + 3); + foo (1 | (2 + 3)); + foo (a - b | c); // { dg-warning "parentheses" "correct warning" } + foo ((a - b) | c); + foo (a - (b | c)); + foo (1 - 2 | c); // { dg-warning "parentheses" "correct warning" } + foo ((1 - 2) | c); + foo (1 - (2 | c)); + foo (1 - 2 | 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 - 2) | 3); + foo (1 - (2 | 3)); + foo (a | b - c); // { dg-warning "parentheses" "correct warning" } + foo ((a | b) - c); + foo (a | (b - c)); + foo (1 | 2 - c); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) - c); + foo (1 | (2 - c)); + foo (1 | 2 - 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) - 3); + foo (1 | (2 - 3)); + foo (a > b | c); // { dg-warning "parentheses" "correct warning" } + foo ((a > b) | c); + foo (a > (b | c)); + foo (1 > 2 | c); // { dg-warning "parentheses" "correct warning" } + foo ((1 > 2) | c); + foo (1 > (2 | c)); + foo (1 > 2 | 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 > 2) | 3); + foo (1 > (2 | 3)); + foo (a | b > c); // { dg-warning "parentheses" "correct warning" } + foo ((a | b) > c); + foo (a | (b > c)); + foo (1 | 2 > c); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) > c); + foo (1 | (2 > c)); + foo (1 | 2 > 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) > 3); + foo (1 | (2 > 3)); + foo (a <= b | c); // { dg-warning "parentheses" "correct warning" } + foo ((a <= b) | c); + foo (a <= (b | c)); + foo (1 <= 2 | c); // { dg-warning "parentheses" "correct warning" } + foo ((1 <= 2) | c); + foo (1 <= (2 | c)); + foo (1 <= 2 | 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 <= 2) | 3); + foo (1 <= (2 | 3)); + foo (a | b <= c); // { dg-warning "parentheses" "correct warning" } + foo ((a | b) <= c); + foo (a | (b <= c)); + foo (1 | 2 <= c); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) <= c); + foo (1 | (2 <= c)); + foo (1 | 2 <= 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) <= 3); + foo (1 | (2 <= 3)); +} + +template void bar<int> (int, int, int); // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-19.C b/gcc/testsuite/g++.dg/warn/Wparentheses-19.C new file mode 100644 index 000000000..e3dfc5d05 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-19.C @@ -0,0 +1,122 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +// Template version of Wparentheses-10.C. + +int foo (int); + +template<class T> +void +bar (T a, T b, T c) +{ + foo (a & b ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((a & b) ^ c); + foo (a & (b ^ c)); + foo (1 & 2 ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) ^ c); + foo (1 & (2 ^ c)); + foo (1 & 2 ^ 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) ^ 3); + foo (1 & (2 ^ 3)); + foo (a ^ b & c); // { dg-warning "parentheses" "correct warning" } + foo ((a ^ b) & c); + foo (a ^ (b & c)); + foo (1 ^ 2 & c); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) & c); + foo (1 ^ (2 & c)); + foo (1 ^ 2 & 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) & 3); + foo (1 ^ (2 & 3)); + foo (a + b ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((a + b) ^ c); + foo (a + (b ^ c)); + foo (1 + 2 ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) ^ c); + foo (1 + (2 ^ c)); + foo (1 + 2 ^ 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) ^ 3); + foo (1 + (2 ^ 3)); + foo (a ^ b + c); // { dg-warning "parentheses" "correct warning" } + foo ((a ^ b) + c); + foo (a ^ (b + c)); + foo (1 ^ 2 + c); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) + c); + foo (1 ^ (2 + c)); + foo (1 ^ 2 + 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) + 3); + foo (1 ^ (2 + 3)); + foo (a - b ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((a - b) ^ c); + foo (a - (b ^ c)); + foo (1 - 2 ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((1 - 2) ^ c); + foo (1 - (2 ^ c)); + foo (1 - 2 ^ 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 - 2) ^ 3); + foo (1 - (2 ^ 3)); + foo (a ^ b - c); // { dg-warning "parentheses" "correct warning" } + foo ((a ^ b) - c); + foo (a ^ (b - c)); + foo (1 ^ 2 - c); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) - c); + foo (1 ^ (2 - c)); + foo (1 ^ 2 - 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) - 3); + foo (1 ^ (2 - 3)); + foo (a >= b ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((a >= b) ^ c); + foo (a >= (b ^ c)); + foo (1 >= 2 ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((1 >= 2) ^ c); + foo (1 >= (2 ^ c)); + foo (1 >= 2 ^ 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 >= 2) ^ 3); + foo (1 >= (2 ^ 3)); + foo (a ^ b >= c); // { dg-warning "parentheses" "correct warning" } + foo ((a ^ b) >= c); + foo (a ^ (b >= c)); + foo (1 ^ 2 >= c); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) >= c); + foo (1 ^ (2 >= c)); + foo (1 ^ 2 >= 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) >= 3); + foo (1 ^ (2 >= 3)); + foo (a == b ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((a == b) ^ c); + foo (a == (b ^ c)); + foo (1 == 2 ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((1 == 2) ^ c); + foo (1 == (2 ^ c)); + foo (1 == 2 ^ 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 == 2) ^ 3); + foo (1 == (2 ^ 3)); + foo (a ^ b == c); // { dg-warning "parentheses" "correct warning" } + foo ((a ^ b) == c); + foo (a ^ (b == c)); + foo (1 ^ 2 == c); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) == c); + foo (1 ^ (2 == c)); + foo (1 ^ 2 == 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) == 3); + foo (1 ^ (2 == 3)); + foo (a < b ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((a < b) ^ c); + foo (a < (b ^ c)); + foo (1 < 2 ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((1 < 2) ^ c); + foo (1 < (2 ^ c)); + foo (1 < 2 ^ 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 < 2) ^ 3); + foo (1 < (2 ^ 3)); + foo (a ^ b < c); // { dg-warning "parentheses" "correct warning" } + foo ((a ^ b) < c); + foo (a ^ (b < c)); + foo (1 ^ 2 < c); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) < c); + foo (1 ^ (2 < c)); + foo (1 ^ 2 < 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) < 3); + foo (1 ^ (2 < 3)); +} + +template void bar<int> (int, int, int); // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-2.C b/gcc/testsuite/g++.dg/warn/Wparentheses-2.C new file mode 100644 index 000000000..286e2f97c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-2.C @@ -0,0 +1,43 @@ +// Test operation of -Wparentheses. Warnings for assignments used as +// truth-values shouldn't apply other than for plain assignment. +// Essentially the same as gcc.dg/Wparentheses-10.c. +// Origin: Joseph Myers <jsm@polyomino.org.uk> + +// { dg-do compile } +// { dg-options "-Wparentheses" } + +int foo (int); + +int a, b, c; +bool d; + +void +bar (void) +{ + if (a += b) + foo (0); + if (a -= a) + foo (1); + if (b *= c) + foo (2); + else + foo (3); + if (b /= b) + foo (4); + else + foo (5); + while (c %= b) + foo (6); + while (c <<= c) + foo (7); + do foo (8); while (a >>= b); + do foo (9); while (a &= a); + for (;c ^= b;) + foo (10); + for (;c |= c;) + foo (11); + d = a += b; + foo (12); + d = a -= a; + foo (13); +} diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-20.C b/gcc/testsuite/g++.dg/warn/Wparentheses-20.C new file mode 100644 index 000000000..a1ba89dfc --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-20.C @@ -0,0 +1,104 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +// Template version of Wparentheses-11.C. + +int foo (int); + +template<class T> +void +bar (T a, T b, T c) +{ + foo (a + b & c); // { dg-warning "parentheses" "correct warning" } + foo ((a + b) & c); + foo (a + (b & c)); + foo (1 + 2 & c); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) & c); + foo (1 + (2 & c)); + foo (1 + 2 & 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) & 3); + foo (1 + (2 & 3)); + foo (a & b + c); // { dg-warning "parentheses" "correct warning" } + foo ((a & b) + c); + foo (a & (b + c)); + foo (1 & 2 + c); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) + c); + foo (1 & (2 + c)); + foo (1 & 2 + 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) + 3); + foo (1 & (2 + 3)); + foo (a - b & c); // { dg-warning "parentheses" "correct warning" } + foo ((a - b) & c); + foo (a - (b & c)); + foo (1 - 2 & c); // { dg-warning "parentheses" "correct warning" } + foo ((1 - 2) & c); + foo (1 - (2 & c)); + foo (1 - 2 & 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 - 2) & 3); + foo (1 - (2 & 3)); + foo (a & b - c); // { dg-warning "parentheses" "correct warning" } + foo ((a & b) - c); + foo (a & (b - c)); + foo (1 & 2 - c); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) - c); + foo (1 & (2 - c)); + foo (1 & 2 - 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) - 3); + foo (1 & (2 - 3)); + foo (a < b & c); // { dg-warning "parentheses" "correct warning" } + foo ((a < b) & c); + foo (a < (b & c)); + foo (1 < 2 & c); // { dg-warning "parentheses" "correct warning" } + foo ((1 < 2) & c); + foo (1 < (2 & c)); + foo (1 < 2 & 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 < 2) & 3); + foo (1 < (2 & 3)); + foo (a & b < c); // { dg-warning "parentheses" "correct warning" } + foo ((a & b) < c); + foo (a & (b < c)); + foo (1 & 2 < c); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) < c); + foo (1 & (2 < c)); + foo (1 & 2 < 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) < 3); + foo (1 & (2 < 3)); + foo (a == b & c); // { dg-warning "parentheses" "correct warning" } + foo ((a == b) & c); + foo (a == (b & c)); + foo (1 == 2 & c); // { dg-warning "parentheses" "correct warning" } + foo ((1 == 2) & c); + foo (1 == (2 & c)); + foo (1 == 2 & 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 == 2) & 3); + foo (1 == (2 & 3)); + foo (a & b == c); // { dg-warning "parentheses" "correct warning" } + foo ((a & b) == c); + foo (a & (b == c)); + foo (1 & 2 == c); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) == c); + foo (1 & (2 == c)); + foo (1 & 2 == 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) == 3); + foo (1 & (2 == 3)); + foo (a != b & c); // { dg-warning "parentheses" "correct warning" } + foo ((a != b) & c); + foo (a != (b & c)); + foo (1 != 2 & c); // { dg-warning "parentheses" "correct warning" } + foo ((1 != 2) & c); + foo (1 != (2 & c)); + foo (1 != 2 & 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 != 2) & 3); + foo (1 != (2 & 3)); + foo (a & b != c); // { dg-warning "parentheses" "correct warning" } + foo ((a & b) != c); + foo (a & (b != c)); + foo (1 & 2 != c); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) != c); + foo (1 & (2 != c)); + foo (1 & 2 != 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) != 3); + foo (1 & (2 != 3)); +} + +template void bar<int> (int, int, int); // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-21.C b/gcc/testsuite/g++.dg/warn/Wparentheses-21.C new file mode 100644 index 000000000..588b4fdb7 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-21.C @@ -0,0 +1,66 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +// Template version of Wparentheses-12.C. Note that we currently warn +// when we initially parse the template, not when we are instantiating +// it. That seems reasonable since the template parameters can not +// affect the syntax parsing. + +int foo (int); + +int a, b, c; + +template<class T> +void +bar (T) +{ + if (a) + foo (0); + if (b) + foo (1); + else + foo (2); + if (c) // { dg-warning "ambiguous" "correct warning" } + if (a) + foo (3); + else + foo (4); + if (a) + if (c) + foo (5); + if (a) + if (b) // { dg-warning "ambiguous" "correct warning" } + if (c) + foo (6); + else + foo (7); + if (a) // { dg-warning "ambiguous" "correct warning" } + if (b) + if (c) + foo (8); + else + foo (9); + else + foo (10); + if (a) + if (b) + if (c) + foo (11); + else + foo (12); + else + foo (13); + else + foo (14); + if (a) { + if (b) + if (c) + foo (15); + else + foo (16); + else + foo (17); + } +} + +template void bar<int> (int); diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-22.C b/gcc/testsuite/g++.dg/warn/Wparentheses-22.C new file mode 100644 index 000000000..395953dd4 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-22.C @@ -0,0 +1,111 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +// Warnings for assignments used as truth-values when using classes. +// Like Wparentheses-1.C, but with a class. + +int foo (int); + +class C +{ + public: + C() + : b(0) + { } + + // Use default assignment constructor. + + // Provide conversion to bool so that an instance of this class will + // work as a condition. + operator bool() const + { return b != 0; } + + private: + int b; +}; + +C a, b, c; +bool d; + +void +bar (void) +{ + if (a = b) // { dg-warning "assignment" "correct warning" } + foo (0); + if ((a = b)) + foo (1); + if (a = a) // { dg-warning "assignment" "correct warning" } + foo (2); + if ((a = a)) + foo (3); + if (b = c) // { dg-warning "assignment" "correct warning" } + foo (4); + else + foo (5); + if ((b = c)) + foo (6); + else + foo (7); + if (b = b) // { dg-warning "assignment" "correct warning" } + foo (8); + else + foo (9); + if ((b = b)) + foo (10); + else + foo (11); + while (c = b) // { dg-warning "assignment" "correct warning" } + foo (12); + while ((c = b)) + foo (13); + while (c = c) // { dg-warning "assignment" "correct warning" } + foo (14); + while ((c = c)) + foo (15); + do foo (16); while (a = b); // { dg-warning "assignment" "correct warning" } + do foo (17); while ((a = b)); + do foo (18); while (a = a); // { dg-warning "assignment" "correct warning" } + do foo (19); while ((a = a)); + for (;c = b;) // { dg-warning "assignment" "correct warning" } + foo (20); + for (;(c = b);) + foo (21); + for (;c = c;) // { dg-warning "assignment" "correct warning" } + foo (22); + for (;(c = c);) + foo (23); + d = a = b; // { dg-warning "assignment" "correct warning" } + foo (24); + d = (a = b); + foo (25); + d = a = a; // { dg-warning "assignment" "correct warning" } + foo (26); + d = (a = a); + foo (27); + if (C(a)) + foo (28); +} + +bool +bar1 (void) +{ + return a = b; // { dg-warning "assignment" "correct warning" } +} + +bool +bar2 (void) +{ + return (a = b); +} + +bool +bar3 (void) +{ + return a = a; // { dg-warning "assignment" "correct warning" } +} + +bool +bar4 (void) +{ + return (a = a); +} diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-23.C b/gcc/testsuite/g++.dg/warn/Wparentheses-23.C new file mode 100644 index 000000000..cadc287fe --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-23.C @@ -0,0 +1,121 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +// Template version of Wparentheses-22.C. + +int foo (int); + +class C +{ + public: + C() + : b(0) + { } + + // Use default assignment constructor. + + // Provide conversion to bool so that an instance of this class will + // work as a condition. + operator bool() const + { return b != 0; } + + private: + int b; +}; + +C a, b, c; +bool d; + +template<class T> +void +bar (T) +{ + if (a = b) // { dg-warning "assignment" "correct warning" } + foo (0); + if ((a = b)) + foo (1); + if (a = a) // { dg-warning "assignment" "correct warning" } + foo (2); + if ((a = a)) + foo (3); + if (b = c) // { dg-warning "assignment" "correct warning" } + foo (4); + else + foo (5); + if ((b = c)) + foo (6); + else + foo (7); + if (b = b) // { dg-warning "assignment" "correct warning" } + foo (8); + else + foo (9); + if ((b = b)) + foo (10); + else + foo (11); + while (c = b) // { dg-warning "assignment" "correct warning" } + foo (12); + while ((c = b)) + foo (13); + while (c = c) // { dg-warning "assignment" "correct warning" } + foo (14); + while ((c = c)) + foo (15); + do foo (16); while (a = b); // { dg-warning "assignment" "correct warning" } + do foo (17); while ((a = b)); + do foo (18); while (a = a); // { dg-warning "assignment" "correct warning" } + do foo (19); while ((a = a)); + for (;c = b;) // { dg-warning "assignment" "correct warning" } + foo (20); + for (;(c = b);) + foo (21); + for (;c = c;) // { dg-warning "assignment" "correct warning" } + foo (22); + for (;(c = c);) + foo (23); + d = a = b; // { dg-warning "assignment" "correct warning" } + foo (24); + d = (a = b); + foo (25); + d = a = a; // { dg-warning "assignment" "correct warning" } + foo (26); + d = (a = a); + foo (27); + if (C(a)) + foo (28); +} + +template<class T> +bool +bar1 (T) +{ + return a = b; // { dg-warning "assignment" "correct warning" } +} + +template<class T> +bool +bar2 (T) +{ + return (a = b); +} + +template<class T> +bool +bar3 (T) +{ + return a = a; // { dg-warning "assignment" "correct warning" } +} + +template<class T> +bool +bar4 (T) +{ + return (a = a); +} + +template void bar<int> (int); // { dg-message "instantiated" } +template bool bar1<int> (int); // { dg-message "instantiated" } +template bool bar2<int> (int); +template bool bar3<int> (int); // { dg-message "instantiated" } +template bool bar4<int> (int); diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-24.C b/gcc/testsuite/g++.dg/warn/Wparentheses-24.C new file mode 100644 index 000000000..4019d3d82 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-24.C @@ -0,0 +1,14 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +extern int foo (int); + +bool a, b, c; + +bool +bar () +{ + c = a = b; + foo (0); + return a = b; +} diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-25.C b/gcc/testsuite/g++.dg/warn/Wparentheses-25.C new file mode 100644 index 000000000..ab00c25f0 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-25.C @@ -0,0 +1,259 @@ +/* PR 7543. Test operation of -Wparentheses. Precedence warnings. + !a | b and !a & b. */ +/* { dg-do compile } */ +/* { dg-options "-Wparentheses" } */ +// C++ version of Wparentheses-11.c +int foo (int); + +int +bar (int a, int b, int c) +{ + foo (!a & b); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a & (b < c)); + foo (!a & (b > c)); + foo (!a & (b == c)); + foo (!a & (b != c)); + foo (!a & (b <= c)); + foo (!a & (b >= c)); + foo (!a & (b && c)); + foo (!a & (b || c)); + foo (!a & !b); + foo (!(a & b)); + foo ((!a) & b); + foo (!a & 2); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a & (2 < c)); + foo (!a & (2 > c)); + foo (!a & (2 == c)); + foo (!a & (2 != c)); + foo (!a & (2 <= c)); + foo (!a & (2 >= c)); + foo (!a & (2 && c)); + foo (!a & (2 || c)); + foo (!a & !2); + foo (!(a & 2)); + foo ((!a) & 2); + foo (!1 & 2); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!1 & (2 < c)); + foo (!1 & (2 > c)); + foo (!1 & (2 == c)); + foo (!1 & (2 != c)); + foo (!1 & (2 <= c)); + foo (!1 & (2 >= c)); + foo (!1 & (2 && c)); + foo (!1 & (2 || c)); + foo (!1 & !2); + foo (!(1 & 2)); + + foo (!a | b); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a | (b < c)); + foo (!a | (b > c)); + foo (!a | (b == c)); + foo (!a | (b != c)); + foo (!a | (b <= c)); + foo (!a | (b >= c)); + foo (!a | (b && c)); + foo (!a | (b || c)); + foo (!a | !b); + foo (!(a | b)); + foo ((!a) | b); + foo (!a | 2); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a | (2 < c)); + foo (!a | (2 > c)); + foo (!a | (2 == c)); + foo (!a | (2 != c)); + foo (!a | (2 <= c)); + foo (!a | (2 >= c)); + foo (!a | (2 && c)); + foo (!a | (2 || c)); + foo (!a | !2); + foo (!(a | 2)); + foo ((!a) | 2); + foo (!1 | 2); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!1 | (2 < c)); + foo (!1 | (2 > c)); + foo (!1 | (2 == c)); + foo (!1 | (2 != c)); + foo (!1 | (2 <= c)); + foo (!1 | (2 >= c)); + foo (!1 | (2 && c)); + foo (!1 | (2 || c)); + foo (!1 | !2); + foo (!(1 | 2)); + foo ((!1) | 2); + + foo (b & !a); /* { dg-bogus "parentheses" "bogus warning" } */ + foo ((b < c) & !a); + foo ((b > c) & !a); + foo ((b == c) & !a); + foo ((b != c) & !a); + foo ((b <= c) & !a); + foo ((b >= c) & !a); + foo ((b && c) & !a); + foo ((b || c) & !a); + foo (!b & !a); + foo (!(b & a)); + foo (b & (!a)); + foo (2 & !a); /* { dg-bogus "parentheses" "correct warning" } */ + foo ((2 < c) & !a); + foo ((2 > c) & !a); + foo ((2 == c) & !a); + foo ((2 != c) & !a); + foo ((2 <= c) & !a); + foo ((2 >= c) & !a); + foo ((2 && c) & !a); + foo ((2 || c) & !a); + foo (!2 & !a); + foo (!(2 & a)); + foo (2 & (!a)); + foo (2 & !1); /* { dg-bogus "parentheses" "correct warning" } */ + foo ((2 < c) & !1); + foo ((2 > c) & !1); + foo ((2 == c) & !1); + foo ((2 != c) & !1); + foo ((2 <= c) & !1); + foo ((2 >= c) & !1); + foo ((2 && c) & !1); + foo ((2 || c) & !1); + foo (!2 & !1); + foo (!(2 & 1)); + + foo (b | !a); /* { dg-bogus "parentheses" "correct warning" } */ + foo ((b < c) | !a); + foo ((b > c) | !a); + foo ((b == c) | !a); + foo ((b != c) | !a); + foo ((b <= c) | !a); + foo ((b >= c) | !a); + foo ((b && c) | !a); + foo ((b || c) | !a); + foo (!b | !a); + foo (!(b | a)); + foo (b | (!a)); + foo (2 | !a); /* { dg-bogus "parentheses" "correct warning" } */ + foo ((2 < c) | !a); + foo ((2 > c) | !a); + foo ((2 == c) | !a); + foo ((2 != c) | !a); + foo ((2 <= c) | !a); + foo ((2 >= c) | !a); + foo ((2 && c) | !a); + foo ((2 || c) | !a); + foo (!2 | !a); + foo (!(2 | a)); + foo (2 | (!a)); + foo (2 | !1); /* { dg-bogus "parentheses" "correct warning" } */ + foo ((2 < c) | !1); + foo ((2 > c) | !1); + foo ((2 == c) | !1); + foo ((2 != c) | !1); + foo ((2 <= c) | !1); + foo ((2 >= c) | !1); + foo ((2 && c) | !1); + foo ((2 || c) | !1); + foo (!2 | !1); + foo (!(2 | 1)); + foo (2 | (!1)); +} + + +int +baz (int a, int b, int c) +{ + foo (!a & (b << c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a & (b >> c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a & (b + c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a & (b - c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a & (b = c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a & ~b); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a & (b & c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a & (b | c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a & 2); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a & (2 << c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a & (2 >> c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a & (2 + c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a & (2 - c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a & (c = 2)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a & ~2); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a & (2 & c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a & (2 | c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!1 & (2 << c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!1 & (2 >> c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!1 & (2 + c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!1 & (2 - c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!1 & (c = 2)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!1 & ~2); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!1 & (2 & c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!1 & (2 | c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a | (b << c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a | (b >> c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a | (b + c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a | (b - c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a | (b = c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a | ~b); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a | (b & c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a | (b | c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a | (2 << c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a | (2 >> c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a | (2 + c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a | (2 - c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a | (c = 2)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a | ~2); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a | (2 & c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!a | (2 | c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!1 | (2 << c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!1 | (2 >> c));/* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!1 | (2 + c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!1 | (2 - c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!1 | (c = 2)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!1 | ~2); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!1 | (2 & c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo (!1 | (2 | c)); /* { dg-warning "parentheses" "correct warning" { xfail *-*-* } } */ + foo ((b << c) & !a); + foo ((b >> c) & !a); + foo ((b + c) & !a); + foo ((b - c) & !a); + foo ((b = c) & !a); + foo (~b & !a); + foo ((b & c) & !a); + foo ((b | c) & !a); + foo ((2 << c) & !a); + foo ((2 >> c) & !a); + foo ((2 + c) & !a); + foo ((2 - c) & !a); + foo ((c = 2) & !a); + foo (~2 & !a); + foo ((2 & c) & !a); + foo ((2 | c) & !a); + foo ((2 << c) & !1); + foo ((2 >> c) & !1); + foo ((2 + c) & !1); + foo ((2 - c) & !1); + foo ((c = 2) & !1); + foo (~2 & !1); + foo ((2 & c) & !1); + foo ((2 | c) & !1); + foo ((b << c) | !a); + foo ((b >> c) | !a); + foo ((b + c) | !a); + foo ((b - c) | !a); + foo ((b = c) | !a); + foo (~b | !a); + foo ((b & c) | !a); + foo ((b | c) | !a); + foo ((2 << c) | !a); + foo ((2 >> c) | !a); + foo ((2 + c) | !a); + foo ((2 - c) | !a); + foo ((c = 2) | !a); + foo (~2 | !a); + foo ((2 & c) | !a); + foo ((2 | c) | !a); + foo ((2 << c) | !1); + foo ((2 >> c) | !1); + foo ((2 + c) | !1); + foo ((2 - c) | !1); + foo ((c = 2) | !1); + foo (~2 | !1); + foo ((2 & c) | !1); + foo ((2 | c) | !1); +} diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-3.C b/gcc/testsuite/g++.dg/warn/Wparentheses-3.C new file mode 100644 index 000000000..8781953b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-3.C @@ -0,0 +1,13 @@ +// Test that -Wparentheses does not give bogus warnings in the +// presence of templates. Bug 17041. + +// { dg-do compile } +// { dg-options "-Wparentheses" } + +template<int> struct A +{ + int i; + A() { if ((i = 0)) ; } +}; + +A<0> a; diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-4.C b/gcc/testsuite/g++.dg/warn/Wparentheses-4.C new file mode 100644 index 000000000..2048ed7c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-4.C @@ -0,0 +1,19 @@ +// Test that -Wparentheses does not give bogus warnings in the +// presence of templates for non-plain assignment. Bug 17120. + +// { dg-do compile } +// { dg-options "-Wparentheses" } + +template<typename _Tp> + inline _Tp + cmath_power(_Tp __x, unsigned int __n) + { + while (__n >>= 1) + ; + return __x; + } + +int main() +{ + cmath_power(1.0, 3); +} diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-5.C b/gcc/testsuite/g++.dg/warn/Wparentheses-5.C new file mode 100644 index 000000000..2cd05aaae --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-5.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// { dg-options -Wparentheses } + +// C++ version of gcc.dg/Wparentheses-1.c. + +int foo (int a, int b) +{ + int c = (a && b) || 0; // { dg-bogus "suggest parentheses" } + c = a && b || 0; // { dg-warning "suggest parentheses" } + + return (a && b && 1) || 0; // { dg-bogus "suggest parentheses" } +} diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-6.C b/gcc/testsuite/g++.dg/warn/Wparentheses-6.C new file mode 100644 index 000000000..9963d822e --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-6.C @@ -0,0 +1,65 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +// C++ version of gcc.dg/Wparentheses-2.c. + +int foo (int); + +int +bar (int a, int b, int c) +{ + foo (a <= b <= c); // { dg-warning "comparison" "correct warning" } + foo ((a <= b) <= c); + foo (a <= (b <= c)); + foo (1 <= 2 <= c); // { dg-warning "comparison" "correct warning" } + foo ((1 <= 2) <= c); + foo (1 <= (2 <= c)); + foo (1 <= 2 <= 3); // { dg-warning "comparison" "correct warning" } + foo ((1 <= 2) <= 3); + foo (1 <= (2 <= 3)); + foo (a > b > c); // { dg-warning "comparison" "correct warning" } + foo ((a > b) > c); + foo (a > (b > c)); + foo (1 > 2 > c); // { dg-warning "comparison" "correct warning" } + foo ((1 > 2) > c); + foo (1 > (2 > c)); + foo (1 > 2 > 3); // { dg-warning "comparison" "correct warning" } + foo ((1 > 2) > 3); + foo (1 > (2 > 3)); + foo (a < b <= c); // { dg-warning "comparison" "correct warning" } + foo ((a < b) <= c); + foo (a < (b <= c)); + foo (1 < 2 <= c); // { dg-warning "comparison" "correct warning" } + foo ((1 < 2) <= c); + foo (1 < (2 <= c)); + foo (1 < 2 <= 3); // { dg-warning "comparison" "correct warning" } + foo ((1 < 2) <= 3); + foo (1 < (2 <= 3)); + foo (a <= b > c); // { dg-warning "comparison" "correct warning" } + foo ((a <= b) > c); + foo (a <= (b > c)); + foo (1 <= 2 > c); // { dg-warning "comparison" "correct warning" } + foo ((1 <= 2) > c); + foo (1 <= (2 > c)); + foo (1 <= 2 > 3); // { dg-warning "comparison" "correct warning" } + foo ((1 <= 2) > 3); + foo (1 <= (2 > 3)); + foo (a <= b == c); // { dg-warning "comparison" "correct warning" } + foo ((a <= b) == c); + foo (a <= (b == c)); + foo (1 <= 2 == c); // { dg-warning "comparison" "correct warning" } + foo ((1 <= 2) == c); + foo (1 <= (2 == c)); + foo (1 <= 2 == 3); // { dg-warning "comparison" "correct warning" } + foo ((1 <= 2) == 3); + foo (1 <= (2 == 3)); + foo (a != b != c); // { dg-warning "comparison" "correct warning" } + foo ((a != b) != c); + foo (a != (b != c)); + foo (1 != 2 != c); // { dg-warning "comparison" "correct warning" } + foo ((1 != 2) != c); + foo (1 != (2 != c)); + foo (1 != 2 != 3); // { dg-warning "comparison" "correct warning" } + foo ((1 != 2) != 3); + foo (1 != (2 != 3)); +} diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-7.C b/gcc/testsuite/g++.dg/warn/Wparentheses-7.C new file mode 100644 index 000000000..7d549c38c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-7.C @@ -0,0 +1,83 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +// C++ copy of gcc.dg/Wparentheses-4.c + +int foo (int); + +int +bar (int a, int b, int c) +{ + foo (a + b << c); // { dg-warning "parentheses" "correct warning" } + foo ((a + b) << c); + foo (a + (b << c)); + foo (1 + 2 << c); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) << c); + foo (1 + (2 << c)); + foo (1 + 2 << 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) << 3); + foo (1 + (2 << 3)); + foo (a << b + c); // { dg-warning "parentheses" "correct warning" } + foo ((a << b) + c); + foo (a << (b + c)); + foo (1 << 2 + c); // { dg-warning "parentheses" "correct warning" } + foo ((1 << 2) + c); + foo (1 << (2 + c)); + foo (1 << 2 + 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 << 2) + 3); + foo (1 << (2 + 3)); + foo (a + b >> c); // { dg-warning "parentheses" "correct warning" } + foo ((a + b) >> c); + foo (a + (b >> c)); + foo (1 + 2 >> c); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) >> c); + foo (1 + (2 >> c)); + foo (1 + 2 >> 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) >> 3); + foo (1 + (2 >> 3)); + foo (a >> b + c); // { dg-warning "parentheses" "correct warning" } + foo ((a >> b) + c); + foo (a >> (b + c)); + foo (1 >> 2 + c); // { dg-warning "parentheses" "correct warning" } + foo ((1 >> 2) + c); + foo (1 >> (2 + c)); + foo (1 >> 2 + 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 >> 2) + 3); + foo (1 >> (2 + 3)); + foo (a - b << c); // { dg-warning "parentheses" "correct warning" } + foo ((a - b) << c); + foo (a - (b << c)); + foo (6 - 5 << c); // { dg-warning "parentheses" "correct warning" } + foo ((6 - 5) << c); + foo (6 - (5 << c)); + foo (6 - 5 << 4); // { dg-warning "parentheses" "correct warning" } + foo ((6 - 5) << 4); + foo (6 - (5 << 4)); + foo (a << b - c); // { dg-warning "parentheses" "correct warning" } + foo ((a << b) - c); + foo (a << (b - c)); + foo (6 << 5 - c); // { dg-warning "parentheses" "correct warning" } + foo ((6 << 5) - c); + foo (6 << (5 - c)); + foo (6 << 5 - 4); // { dg-warning "parentheses" "correct warning" } + foo ((6 << 5) - 4); + foo (6 << (5 - 4)); + foo (a - b >> c); // { dg-warning "parentheses" "correct warning" } + foo ((a - b) >> c); + foo (a - (b >> c)); + foo (6 - 5 >> c); // { dg-warning "parentheses" "correct warning" } + foo ((6 - 5) >> c); + foo (6 - (5 >> c)); + foo (6 - 5 >> 4); // { dg-warning "parentheses" "correct warning" } + foo ((6 - 5) >> 4); + foo (6 - (5 >> 4)); + foo (a >> b - c); // { dg-warning "parentheses" "correct warning" } + foo ((a >> b) - c); + foo (a >> (b - c)); + foo (6 >> 5 - c); // { dg-warning "parentheses" "correct warning" } + foo ((6 >> 5) - c); + foo (6 >> (5 - c)); + foo (6 >> 5 - 4); // { dg-warning "parentheses" "correct warning" } + foo ((6 >> 5) - 4); + foo (6 >> (5 - 4)); +} diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-8.C b/gcc/testsuite/g++.dg/warn/Wparentheses-8.C new file mode 100644 index 000000000..ddb5e64b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-8.C @@ -0,0 +1,29 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +// C++ version of gcc.dg/Wparentheses-5.c + +int foo (int); + +int +bar (int a, int b, int c) +{ + foo (a && b || c); // { dg-warning "parentheses" "correct warning" } + foo ((a && b) || c); + foo (a && (b || c)); + foo (1 && 2 || c); // { dg-warning "parentheses" "correct warning" } + foo ((1 && 2) || c); + foo (1 && (2 || c)); + foo (1 && 2 || 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 && 2) || 3); + foo (1 && (2 || 3)); + foo (a || b && c); // { dg-warning "parentheses" "correct warning" } + foo ((a || b) && c); + foo (a || (b && c)); + foo (1 || 2 && c); // { dg-warning "parentheses" "correct warning" } + foo ((1 || 2) && c); + foo (1 || (2 && c)); + foo (1 || 2 && 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 || 2) && 3); + foo (1 || (2 && 3)); +} diff --git a/gcc/testsuite/g++.dg/warn/Wparentheses-9.C b/gcc/testsuite/g++.dg/warn/Wparentheses-9.C new file mode 100644 index 000000000..bad6fb1c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wparentheses-9.C @@ -0,0 +1,119 @@ +// { dg-do compile } +// { dg-options "-Wparentheses" } + +// C++ version of gcc.dg/Wparentheses-6.c + +int foo (int); + +int +bar (int a, int b, int c) +{ + foo (a & b | c); // { dg-warning "parentheses" "correct warning" } + foo ((a & b) | c); + foo (a & (b | c)); + foo (1 & 2 | c); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) | c); + foo (1 & (2 | c)); + foo (1 & 2 | 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 & 2) | 3); + foo (1 & (2 | 3)); + foo (a | b & c); // { dg-warning "parentheses" "correct warning" } + foo ((a | b) & c); + foo (a | (b & c)); + foo (1 | 2 & c); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) & c); + foo (1 | (2 & c)); + foo (1 | 2 & 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) & 3); + foo (1 | (2 & 3)); + foo (a ^ b | c); // { dg-warning "parentheses" "correct warning" } + foo ((a ^ b) | c); + foo (a ^ (b | c)); + foo (1 ^ 2 | c); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) | c); + foo (1 ^ (2 | c)); + foo (1 ^ 2 | 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 ^ 2) | 3); + foo (1 ^ (2 | 3)); + foo (a | b ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((a | b) ^ c); + foo (a | (b ^ c)); + foo (1 | 2 ^ c); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) ^ c); + foo (1 | (2 ^ c)); + foo (1 | 2 ^ 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) ^ 3); + foo (1 | (2 ^ 3)); + foo (a + b | c); // { dg-warning "parentheses" "correct warning" } + foo ((a + b) | c); + foo (a + (b | c)); + foo (1 + 2 | c); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) | c); + foo (1 + (2 | c)); + foo (1 + 2 | 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 + 2) | 3); + foo (1 + (2 | 3)); + foo (a | b + c); // { dg-warning "parentheses" "correct warning" } + foo ((a | b) + c); + foo (a | (b + c)); + foo (1 | 2 + c); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) + c); + foo (1 | (2 + c)); + foo (1 | 2 + 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) + 3); + foo (1 | (2 + 3)); + foo (a - b | c); // { dg-warning "parentheses" "correct warning" } + foo ((a - b) | c); + foo (a - (b | c)); + foo (1 - 2 | c); // { dg-warning "parentheses" "correct warning" } + foo ((1 - 2) | c); + foo (1 - (2 | c)); + foo (1 - 2 | 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 - 2) | 3); + foo (1 - (2 | 3)); + foo (a | b - c); // { dg-warning "parentheses" "correct warning" } + foo ((a | b) - c); + foo (a | (b - c)); + foo (1 | 2 - c); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) - c); + foo (1 | (2 - c)); + foo (1 | 2 - 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) - 3); + foo (1 | (2 - 3)); + foo (a > b | c); // { dg-warning "parentheses" "correct warning" } + foo ((a > b) | c); + foo (a > (b | c)); + foo (1 > 2 | c); // { dg-warning "parentheses" "correct warning" } + foo ((1 > 2) | c); + foo (1 > (2 | c)); + foo (1 > 2 | 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 > 2) | 3); + foo (1 > (2 | 3)); + foo (a | b > c); // { dg-warning "parentheses" "correct warning" } + foo ((a | b) > c); + foo (a | (b > c)); + foo (1 | 2 > c); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) > c); + foo (1 | (2 > c)); + foo (1 | 2 > 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) > 3); + foo (1 | (2 > 3)); + foo (a <= b | c); // { dg-warning "parentheses" "correct warning" } + foo ((a <= b) | c); + foo (a <= (b | c)); + foo (1 <= 2 | c); // { dg-warning "parentheses" "correct warning" } + foo ((1 <= 2) | c); + foo (1 <= (2 | c)); + foo (1 <= 2 | 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 <= 2) | 3); + foo (1 <= (2 | 3)); + foo (a | b <= c); // { dg-warning "parentheses" "correct warning" } + foo ((a | b) <= c); + foo (a | (b <= c)); + foo (1 | 2 <= c); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) <= c); + foo (1 | (2 <= c)); + foo (1 | 2 <= 3); // { dg-warning "parentheses" "correct warning" } + foo ((1 | 2) <= 3); + foo (1 | (2 <= 3)); +} diff --git a/gcc/testsuite/g++.dg/warn/Wreorder-1.C b/gcc/testsuite/g++.dg/warn/Wreorder-1.C new file mode 100644 index 000000000..940ef4a46 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wreorder-1.C @@ -0,0 +1,14 @@ +// { dg-options "-Wreorder -W" } + +struct S { + S (); +}; + +struct T { + T (); +}; + +struct U : virtual public S, virtual public T { + U () : T (), S () {} // { dg-warning "" } + U (const U&) : S () {} +}; diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-1.C b/gcc/testsuite/g++.dg/warn/Wreturn-1.C new file mode 100644 index 000000000..f0dba504b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wreturn-1.C @@ -0,0 +1,9 @@ +// { dg-options "-Wreturn-type" } +// PR c++/15742 + +extern void exit(int) __attribute__ ((noreturn)); + +template<typename T> +struct A { + int find_cmp(void) { exit(1); } +}; diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-2.C b/gcc/testsuite/g++.dg/warn/Wreturn-2.C new file mode 100644 index 000000000..460afd53a --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wreturn-2.C @@ -0,0 +1,7 @@ +// { dg-do compile } +int foo(int first) { + while (true) { + return first; + } +} // { dg-bogus "control reaches" } + diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-3.C b/gcc/testsuite/g++.dg/warn/Wreturn-3.C new file mode 100644 index 000000000..822dd4fdd --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wreturn-3.C @@ -0,0 +1,18 @@ +// { dg-options "-Wreturn-type" } +// PR c++/20624 + +struct fpos { + fpos(int __pos) {} +}; +struct g { + g(); + ~g(); +}; +fpos seekoff(int b, int c) +{ + g __buf; + if (b != -1 && c >= 0) + return fpos(-1); + else + return fpos(-1); +} diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-type-1.C b/gcc/testsuite/g++.dg/warn/Wreturn-type-1.C new file mode 100644 index 000000000..fb9a86291 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wreturn-type-1.C @@ -0,0 +1,11 @@ +// PR c++/11725 +// { dg-options "-Wreturn-type" } + +template <class T> +struct A +{ + int foo() + { + throw "Stop"; + } +}; diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-type-2.C b/gcc/testsuite/g++.dg/warn/Wreturn-type-2.C new file mode 100644 index 000000000..ad59d4ec3 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wreturn-type-2.C @@ -0,0 +1,20 @@ +// PR middle-end/16558 +// { dg-options "-Wreturn-type" } + +struct C +{ + C (); + ~C (); +}; + +int getref (int ndx) +{ + C d; + + if (ndx != 0) { + C base; + return 0; + } + else + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-type-3.C b/gcc/testsuite/g++.dg/warn/Wreturn-type-3.C new file mode 100644 index 000000000..f13d58745 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wreturn-type-3.C @@ -0,0 +1,14 @@ +// PR middle-end/19583 +// { dg-options "-Wreturn-type -O" } + +struct E{}; + +inline int bar() throw(E) +{ + return 0; +} + +void foo () +{ + bar(); +} diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-type-4.C b/gcc/testsuite/g++.dg/warn/Wreturn-type-4.C new file mode 100644 index 000000000..4f02678e7 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wreturn-type-4.C @@ -0,0 +1,43 @@ +/* PR c++/18313 */ +/* { dg-do compile } */ +/* { dg-options "-Wignored-qualifiers" } */ + +volatile void bar(); /* { dg-warning "type qualifiers ignored" } */ + +struct A +{ + const int bla(); /* { dg-warning "type qualifiers ignored" } */ + static const A getA(); /* { dg-bogus "type qualifiers" } */ +}; + +template<typename T> const T getfoo(const T def) /* { dg-bogus "type qualifiers ignored" } */ +{ return def; } + +template<typename T> class Pair +{ + public: + T getLeft() const { return T(); } /* { dg-bogus "type qualifiers ignored" } */ + const T getRight() const { return T(); } /* { dg-bogus "type qualifiers ignored" } */ +}; + +template <typename T> struct S { + const int f(); /* { dg-warning "type qualifiers ignored" } */ + const T g(); /* { dg-bogus "type qualifiers ignored" } */ + T h(); +}; + +int* testtemplate() +{ + int i; + + Pair<const int> a; + + a.getLeft(); + a.getRight(); + + S<bool> b; + b.h(); /* { dg-bogus "type qualifiers ignored" } */ + b.g(); /* { dg-bogus "type qualifiers ignored" } */ + + return getfoo<int*>(&i); +} diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-type-5.C b/gcc/testsuite/g++.dg/warn/Wreturn-type-5.C new file mode 100644 index 000000000..8a19d646f --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wreturn-type-5.C @@ -0,0 +1,21 @@ +// PR c++/36254 +// { dg-do compile } +// { dg-options "-Wreturn-type" } + +int i, j, k; +struct X { X (); ~X (); }; + +bool +foo () +{ + X x; + if (i && j) + { + if (k) + return true; + else + return false; + } + else + return false; +} diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-type-6.C b/gcc/testsuite/g++.dg/warn/Wreturn-type-6.C new file mode 100644 index 000000000..45ec95236 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wreturn-type-6.C @@ -0,0 +1,13 @@ +/* PR c++/40749 */ +/* { dg-do compile } */ +/* { dg-options "-Wreturn-type" } */ + +struct A {}; +const A a() {} /* { dg-warning "no return statement" } */ +const A& b() {} /* { dg-warning "no return statement" } */ + +const int c() {} /* { dg-warning "no return statement" } */ + +template<class T> +const int foo(T t) {} /* { dg-warning "no return statement" } */ +int d = foo<int>(0), e = foo<int>(1); diff --git a/gcc/testsuite/g++.dg/warn/Wsequence-point-1.C b/gcc/testsuite/g++.dg/warn/Wsequence-point-1.C new file mode 100644 index 000000000..fb5b8a1a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wsequence-point-1.C @@ -0,0 +1,11 @@ +// { dg-do compile } +// { dg-options "-Wsequence-point" } +struct C +{ + ~C() throw(); +}; + +void t_test1 (C* mapping) +{ + delete [] mapping; +} diff --git a/gcc/testsuite/g++.dg/warn/Wsequence-point-2.C b/gcc/testsuite/g++.dg/warn/Wsequence-point-2.C new file mode 100644 index 000000000..ab9c97a80 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wsequence-point-2.C @@ -0,0 +1,28 @@ +// PR c++/45894 +// { dg-do compile } +// { dg-options "-std=c++0x -Wsequence-point" } + +struct F +{ + template <typename = int> + void bar (); +}; +template <typename = int> +struct V +{ + V (const V &) { F::bar <>; } +}; +struct C +{ + V <> v; +}; +struct B +{ + C f (); +}; +struct A +{ + C c; + B b; + A () : c (b.f ()) { } +}; diff --git a/gcc/testsuite/g++.dg/warn/Wsequence-point-3.C b/gcc/testsuite/g++.dg/warn/Wsequence-point-3.C new file mode 100644 index 000000000..5f73ca18b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wsequence-point-3.C @@ -0,0 +1,20 @@ +// PR c++/46401 +// { dg-do compile } +// { dg-options "-Wsequence-point" } + +struct S +{ + S (); + S &operator<< (const char *); + S (const S &); +}; + +#define N1(n) << #n +#define N2(n) N1(n) +#define N3(n) N2(n##0) N2(n##1) N2(n##2) N2(n##3) N2(n##4) \ + N2(n##5) N2(n##6) N2(n##7) N2(n##8) N2(n##9) +#define N4(n) N3(n##0) N3(n##1) N3(n##2) N3(n##3) N3(n##4) \ + N3(n##5) N3(n##6) N3(n##7) N3(n##8) N3(n##9) +#define N5(n) N4(n##0) N4(n##1) N4(n##2) N4(n##3) N4(n##4) \ + N4(n##5) N4(n##6) N4(n##7) N4(n##8) N4(n##9) +S s = S () N5(a) N5(b); diff --git a/gcc/testsuite/g++.dg/warn/Wsequence-point-pr18050.C b/gcc/testsuite/g++.dg/warn/Wsequence-point-pr18050.C new file mode 100644 index 000000000..63aecd0f3 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wsequence-point-pr18050.C @@ -0,0 +1,24 @@ +/* PR 18050 : bogus warning with -Wsequence-point */ +/* { dg-do compile } */ +/* { dg-options "-Wsequence-point" } */ + +struct x +{ + int i; +}; +void bar(struct x*, int *); + +void foo(struct x *y) +{ + bar(y++, &y->i); /* { dg-warning "operation on 'y' may be undefined" } */ +} + +void zz(int a, int *b) +{ + *b = a; +} + +void baz(void) { + int a = 5; + zz(++a, &a); /* { dg-bogus "operation on 'a' may be undefined" } */ +} diff --git a/gcc/testsuite/g++.dg/warn/Wshadow-1.C b/gcc/testsuite/g++.dg/warn/Wshadow-1.C new file mode 100644 index 000000000..1647a010d --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wshadow-1.C @@ -0,0 +1,41 @@ +/* Copyright (C) 2001, 2002 Free Software Foundation, Inc. */ + +/* { dg-do compile } */ +/* { dg-options -Wshadow } */ + +/* Source: Neil Booth, 3 Nov 2001, and PR 16, 713. -Wshadow was + giving a bunch of warnings we didn't want, and wasn't giving the + location of the shadowed variable. */ + +struct status // { dg-bogus "shadowed declaration" } +{ + int member; + void foo2 (); + + inline static int foo3 (int member) // { dg-bogus "shadows" } + { + return member; + } +}; + +int decl1; // { dg-warning "shadowed declaration" } +int decl2; // { dg-warning "shadowed declaration" } +void foo (struct status &status,// { dg-bogus "shadows a global decl" } + double decl1) // { dg-warning "shadows a global decl" } +{ +} + +void foo1 (int d) +{ + double d; // { dg-error "shadows a parameter" } +} + +void status::foo2 () +{ + int member; // { dg-warning "shadows a member" } + int decl2; // { dg-warning "shadows a global decl" } + int local; // { dg-warning "shadowed declaration" } + { + int local; // { dg-warning "shadows a previous local" } + } +} diff --git a/gcc/testsuite/g++.dg/warn/Wshadow-2.C b/gcc/testsuite/g++.dg/warn/Wshadow-2.C new file mode 100644 index 000000000..a3e9428b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wshadow-2.C @@ -0,0 +1,10 @@ +/* { dg-options "-Wshadow" } */ + +struct A { + void a1 () { + struct B { B() {} }; // There should be no warning here. + } + void a2 () { + struct B { }; + } +}; diff --git a/gcc/testsuite/g++.dg/warn/Wshadow-3.C b/gcc/testsuite/g++.dg/warn/Wshadow-3.C new file mode 100644 index 000000000..99add19a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wshadow-3.C @@ -0,0 +1,8 @@ +// PR c++/18530 +// { dg-options "-Wshadow" } + +struct A { + A(); + ~A(); + void foo (int __ct, int __dt) {} +}; diff --git a/gcc/testsuite/g++.dg/warn/Wshadow-4.C b/gcc/testsuite/g++.dg/warn/Wshadow-4.C new file mode 100644 index 000000000..c033028d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wshadow-4.C @@ -0,0 +1,32 @@ +// PR c++/39526 +// { dg-options "-Wshadow" } + +class INetURLObject +{ +public: + INetURLObject(int i); + int GetMainURL() const; +}; + +int foo(int infoo) // { dg-bogus "shadowed declaration" } +{ + int outfoo( INetURLObject( infoo ).GetMainURL()); // { dg-bogus "shadows" } + extern void f(int infoo); + struct A + { + void f(int infoo) { } // { dg-bogus "shadows a parameter" } + }; + return outfoo; +} + +// PR c++/39763 +int foo2(void) +{ + int infoo = 0; // { dg-bogus "shadowed declaration" } + int outfoo( INetURLObject( infoo ).GetMainURL()); // { dg-bogus "shadows" } + struct A + { + void f(int infoo) { } // { dg-bogus "shadows a previous local" } + }; + return outfoo; +} diff --git a/gcc/testsuite/g++.dg/warn/Wshadow-5.C b/gcc/testsuite/g++.dg/warn/Wshadow-5.C new file mode 100644 index 000000000..66232913f --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wshadow-5.C @@ -0,0 +1,33 @@ +// Wshadows was giving warnings for nested function parameters in nested class +// or structure that we didn't want. +// { dg-do compile } +// { dg-options "-Wshadow" } + +// PR c++/41825 +int f (int n) +{ + int bar (int n) { return n++; } // { dg-error "a function-definition is not allowed here" } + return bar (n); // { dg-error "was not declared in this scope" } +} + +int g (int i) +{ + struct { + int bar (int i) { return i++; } // { dg-bogus "shadows" } + } s; + + return s.bar (i); +} + +// PR c++/30566 +void h( int x ) +{ + class InnerClass + { + public: + static int g( int x ) // { dg-bogus "shadows" } + { + // empty + } + }; +} diff --git a/gcc/testsuite/g++.dg/warn/Wshadow-6.C b/gcc/testsuite/g++.dg/warn/Wshadow-6.C new file mode 100644 index 000000000..9b13e3ae7 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wshadow-6.C @@ -0,0 +1,39 @@ +// Test the declaration of nested lambda function shadows +// a parameter or previous local. +// { dg-do compile } +// { dg-options "-std=c++0x -Wshadow" } + +struct S {}; +int f1(int x) // { dg-warning "shadowed declaration" } +{ + int t = 0; + int m = 0; // { dg-warning "shadowed declaration" } + [&t] (int x) { // { dg-warning "shadows a parameter" } + int m = 1; // { dg-warning "shadows a previous local" } + t = t + x + m; + }; + return t; +} + +void f2(struct S i, int j) { + struct A { + struct S x; + void g(struct S i) { // { dg-warning "shadowed declaration" } + struct S x; // { dg-warning "shadows a member of" } + struct S y; // { dg-warning "shadowed declaration" } + int t; + [&t](struct S i){ // { dg-warning "shadows a parameter" } + int j = 1; // { dg-bogus "shadows" } + struct S y; // { dg-warning "shadows a previous local" } + t = j; + }; + } + }; +} + +void f3(int i) { + [=]{ + int j = i; + int i; // { dg-warning "shadows a member of" } + }; +} diff --git a/gcc/testsuite/g++.dg/warn/Wshadow-7.C b/gcc/testsuite/g++.dg/warn/Wshadow-7.C new file mode 100644 index 000000000..5de952ee7 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wshadow-7.C @@ -0,0 +1,37 @@ +// PR c++/44128 +// { dg-options "-Wshadow" } + +typedef long My_ssize_t; // { dg-warning "shadowed declaration" } +typedef int Foo; // { dg-warning "shadowed declaration" } +struct Bar1 { // { dg-bogus "shadowed declaration" } + int a; +}; +struct Bar2 { // { dg-warning "shadowed declaration" } + int a; +}; + +void func() { + typedef int My_ssize_t; // { dg-warning "shadows a global" } + typedef char My_Num; // { dg-warning "shadowed declaration" } + { + typedef short My_Num; // { dg-warning "shadows a previous local" } + } + int Foo; // { dg-warning "shadows a global" } + float Bar1; // { dg-bogus "shadows a global" } + struct Bar2 { // { dg-warning "shadows a global" } + int a; + }; + struct Bar3 { // { dg-warning "shadowed declaration" } + int a; + }; + struct Bar4 { // { dg-bogus "shadowed declaration" } + int a; + }; + { + struct Bar3 { // { dg-warning "shadows a previous local" } + int a; + }; + char Bar4; // { dg-bogus "shadows a previous local" } + int My_Num; // { dg-warning "shadows a previous local" } + } +} diff --git a/gcc/testsuite/g++.dg/warn/Wsign-compare-1.C b/gcc/testsuite/g++.dg/warn/Wsign-compare-1.C new file mode 100644 index 000000000..495bb992c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wsign-compare-1.C @@ -0,0 +1,6 @@ +// { dg-options "-Wsign-compare" } + +extern unsigned u; + +template<class F> +int f() { return u > 1; } diff --git a/gcc/testsuite/g++.dg/warn/Wsign-compare-2.C b/gcc/testsuite/g++.dg/warn/Wsign-compare-2.C new file mode 100644 index 000000000..2b8360648 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wsign-compare-2.C @@ -0,0 +1,10 @@ +// PR c/35430 +// { dg-do compile } +// { dg-options "-Wsign-compare" } + +void +foo (__complex__ int i) +{ + i == 0u; + i == ~1u; // { dg-warning "comparison between signed and unsigned integer expressions" } +} diff --git a/gcc/testsuite/g++.dg/warn/Wsign-compare-3.C b/gcc/testsuite/g++.dg/warn/Wsign-compare-3.C new file mode 100644 index 000000000..dc42f41a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wsign-compare-3.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options "-Wsign-compare" } + +enum E { A, B, C }; +extern void f1(int); +void +f2(E v1, E v2) +{ + for (unsigned int i = v1; i <= v2; ++i) + f1(i); + for (int i = v1; i <= v2; ++i) + f1(i); +} diff --git a/gcc/testsuite/g++.dg/warn/Wsign-conversion.C b/gcc/testsuite/g++.dg/warn/Wsign-conversion.C new file mode 100644 index 000000000..83fe2ed66 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wsign-conversion.C @@ -0,0 +1,95 @@ +/* Test for diagnostics for implicit conversions between signed and + unsigned integer types. + C++ equivalent of gcc/testsuite/gcc.dg/Wsign-conversion.c */ + +// { dg-do compile } +// { dg-options "-fsigned-char -Wsign-conversion" } +#include <limits.h> + +void fsc (signed char sc); +void fuc (unsigned char uc); +unsigned fui (unsigned int ui); +void fsi (signed int ui); + +void h (int x) +{ + unsigned int ui = 3; + int si = 3; + unsigned char uc = 3; + signed char sc = 3; + + uc = ui; + uc = si; + sc = ui; + sc = si; + fuc (ui); + fuc (si); + fsc (ui); + fsc (si); + + fsi (si); + fui (ui); + fsi (uc); + si = uc; + fui (uc); + ui = uc; + fui ('A'); + ui = 'A'; + fsi ('A'); + si = 'A'; + fuc ('A'); + uc = 'A'; + + uc = x ? 1U : -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + uc = x ? SCHAR_MIN : 1U; /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + uc = x ? 1 : -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + uc = x ? SCHAR_MIN : 1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + ui = x ? 1U : -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + ui = x ? INT_MIN : 1U; /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + ui = ui ? SCHAR_MIN : 1U; /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + ui = 1U * -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + ui = ui + INT_MIN; /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + ui = x ? 1 : -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + ui = ui ? SCHAR_MIN : 1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + + fuc (-1); /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + uc = -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + fui (-1); /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + ui = -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + fuc ('\xa0'); /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + uc = '\xa0'; /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + fui ('\xa0');/* { dg-warning "negative integer implicitly converted to unsigned type" } */ + ui = '\xa0'; /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + fsi (0x80000000); /* { dg-warning "conversion" } */ + si = 0x80000000; /* { dg-warning "conversion" } */ + + + fsi (UINT_MAX - 1); /* { dg-warning "conversion" } */ + si = UINT_MAX - 1; /* { dg-warning "conversion" } */ + fsi (UINT_MAX - 1U); /* { dg-warning "conversion" } */ + si = UINT_MAX - 1U; /* { dg-warning "conversion" } */ + fsi (UINT_MAX/3U); + si = UINT_MAX/3U; + fsi (UINT_MAX/3); + si = UINT_MAX/3; + fui (UINT_MAX - 1); + ui = UINT_MAX - 1; + + uc = (unsigned char) -1; + ui = -1 * (1 * -1); + ui = (unsigned) -1; + + fsc (uc); /* { dg-warning "conversion" } */ + sc = uc; /* { dg-warning "conversion" } */ + fuc (sc); /* { dg-warning "conversion" } */ + uc = sc; /* { dg-warning "conversion" } */ + fsi (ui); /* { dg-warning "conversion" } */ + si = ui; /* { dg-warning "conversion" } */ + fui (si); /* { dg-warning "conversion" } */ + ui = si; /* { dg-warning "conversion" } */ + fui (sc); /* { dg-warning "conversion" } */ + ui = sc; /* { dg-warning "conversion" } */ +} + +unsigned fui (unsigned a) { return a + -1; } /* { dg-warning "negative integer implicitly converted to unsigned type" } */ + diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-1.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-1.C new file mode 100644 index 000000000..3e9db3611 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-1.C @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-Wstrict-aliasing=2 -O2" } */ + +double x; +int *foo(void) +{ + return (int *)&x; /* { dg-warning "strict-aliasing" } */ +} + diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-2.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-2.C new file mode 100644 index 000000000..713b35461 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-2.C @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-Wstrict-aliasing=2 -O2" } */ + +double x; + +template <typename T> +T *foo(void) +{ + return (T *)&x; /* { dg-bogus "strict-aliasing" } */ +} + +template double *foo<double>(void); + diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-3.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-3.C new file mode 100644 index 000000000..94c2f4702 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-3.C @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-Wstrict-aliasing=2 -O2" } */ + +double x; + +template <typename T> +T *foo(void) +{ + return (T *)&x; /* { dg-warning "strict-aliasing" } */ +} + +template int *foo<int>(void); /* { dg-message "instantiated from here" } */ +template char *foo<char>(void); /* { dg-bogus "instantiated from here" } */ + diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-4.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-4.C new file mode 100644 index 000000000..e877c70fb --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-4.C @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-Wstrict-aliasing=2 -O2" } */ + +double x; + +template <typename T> +T *foo(void) +{ + int a[2]; + float *y = (float *)a; /* { dg-bogus "strict-aliasing" } */ + return (T *)&x; /* { dg-bogus "strict-aliasing" } */ +} + diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-5.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-5.C new file mode 100644 index 000000000..a04925118 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-5.C @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-Wstrict-aliasing=2 -O2" } */ + +float foo () +{ + unsigned int MASK = 0x80000000; + return (float &) MASK; /* { dg-warning "strict-aliasing" } */ +} + diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C new file mode 100644 index 000000000..6f935c854 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-6.C @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-Wstrict-aliasing=2 -O2" } */ + +int foo () +{ + char buf[8]; + return *((int *)buf); /* { dg-warning "strict-aliasing" } */ +} + diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-7.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-7.C new file mode 100644 index 000000000..71ed6cae8 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-7.C @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-Wstrict-aliasing=2 -O2" } */ + +int a[2]; + +double *foo1(void) +{ + return (double *)a; /* { dg-warning "strict-aliasing" } */ +} + +double *foo2(void) +{ + return (double *)&a[0]; /* { dg-warning "strict-aliasing" } */ +} + +__complex__ double x; +int *bar(void) +{ + return (int *)&__imag__ x; /* { dg-warning "strict-aliasing" } */ +} diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-8.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-8.C new file mode 100644 index 000000000..497565eec --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-8.C @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-Wstrict-aliasing=2 -O2 -Wall" } */ + +int a[2]; + +double *foo1(void) +{ + return (double *)a; /* { dg-warning "strict-aliasing" } */ +} + +double *foo2(void) +{ + return (double *)&a[0]; /* { dg-warning "strict-aliasing" } */ +} + +__complex__ double x; +int *bar(void) +{ + return (int *)&__imag__ x; /* { dg-warning "strict-aliasing" } */ +} diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-base-derived.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-base-derived.C new file mode 100644 index 000000000..18e6caf90 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-base-derived.C @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wstrict-aliasing -fstrict-aliasing" } */ + + +class base { + public: + int x; +}; + +class derived: public base { + public: + int y; +}; + +base foo () { + derived d; + base* pb = &d; /* { dg-bogus "base vs. derived" } */ + pb->x = 1; + + return d; +} diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-char-1.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-char-1.C new file mode 100644 index 000000000..bdd24aca6 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-char-1.C @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wstrict-aliasing -fstrict-aliasing" } */ + + +int foo () { + int i; + char* c= reinterpret_cast<char*>(&i); /* { dg-bogus "char" } */ + c[1] = 1; + return i; +} diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-const.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-const.C new file mode 100644 index 000000000..7c079ad5c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-const.C @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wstrict-aliasing -fstrict-aliasing" } */ + +int foo(int* p) { + const int& q = *p; /* { dg-bogus "const vs. non-const" } */ + *p = 1; + return q; +} + diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape-2.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape-2.C new file mode 100644 index 000000000..29414e00e --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape-2.C @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wstrict-aliasing" } */ + +#include<list> + +struct A +{ + virtual ~A(); +}; + +A* foo(); + +void bar(std::list<int> x) +{ + std::list<int> y = x; + if (*y.rbegin()) + delete foo(); +} + diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape-3.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape-3.C new file mode 100644 index 000000000..de6b2c477 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape-3.C @@ -0,0 +1,35 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wstrict-aliasing" } */ + +struct Node_base {}; + +struct Node : Node_base +{ + int data; +}; + +struct List +{ + Node_base node, *prev; + + List() : prev(&node) { xyz(); } + + void xyz(); + + int back() { return static_cast<Node*>(prev)->data; } +}; + +struct A +{ + virtual ~A(); +}; + +A* foo(); + +void bar() +{ + List y; + if (y.back()) + delete foo(); +} + diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape.C new file mode 100644 index 000000000..9ea619877 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-escape.C @@ -0,0 +1,30 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wstrict-aliasing" } */ + +#include <string> +#include <list> + +class A; + +class B { +public: + void foo(A&); + std::string s; +}; + +class A { +public: + A& qaz() { + l.push_back( new A() ); + return *l.back(); + } + std::list<A*> l; +}; + +void bar() +{ + A a; + B b; + b.foo(a.qaz()); +} + diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-nested-arrays.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-nested-arrays.C new file mode 100644 index 000000000..529118102 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-nested-arrays.C @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wstrict-aliasing -fstrict-aliasing" } */ + +int foo () { + int buffer[10][10]; + int* pi = &buffer[0][0]; /* { dg-bogus "same element type" } */ + *pi = 10; + return buffer[0][0]; +} diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-placement-new.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-placement-new.C new file mode 100644 index 000000000..514957bcd --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-placement-new.C @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wstrict-aliasing" } */ + +inline void *operator new (__SIZE_TYPE__, void *__p) throw() { return __p; } + +struct Y { + Y() {} + int i; +}; + +struct X { + X() {} + void construct(const Y& y) + { + new (&m_data[0]) Y(y); + } + bool initialized; + char m_data[sizeof (Y)]; +}; + +void bar(const X&); +void foo(Y& y) +{ + X x; + x.construct(y); + x.initialized = true; + bar(x); +} + diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-signed-unsigned.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-signed-unsigned.C new file mode 100644 index 000000000..5e71ebff8 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-signed-unsigned.C @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wstrict-aliasing -fstrict-aliasing" } */ + + +int foo () { + int i; + unsigned int* pu = reinterpret_cast<unsigned int*> (&i); /* { dg-bogus "signed vs. unsigned" } */ + *pu = 1000000; + return i; +} diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-struct-included.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-struct-included.C new file mode 100644 index 000000000..3f55c78c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-struct-included.C @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wstrict-aliasing -fstrict-aliasing" } */ + + +struct S { + int i; + float f; +}; + +int foo () { + struct S s; + s.i = 7; + float* f = &s.f; /* { dg-bogus "float included in struct S" } */ + *f = 2.0; + return s.i + (int)s.f; +} diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-union.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-union.C new file mode 100644 index 000000000..dfbb42c6f --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-bogus-union.C @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wstrict-aliasing -fstrict-aliasing" } */ + + +union U { + int i; + float f; +}; + +float foo () { + union U u; + float* f = &u.f; /* { dg-bogus "unions are holy in GCC" } */ + u.i = 2; + return *f; +} diff --git a/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-float-ref-int-obj.C b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-float-ref-int-obj.C new file mode 100644 index 000000000..103248da4 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstrict-aliasing-float-ref-int-obj.C @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wstrict-aliasing -fstrict-aliasing" } */ + + +int foo() { + int x; + float& q = reinterpret_cast<float&> (x); /* { dg-message "dereferencing type-punned" "" { target *-*-* } } */ + q = 1.0; /* { dg-warning "does break strict-aliasing" "" { xfail *-*-* } } */ + return x; +} + +/* { dg-message "initialized" "" { xfail *-*-* } 7 } */ diff --git a/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-1.C b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-1.C new file mode 100644 index 000000000..97e317644 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-1.C @@ -0,0 +1,29 @@ +/* PR c/7776 */ +/* { dg-do compile } */ +/* { dg-options "-Waddress" } */ + +int test1(char *ptr) +{ + return ptr == "foo"; /* { dg-warning "comparison with string" } */ +} + +int test2() +{ + return "foo" != (const char*)0; +} + +int test3() +{ + return "foo" == (const char*)0; +} + +int test4() +{ + return (const char*)0 != "foo"; +} + +int test5() +{ + return (const char*)0 == "foo"; +} + diff --git a/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-2.C b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-2.C new file mode 100644 index 000000000..3eb91eeca --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-2.C @@ -0,0 +1,29 @@ +/* PR c/7776 */ +/* { dg-do compile } */ +/* { dg-options "-Wall" } */ + +int test1(char *ptr) +{ + return ptr == "foo"; /* { dg-warning "comparison with string" } */ +} + +int test2() +{ + return "foo" != (const char*)0; +} + +int test3() +{ + return "foo" == (const char*)0; +} + +int test4() +{ + return (const char*)0 != "foo"; +} + +int test5() +{ + return (const char*)0 == "foo"; +} + diff --git a/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-3.C b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-3.C new file mode 100644 index 000000000..f700a51a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-3.C @@ -0,0 +1,29 @@ +/* PR c/7776 */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +int test1(char *ptr) +{ + return ptr == "foo"; +} + +int test2() +{ + return "foo" != (const char*)0; +} + +int test3() +{ + return "foo" == (const char*)0; +} + +int test4() +{ + return (const char*)0 != "foo"; +} + +int test5() +{ + return (const char*)0 == "foo"; +} + diff --git a/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-4.C b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-4.C new file mode 100644 index 000000000..f2a711aeb --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstring-literal-comparison-4.C @@ -0,0 +1,29 @@ +/* PR c/7776 */ +/* { dg-do compile } */ +/* { dg-options "-Wall -Wno-address" } */ + +int test1(char *ptr) +{ + return ptr == "foo"; +} + +int test2() +{ + return "foo" != (const char*)0; +} + +int test3() +{ + return "foo" == (const char*)0; +} + +int test4() +{ + return (const char*)0 != "foo"; +} + +int test5() +{ + return (const char*)0 == "foo"; +} + diff --git a/gcc/testsuite/g++.dg/warn/Wswitch-1.C b/gcc/testsuite/g++.dg/warn/Wswitch-1.C new file mode 100644 index 000000000..1da7180ec --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wswitch-1.C @@ -0,0 +1,63 @@ +/* PR c/4475, PR c++/3780 */ +/* { dg-do compile } */ +/* { dg-options "-Wswitch" } */ + +enum e { e1, e2 }; + +int +foo (int i, int j, enum e ei, enum e ej, enum e ek, enum e el, + enum e em, enum e en, enum e eo, enum e ep) +{ + switch (i) + { + case 1: return 1; + case 2: return 2; + } + switch (j) + { + case 3: return 4; + case 4: return 3; + default: break; + } + switch (ei) /* { dg-warning "enumeration value 'e1' not handled in switch" "enum e1" } */ + { /* { dg-warning "enumeration value 'e2' not handled in switch" "enum e2" { target *-*-* } 22 } */ + } + switch (ej) + { + default: break; + } + switch (ek) /* { dg-warning "enumeration value 'e2' not handled in switch" "enum e2" } */ + { + case e1: return 1; + } + switch (el) + { + case e1: return 1; + default: break; + } + switch (em) + { + case e1: return 1; + case e2: return 2; + } + switch (en) + { + case e1: return 1; + case e2: return 2; + default: break; + } + switch (eo) + { + case e1: return 1; + case e2: return 2; + case 3: return 3; /* { dg-warning "case value" } */ + } + switch (ep) + { + case e1: return 1; + case e2: return 2; + case 3: return 3; /* { dg-warning "case value" } */ + default: break; + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/Wswitch-2.C b/gcc/testsuite/g++.dg/warn/Wswitch-2.C new file mode 100644 index 000000000..79ba4bdcb --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wswitch-2.C @@ -0,0 +1,31 @@ +/* Further -Wswitch tests. */ +/* { dg-do compile } */ +/* { dg-options "-Wswitch" } */ + +enum e { e1 = 0, e2 = 1, e3 = 1, e4 = 2 }; + +int +foo (enum e ei, int j) +{ + switch (ei) + { + case e1: return 1; + case e3: return 2; + case e4: return 3; + } /* No warning here since e2 has the same value as e3. */ + switch (ei) /* { dg-warning "enumeration value 'e4' not handled in switch" "enum e4" } */ + { + case e1: return 1; + case e2: return 2; + } + switch ((int) ei) + { + case e1: return 1; + } /* No warning here since switch condition was cast to int. */ + switch ((enum e) j) /* { dg-warning "enumeration value 'e1' not handled in switch" "enum e1" } */ + { + case e2: return 1; + case e4: return 2; + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/Wswitch-3.C b/gcc/testsuite/g++.dg/warn/Wswitch-3.C new file mode 100644 index 000000000..df1f8956d --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wswitch-3.C @@ -0,0 +1,37 @@ +/* { dg-do compile } */ +/* { dg-options "-Wswitch" } */ + +enum E { A, B, C, D, E, F }; + +int +f1 (enum E e) +{ + switch (e) + { + case A: return 1; + case B: return 2; + case C: return 3; + case D: return 4; + case E: return 5; + case F: return 6; + case 7: return 7; /* { dg-warning "not in enumerated type" } */ + } + return 0; +} + +int +f2 (enum E e) +{ + switch (e) + { + case A: return 1; + case B: return 2; + case C: return 3; + case D: return 4; + case E: return 5; + case F: return 6; + case 7: return 7; /* { dg-warning "not in enumerated type" } */ + default: return 8; + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/Wswitch-default-1.C b/gcc/testsuite/g++.dg/warn/Wswitch-default-1.C new file mode 100644 index 000000000..2236ae531 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wswitch-default-1.C @@ -0,0 +1,22 @@ +// PR C++/21123 +/* { dg-do compile } */ +/* { dg-options "-Wswitch-default" } */ + + +template <typename ArrayType> +void foo( ) +{ + int i = 0; + + switch ( i ) /* { dg-bogus "switch missing default case" } */ + { + case 9: + default: + break; + } +} + +void f() +{ + foo<int>(); +} diff --git a/gcc/testsuite/g++.dg/warn/Wswitch-default-2.C b/gcc/testsuite/g++.dg/warn/Wswitch-default-2.C new file mode 100644 index 000000000..832f867e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wswitch-default-2.C @@ -0,0 +1,21 @@ +// PR C++/21123 +/* { dg-do compile } */ +/* { dg-options "-Wswitch-default" } */ + + +template <typename ArrayType> +void foo( ) +{ + int i = 0; + + switch ( i ) /* { dg-warning "switch missing default case" } */ + { + case 9: + break; + } +} + +void f() +{ + foo<int>(); +} diff --git a/gcc/testsuite/g++.dg/warn/Wtype-limits-Wextra.C b/gcc/testsuite/g++.dg/warn/Wtype-limits-Wextra.C new file mode 100644 index 000000000..9cbdbe547 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wtype-limits-Wextra.C @@ -0,0 +1,84 @@ +/* Test that -Wtype-limits is enabled by -Wextra. */ +/* { dg-do compile } */ +/* { dg-options "-Wextra" } */ +extern void assert (int); + +void a (unsigned char x) +{ + if (x < 0) return;/* { dg-warning "comparison is always false due to limited range of data type" } */ + if (x >= 0) return;/* { dg-warning "comparison is always true due to limited range of data type" } */ + if (0 > x) return;/* { dg-warning "comparison is always false due to limited range of data type" } */ + if (0 <= x) return;/* { dg-warning "comparison is always true due to limited range of data type" } */ + if (x <= 255) /* { dg-warning "comparison is always true due to limited range of data type" } */ + return; + if (255 >= x) /* { dg-warning "comparison is always true due to limited range of data type" } */ + return; + if ((int)x <= 255) /* { dg-bogus "comparison is always true due to limited range of data type" "" { xfail *-*-* } 16 } */ + return; + if (255 >= (unsigned char) 1) + return; + +} + +void b (unsigned short x) +{ + if (x < 0) return;/* { dg-warning "comparison is always false due to limited range of data type" } */ + if (x >= 0) return;/* { dg-warning "comparison is always true due to limited range of data type" } */ + if (0 > x) return;/* { dg-warning "comparison is always false due to limited range of data type" } */ + if (0 <= x) return;/* { dg-warning "comparison is always true due to limited range of data type" } */ +} + +void c (unsigned int x) +{ + if (x < 0) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */ + if (x >= 0) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */ + if (0 > x) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */ + if (0 <= x) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */ + if (1U >= 0) return; + if (1U < 0) return; + if (0 <= 1U) return; + if (0 > 1U) return; +} + +void d (unsigned long x) +{ + if (x < 0) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */ + if (x >= 0) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */ + if (0 > x) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */ + if (0 <= x) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */ +} + +void e (unsigned long long x) +{ + if (x < 0) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */ + if (x >= 0) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */ + if (0 > x) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */ + if (0 <= x) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */ +} + +int test (int x) +{ + if ((long long)x <= 0x123456789ABCLL) /* { dg-bogus "comparison is always true due to limited range of data type" "" { xfail *-*-* } 61 } */ + return 1; + else + return 0; +} + +template <typename Int, Int D> +void f(Int x) { + assert(0 <= x and x <= D); // { dg-warning "comparison is always true due to limited range of data type" } +} + +int ff(void) { + f<unsigned char, 2>(5); + f<signed char, 2>(5); +} + +template <typename Int, Int D> +void g(void) { + assert(0 <= D); +} +int gg(void) { + g<unsigned char, 2>(); +} + diff --git a/gcc/testsuite/g++.dg/warn/Wtype-limits-no.C b/gcc/testsuite/g++.dg/warn/Wtype-limits-no.C new file mode 100644 index 000000000..5040e2657 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wtype-limits-no.C @@ -0,0 +1,84 @@ +/* Test disabling -Wtype-limits. */ +/* { dg-do compile } */ +/* { dg-options "-Wextra -Wno-type-limits" } */ +extern void assert (int); + +void a (unsigned char x) +{ + if (x < 0) return;/* { dg-bogus "comparison is always false due to limited range of data type" } */ + if (x >= 0) return;/* { dg-bogus "comparison is always true due to limited range of data type" } */ + if (0 > x) return;/* { dg-bogus "comparison is always false due to limited range of data type" } */ + if (0 <= x) return;/* { dg-bogus "comparison is always true due to limited range of data type" } */ + if (x <= 255) /* { dg-bogus "comparison is always true due to limited range of data type" } */ + return; + if (255 >= x) /* { dg-bogus "comparison is always true due to limited range of data type" } */ + return; + if ((int)x <= 255) + return; + if (255 >= (unsigned char) 1) + return; + +} + +void b (unsigned short x) +{ + if (x < 0) return;/* { dg-bogus "comparison is always false due to limited range of data type" } */ + if (x >= 0) return;/* { dg-bogus "comparison is always true due to limited range of data type" } */ + if (0 > x) return;/* { dg-bogus "comparison is always false due to limited range of data type" } */ + if (0 <= x) return;/* { dg-bogus "comparison is always true due to limited range of data type" } */ +} + +void c (unsigned int x) +{ + if (x < 0) return;/* { dg-bogus "comparison of unsigned expression < 0 is always false" } */ + if (x >= 0) return;/* { dg-bogus "comparison of unsigned expression >= 0 is always true" } */ + if (0 > x) return;/* { dg-bogus "comparison of unsigned expression < 0 is always false" } */ + if (0 <= x) return;/* { dg-bogus "comparison of unsigned expression >= 0 is always true" } */ + if (1U >= 0) return; + if (1U < 0) return; + if (0 <= 1U) return; + if (0 > 1U) return; +} + +void d (unsigned long x) +{ + if (x < 0) return;/* { dg-bogus "comparison of unsigned expression < 0 is always false" } */ + if (x >= 0) return;/* { dg-bogus "comparison of unsigned expression >= 0 is always true" } */ + if (0 > x) return;/* { dg-bogus "comparison of unsigned expression < 0 is always false" } */ + if (0 <= x) return;/* { dg-bogus "comparison of unsigned expression >= 0 is always true" } */ +} + +void e (unsigned long long x) +{ + if (x < 0) return;/* { dg-bogus "comparison of unsigned expression < 0 is always false" } */ + if (x >= 0) return;/* { dg-bogus "comparison of unsigned expression >= 0 is always true" } */ + if (0 > x) return;/* { dg-bogus "comparison of unsigned expression < 0 is always false" } */ + if (0 <= x) return;/* { dg-bogus "comparison of unsigned expression >= 0 is always true" } */ +} + +int test (int x) +{ + if ((long long)x <= 0x123456789ABCLL) /* { dg-bogus "comparison is always true due to limited range of data type" } */ + return 1; + else + return 0; +} + +template <typename Int, Int D> +void f(Int x) { + assert(0 <= x and x <= D); // { dg-bogus "comparison is always true due to limited range of data type" } +} + +int ff(void) { + f<unsigned char, 2>(5); + f<signed char, 2>(5); +} + +template <typename Int, Int D> +void g(void) { + assert(0 <= D); +} +int gg(void) { + g<unsigned char, 2>(); +} + diff --git a/gcc/testsuite/g++.dg/warn/Wtype-limits.C b/gcc/testsuite/g++.dg/warn/Wtype-limits.C new file mode 100644 index 000000000..814c2a882 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wtype-limits.C @@ -0,0 +1,84 @@ +/* { dg-do compile } */ +/* { dg-options "-Wtype-limits" } */ + +extern void assert (int); + +void a (unsigned char x) +{ + if (x < 0) return;/* { dg-warning "comparison is always false due to limited range of data type" } */ + if (x >= 0) return;/* { dg-warning "comparison is always true due to limited range of data type" } */ + if (0 > x) return;/* { dg-warning "comparison is always false due to limited range of data type" } */ + if (0 <= x) return;/* { dg-warning "comparison is always true due to limited range of data type" } */ + if (x <= 255) /* { dg-warning "comparison is always true due to limited range of data type" } */ + return; + if (255 >= x) /* { dg-warning "comparison is always true due to limited range of data type" } */ + return; + if ((int)x <= 255) /* { dg-bogus "comparison is always true due to limited range of data type" "" { xfail *-*-* } 16 } */ + return; + if (255 >= (unsigned char) 1) + return; + +} + +void b (unsigned short x) +{ + if (x < 0) return;/* { dg-warning "comparison is always false due to limited range of data type" } */ + if (x >= 0) return;/* { dg-warning "comparison is always true due to limited range of data type" } */ + if (0 > x) return;/* { dg-warning "comparison is always false due to limited range of data type" } */ + if (0 <= x) return;/* { dg-warning "comparison is always true due to limited range of data type" } */ +} + +void c (unsigned int x) +{ + if (x < 0) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */ + if (x >= 0) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */ + if (0 > x) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */ + if (0 <= x) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */ + if (1U >= 0) return; + if (1U < 0) return; + if (0 <= 1U) return; + if (0 > 1U) return; +} + +void d (unsigned long x) +{ + if (x < 0) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */ + if (x >= 0) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */ + if (0 > x) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */ + if (0 <= x) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */ +} + +void e (unsigned long long x) +{ + if (x < 0) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */ + if (x >= 0) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */ + if (0 > x) return;/* { dg-warning "comparison of unsigned expression < 0 is always false" } */ + if (0 <= x) return;/* { dg-warning "comparison of unsigned expression >= 0 is always true" } */ +} + +int test (int x) +{ + if ((long long)x <= 0x123456789ABCLL) /* { dg-bogus "comparison is always true due to limited range of data type" "" { xfail *-*-* } 61 } */ + return 1; + else + return 0; +} + +template <typename Int, Int D> +void f(Int x) { + assert(0 <= x and x <= D); // { dg-warning "comparison is always true due to limited range of data type" } +} + +int ff(void) { + f<unsigned char, 2>(5); + f<signed char, 2>(5); +} + +template <typename Int, Int D> +void g(void) { + assert(0 <= D); +} +int gg(void) { + g<unsigned char, 2>(); +} + diff --git a/gcc/testsuite/g++.dg/warn/Wuninitializable-member-no.C b/gcc/testsuite/g++.dg/warn/Wuninitializable-member-no.C new file mode 100644 index 000000000..0f6ccfd9d --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wuninitializable-member-no.C @@ -0,0 +1,15 @@ +// Test disabling +// { dg-do compile } +// { dg-options "-Wall -Wextra -Wno-uninitialized" } + +class X { + int & flag;// { dg-bogus "non-static reference 'int& X::flag' in class without a constructor" } +public: + void f(){ flag++ ; } +}; + +class Y { + const int var;// { dg-bogus "non-static const member 'const int Y::var' in class without a constructor" } +public: + int g(){ return 2*var; } +}; diff --git a/gcc/testsuite/g++.dg/warn/Wuninitializable-member.C b/gcc/testsuite/g++.dg/warn/Wuninitializable-member.C new file mode 100644 index 000000000..1c37e3ea0 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wuninitializable-member.C @@ -0,0 +1,14 @@ +// { dg-do compile } +// { dg-options "-Wuninitialized" } + +class X { + int & flag;// { dg-warning "non-static reference 'int& X::flag' in class without a constructor" } +public: + void f(){ flag++ ; } +}; + +class Y { + const int var;// { dg-warning "non-static const member 'const int Y::var' in class without a constructor" } +public: + int g(){ return 2*var; } +}; diff --git a/gcc/testsuite/g++.dg/warn/Wuninitialized-1.C b/gcc/testsuite/g++.dg/warn/Wuninitialized-1.C new file mode 100644 index 000000000..7b1b90b94 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wuninitialized-1.C @@ -0,0 +1,15 @@ +/* { dg-options "-O2 -Wuninitialized" } */ + +struct Empty { Empty() {} }; /* { dg-bogus "uninitialized" } */ +struct Other { + Other(const Empty& e_) : e(e_) {} + Empty e; +}; +void bar(Other&); +void foo() +{ + Empty e; + Other o(e); + bar(o); +} + diff --git a/gcc/testsuite/g++.dg/warn/Wuninitialized-2.C b/gcc/testsuite/g++.dg/warn/Wuninitialized-2.C new file mode 100644 index 000000000..2b6f92530 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wuninitialized-2.C @@ -0,0 +1,53 @@ +/* { dg-do compile } */ +/* { dg-options "-O -Wuninitialized" } */ + +struct S8 { template<typename T> S8(T) { } }; + +template<typename T> struct S10; +template<typename T> struct S10<T()> { typedef T S12; typedef S8 S1(); }; + +template<typename T> struct S3 { }; +template<typename T> struct S11 { S11(S3<T>); }; + +struct S2 +{ + template<typename T> operator S11<T>() { return S11<T>(S5<T>()); } + template<typename T> struct S5:public S3<T> + { + virtual typename S10<T>::S12 S13() { + return 0; + } + }; +}; + +template<typename T> S11<T> S6(S3<T>) { return S11<T>(S3<T>()); } +template<typename S12> struct S7 { typedef S12 S15(); }; + +struct S4 +{ + template<typename T> operator S11<T>() + { + struct S14:public S3<T> + { + S14(S2 x):S11_(x) { } + S11<typename S7<typename S10<T>::S12>::S15> S11_; + }; + return S6(S14(S11_)); + } + S2 S11_; +}; + +struct S9 +{ + template<typename F> operator S11<F>() { return S11<F>(S14<F>(S11_)); } + template<typename F> struct S14:public S3<F> + { + S14(S4 x):S11_(x) { } + S11<typename S10<F>::S1> S11_; + }; + S4 S11_; +}; + +void S15(S11<void()>); +void S16() { S9 x; S15(x); } + diff --git a/gcc/testsuite/g++.dg/warn/Wuninitialized-3.C b/gcc/testsuite/g++.dg/warn/Wuninitialized-3.C new file mode 100644 index 000000000..dc3be3f67 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wuninitialized-3.C @@ -0,0 +1,17 @@ +// PR C++/38908 +// { dg-options "-Wuninitialized -O" } + +struct empty {}; + +struct dfs_visitor { + dfs_visitor() { } + empty m_vis; +}; + +void bar(const dfs_visitor&); +void foo(void) +{ + dfs_visitor vis; + dfs_visitor vis2 = vis; + bar (vis2); +} diff --git a/gcc/testsuite/g++.dg/warn/Wuninitialized-4.C b/gcc/testsuite/g++.dg/warn/Wuninitialized-4.C new file mode 100644 index 000000000..3d2543fb1 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wuninitialized-4.C @@ -0,0 +1,22 @@ +// PR middle-end/39666 +// { dg-do compile } +// { dg-options "-O2 -Wuninitialized" } + +int +foo (int i) +{ + int j; + switch (i) + { + case -__INT_MAX__ - 1 ... -1: + j = 6; + break; + case 0: + j = 5; + break; + case 1 ... __INT_MAX__: + j = 4; + break; + } + return j; +} diff --git a/gcc/testsuite/g++.dg/warn/Wuninitialized-5.C b/gcc/testsuite/g++.dg/warn/Wuninitialized-5.C new file mode 100644 index 000000000..787d3c78f --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wuninitialized-5.C @@ -0,0 +1,22 @@ +// PR middle-end/39666 +// { dg-do compile } +// { dg-options "-O2 -Wuninitialized" } + +int +foo (int i) +{ + int j; + switch (i) + { + case -__INT_MAX__ - 1 ... -1: + j = 6; + break; + case 0: + j = 5; + break; + case 2 ... __INT_MAX__: + j = 4; + break; + } + return j; // { dg-warning "may be used uninitialized" } +} diff --git a/gcc/testsuite/g++.dg/warn/Wunreachable-code-1.C b/gcc/testsuite/g++.dg/warn/Wunreachable-code-1.C new file mode 100644 index 000000000..23fc86dfb --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunreachable-code-1.C @@ -0,0 +1,22 @@ +/* PR17544 Incorrect -Wunreachable-code warning + Origin: sebor@roguewave.com + + G++ appends a "return 0;" when finishing a function, but it was not + given a source location. The gimplifier thinks a return statement + needs a locus so it would add one, making the compiler generated code + visible to the unreachable code warning. */ + +/* { dg-do compile } */ +/* { dg-options "-O -Wunreachable-code" } */ + +int +main (int argc, char *argv[]) +{ + const char* const s = argc < 2 ? "" : argv [1]; + int i = 0; + do { + ++i; + } while (i < s [0]); + return i; +} + diff --git a/gcc/testsuite/g++.dg/warn/Wunreachable-code-2.C b/gcc/testsuite/g++.dg/warn/Wunreachable-code-2.C new file mode 100644 index 000000000..d50f7fe57 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunreachable-code-2.C @@ -0,0 +1,23 @@ +// PR c++/21228 +/* { dg-options "-Wunreachable-code" } */ + +class testStringBase +{ +public: + char *stringPtr; +}; + +class testString : public testStringBase +{ +public: + testString(); +}; + +testString::testString() +{ + stringPtr = (char *) 9; +} + +int main(int argc, char **argv) { + testString s; +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-1.C b/gcc/testsuite/g++.dg/warn/Wunused-1.C new file mode 100644 index 000000000..60ceb4f07 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-1.C @@ -0,0 +1,15 @@ +// Test whether -Wunused handles empty classes the same as non-empty. +// { dg-do compile } +// { dg-options "-Wunused" } + +struct A {}; +struct B { char c; }; + +void foo () +{ + struct A a0, a1; + struct B b0, b1 = { 25 }; + + a0 = a1; // { dg-bogus "value computed is not used" } + b0 = b1; +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-10.C b/gcc/testsuite/g++.dg/warn/Wunused-10.C new file mode 100644 index 000000000..d2d6a343d --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-10.C @@ -0,0 +1,8 @@ +// PR c++/19190 +// { dg-options "-Wunused" } + +struct breakme +{ + void setAction( unsigned char a ) { act = a; } + unsigned int act:8; +}; diff --git a/gcc/testsuite/g++.dg/warn/Wunused-11.C b/gcc/testsuite/g++.dg/warn/Wunused-11.C new file mode 100644 index 000000000..4a151d245 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-11.C @@ -0,0 +1,11 @@ +// PR c++/20212 +// { dg-options "-O2 -Wunused -Wextra" } + +template<int> void f(int); +void g(int i) +{ + f<0>(i); +} +template<int> void f(int i __attribute__((unused)) ) +{} + diff --git a/gcc/testsuite/g++.dg/warn/Wunused-12.C b/gcc/testsuite/g++.dg/warn/Wunused-12.C new file mode 100644 index 000000000..51d234331 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-12.C @@ -0,0 +1,8 @@ +// PR c++/24302 +// { dg-options "-Wunused" } + +static union +{ + unsigned char FLT4ARR[4]; + float FLT4; +}; // { dg-warning "used" } diff --git a/gcc/testsuite/g++.dg/warn/Wunused-13.C b/gcc/testsuite/g++.dg/warn/Wunused-13.C new file mode 100644 index 000000000..d0eae113e --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-13.C @@ -0,0 +1,7 @@ +// Test whether -Wunused handles effectless indirect_ref operation ('*'). +// { dg-do compile } +// { dg-options "-Wunused" } + +void Foo(int* x) { + *x++; // { dg-warning "value computed is not used" } +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-14.C b/gcc/testsuite/g++.dg/warn/Wunused-14.C new file mode 100644 index 000000000..b325ccb71 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-14.C @@ -0,0 +1,14 @@ +// Test that -Wunused should not emit a warning on the initialization of +// non-POD arrays. See PR c++/39803. +// { dg-do compile } +// { dg-options "-Wunused" } + +#include <utility> + +using std::pair; + +int foo() { + pair<int, const char*> components[3]; // { dg-bogus "value computed is not used" } + components[0].first = 0; + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-15.C b/gcc/testsuite/g++.dg/warn/Wunused-15.C new file mode 100644 index 000000000..efaebc006 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-15.C @@ -0,0 +1,11 @@ +// PR c++/39875 +// { dg-do compile } +// { dg-options "-Wunused-value" } + +int *i; +void +foo () +{ + *i++; // { dg-warning "value computed is not used" } + (void) *i++; // { dg-bogus "value computed is not used" } +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-16.C b/gcc/testsuite/g++.dg/warn/Wunused-16.C new file mode 100644 index 000000000..c9e57f79b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-16.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// { dg-options "-Wunused-value" } + +extern void f1(); +void +f(bool b) +{ + b ? f1(), 0 : 0; // { dg-bogus "has no effect" } +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-17.C b/gcc/testsuite/g++.dg/warn/Wunused-17.C new file mode 100644 index 000000000..217bb4b77 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-17.C @@ -0,0 +1,19 @@ +// PR c++/41109, 41110, 41134 +// { dg-options "-Wunused" } + +int memory_consumption(const int &t) { return sizeof(t); } + +int s; +int g() { return memory_consumption(s); } + +template <int> struct X { static const int s = 2; }; + +template <typename T> int f() { + const unsigned int dim = 2; + return X<dim>::s; +} + +template int f<int>(); + +static int i; +template <typename> int h() { return i; } diff --git a/gcc/testsuite/g++.dg/warn/Wunused-2.C b/gcc/testsuite/g++.dg/warn/Wunused-2.C new file mode 100644 index 000000000..593bf4872 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-2.C @@ -0,0 +1,6 @@ +// { dg-do compile } +// { dg-options "-Wunused -O3" } + +static const int i = 0; +static void f() { } /* { dg-warning "defined but not used" "" } */ +static inline void g() { } diff --git a/gcc/testsuite/g++.dg/warn/Wunused-3.C b/gcc/testsuite/g++.dg/warn/Wunused-3.C new file mode 100644 index 000000000..310090943 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-3.C @@ -0,0 +1,11 @@ +// { dg-do compile } +// { dg-options "-Wunused -O" } + +void do_cleanups(); + +class Cleanup { +public: + ~Cleanup() { do_cleanups();} +}; + +static Cleanup dummy; diff --git a/gcc/testsuite/g++.dg/warn/Wunused-4.C b/gcc/testsuite/g++.dg/warn/Wunused-4.C new file mode 100644 index 000000000..9018e92ef --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-4.C @@ -0,0 +1,30 @@ +// { dg-do compile } +// { dg-options "-Wunused-parameter" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Sep 2003 <nathan@codesourcery.com> +// Origin: yotamm@mellanox.co.il + + +// PR c++/9848. Missing warning + +struct C1 { + // Only use in-charge ctor + C1(int bi) {} // { dg-warning "unused parameter" "" } +}; +struct C2 { + // Only use base ctor + C2(int bi) {} // { dg-warning "unused parameter" "" } +}; + +struct D : C2 +{ + D (int) : C2 (1) {} +}; + +void show_compile_warning () +{ + C1 c1 (1); + + D d (1); +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-5.C b/gcc/testsuite/g++.dg/warn/Wunused-5.C new file mode 100644 index 000000000..8a8d9d280 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-5.C @@ -0,0 +1,19 @@ +/* PR opt/14288 */ +/* { dg-do compile } */ +/* { dg-options "-O -Wall" } */ + +volatile int sink; +extern int foo(int); + +struct S +{ + int x; + + S() { x = foo(0); } + ~S() { sink = x; } +}; + +int test(bool p) +{ + return p ? foo(S().x) : 0; /* { dg-bogus "uninitialized" } */ +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-6.C b/gcc/testsuite/g++.dg/warn/Wunused-6.C new file mode 100644 index 000000000..58a3f642b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-6.C @@ -0,0 +1,11 @@ +/* PR middle-end/14203 */ +/* { dg-do compile } */ +/* { dg-options "-Wall" } */ + +void foo() +{ + if (false) + if (int i=0) // { dg-warning "unused" "" } + int j=0; // { dg-warning "unused" "" } +} + diff --git a/gcc/testsuite/g++.dg/warn/Wunused-7.C b/gcc/testsuite/g++.dg/warn/Wunused-7.C new file mode 100644 index 000000000..6f5c23e95 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-7.C @@ -0,0 +1,12 @@ +// PR c++/14481 +// { dg-options "-Wunused" } + +void func() +{ + struct mybitfields { + unsigned int s_field:8; + }; + struct mybitfields s; // { dg-warning "set but not used" } + s.s_field = 255; +}; + diff --git a/gcc/testsuite/g++.dg/warn/Wunused-8.C b/gcc/testsuite/g++.dg/warn/Wunused-8.C new file mode 100644 index 000000000..a1c8a1fb4 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-8.C @@ -0,0 +1,9 @@ +// PR c++/16029 +// { dg-options "-Wunused" } + +int main () +{ + // We should not see an "unused" warning about "whatever" on the + // next line. + return whatever (); // { dg-error "declared" } +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-9.C b/gcc/testsuite/g++.dg/warn/Wunused-9.C new file mode 100644 index 000000000..869888955 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-9.C @@ -0,0 +1,38 @@ +// PR c++/11224 +// { dg-options "-Wunused" } + +struct someclass { + + bool isEmpty() const { return true; } +}; + +int main() +{ + bool bOk = false; + someclass foo; + + bOk == foo.isEmpty(); // { dg-warning "not used" } + + return bOk; +} + +int& f(); + +void g() { + f() == 0; // { dg-warning "not used" } + f() != 1; // { dg-warning "not used" } + f() < 2; // { dg-warning "not used" } + f() > 3; // { dg-warning "not used" } + f() <= 4; // { dg-warning "not used" } + f() >= 5; // { dg-warning "not used" } + f() + 6; // { dg-warning "not used" } + f() - 7; // { dg-warning "not used" } + f() * 8; // { dg-warning "not used" } + f() / 9; // { dg-warning "not used" } + +f(); // { dg-warning "not used" } + -f(); // { dg-warning "not used" } + ++f(); + --f(); + f() = 10; + f() <<= 11; +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-label-1.C b/gcc/testsuite/g++.dg/warn/Wunused-label-1.C new file mode 100644 index 000000000..96f49b321 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-label-1.C @@ -0,0 +1,28 @@ +// { dg-do compile } +// { dg-options "-Wunused-label" } + +extern void f9(); + +void +f1() +{ + l1: f9(); // { dg-warning "not used" } + l3: ; f9(); // { dg-warning "not used" } + l4: __attribute__ ((unused)) ; f9(); +} + +void +f2() +{ + label: __attribute ((unused)) ; +} + +void +f3() +{ + // The next line would be OK in C but is a syntax error in C++. + l2: __attribute__ ((unused)) f9(); // { dg-error "expected" } + // We still get an unused label warning--this is + // optional and can be removed if it ever changes. + // { dg-warning "not used" "expected" { target *-*-* } 24 } +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-label-2.C b/gcc/testsuite/g++.dg/warn/Wunused-label-2.C new file mode 100644 index 000000000..a53fdedf3 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-label-2.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options "-Wunused" } + +// If __attribute__ ((unused)) follows a label and precedes a +// declaration, we should get a warning for the label, not the +// declaration. + +void +f1() +{ + int i1; // { dg-warning "unused variable" } + l1: __attribute__ ((unused)) int i2; // { dg-warning "label \[^\n\]* not used" } +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-label-3.C b/gcc/testsuite/g++.dg/warn/Wunused-label-3.C new file mode 100644 index 000000000..7479ca20c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-label-3.C @@ -0,0 +1,51 @@ +// { dg-do compile } +// { dg-options "-Wunused-label" } + +extern void f9(); + +template<int i> +void +f1() +{ + if (i) + return; + + l1: f9(); // { dg-warning "not used" } + l3: ; f9(); // { dg-warning "not used" } + l4: __attribute__ ((unused)) ; f9(); +} + +template +void f1<0>(); + +template<int i> +void +f2() +{ + if (i) + return; + + l1: f9(); // { dg-warning "not used" } + l3: ; f9(); // { dg-warning "not used" } + l4: __attribute__ ((unused)) ; f9(); +} + +template +void f2<1>(); + +template<int i> +void +f3() +{ + void* lab; + l1: f9(); + l2: __attribute__ ((unused)) ; f9(); + lab = i ? &&l1 : &&l2; + goto *lab; +} + +template +void f3<0>(); + +template +void f3<1>(); diff --git a/gcc/testsuite/g++.dg/warn/Wunused-parm-1.C b/gcc/testsuite/g++.dg/warn/Wunused-parm-1.C new file mode 100644 index 000000000..08bfaa66b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-parm-1.C @@ -0,0 +1,58 @@ +// { dg-do compile } +// { dg-options "-Wunused -W" } + +long +f1 (unsigned long long x) +{ + unsigned long long a = 1; + const union { unsigned long long l; unsigned int p[2]; } b = { x }; + const union { unsigned long long l; unsigned int p[2]; } c = { a }; + return b.p[0] + c.p[0]; +} + +int +f2 (int x, int y) +{ + int a = 1; + int b[] = { 1, 2, x, a, 3, 4 }; + return b[y]; +} + +int +f3 (int a) // { dg-warning "unused parameter" } +{ + return 0; +} + +int +f4 (int a) // { dg-warning "set but not used" } +{ + a = 1; + return 0; +} + +int +f5 (int a) +{ + a = 1; + return a; +} + +int +f6 (int &a) +{ + return a; +} + +void +f7 (int &a) +{ + a = 1; +} + +struct S +{ + S (int i) : j(i) {} + S (long i) : j(i + 1) {} + int j; +}; diff --git a/gcc/testsuite/g++.dg/warn/Wunused-parm-2.C b/gcc/testsuite/g++.dg/warn/Wunused-parm-2.C new file mode 100644 index 000000000..d4276c0a2 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-parm-2.C @@ -0,0 +1,54 @@ +// { dg-do compile } +// { dg-options "-Wunused -W" } + +template <int N> +long +f1 (unsigned long long x) +{ + unsigned long long a = 1; + const union { unsigned long long l; unsigned int p[2]; } b = { x }; + const union { unsigned long long l; unsigned int p[2]; } c = { a }; + return b.p[0] + c.p[0]; +} + +template <int N> +int +f2 (int x, int y) +{ + int a = 1; + int b[] = { 1, 2, x, a, 3, 4 }; + return b[y]; +} + +template <int N> +int +f3 (int a) // { dg-warning "unused parameter" } +{ + return 0; +} + +template <int N> +int +f4 (int a) // { dg-warning "set but not used" } +{ + a = 1; + return 0; +} + +template <int N> +int +f5 (int a) +{ + a = 1; + return a; +} + +void +test () +{ + (void) f1<0> (0); + (void) f2<0> (0, 0); + (void) f3<0> (0); + (void) f4<0> (0); + (void) f5<0> (0); +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-parm-3.C b/gcc/testsuite/g++.dg/warn/Wunused-parm-3.C new file mode 100644 index 000000000..3f0a0e7d0 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-parm-3.C @@ -0,0 +1,71 @@ +// { dg-do compile } +// { dg-options "-Wunused -W" } +// Suppress a warning that is irrelevant to the purpose of this test. +// { dg-options "-Wunused -W -Wno-abi" { target arm_eabi } } + +#include <stdarg.h> + +struct A +{ + long a; + A () : a (0) { } + A (long x) : a (x) { } + operator long () const { return a; } + long operator- (const A& x) const { return a - x.a; } +}; + +long +fn1 (A a) +{ + return a - A (0); +} + +struct B +{ + bool operator() (const int x, const int y) const throw() { return x < y; } +}; + +template <typename T> +bool +fn2 (int x, int y, T z) +{ + return z (x, y); +} + +bool +fn3 (void) +{ + return fn2 (1, 2, B ()); +} + +int +fn4 (va_list ap) +{ + return va_arg (ap, int); +} + +template <typename T> +T +fn5 (va_list ap) +{ + return va_arg (ap, T); +} + +int +fn6 (va_list ap) +{ + return fn5 <int> (ap); +} + +template <typename T> +int +fn7 (T ap) +{ + return va_arg (ap, int); +} + +int +fn8 (va_list ap) +{ + return fn7 (ap); +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-parm-4.C b/gcc/testsuite/g++.dg/warn/Wunused-parm-4.C new file mode 100644 index 000000000..fbad380f6 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-parm-4.C @@ -0,0 +1,24 @@ +// PR c++/47783 +// { dg-do compile } +// { dg-options "-Wunused -W" } + +struct R +{ + int &i; +}; + +void +foo (R r, int &s) +{ + r.i = 7; + s = 8; +} + +int +bar () +{ + int x = 1, y = 1; + R r = { x }; + foo (r, y); + return x + y; +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-1.C b/gcc/testsuite/g++.dg/warn/Wunused-var-1.C new file mode 100644 index 000000000..89c110b0e --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-1.C @@ -0,0 +1,8 @@ +// { dg-options "-Wunused" } +template <int> struct X { static const int s = 2; }; +template <typename T> int f() { const int v = 2; return X<v+1>::s; } +template <typename T> int g() { const int v = 2; return X<v>::s; } +template <typename T> int h() { const int v = 2; return X<1 ? v : 0>::s; } +template int f<int>(); +template int g<int>(); +template int h<int>(); diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-10.C b/gcc/testsuite/g++.dg/warn/Wunused-var-10.C new file mode 100644 index 000000000..ffdb89327 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-10.C @@ -0,0 +1,42 @@ +// PR c++/44412 +// { dg-do compile } +// { dg-options "-Wunused" } + +struct S +{ + static const int a = 3; + static int b; + int c; +}; + +const int S::a; +int S::b = 4; + +int +f1 () +{ + S s; + return s.a; +} + +int +f2 () +{ + S s; + return s.b; +} + +void +f3 () +{ + S s; // { dg-warning "set but not used" } + s.c = 6; +} + +int +f4 () +{ + S s; + s.c = 6; + return s.c; +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-11.C b/gcc/testsuite/g++.dg/warn/Wunused-var-11.C new file mode 100644 index 000000000..c7c1bf35f --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-11.C @@ -0,0 +1,33 @@ +// PR c++/44412 +// { dg-do compile } +// { dg-options "-Wunused" } + +struct S +{ + int foo (); + static int bar (); +}; + +int S::foo () +{ + return 5; +} + +int S::bar () +{ + return 6; +} + +int +f1 () +{ + S s; + return s.foo (); +} + +int +f2 () +{ + S s; + return s.bar (); +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-12.C b/gcc/testsuite/g++.dg/warn/Wunused-var-12.C new file mode 100644 index 000000000..3300cbe3d --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-12.C @@ -0,0 +1,36 @@ +// PR c++/44444 +// { dg-do compile } +// { dg-options "-Wunused" } + +struct S +{ + const int &u; + const int &v; + S (const int &a, const int &b) : u(a), v(b) { } +}; + +bool +f1 () +{ + bool t = false; + S z = S (1, 2); + t |= z.u == 1; + t |= z.v == 2; + return t; +} + +void +f2 () +{ + S z = S (1, 2); + z.u; // { dg-warning "no effect" } +} + +int i; + +void +f3 () +{ + S z = S (1, 2); + i++, z.u; // { dg-warning "no effect" } +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-13.C b/gcc/testsuite/g++.dg/warn/Wunused-var-13.C new file mode 100644 index 000000000..43df81d88 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-13.C @@ -0,0 +1,22 @@ +// PR c++/44619 +// { dg-do compile } +// { dg-options "-Wunused -W" } + +struct S { int x, y; }; + +int +f1 () +{ + struct S p; + int S::*q = &S::x; + p.*q = 5; + return p.*q; +} + +int +f2 (struct S *p, int S::*q) +{ + struct S *r = p; + int S::*s = q; + return r->*s; +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-14.C b/gcc/testsuite/g++.dg/warn/Wunused-var-14.C new file mode 100644 index 000000000..a552b56da --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-14.C @@ -0,0 +1,17 @@ +// PR c++/44682 +// { dg-do compile } +// { dg-options "-Wunused" } + +struct S { virtual ~S () {} }; +struct T { virtual ~T () {} }; +struct U : S, T {}; + +void f (U &); + +void +g (void *v) +{ + T *t = static_cast <T *> (v); + U *u = static_cast <U *> (t); + f (*u); +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-15.C b/gcc/testsuite/g++.dg/warn/Wunused-var-15.C new file mode 100644 index 000000000..9782ccbd9 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-15.C @@ -0,0 +1,29 @@ +// PR c++/45588 +// { dg-do compile } +// { dg-options "-Wunused" } + +void bar (unsigned char *); + +template <int N> +struct S +{ + static const int k = 6; +}; + +template <int N> +const int S<N>::k; + +template <int N> +void +foo () +{ + const int i = S<N>::k; + unsigned char a[i]; + bar (a); +} + +void +baz () +{ + foo<0> (); +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-2.C b/gcc/testsuite/g++.dg/warn/Wunused-var-2.C new file mode 100644 index 000000000..0b21ef116 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-2.C @@ -0,0 +1,104 @@ +// { dg-options "-Wunused -W" } + +extern void foo (); + +void +f1 () +{ + try + { + foo (); + } + catch (int i) + { + } + catch (double d) + { + } +} + +void +f2 (int x) +{ + int a = 0; + x++; + ++a; +} + +struct A +{ + bool foo () const { return true; } +}; + +int +f3 () +{ + A a; + bool b = a.foo (); + return b; +} + +struct B +{ + int i; + B (int j); +}; + +void +f4 () +{ + B b (6); +} + +struct C +{ + int i; + C (int j) : i (j) {} +}; + +void +f5 () +{ + C c (6); +} + +struct D +{ + int i; + D (int j) : i (j) {} + ~D (); +}; + +void +f6 () +{ + D d (6); +} + +int *f7 (int s) +{ + return new int[s]; +} + +template <typename T> +T *f8 (int s) +{ + return new T[s]; +} + +template int *f8<int> (int); + +void +f9 (char *p) +{ + delete p; +} + +template <typename T> +void +f10 (T *p) +{ + delete p; +} + +template void f10<char> (char *); diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-3.C b/gcc/testsuite/g++.dg/warn/Wunused-var-3.C new file mode 100644 index 000000000..cd8931d71 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-3.C @@ -0,0 +1,110 @@ +// { dg-options "-Wunused -W" } + +#include <typeinfo> +#include <stdarg.h> + +void +f1 (int a, ...) +{ + va_list ap; + va_start (ap, a); + va_end (ap); +} + +int +f2 (int a, ...) +{ + va_list ap; + va_start (ap, a); + int i = va_arg (ap, int); + va_end (ap); + return i; +} + +struct A { int a; A (); virtual ~A (); }; +struct B : virtual A { int b; }; + +struct B * +f3 (struct A *a) +{ + return dynamic_cast <B *> (a); +} + +struct A * +f4 (struct B *a) +{ + return static_cast <A *> (a); +} + +struct A * +f5 (struct B *a) +{ + return reinterpret_cast <A *> (a); +} + +struct A * +f6 (const struct A *a) +{ + return const_cast <A *> (a); +} + +int +f7 (long a) +{ + return (int) a; +} + +int +f8 (long a) +{ + return int (a); +} + +struct C +{ + operator unsigned int() { return 42; } +}; + +unsigned int +f9 () +{ + C u; + return u; +} + +struct D +{ + operator int & (); + operator const int & () const; +}; + +void foo (int &); +void foo (const int &); + +void +f10 () +{ + const D x = D (); + foo (x); +} + +int +f11 (int a) +{ + return typeid (a) == typeid (int); +} + +struct E +{ + int e () {return 0;} +}; + +template <typename T> +int +f12 (E a) +{ + __decltype (a.e()) i; + return i; +} + +template <> int f12<int> (E); diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-4.C b/gcc/testsuite/g++.dg/warn/Wunused-var-4.C new file mode 100644 index 000000000..11ed7afea --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-4.C @@ -0,0 +1,50 @@ +/* { dg-do compile } */ +/* { dg-options "-Wunused" } */ + +struct S { int e; }; + +int +f1 (void) +{ + int a; + int b; + int c; + int d; + S s; + a = 1; + b = 2; + c = 3; + d = 4; + s.e = 5; + __typeof (c) e; // { dg-warning "set but not used" } + __decltype (d) f; // { dg-warning "set but not used" } + __decltype (s.e) g; // { dg-warning "set but not used" } + e = 1; + f = 1; + g = 1; + return sizeof (a) + __alignof__ (b); +} + +template <int N> +int f2 (void) +{ + int a; + int b; + int c; + int d; + a = 1; + b = 2; + c = 3; + d = 4; + __typeof (c) e; // { dg-warning "set but not used" } + __decltype (d) f; // { dg-warning "set but not used" } + e = 1; + f = 1; + return sizeof (a) + __alignof__ (b); +} + +void +test (void) +{ + (void) f2<0> (); +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-5.C b/gcc/testsuite/g++.dg/warn/Wunused-var-5.C new file mode 100644 index 000000000..7fcaa955c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-5.C @@ -0,0 +1,227 @@ +// { dg-do compile } +// { dg-options "-Wunused" } + +template <int N> +void +f1 (void) +{ + int a; // { dg-warning "set but not used" } + int b; + int c; + c = 1; + a = b = c; +} + +template <int N> +void +f2 (int x) +{ + int a; // { dg-warning "set but not used" } + int b; + int c; // { dg-warning "set but not used" } + c = (a = x, b = x); +} + +template <int N> +int +f3 (int x) +{ + int a; + return a = x; +} + +template <int N> +int +f4 (int x) +{ + int a; + a = x; + return a; +} + +template <int N> +void +f5 (int x) +{ + int a[2]; // { dg-warning "set but not used" } + int b; + int *c, d[2]; + c = d; + b = x; + a[b] = 1; + c[b] = 1; +} + +template <int N> +int +f6 (int x) +{ + int a[2]; + int b; + b = x; + a[b] = 1; + return a[b]; +} + +template <int N> +void +f7 (int x, int *p) +{ + int *a[2]; + a[x] = p; + a[x][x] = x; +} + +struct S { int i; }; + +template <int N> +void +f8 (void) +{ + struct S s; // { dg-warning "set but not used" } + s.i = 6; +} + +template <int N> +int +f9 (void) +{ + struct S s; + s.i = 6; + return s.i; +} + +template <int N> +struct S +f10 (void) +{ + struct S s; + s.i = 6; + return s; +} + +extern int foo11 (int *); + +template <int N> +void +f11 (void) +{ + int a[2]; + foo11 (a); +} + +template <int N> +void +f12 (void) +{ + int a; + a = 1; + a; // { dg-warning "statement has no effect" } +} + +template <int N> +void +f13 (void (*x) (void)) +{ + void (*a) (void); + a = x; + a (); +} + +template <int N> +void +f14 (void (*x) (void)) +{ + void (*a) (void); // { dg-warning "set but not used" } + a = x; +} + +extern void foo15 (int *); + +template <int N> +void +f15 (void) +{ + int a[10]; + int *b = a + 2; + foo15 (b); +} + +extern void foo16 (int **); + +template <int N> +void +f16 (void) +{ + int a[10]; + int *b[] = { a, a + 2 }; + foo16 (b); +} + +template <int N> +void +f17 (int x) +{ + long a; // { dg-warning "set but not used" } + int b; + a = b = x; +} + +template <int N> +void +f18 (int x) +{ + int a; // { dg-warning "set but not used" } + int b; + a = (char) (b = x); +} + +template <int N> +int +f19 (int x, int y, int z) +{ + int a; + int b; + a = x; + b = y; + return z ? a : b; +} + +template <int N> +int * +f20 (int x) +{ + static int a[] = { 3, 4, 5, 6 }; + static int b[] = { 4, 5, 6, 7 }; + static int c[] = { 5, 6, 7, 8 }; // { dg-warning "set but not used" } + c[1] = 1; + return x ? a : b; +} + +S s; + +void +test () +{ + int i = 0; + f1<0> (); + f2<0> (0); + (void) f3<0> (0); + (void) f4<0> (0); + f5<0> (0); + (void) f6<0> (0); + f7<0> (0, &i); + f8<0> (); + (void) f9<0> (); + s = f10<0> (); + f11<0> (); + f12<0> (); + f13<0> (f1<0>); + f14<0> (f1<0>); + f15<0> (); + f16<0> (); + f17<0> (0); + f18<0> (0); + (void) f19<0> (0, 0, 0); + (void) f20<0> (0); +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-6.C b/gcc/testsuite/g++.dg/warn/Wunused-var-6.C new file mode 100644 index 000000000..0fb8e5cac --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-6.C @@ -0,0 +1,29 @@ +// { dg-do compile } +// { dg-options "-Wunused" } + +template <int N> +int +f1 (void) +{ + int c = ({ + int a; + a = 1; + a; }); + return c; +} + +template <int N> +void +f2 (void) +{ + int f; + f = 0; + __asm__ __volatile__ ("" : "+r" (f)); +} + +void +test () +{ + (void) f1<0> (); + f2<0> (); +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-7.C b/gcc/testsuite/g++.dg/warn/Wunused-var-7.C new file mode 100644 index 000000000..cf1b605c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-7.C @@ -0,0 +1,48 @@ +// { dg-do compile } +// { dg-options "-Wunused" } + +template <int N> +void +f1 (void) +{ + _Complex int a; // { dg-warning "set but not used" } + _Complex double b; // { dg-warning "set but not used" } + __real__ a = 1; + __imag__ a = 2; + __real__ b = 3.0; + __imag__ b = 4.0; +} + +template <int N> +int +f2 (void) +{ + _Complex int a; + _Complex double b; + __real__ a = 1; + __imag__ a = 2; + __real__ b = 3.0; + __imag__ b = 4.0; + return __real__ a + __imag__ b; +} + +template <int N> +_Complex double +f3 (void) +{ + _Complex int a; + _Complex double b; + __real__ a = 1; + __imag__ a = 2; + __real__ b = 3.0; + __imag__ b = 4.0; + return a + b; +} + +void +test () +{ + f1<0> (); + (void) f2<0> (); + (void) f3<0> (); +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-8.C b/gcc/testsuite/g++.dg/warn/Wunused-var-8.C new file mode 100644 index 000000000..69fc6fb79 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-8.C @@ -0,0 +1,46 @@ +// { dg-do compile } +// { dg-options "-Wunused" } + +template <int N> +void +f1 (void) +{ + extern int extvari; + extvari = 1; +} + +int extvarj; + +template <int N> +void +f2 (void) +{ + extern int extvarj; + extvarj = 1; +} + +static int extvark; + +template <int N> +void +f3 (void) +{ + extern int extvark; + extvark = 1; +} + +template <int N> +int +f4 (void) +{ + return extvark; +} + +void +test () +{ + f1<0> (); + f2<0> (); + f3<0> (); + (void) f4<0> (); +} diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-9.C b/gcc/testsuite/g++.dg/warn/Wunused-var-9.C new file mode 100644 index 000000000..cb422f45c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-9.C @@ -0,0 +1,13 @@ +/* PR c++/44062 */ +/* { dg-do compile } */ +/* { dg-options "-Wunused" } */ + +void +f () +{ + int i = 4; + static_cast <void> (i); + int j; + j = 5; + static_cast <void> (j); +} diff --git a/gcc/testsuite/g++.dg/warn/Wvla-1.C b/gcc/testsuite/g++.dg/warn/Wvla-1.C new file mode 100644 index 000000000..ca3669aec --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wvla-1.C @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-Wvla" } */ + +void func (int i) +{ + int array[i]; /* { dg-warning "variable length array 'array' is used" } */ +} diff --git a/gcc/testsuite/g++.dg/warn/Wvla-2.C b/gcc/testsuite/g++.dg/warn/Wvla-2.C new file mode 100644 index 000000000..ba83ac1a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wvla-2.C @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-pedantic-errors -Wvla" } */ + +void func (int i) +{ + int array[i]; /* { dg-error "ISO C.* forbids variable.* array 'array'" } */ +} diff --git a/gcc/testsuite/g++.dg/warn/Wvla-3.C b/gcc/testsuite/g++.dg/warn/Wvla-3.C new file mode 100644 index 000000000..259c576b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wvla-3.C @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-pedantic-errors -Wno-vla" } */ + +void func (int i) +{ + int array[i]; +} diff --git a/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.C b/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.C new file mode 100644 index 000000000..cf193e0cb --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.C @@ -0,0 +1,18 @@ +// Test for the warning of exposing types from an anonymous namespace +// { dg-do compile } + +#include "anonymous-namespace-1.h" + +namespace { + class good { }; +} + +class foo::bar : public good { }; +class foobar1 +{ + good g; +}; + +#line 17 "foo.C" +class foobar : public bad { }; // { dg-warning "uses the anonymous namespace" } +class foobar2 { bad b; }; // { dg-warning "uses the anonymous namespace" } diff --git a/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.h b/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.h new file mode 100644 index 000000000..0d3e239e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/anonymous-namespace-1.h @@ -0,0 +1,7 @@ +class foo { + class bar; +}; + +namespace { + class bad { }; +} diff --git a/gcc/testsuite/g++.dg/warn/anonymous-namespace-2.C b/gcc/testsuite/g++.dg/warn/anonymous-namespace-2.C new file mode 100644 index 000000000..4048f3959 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/anonymous-namespace-2.C @@ -0,0 +1,29 @@ +// Test for the warning of exposing types from an anonymous namespace +// { dg-do compile } +// +#include "anonymous-namespace-2.h" + +namespace { + struct good { }; +} + +struct g1 { + good * A; +}; +struct g2 { + good * A[1]; +}; +struct g3 { + good (*A)[1]; +}; + +#line 21 "foo.C" +struct b1 { // { dg-warning "uses the anonymous namespace" } + bad * B; +}; +struct b2 { // { dg-warning "uses the anonymous namespace" } + bad * B[1]; +}; +struct b3 { // { dg-warning "uses the anonymous namespace" } + bad (*B)[1]; +}; diff --git a/gcc/testsuite/g++.dg/warn/anonymous-namespace-2.h b/gcc/testsuite/g++.dg/warn/anonymous-namespace-2.h new file mode 100644 index 000000000..ce5d05c2a --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/anonymous-namespace-2.h @@ -0,0 +1,3 @@ +namespace { + struct bad { }; +} diff --git a/gcc/testsuite/g++.dg/warn/anonymous-namespace-3.C b/gcc/testsuite/g++.dg/warn/anonymous-namespace-3.C new file mode 100644 index 000000000..0ba6790f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/anonymous-namespace-3.C @@ -0,0 +1,13 @@ +// Test for the warning of exposing types from an anonymous namespace +// { dg-do compile } +// +#include <memory> +#include "anonymous-namespace-3.h" + +struct B { std::auto_ptr<A> p; }; + +#line 10 "foo.C" +struct C // { dg-warning "uses the anonymous namespace" } +{ + std::auto_ptr<A> p; +}; diff --git a/gcc/testsuite/g++.dg/warn/anonymous-namespace-3.h b/gcc/testsuite/g++.dg/warn/anonymous-namespace-3.h new file mode 100644 index 000000000..0c7c1f8e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/anonymous-namespace-3.h @@ -0,0 +1 @@ +namespace { struct A; } diff --git a/gcc/testsuite/g++.dg/warn/changes-meaning.C b/gcc/testsuite/g++.dg/warn/changes-meaning.C new file mode 100644 index 000000000..fdbddf820 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/changes-meaning.C @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-fpermissive" } */ + +template <class _Tp> class auto_ptr {}; /* { dg-warning "changes meaning" } */ +template <class _Tp> +class counted_ptr +{ +public: + auto_ptr<_Tp> auto_ptr(); /* { dg-warning "" } */ +}; + diff --git a/gcc/testsuite/g++.dg/warn/compare1.C b/gcc/testsuite/g++.dg/warn/compare1.C new file mode 100644 index 000000000..e00592262 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/compare1.C @@ -0,0 +1,10 @@ +/* -Wall is supposed to trigger -Wsign-compare for C++. PR 10604. + See also gcc.dg/compare7.c. */ + +/* { dg-do compile } */ +/* { dg-options "-Wall" } */ + +int f(unsigned a, int b) +{ + return a < b; /* { dg-warning "signed and unsigned" } */ +} diff --git a/gcc/testsuite/g++.dg/warn/conv1.C b/gcc/testsuite/g++.dg/warn/conv1.C new file mode 100644 index 000000000..d06cbd586 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/conv1.C @@ -0,0 +1,33 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 20 Apr 2003 <nathan@codesourcery.com> + +// PR 10337, unneeded warning + +class A { + public: + A() {} +}; + +class B : public A { + public: + B() {} + void operator=(const A& b) {} + void operator=(const B& b) {} +}; + +class C { + public: + C() {} + operator B &() { return _b; } + operator const B &() const { return _b; } + + B _b; +}; + +int main() { + B b; + C c; + b = c; +} diff --git a/gcc/testsuite/g++.dg/warn/conv2.C b/gcc/testsuite/g++.dg/warn/conv2.C new file mode 100644 index 000000000..45f518346 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/conv2.C @@ -0,0 +1,5 @@ +// PR c++/13932 +// { dg-options "-Wconversion" } + +int i = 1.; +int j = 1.1; // { dg-warning "conversion" } diff --git a/gcc/testsuite/g++.dg/warn/conv3.C b/gcc/testsuite/g++.dg/warn/conv3.C new file mode 100644 index 000000000..5900c3aac --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/conv3.C @@ -0,0 +1,4 @@ +// PR c++/19457 + +int i=-1; +unsigned int j= ~0; // { dg-bogus "" } diff --git a/gcc/testsuite/g++.dg/warn/conv4.C b/gcc/testsuite/g++.dg/warn/conv4.C new file mode 100644 index 000000000..a15ef8bf1 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/conv4.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// This file should compile cleanly by default and not warn on the conversions. +int func1(int i) +{ + return i; +} + +int main() +{ + float f; + long l; + unsigned long ul; + + f = 1.5f; + + l = f; + ul = -1; + func1(f); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/conversion-function-1.C b/gcc/testsuite/g++.dg/warn/conversion-function-1.C new file mode 100644 index 000000000..878011cf3 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/conversion-function-1.C @@ -0,0 +1,8 @@ +// Copyright (C) 2003 Free Software Foundation +// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net> +// { dg-options "-Wno-conversion" } + +struct A { + operator A&(); +}; + diff --git a/gcc/testsuite/g++.dg/warn/ctor-dtor-privacy-1.C b/gcc/testsuite/g++.dg/warn/ctor-dtor-privacy-1.C new file mode 100644 index 000000000..3e84c0921 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/ctor-dtor-privacy-1.C @@ -0,0 +1,9 @@ +// { dg-options "-Wctor-dtor-privacy" } + +struct C { // { dg-warning "" } + static bool result; +private: + static bool check(); +}; + +bool C::result = check(); diff --git a/gcc/testsuite/g++.dg/warn/ctor-dtor-privacy-2.C b/gcc/testsuite/g++.dg/warn/ctor-dtor-privacy-2.C new file mode 100644 index 000000000..16873ab78 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/ctor-dtor-privacy-2.C @@ -0,0 +1,7 @@ +struct C { + static bool result; +private: + static bool check(); +}; + +bool C::result = check(); diff --git a/gcc/testsuite/g++.dg/warn/ctor-init-1.C b/gcc/testsuite/g++.dg/warn/ctor-init-1.C new file mode 100644 index 000000000..0796972fc --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/ctor-init-1.C @@ -0,0 +1,9 @@ +// PR c++/11554 +// { dg-options "-Wall" } + +struct Y { + Y (); + int i1, i2; // { dg-warning "" } +}; + +Y::Y () : i2(0), i1(0) {} // { dg-warning "" } diff --git a/gcc/testsuite/g++.dg/warn/ctor1.C b/gcc/testsuite/g++.dg/warn/ctor1.C new file mode 100644 index 000000000..00a6c952b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/ctor1.C @@ -0,0 +1,13 @@ +// PR c++/35734 +// { dg-options "-W" } + +struct A +{ + A(); + template<typename T> A(const T&); +}; + +struct B : A +{ + B(const B&) {} // { dg-warning "base class" } +}; diff --git a/gcc/testsuite/g++.dg/warn/deprecated-2.C b/gcc/testsuite/g++.dg/warn/deprecated-2.C new file mode 100644 index 000000000..d79a7f9e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/deprecated-2.C @@ -0,0 +1,11 @@ +/* Test __attribute__((deprecated)). Test merging with multiple + declarations. Bug 7425 (C++ version). */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +void func(void); +void func(void) __attribute__((deprecated)); + +void f(void) { + func(); /* { dg-warning "'void func\\(\\)' is deprecated" } */ +} diff --git a/gcc/testsuite/g++.dg/warn/deprecated-3.C b/gcc/testsuite/g++.dg/warn/deprecated-3.C new file mode 100644 index 000000000..8b4378c41 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/deprecated-3.C @@ -0,0 +1,14 @@ +/* PR 17947 bad warning with implicit conversion and __attribute__((deprecated)) */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +struct Foo +{ + operator int() __attribute__((deprecated)); +}; + +void g(void) +{ + Foo f; + (int)f; // { dg-warning "'Foo::operator int\\(\\)' is deprecated \\(declared at" } +} diff --git a/gcc/testsuite/g++.dg/warn/deprecated-4.C b/gcc/testsuite/g++.dg/warn/deprecated-4.C new file mode 100644 index 000000000..e2f1a2c33 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/deprecated-4.C @@ -0,0 +1,9 @@ +// PR c++/15269 + +struct B { + virtual int foo() __attribute__((deprecated)); +}; + +int main(void) { + ((B*)0)->foo(); // { dg-warning "deprecated" } +} diff --git a/gcc/testsuite/g++.dg/warn/deprecated-5.C b/gcc/testsuite/g++.dg/warn/deprecated-5.C new file mode 100644 index 000000000..a015bd50b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/deprecated-5.C @@ -0,0 +1,4 @@ +// PR c++/16370 + +struct Foo { int i; } __attribute__ ((deprecated)); +void foo() { Foo f; } // { dg-warning "deprecated" } diff --git a/gcc/testsuite/g++.dg/warn/deprecated-6.C b/gcc/testsuite/g++.dg/warn/deprecated-6.C new file mode 100644 index 000000000..8ce6ac02d --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/deprecated-6.C @@ -0,0 +1,110 @@ +/* Test __attribute__ ((deprecated("message"))) */ +/* { dg-do compile } */ +/* { dg-options "-Wdeprecated-declarations -fmessage-length=0" } */ + +typedef int INT1 __attribute__((deprecated("Please avoid INT1"))); +typedef INT1 INT2 __attribute__ ((__deprecated__("Please avoid INT2"))); + +typedef INT1 INT1a; /* { dg-warning "'INT1' is deprecated .declared at \[^\n\]*: Please avoid INT1" "" } */ + +INT1 should_be_unavailable; /* { dg-warning "'INT1' is deprecated .declared at \[^\n\]*: Please avoid INT1" "" } */ +INT1a should_not_be_deprecated; + +INT1 f1(void) __attribute__ ((deprecated("Please avoid f1"))); +INT1 f2(void) { return 0; } /* { dg-warning "'INT1' is deprecated .declared at \[^\n\]*: Please avoid INT1" "" } */ + +INT2 f3(void) __attribute__ ((__deprecated__("Please avoid f3"))); +INT2 f4(void) { return 0; } /* { dg-warning "'INT2' is deprecated .declared at \[^\n\]*: Please avoid INT2" "" } */ +int f5(INT2 x); /* { dg-warning "'INT2' is deprecated" "" } */ +int f6(INT2 x) __attribute__ ((__deprecated__("Please avoid f6"))); + +typedef enum Color {red, green, blue} Color __attribute__((deprecated("Please avoid Color"))); + +int g1; +int g2 __attribute__ ((deprecated("Please avoid g2"))); +int g3 __attribute__ ((__deprecated__("Please avoid g3"))); +Color k; /* { dg-warning "'Color' is deprecated .declared at \[^\n\]*: Please avoid Color" "" } */ + +typedef struct { + int field1; + int field2 __attribute__ ((deprecated("Please avoid field2"))); + int field3; + int field4 __attribute__ ((__deprecated__("Please avoid field4"))); + union { + int field5; + int field6 __attribute__ ((deprecated("Please avoid field6"))); + } u1; + int field7:1; + int field8:1 __attribute__ ((deprecated("Please avoid field8"))); + union { + int field9; + int field10; + } u2 __attribute__ ((deprecated("Please avoid u2"))); +} S1; + +int func1() +{ + INT1 w; /* { dg-warning "'INT1' is deprecated .declared at \[^\n\]*: Please avoid INT1" "" } */ + int x __attribute__ ((deprecated("Please avoid x"))); + int y __attribute__ ((__deprecated__("Please avoid y"))); + int z; + int (*pf)() = f1; /* { dg-warning "'INT1 f1\\(\\)' is deprecated .declared at \[^\n\]*: Please avoid f1" "" } */ + + z = w + x + y + g1 + g2 + g3; /* { dg-warning "'x' is deprecated .declared at \[^\n\]*: Please avoid x" "" } */ + /* { dg-warning "'y' is deprecated .declared at \[^\n\]*: Please avoid y" "y" { target *-*-* } 53 } */ + /* { dg-warning "'g2' is deprecated .declared at \[^\n\]*: Please avoid g2" "g2" { target *-*-* } 53 } */ + /* { dg-warning "'g3' is deprecated .declared at \[^\n\]*: Please avoid g3" "g3" { target *-*-* } 53 } */ + return f1(); /* { dg-warning "'INT1 f1\\(\\)' is deprecated .declared at \[^\n\]*: Please avoid f1" "f1" } */ +} + +int func2(S1 *p) +{ + S1 lp; + + if (p->field1) + return p->field2; /* { dg-warning "'S1::field2' is deprecated .declared at \[^\n\]*: Please avoid field2" "" } */ + else if (lp.field4) /* { dg-warning "'S1::field4' is deprecated .declared at \[^\n\]*: Please avoid field4" "" } */ + return p->field3; + + p->u1.field5 = g1 + p->field7; + p->u2.field9; /* { dg-warning "'S1::u2' is deprecated .declared at \[^\n\]*: Please avoid u2" "" } */ + return p->u1.field6 + p->field8; /* { dg-warning "'S1::<anonymous union>::field6' is deprecated .declared at \[^\n\]*: Please avoid field6" "" } */ + /* { dg-warning "'S1::field8' is deprecated .declared at \[^\n\]*: Please avoid field8" "field8" { target *-*-* } 71 } */ +} + +struct SS1 { + int x; + INT1 y; /* { dg-warning "'INT1' is deprecated .declared at \[^\n\]*: Please avoid INT1" "" } */ +} __attribute__ ((deprecated("Please avoid SS1"))); + +struct SS1 *p1; /* { dg-warning "'SS1' is deprecated .declared at \[^\n\]*: Please avoid SS1" "" } */ + +struct __attribute__ ((__deprecated__("Please avoid SS2"))) SS2 { + int x; + INT1 y; /* { dg-warning "'INT1' is deprecated .declared at \[^\n\]*: Please avoid INT1" "" } */ +}; + +struct SS2 *p2; /* { dg-warning "'SS2' is deprecated .declared at \[^\n\]*: Please avoid SS2" "" } */ + +class T { + public: + void member1(int) __attribute__ ((deprecated("Please avoid member1"))); + void member2(INT1) __attribute__ ((__deprecated__("Please avoid member2"))); /* { dg-warning "'INT1' is deprecated" "" } */ + int member3(T *); + int x; +} __attribute__ ((deprecated("Please avoid T"))); + +T *p3; // { dg-warning "'T' is deprecated .declared at \[^\n\]*: Please avoid T" } + +inline void T::member1(int) {} + +int T::member3(T *p) // { dg-warning "'T' is deprecated .declared at \[^\n\]*: Please avoid T" } +{ + p->member1(1); /* { dg-warning "'void T::member1\\(int\\)' is deprecated .declared at \[^\n\]*: Please avoid member1" "" } */ + (*p).member1(2); /* { dg-warning "'void T::member1\\(int\\)' is deprecated .declared at \[^\n\]*: Please avoid member1" "" } */ + p->member2(1); /* { dg-warning "'void T::member2\\(INT1\\)' is deprecated .declared at \[^\n\]*: Please avoid member2" "" } */ + (*p).member2(2); /* { dg-warning "'void T::member2\\(INT1\\)' is deprecated .declared at \[^\n\]*: Please avoid member2" "" } */ + p->member3(p); + (*p).member3(p); + return f1(); /* { dg-warning "'INT1 f1\\(\\)' is deprecated .declared at \[^\n\]*: Please avoid f1" "" } */ +} diff --git a/gcc/testsuite/g++.dg/warn/deprecated.C b/gcc/testsuite/g++.dg/warn/deprecated.C new file mode 100644 index 000000000..210740814 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/deprecated.C @@ -0,0 +1,117 @@ +/* Test __attribute__ ((deprecated)) */ +/* { dg-do compile } */ +/* { dg-options "-Wdeprecated-declarations -fmessage-length=0" } */ + +#if 1 +typedef int INT1 __attribute__((deprecated)); +typedef INT1 INT2 __attribute__ ((__deprecated__)); + +typedef INT1 INT1a; /* { dg-warning "'INT1' is deprecated" "" } */ +typedef INT1 INT1b __attribute__ ((deprecated)); + +INT1 should_be_unavailable; /* { dg-warning "'INT1' is deprecated" "" } */ +INT1a should_not_be_deprecated; + +INT1 f1(void) __attribute__ ((deprecated)); +INT1 f2(void) { return 0; } /* { dg-warning "'INT1' is deprecated" "" } */ + +INT2 f3(void) __attribute__ ((__deprecated__)); +INT2 f4(void) { return 0; } /* { dg-warning "'INT2' is deprecated" "" } */ +int f5(INT2 x); /* { dg-warning "'INT2' is deprecated" "" } */ +int f6(INT2 x) __attribute__ ((__deprecated__)); + +typedef enum Color {red, green, blue} Color __attribute__((deprecated)); + +int g1; +int g2 __attribute__ ((deprecated)); +int g3 __attribute__ ((__deprecated__)); +Color k; /* { dg-warning "'Color' is deprecated" "" } */ + +typedef struct { + int field1; + int field2 __attribute__ ((deprecated)); + int field3; + int field4 __attribute__ ((__deprecated__)); + union { + int field5; + int field6 __attribute__ ((deprecated)); + } u1; + int field7:1; + int field8:1 __attribute__ ((deprecated)); + union { + int field9; + int field10; + } u2 __attribute__ ((deprecated)); +} S1; + +int func1() +{ + INT1 w; /* { dg-warning "'INT1' is deprecated" "" } */ + int x __attribute__ ((deprecated)); + int y __attribute__ ((__deprecated__)); + int z; + int (*pf)() = f1; /* { dg-warning "'INT1 f1\\(\\)' is deprecated" "" } */ + + z = w + x + y + g1 + g2 + g3; /* { dg-warning "'x' is deprecated" "" } */ + /* { dg-warning "'y' is deprecated" "y" { target *-*-* } 55 } */ + /* { dg-warning "'g2' is deprecated" "g2" { target *-*-* } 55 } */ + /* { dg-warning "'g3' is deprecated" "g3" { target *-*-* } 55 } */ + return f1(); /* { dg-warning "'INT1 f1\\(\\)' is deprecated" "f1" } */ +} + +int func2(S1 *p) +{ + S1 lp; + + if (p->field1) + return p->field2; /* { dg-warning "'S1::field2' is deprecated" "" } */ + else if (lp.field4) /* { dg-warning "'S1::field4' is deprecated" "" } */ + return p->field3; + + p->u1.field5 = g1 + p->field7; + p->u2.field9; /* { dg-warning "'S1::u2' is deprecated" "" } */ + return p->u1.field6 + p->field8; /* { dg-warning "'S1::<anonymous union>::field6' is deprecated" "" } */ + /* { dg-warning "'S1::field8' is deprecated" "field8" { target *-*-* } 73 } */ +} + +struct SS1 { + int x; + INT1 y; /* { dg-warning "'INT1' is deprecated" "" } */ +} __attribute__ ((deprecated)); + +struct SS1 *p1; /* { dg-warning "'SS1' is deprecated" "" } */ + +struct __attribute__ ((__deprecated__)) SS2 { + int x; + INT1 y; /* { dg-warning "'INT1' is deprecated" "" } */ +}; + +struct SS2 *p2; /* { dg-warning "'SS2' is deprecated" "" } */ +#endif + +#ifdef __cplusplus +class T { + public: + void member1(int) __attribute__ ((deprecated)); + void member2(INT1) __attribute__ ((__deprecated__)); /* { dg-warning "'INT1' is deprecated" "" } */ + int member3(T *); + int x; +} __attribute__ ((deprecated)); + +T *p3; // { dg-warning "'T' is deprecated" } + +inline void T::member1(int) {} + +int T::member3(T *p) // { dg-warning "'T' is deprecated" } +{ + p->member1(1); /* { dg-warning "'void T::member1\\(int\\)' is deprecated" "" } */ + (*p).member1(2); /* { dg-warning "'void T::member1\\(int\\)' is deprecated" "" } */ + p->member2(1); /* { dg-warning "'void T::member2\\(INT1\\)' is deprecated" "" } */ + (*p).member2(2); /* { dg-warning "'void T::member2\\(INT1\\)' is deprecated" "" } */ + p->member3(p); + (*p).member3(p); + return f1(); /* { dg-warning "'INT1 f1\\(\\)' is deprecated" "" } */ +} +#endif + + diff --git a/gcc/testsuite/g++.dg/warn/do-empty.C b/gcc/testsuite/g++.dg/warn/do-empty.C new file mode 100644 index 000000000..350261d48 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/do-empty.C @@ -0,0 +1,15 @@ +/* Test diagnostics for empty bodies in do / while. */ +/* { dg-do compile } */ +/* { dg-options "-Wempty-body" } */ + +void +f (int x) +{ + do + ; /* { dg-warning "empty body in" } */ + while (x--); + + do + {} /* { dg-bogus "empty body in" } */ + while (++x < 10); +} diff --git a/gcc/testsuite/g++.dg/warn/effc1.C b/gcc/testsuite/g++.dg/warn/effc1.C new file mode 100644 index 000000000..345f8d1b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/effc1.C @@ -0,0 +1,16 @@ +// { dg-options -Weffc++ } +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Apr 2002 <nathan@codesourcery.com> + +// Bug 5719 + +class A +{ + public: + A & operator+=( int ); + A & operator+( int ); // { dg-warning ".* should return by value" "" } + A operator+=( float ); + A operator+( float ); +}; diff --git a/gcc/testsuite/g++.dg/warn/effc2.C b/gcc/testsuite/g++.dg/warn/effc2.C new file mode 100644 index 000000000..fb765f0d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/effc2.C @@ -0,0 +1,39 @@ +// { dg-do compile } +// { dg-options "-Weffc++" } +// Contributed by Benjamin Kosnik <bkoz at redhat dot com> +// PR c++/16169 : Improve -Weffc++ rule 15 + +struct A { + const A& foo(); + const A& operator=(int) + { return foo(); } +}; + +struct B { + B& foo(); + B& operator=(int) + { return foo(); } +}; + +struct C { + C& operator=(int) + { return *this; } +}; + +struct D { + D operator=(int) + { return *this; } // { dg-warning "should return a reference" } +}; + +struct E { + E& foo(); + E operator=(int) + { return foo(); } // { dg-warning "should return a reference" } +}; + +struct F +{ + operator float(); + float operator=(int) + { return *this; } // { dg-warning "should return a reference" } +}; diff --git a/gcc/testsuite/g++.dg/warn/effc3.C b/gcc/testsuite/g++.dg/warn/effc3.C new file mode 100644 index 000000000..ba2cc0399 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/effc3.C @@ -0,0 +1,58 @@ +// { dg-do compile } +// { dg-options "-Weffc++" } +// Contributed by Benjamin Kosnik <bkoz at redhat dot com> +// PR c++/16165 and PR c++/8211: Improve item 11 of -Weffc++ + + +// We should not warn for this class since this kind of pointers can +// never hold dynamic memory. +struct A { + void (*func1)(void); + void (A::*func2)(void); + int A::*func3; + + int a; + void b(void); + + A(); + ~A(); +}; + +// We do not warn for this class because there is no destructor, so we +// assume there is no dynamic memory allocated (it could point to a +// global variable). +struct B { + int *ptr; + B(); +}; + + +// We should emit a warning for these +struct C1 { // { dg-warning "" "" } + int *ptr; + C1(); + ~C1(); +}; + +struct C2 { // { dg-warning "" "" } + int *ptr; + C2(); + C2(const C2&); + ~C2(); +}; + +struct C3 { // { dg-warning "" "" } + int *ptr; + C3(); + ~C3(); + C3& operator=(const C3&); +}; + +// But not for this +struct C4 { + int *ptr; + C4(); + C4(const C4&); + ~C4(); + C4& operator=(const C4&); +}; diff --git a/gcc/testsuite/g++.dg/warn/empty-body.C b/gcc/testsuite/g++.dg/warn/empty-body.C new file mode 100644 index 000000000..064a09dde --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/empty-body.C @@ -0,0 +1,12 @@ +// PR c++/5520 +// { dg-options "-O2 -Wempty-body" } + +void breakme() +{ + if(1) ; // { dg-warning "empty body" } + if(1) {} // { dg-bogus "empty body" } + if(1) (void)0; // { dg-bogus "empty body" } + if(1) {} else; // { dg-warning "empty body" } + if(1) {} else (void)0; // // { dg-bogus "empty body" } + if(1) ; else (void)0; // // { dg-bogus "empty body" } +} diff --git a/gcc/testsuite/g++.dg/warn/format1.C b/gcc/testsuite/g++.dg/warn/format1.C new file mode 100644 index 000000000..27bc414b0 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/format1.C @@ -0,0 +1,15 @@ +// Test that formats get checked according to C94. +// Origin: Joseph Myers <jsm28@cam.ac.uk>. +// { dg-do compile } +// { dg-options "-ansi -pedantic -Wformat" } + +#include <cstdio> + +void +foo (int i, int *ip, __WINT_TYPE__ lc, wchar_t *ls) +{ + std::printf ("%d%ls%lc\n", i, ls, lc); + std::printf ("%d", ls); // { dg-warning "format" "printf warning" } + std::scanf ("%d%lc%ls%l[abc]", ip, ls, ls, ls); + std::scanf ("%hd", ip); // { dg-warning "format" "scanf warning" } +} diff --git a/gcc/testsuite/g++.dg/warn/format2.C b/gcc/testsuite/g++.dg/warn/format2.C new file mode 100644 index 000000000..639bc668b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/format2.C @@ -0,0 +1,32 @@ +// Test for format attributes: test applying them to types in C++. +// Origin: Joseph Myers <jsm28@cam.ac.uk> +// { dg-do compile } +// { dg-options "-Wformat" } + +__attribute__((format(printf, 1, 2))) void (*tformatprintf0) (const char *, ...); +void (*tformatprintf1) (const char *, ...) __attribute__((format(printf, 1, 2))); +void (__attribute__((format(printf, 1, 2))) *tformatprintf2) (const char *, ...); +void (__attribute__((format(printf, 1, 2))) ****tformatprintf3) (const char *, ...); + +char * (__attribute__((format_arg(1))) *tformat_arg) (const char *); + +void +baz (int i) +{ + (*tformatprintf0) ("%d", i); + (*tformatprintf0) ((*tformat_arg) ("%d"), i); + (*tformatprintf0) ("%"); // { dg-warning "format" "prefix" } + (*tformatprintf0) ((*tformat_arg) ("%")); // { dg-warning "format" "prefix" } + (*tformatprintf1) ("%d", i); + (*tformatprintf1) ((*tformat_arg) ("%d"), i); + (*tformatprintf1) ("%"); // { dg-warning "format" "postfix" } + (*tformatprintf1) ((*tformat_arg) ("%")); // { dg-warning "format" "postfix" } + (*tformatprintf2) ("%d", i); + (*tformatprintf2) ((*tformat_arg) ("%d"), i); + (*tformatprintf2) ("%"); // { dg-warning "format" "nested" } + (*tformatprintf2) ((*tformat_arg) ("%")); // { dg-warning "format" "nested" } + (****tformatprintf3) ("%d", i); + (****tformatprintf3) ((*tformat_arg) ("%d"), i); + (****tformatprintf3) ("%"); // { dg-warning "format" "nested 2" } + (****tformatprintf3) ((*tformat_arg) ("%")); // { dg-warning "format" "nested 2" } +} diff --git a/gcc/testsuite/g++.dg/warn/format3.C b/gcc/testsuite/g++.dg/warn/format3.C new file mode 100644 index 000000000..0bdaaee17 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/format3.C @@ -0,0 +1,12 @@ +// PR c++/13070 +// { dg-do compile } +// { dg-options "-Wformat" } + +extern "C" int printf (const char*, ...); + +int main() +{ + printf("%d\n", 1, 1); // { dg-warning "too many" "printf warning" } + return 0; +} + diff --git a/gcc/testsuite/g++.dg/warn/format4.C b/gcc/testsuite/g++.dg/warn/format4.C new file mode 100644 index 000000000..fa622fceb --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/format4.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options "-Wformat=2" } + +extern "C" int printf (const char*, ...); + +void foo(int i) +{ + printf("Hello World %d!\n", i); + printf(&"Hello World %d!\n"[0], i); + printf(&"Hello World %d!\n"[6], i); + printf(&"Hello World %d!\n"[8]-2, i); + printf(&"Hello World %d!\n"[4]+2, i); +} diff --git a/gcc/testsuite/g++.dg/warn/forward-inner.C b/gcc/testsuite/g++.dg/warn/forward-inner.C new file mode 100644 index 000000000..dae99486a --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/forward-inner.C @@ -0,0 +1,81 @@ +// Check that the compiler warns about inner-style forward declarations in +// contexts where they're not actually illegal, but merely useless. + +// Verify warnings for and within classes, and by extension, struct and union. +class C1; +class C1::C2; // { dg-error "does not name a type" } +class C1::C2::C3; // { dg-error "has not been declared" } + +class C1 { + public: + class C2; + class C2::C3; // { dg-error "does not name a type" } + class C2 { + public: + class C3; + class C3 { }; + class C3; + }; + class C2; + class C2::C3; // { dg-warning "declaration 'class C1::C2::C3' does not declare anything" } +}; + +class C1; +class C1::C2; // { dg-warning "declaration 'class C1::C2' does not declare anything" } +class C1::C2::C3; // { dg-warning "declaration 'class C1::C2::C3' does not declare anything" } + + +// Verify warnings for namespace scopes. +class N1::C4; // { dg-error "has not been declared" } +class N1::N2::C5; // { dg-error "has not been declared" } + +namespace N1 { + class C4; + class C4 { }; + class C4; + + class N2::C5; // { dg-error "has not been declared" } + namespace N2 { + class C5; + class C5 { }; + class C5; + } + class N2::C5; // { dg-warning "declaration 'class N1::N2::C5' does not declare anything" } +} + +class N1::C4; // { dg-warning "declaration 'class N1::C4' does not declare anything" } +class N1::N2::C5; // { dg-warning "declaration 'class N1::N2::C5' does not declare anything" } + + +// Verify that using declarations related to namespaces don't generate a +// warning. +using namespace N1; +using namespace N1::N2; + +namespace N3 { + using N1::C4; // Valid using declaration, no warning + using N1::N2::C5; // Valid using declaration, no warning +} + + +// Verify that explicit template instantiations, easy to confuse with +// forward declarations, don't generate a warning. +template<class C> +class TC6 { + public: + class TC7 { }; +}; + +template class TC6<int>::TC7; // Valid explicit instantiation, no warning + + +// Verify that friend declarations, also easy to confuse with forward +// declrations, are similarly not warned about. +class C8 { + public: + class C9 { }; +}; +class C10 { + public: + friend class C8::C9; // Valid friend declaration, no warning +}; diff --git a/gcc/testsuite/g++.dg/warn/friend.C b/gcc/testsuite/g++.dg/warn/friend.C new file mode 100644 index 000000000..e7982896a --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/friend.C @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options -Wredundant-decls } */ + +/* Test to see if spurious warnings about redundant + declarations are emiited because of the friend + declaration. */ + +class Foo +{ + friend void bar (Foo); +public: +}; + +extern void bar (Foo); diff --git a/gcc/testsuite/g++.dg/warn/huge-val1.C b/gcc/testsuite/g++.dg/warn/huge-val1.C new file mode 100644 index 000000000..2ddfae0c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/huge-val1.C @@ -0,0 +1,33 @@ +// PR c++/23139: HUGE_VAL definition should be accepted with -pedantic. +// Origin: Joseph Myers <joseph@codesourcery.com> +// { dg-do link } +// { dg-options "-pedantic-errors" } + +#include <math.h> + +double d = HUGE_VAL; +#ifdef HUGE_VALF +float f = HUGE_VALF; +#endif +#ifdef HUGE_VALL +long double l = HUGE_VALL; +#endif + +extern void link_failure (); + +int +main () +{ +#ifdef __GLIBC__ + if (HUGE_VAL != __builtin_huge_val ()) + link_failure (); +#ifdef HUGE_VALF + if (HUGE_VALF != __builtin_huge_valf ()) + link_failure (); +#endif +#ifdef HUGE_VALL + if (HUGE_VALL != __builtin_huge_vall ()) + link_failure (); +#endif +#endif +} diff --git a/gcc/testsuite/g++.dg/warn/if-empty-1.C b/gcc/testsuite/g++.dg/warn/if-empty-1.C new file mode 100644 index 000000000..b29a6cb92 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/if-empty-1.C @@ -0,0 +1,23 @@ +/* Test diagnostics for empty bodies in if / else. */ +/* Origin: Joseph Myers <joseph@codesourcery.com> */ +/* { dg-do compile } */ +/* { dg-options "-Wempty-body" } */ + +void +f (int x) +{ + if (x) + ; /* { dg-warning "suggest braces around empty body in an" } */ + if (x) + ; /* By design we don't warn in this case. */ + else + (void)0; + if (x) + (void)0; + else + ; /* { dg-warning "suggest braces around empty body in an" } */ + if (x) + (void)0; + else + (void)0; +} diff --git a/gcc/testsuite/g++.dg/warn/ignored_typedef.C b/gcc/testsuite/g++.dg/warn/ignored_typedef.C new file mode 100644 index 000000000..74586a81f --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/ignored_typedef.C @@ -0,0 +1,22 @@ +// PR c++/23689 +// Test that malformed typedef's produce a compiler warning. + +typedef char valid_0; +typedef int valid_1; +typedef long valid_2; +typedef float valid_3; +typedef double valid_4; +typedef unsigned valid_5; +typedef int *valid_6; +typedef struct valid_7 {} valid_8; +typedef struct {} valid_9; +typedef int temp_0; typedef temp_0 valid_10; +struct temp_1 {}; typedef temp_1 valid_11; +union temp_2 {}; typedef temp_2 valid_12; +typedef void (*valid_13) (int); + +typedef struct invalid_0 {}; // { dg-warning "'typedef' was ignored" } +typedef class invalid_1 {}; // { dg-warning "'typedef' was ignored" } +typedef enum invalid_2 { INVALID_2 }; // { dg-warning "'typedef' was ignored" } +typedef enum { INVALID_3 }; // { dg-warning "'typedef' was ignored" } +typedef union invalid_4 {}; // { dg-warning "'typedef' was ignored" } diff --git a/gcc/testsuite/g++.dg/warn/implicit-typename1.C b/gcc/testsuite/g++.dg/warn/implicit-typename1.C new file mode 100644 index 000000000..2952e6fd0 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/implicit-typename1.C @@ -0,0 +1,17 @@ +// The -pedantic option must be omitted to trigger the crash. +// { dg-do compile } +// { dg-options "" } + +// PR c++/7982: Crash warning about implicit typename. +// The base class refers to another typename, while the +// name lookup finds a template. + +template <typename T> struct X {}; + +template <typename T> struct C { + typedef typename T::X X; +}; + +template <typename T> struct A : public C<T> { + typedef ::X<int> X; +}; diff --git a/gcc/testsuite/g++.dg/warn/implicit-typename2.C b/gcc/testsuite/g++.dg/warn/implicit-typename2.C new file mode 100644 index 000000000..2bd83cffa --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/implicit-typename2.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/11039: Implicit typename warning in friend class declaration. + +template <typename T> struct X { + struct Y { + struct Z {}; + }; + friend struct Y::Z; +}; diff --git a/gcc/testsuite/g++.dg/warn/implicit-typename3.C b/gcc/testsuite/g++.dg/warn/implicit-typename3.C new file mode 100644 index 000000000..9b1ea8cfc --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/implicit-typename3.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> + +// PR c++/11039: Implicit typename warning in friend class declaration. + +template <typename T> struct X { + struct Y { + struct Z {}; + }; + template <typename U> friend struct Y::Z f(U); +}; diff --git a/gcc/testsuite/g++.dg/warn/incomplete1.C b/gcc/testsuite/g++.dg/warn/incomplete1.C new file mode 100644 index 000000000..26cfe2eae --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/incomplete1.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Contributed by Brian Gaeke; public domain. + +// 5 If the object being deleted has incomplete class type at the +// point of deletion and the complete class has a non-trivial +// destructor or a deallocation function, the behavior is undefined. + +// (But the deletion does not constitute an ill-formed program. So the +// program should nevertheless compile, but it should give a warning.) + +class A; // { dg-warning "forward declaration of 'struct A'" "" } + +A *a; // { dg-warning "'a' has incomplete type" "" } + +int +main (int argc, char **argv) +{ + delete a; // { dg-warning "delete" "warn" } + // { dg-message "note" "note" { target *-*-* } 19 } + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/incomplete2.C b/gcc/testsuite/g++.dg/warn/incomplete2.C new file mode 100644 index 000000000..30be26749 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/incomplete2.C @@ -0,0 +1,13 @@ +// PR c++/33501 +// { dg-do compile } + +class A; // { dg-error "forward declaration" } + +int f (A); // { dg-error "initializing" } +const A &make (); + +int +main () +{ + return f (make ()); // { dg-error "invalid use of incomplete type" } +} diff --git a/gcc/testsuite/g++.dg/warn/inline1.C b/gcc/testsuite/g++.dg/warn/inline1.C new file mode 100644 index 000000000..24836e744 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/inline1.C @@ -0,0 +1,23 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Dec 2002 <nathan@codesourcery.com> + +// PR 4803. Used inline functions must have a definition. + +inline void Foo1 (); // { dg-warning "inline function" "" } +inline void Bar1 (); +template <typename T> inline void Foo2(T); // { dg-warning "inline function" "" } +template <typename T> inline void Bar2(T); + +void Baz () +{ + Foo1 (); + Foo2 (1); + + Bar1 (); + Bar2 (1); +} + +inline void Bar1 () {} +template <typename T> inline void Bar2(T) {} diff --git a/gcc/testsuite/g++.dg/warn/inline2.C b/gcc/testsuite/g++.dg/warn/inline2.C new file mode 100644 index 000000000..0f5f78af1 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/inline2.C @@ -0,0 +1,20 @@ +// PR c++/21627 + +template<typename T> +struct TPL +{ + TPL (){} + ~TPL (){} + void method () {} +}; + +template <> TPL<int>::TPL (); +template <> TPL<int>::~TPL (); +template <> void TPL<int>::method (); + +void Foo () +{ + TPL<int> i; + i.method (); +} + diff --git a/gcc/testsuite/g++.dg/warn/main-2.C b/gcc/testsuite/g++.dg/warn/main-2.C new file mode 100644 index 000000000..d38ef8e09 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/main-2.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// Make sure that the type of f1 does not change +// after the error of main about not returning +// int. +// From Pekka Vuorela <pvuorela@iki.fi> +// PR c++/23229 + +void f1(); + +void +main() /* { dg-error "must return" } */ +{ + f1(); +} + +void f1() +{ +} + diff --git a/gcc/testsuite/g++.dg/warn/main-3.C b/gcc/testsuite/g++.dg/warn/main-3.C new file mode 100644 index 000000000..eb462f4ba --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/main-3.C @@ -0,0 +1,7 @@ +// PR c++/29735 +// { dg-do compile } + +int __attribute__ ((vector_size (8))) main () // { dg-error "must return" } +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/main-4.C b/gcc/testsuite/g++.dg/warn/main-4.C new file mode 100644 index 000000000..ad2dd7098 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/main-4.C @@ -0,0 +1,5 @@ +// This pattern is used by a lot of autoconf scripts, so don't +// complain about it unless -pedantic. +// { dg-options "" } + +int main () { main (); return 0; } diff --git a/gcc/testsuite/g++.dg/warn/main.C b/gcc/testsuite/g++.dg/warn/main.C new file mode 100644 index 000000000..ebf92177b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/main.C @@ -0,0 +1,11 @@ +// { dg-do compile } + +// Origin: Donald W. Gillies <dgillies@graviton.com> + +// PR c++/4494: Incorrect diagnostics about return type of main. + +typedef int int_t; + +int_t main() { + +} diff --git a/gcc/testsuite/g++.dg/warn/miss-format-1.C b/gcc/testsuite/g++.dg/warn/miss-format-1.C new file mode 100644 index 000000000..a35cd9ca9 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/miss-format-1.C @@ -0,0 +1,43 @@ +/* Test for warnings for missing format attributes. */ +/* Origin: Joseph Myers <jsm28@cam.ac.uk> */ +/* { dg-do compile } */ +/* { dg-options "-Wmissing-format-attribute" } */ +/* { dg-options "-Wmissing-format-attribute -Wno-abi" { target arm_eabi } } */ +/* VxWorks does not provide vscanf, either in kernel or RTP mode. */ +/* { dg-error "not declared" "" { target { *-*-solaris2.8 *-*-vxworks* alpha*-dec-osf* } } 26 } */ + +#include <stdio.h> +#include <stdarg.h> + +void +foo (const char *fmt, ...) +{ + va_list ap; + va_start (ap, fmt); + vprintf (fmt, ap); /* { dg-warning "candidate" "printf attribute warning" } */ + va_end (ap); +} + +void +bar (const char *fmt, ...) +{ + va_list ap; + va_start (ap, fmt); + vscanf (fmt, ap); /* { dg-warning "candidate" "scanf attribute warning" { xfail *-*-solaris2.8 *-*-vxworks* alpha*-dec-osf* } } */ + va_end (ap); +} + +__attribute__((__format__(__printf__, 1, 2))) void +foo2 (const char *fmt, ...) +{ + va_list ap; + va_start (ap, fmt); + vprintf (fmt, ap); + va_end (ap); +} + +void +vfoo (const char *fmt, va_list arg) +{ + vprintf (fmt, arg); /* { dg-warning "candidate" "printf attribute warning 2" } */ +} diff --git a/gcc/testsuite/g++.dg/warn/miss-format-2.C b/gcc/testsuite/g++.dg/warn/miss-format-2.C new file mode 100644 index 000000000..bd7f11ba8 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/miss-format-2.C @@ -0,0 +1,17 @@ +/* Test for warnings for missing format attributes. Don't warn if no + relevant parameters for a format attribute; see c/1017. */ +/* Origin: Joseph Myers <jsm28@cam.ac.uk> */ +/* { dg-do compile } */ +/* { dg-options "-Wmissing-format-attribute" } */ + +#include <stdio.h> +#include <stdarg.h> + +void +foo (int i, ...) +{ + va_list ap; + va_start (ap, i); + vprintf ("Foo %s bar %s", ap); /* { dg-bogus "candidate" "bogus printf attribute warning" } */ + va_end (ap); +} diff --git a/gcc/testsuite/g++.dg/warn/miss-format-3.C b/gcc/testsuite/g++.dg/warn/miss-format-3.C new file mode 100644 index 000000000..d131d1511 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/miss-format-3.C @@ -0,0 +1,27 @@ +/* Test warnings for missing format attributes on function pointers. */ +/* Origin: Kaveh Ghazi <ghazi@caip.rutgers.edu> */ +/* { dg-do compile } */ +/* { dg-options "-Wmissing-format-attribute" } */ +/* { dg-options "-Wmissing-format-attribute -Wno-abi" { target arm_eabi } } */ + +#include <stdarg.h> + +typedef void (*noattr_t) (const char *, ...); +typedef noattr_t __attribute__ ((__format__(__printf__, 1, 2))) attr_t; + +typedef void (*vnoattr_t) (const char *, va_list); +typedef vnoattr_t __attribute__ ((__format__(__printf__, 1, 0))) vattr_t; + +void +foo1 (noattr_t na, attr_t a, vnoattr_t vna, vattr_t va) +{ + noattr_t na1 = na; + noattr_t na2 = a; /* { dg-warning "candidate" "initialization warning" } */ + attr_t a1 = na; + attr_t a2 = a; + + vnoattr_t vna1 = vna; + vnoattr_t vna2 = va; /* { dg-warning "candidate" "initialization warning" } */ + vattr_t va1 = vna; + vattr_t va2 = va; +} diff --git a/gcc/testsuite/g++.dg/warn/miss-format-4.C b/gcc/testsuite/g++.dg/warn/miss-format-4.C new file mode 100644 index 000000000..73db0d50b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/miss-format-4.C @@ -0,0 +1,33 @@ +/* Test warnings for missing format attributes on function pointers. */ +/* Origin: Kaveh Ghazi <ghazi@caip.rutgers.edu> */ +/* { dg-do compile } */ +/* { dg-options "-Wmissing-format-attribute" } */ +/* { dg-options "-Wmissing-format-attribute -Wno-abi" { target arm_eabi } } */ + +#include <stdarg.h> + +typedef void (*noattr_t) (const char *, ...); +typedef noattr_t __attribute__ ((__format__(__printf__, 1, 2))) attr_t; + +typedef void (*vnoattr_t) (const char *, va_list); +typedef vnoattr_t __attribute__ ((__format__(__printf__, 1, 0))) vattr_t; + +void +foo1 (noattr_t na, attr_t a, vnoattr_t vna, vattr_t va) +{ + noattr_t na1, na2; + attr_t a1, a2; + + vnoattr_t vna1, vna2; + vattr_t va1, va2; + + na1 = na; + na2 = a; /* { dg-warning "candidate" "assignment warning" } */ + a1 = na; + a2 = a; + + vna1 = vna; + vna2 = va; /* { dg-warning "candidate" "assignment warning" } */ + va1 = vna; + va1 = va; +} diff --git a/gcc/testsuite/g++.dg/warn/miss-format-5.C b/gcc/testsuite/g++.dg/warn/miss-format-5.C new file mode 100644 index 000000000..cbc27b5e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/miss-format-5.C @@ -0,0 +1,49 @@ +/* Test warnings for missing format attributes on function pointers. */ +/* Origin: Kaveh Ghazi <ghazi@caip.rutgers.edu> */ +/* { dg-do compile } */ +/* { dg-options "-Wmissing-format-attribute" } */ +/* { dg-options "-Wmissing-format-attribute -Wno-abi" { target arm_eabi } } */ + +#include <stdarg.h> + +typedef void (*noattr_t) (const char *, ...); +typedef noattr_t __attribute__ ((__format__(__printf__, 1, 2))) attr_t; + +typedef void (*vnoattr_t) (const char *, va_list); +typedef vnoattr_t __attribute__ ((__format__(__printf__, 1, 0))) vattr_t; + +noattr_t +foo1 (noattr_t na, attr_t a, int i) +{ + if (i) + return na; + else + return a; /* { dg-warning "candidate" "return type warning" } */ +} + +attr_t +foo2 (noattr_t na, attr_t a, int i) +{ + if (i) + return na; + else + return a; +} + +vnoattr_t +foo3 (vnoattr_t vna, vattr_t va, int i) +{ + if (i) + return vna; + else + return va; /* { dg-warning "candidate" "return type warning" } */ +} + +vattr_t +foo4 (vnoattr_t vna, vattr_t va, int i) +{ + if (i) + return vna; + else + return va; +} diff --git a/gcc/testsuite/g++.dg/warn/miss-format-6.C b/gcc/testsuite/g++.dg/warn/miss-format-6.C new file mode 100644 index 000000000..f78dbdfa1 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/miss-format-6.C @@ -0,0 +1,32 @@ +/* Test warnings for missing format attributes on function pointers. */ +/* Origin: Kaveh Ghazi <ghazi@caip.rutgers.edu> */ +/* { dg-do compile } */ +/* { dg-options "-Wmissing-format-attribute" } */ +/* { dg-options "-Wmissing-format-attribute -Wno-abi" { target arm_eabi } } */ + +#include <stdarg.h> + +typedef void (*noattr_t) (const char *, ...); +typedef noattr_t __attribute__ ((__format__(__printf__, 1, 2))) attr_t; + +typedef void (*vnoattr_t) (const char *, va_list); +typedef vnoattr_t __attribute__ ((__format__(__printf__, 1, 0))) vattr_t; + +extern void foo1 (noattr_t); +extern void foo2 (attr_t); +extern void foo3 (vnoattr_t); +extern void foo4 (vattr_t); + +void +foo (noattr_t na, attr_t a, vnoattr_t vna, vattr_t va) +{ + foo1 (na); + foo1 (a); /* { dg-warning "candidate" "parameter passing warning" } */ + foo2 (na); + foo2 (a); + + foo3 (vna); + foo3 (va); /* { dg-warning "candidate" "parameter passing warning" } */ + foo4 (vna); + foo4 (va); +} diff --git a/gcc/testsuite/g++.dg/warn/missing-field-init-1.C b/gcc/testsuite/g++.dg/warn/missing-field-init-1.C new file mode 100644 index 000000000..f28418f0c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/missing-field-init-1.C @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-Wextra -Wno-missing-field-initializers" } */ + +struct s { int a, b, c; }; +struct s s1 = { 1, 2, 3 }; +struct s s2 = { 1, 2 }; /* { dg-bogus "missing initializer" } */ +struct s s3[] = { { 1, 2 }, { 4, 5 } }; /* { dg-bogus "missing initializer" } */ +struct s s4[] = { 1, 2, 3, 4, 5 }; /* { dg-bogus "missing initializer" } */ +struct s s5[] = { 1, 2, 3, 4, 5, 6 }; diff --git a/gcc/testsuite/g++.dg/warn/missing-field-init-2.C b/gcc/testsuite/g++.dg/warn/missing-field-init-2.C new file mode 100644 index 000000000..7f6ec060f --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/missing-field-init-2.C @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-Wmissing-field-initializers" } */ + +struct s { int a, b, c; }; +struct s s1 = { 1, 2, 3 }; +struct s s2 = { 1, 2 }; /* { dg-warning "(missing initializer)|(near initialization)" } */ +struct s s3[] = { { 1, 2 }, { 4, 5 } }; /* { dg-warning "(missing initializer)|(near initialization)" } */ +struct s s4[] = { 1, 2, 3, 4, 5 }; /* { dg-warning "(missing initializer)|(near initialization)" } */ +struct s s5[] = { 1, 2, 3, 4, 5, 6 }; diff --git a/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-1.C b/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-1.C new file mode 100644 index 000000000..489930211 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-1.C @@ -0,0 +1,13 @@ +/* PR c/19978 : Test for duplicated warnings (unary operators). */ +/* { dg-do compile } */ +/* { dg-options "-Woverflow" } */ + +#include <limits.h> + +int +g (void) +{ + return - - - - -INT_MIN; /* { dg-bogus "integer overflow in expression.*integer overflow in expression" } */ + /* { dg-warning "integer overflow in expression" "" { target *-*-* } 10 } */ +} + diff --git a/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-2.C b/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-2.C new file mode 100644 index 000000000..863016bfd --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-2.C @@ -0,0 +1,12 @@ +/* PR c/19978 : Test for duplicated warnings (binary operators). */ +/* { dg-do compile } */ +/* { dg-options "-Woverflow" } */ + +#include <limits.h> + +int +g1 (void) +{ + return INT_MAX + 1 - INT_MAX; /* { dg-bogus "integer overflow in expression.*integer overflow in expression" } */ + /* { dg-warning "integer overflow in expression" "" { target *-*-* } 10 } */ +} diff --git a/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-3.C b/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-3.C new file mode 100644 index 000000000..afb4e517f --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/multiple-overflow-warn-3.C @@ -0,0 +1,12 @@ +/* PR 30465 : Test for duplicated warnings in a conversion. */ +/* { dg-do compile } */ +/* { dg-options "-Woverflow" } */ + +short int +g (void) +{ + short int wc = ((short int)1 << 31) - 1; /* { dg-bogus "overflow .* overflow" } */ + /* { dg-warning "overflow" "" { target *-*-* } 8 } */ + return wc; +} + diff --git a/gcc/testsuite/g++.dg/warn/new1.C b/gcc/testsuite/g++.dg/warn/new1.C new file mode 100644 index 000000000..b50b2c354 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/new1.C @@ -0,0 +1,3 @@ +void f() { + new int[0]; // { dg-bogus "zero" } +} diff --git a/gcc/testsuite/g++.dg/warn/no-write-strings.C b/gcc/testsuite/g++.dg/warn/no-write-strings.C new file mode 100644 index 000000000..c5d48de37 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/no-write-strings.C @@ -0,0 +1,7 @@ +// { dg-do compile } +// { dg-options -Wno-write-strings } + +int main() +{ + char* p = "Asgaard"; +} diff --git a/gcc/testsuite/g++.dg/warn/noeffect2.C b/gcc/testsuite/g++.dg/warn/noeffect2.C new file mode 100644 index 000000000..451e0382a --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/noeffect2.C @@ -0,0 +1,20 @@ +// { dg-do compile } +// { dg-options "-Wall" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 18 Aug 2003 <nathan@codesourcery.com> +// Origin PR 11945 gerald@pfeifer.com + +// PR 11945 inconsistent warnings + +extern "C" void FormatDisk(); + template <class T> + struct C { + C(){ FormatDisk(), 0; } // { dg-warning "right operand of comma" "" } + }; + template struct C<int>; // { dg-message "instantiated" } + template <class T> + void f() { FormatDisk(), 0; } // { dg-warning "right operand of comma" "" } + template void f<int> (); // { dg-message "instantiated" } +void g() { FormatDisk(), 0; } // { dg-warning "right operand of comma" "" } + diff --git a/gcc/testsuite/g++.dg/warn/noeffect4.C b/gcc/testsuite/g++.dg/warn/noeffect4.C new file mode 100644 index 000000000..966716bbc --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/noeffect4.C @@ -0,0 +1,88 @@ +// { dg-do compile } +// { dg-options "-Wall" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 2 Sep 2003 <nathan@codesourcery.com> + +// PR 12037. + +struct X +{ + int operator+(int); + int operator-(int); + int operator*(int); + int operator/(int); + int operator%(int); + int operator>>(int); + int operator<<(int); + int operator&(int); + int operator|(int); + int operator^(int); + int operator&&(int); + int operator||(int); + int operator==(int); + int operator!=(int); + int operator<(int); + int operator<=(int); + int operator>(int); + int operator>=(int); + int operator*(); + int operator!(); + int operator~(); + int operator++(); + int operator--(); + int operator++(int); + int operator--(int); + int operator()(); + int operator,(int); + X *operator->(); + operator int () const; + int m; + virtual ~X (); + X &Foo (); +}; +struct Y : X +{ +}; + +template<int I> void Foo (X &x) +{ + x + I; + x - I; + x * I; + x / I; + x % I; + x >> I; + x << I; + x & I; + x | I; + x && I; + x || I; + x == I; + x != I; + x < I; + x <= I; + x > I; + x >= I; + *x; + !x; + ~x; + x++; + x--; + ++x; + --x; + x (); + x, I; + x->m; + static_cast<int> (x); + dynamic_cast<Y &> (x); + reinterpret_cast<int> (x.Foo ()); // { dg-error "invalid cast" } + const_cast<X &> (x.Foo ()); // { dg-warning "not used" } + + reinterpret_cast<int *> (&x);// { dg-warning "no effect" "" } + const_cast<X &> (x); // { dg-warning "no effect" "" } + sizeof (x++); // { dg-warning "no effect" "" } + __alignof__ (x++); // { dg-warning "no effect" "" } +} + +template void Foo<4> (X&); // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/warn/noeffect5.C b/gcc/testsuite/g++.dg/warn/noeffect5.C new file mode 100644 index 000000000..f0f4e7410 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/noeffect5.C @@ -0,0 +1,8 @@ +/* PR middle-end/13325 */ +/* { dg-do compile } */ +/* { dg-options "-Wall" } */ + +void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n); +void f (void *dest, const void *src) { + memcpy (dest, src, 0); +} diff --git a/gcc/testsuite/g++.dg/warn/noeffect6.C b/gcc/testsuite/g++.dg/warn/noeffect6.C new file mode 100644 index 000000000..ca6baba81 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/noeffect6.C @@ -0,0 +1,14 @@ +// { dg-options "-Wall" } +// PR c++/15083 + +extern "C" int printf(const char*,...); +struct Counter { + Counter(){printf("Hello World.\n");} +}; +template< typename T > +void resetData() { + new Counter(); +} +int main() { + resetData<int>(); +} diff --git a/gcc/testsuite/g++.dg/warn/noeffect7.C b/gcc/testsuite/g++.dg/warn/noeffect7.C new file mode 100644 index 000000000..4aca2496c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/noeffect7.C @@ -0,0 +1,8 @@ +// PR c++/8057 +// Don't give a "statement has no effect" warning when declaring a +// template, only when instantiating it. +// { dg-do compile } +// { dg-options "-Wunused" } +struct Y { static int i; }; +template <typename T> class X { X() { Y::i; }; }; +class Z { Z() { Y::i; }; }; // { dg-warning "no effect" } diff --git a/gcc/testsuite/g++.dg/warn/noeffect8.C b/gcc/testsuite/g++.dg/warn/noeffect8.C new file mode 100644 index 000000000..48edfdea6 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/noeffect8.C @@ -0,0 +1,15 @@ +// PR c++/26696, 28996 +// { dg-do compile } +// { dg-options "-Waddress" } + +struct A +{ + static void f() {} +}; + +int main() +{ + A a; + a.f; // { dg-warning "not call" } + A().f; // { dg-warning "not call" } +} diff --git a/gcc/testsuite/g++.dg/warn/nonnull1.C b/gcc/testsuite/g++.dg/warn/nonnull1.C new file mode 100644 index 000000000..46de7e931 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/nonnull1.C @@ -0,0 +1,16 @@ +// Test that "nonnull" attribute works for C++. +// Origin: Joseph Myers <jsm@polyomino.org.uk> +// { dg-do compile } +// { dg-options "-Wall" } + +// The "nonnull" attribute is thoroughly tested for C, so here we +// simply test that it works at all, as at one point the relevant +// checking code was only called for C. + +extern void f (char *) __attribute__((nonnull)); + +void +g () +{ + f (0); // { dg-warning "null" "null argument" } +} diff --git a/gcc/testsuite/g++.dg/warn/noreturn-1.C b/gcc/testsuite/g++.dg/warn/noreturn-1.C new file mode 100644 index 000000000..17375d42e --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/noreturn-1.C @@ -0,0 +1,71 @@ +// Test that noreturn attributes are properly set. +// Origin: Kaveh Ghazi <ghazi@caip.rutgers.edu> 2002-06-18. +// { dg-do compile } +// { dg-options "-Wall -O2" } + +#include <cstdlib> + +int foo1 (int i) +{ + switch (i) + { + case 1: + case 2: + return i; + } + abort(); +} + +int foo2 (int i) +{ + switch (i) + { + case 1: + case 2: + return i; + } + std::abort(); +} + +int foo3 (int i) +{ + switch (i) + { + case 1: + case 2: + return i; + } + exit(1); +} + +int foo4 (int i) +{ + switch (i) + { + case 1: + case 2: + return i; + } + std::exit(1); +} + +void __attribute__ ((__noreturn__)) foo5 () +{ + abort(); +} + +void __attribute__ ((__noreturn__)) foo6 () +{ + std::abort(); +} + +void __attribute__ ((__noreturn__)) foo7 () +{ + exit(1); +} + +void __attribute__ ((__noreturn__)) foo8 () +{ + std::exit(1); +} + diff --git a/gcc/testsuite/g++.dg/warn/noreturn-2.C b/gcc/testsuite/g++.dg/warn/noreturn-2.C new file mode 100644 index 000000000..3b18e1dbc --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/noreturn-2.C @@ -0,0 +1,4 @@ +// { dg-options "-Wall" } + +template <class T> +int f (T t) { } // { dg-warning "no return" } diff --git a/gcc/testsuite/g++.dg/warn/noreturn-3.C b/gcc/testsuite/g++.dg/warn/noreturn-3.C new file mode 100644 index 000000000..828935c12 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/noreturn-3.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options "-Wall" } + +// Origin: stip@mathematik.uni-ulm.de +// Andrew Pinski <pinskia@gcc.gnu.org> + +// PR c++/13106: No return warning when return type is a dependent type. + +template <typename T> T dummy() { } + +int main() { + dummy<void>(); +} diff --git a/gcc/testsuite/g++.dg/warn/noreturn-4.C b/gcc/testsuite/g++.dg/warn/noreturn-4.C new file mode 100644 index 000000000..7ef76cc5b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/noreturn-4.C @@ -0,0 +1,13 @@ +// PR c++/30988 +// { dg-do compile } +// { dg-options "-O2 -Wall" } + +void f (const char *) __attribute__ ((noreturn)); + +template <typename T> struct A +{ + int g () + { + f (__FUNCTION__); + } +}; diff --git a/gcc/testsuite/g++.dg/warn/noreturn-5.C b/gcc/testsuite/g++.dg/warn/noreturn-5.C new file mode 100644 index 000000000..77d4890df --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/noreturn-5.C @@ -0,0 +1,15 @@ +// PR c++/30988 +// { dg-do compile } +// { dg-options "-O2 -Wall" } + +void f (const char *) __attribute__ ((noreturn)); +void f (int) __attribute__ ((noreturn)); +void f (double) __attribute__ ((noreturn)); + +template <typename T> struct A +{ + int g () + { + f ((T) 0); + } +}; diff --git a/gcc/testsuite/g++.dg/warn/noreturn-6.C b/gcc/testsuite/g++.dg/warn/noreturn-6.C new file mode 100644 index 000000000..fdbc42516 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/noreturn-6.C @@ -0,0 +1,13 @@ +// PR c++/30988 +// { dg-do compile } +// { dg-options "-O2 -Wall" } + +void f (const char *); + +template <typename T> struct A +{ + int g () + { + f (__FUNCTION__); + } // { dg-warning "no return statement in function returning non-void" } +}; diff --git a/gcc/testsuite/g++.dg/warn/noreturn-7.C b/gcc/testsuite/g++.dg/warn/noreturn-7.C new file mode 100644 index 000000000..a869b7016 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/noreturn-7.C @@ -0,0 +1,15 @@ +// PR c++/30988 +// { dg-do compile } +// { dg-options "-O2 -Wall" } + +void f (const char *) __attribute__ ((noreturn)); +void f (int); +void f (double) __attribute__ ((noreturn)); + +template <typename T> struct A +{ + int g () + { + f ((T) 0); + } // { dg-warning "no return statement in function returning non-void" } +}; diff --git a/gcc/testsuite/g++.dg/warn/null4.C b/gcc/testsuite/g++.dg/warn/null4.C new file mode 100644 index 000000000..6aa4a097f --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/null4.C @@ -0,0 +1,55 @@ +// PR c++/24745 : warnings for NULL constant. +// { dg-do compile } +// { dg-options "-Wpointer-arith -Wconversion " } + +#include <cstddef> + +int foo (void) +{ + if (NULL == 1) return -1; // { dg-warning "NULL used in arithmetic" } + if (NULL > NULL) return -1; // { dg-warning "NULL used in arithmetic" } + if (NULL < NULL) return -1; // { dg-warning "NULL used in arithmetic" } + if (NULL >= 0) return -1; // { dg-warning "NULL used in arithmetic" } + if (NULL <= 0) return -1; // { dg-warning "NULL used in arithmetic" } + // Adding to the NULL pointer, which has no specific type, should + // result in a warning; the type of the resulting expression is + // actually "int", not a pointer type. + if (NULL + 1) return -1; // { dg-warning "NULL used in arithmetic" } + if (1 + NULL) return -1; // { dg-warning "NULL used in arithmetic" } + return 0; +} + +int *ip; + +struct S {}; +typedef int S::*SPD; +typedef void (S::*SPF)(void); +SPD spd; +SPF spf; + +int bar (void) +{ + if (NULL) return -1; + if (!NULL) return -1; + if (!NULL == 1) return -1; + if (NULL || NULL) return -1; + if (!NULL && NULL) return -1; + if (NULL == NULL) return -1; + if (NULL != NULL) return -1; + if (NULL == 0) return -1; + if (NULL != 0) return -1; + // Subtraction of pointers is vaild, so using NULL is OK. + if (ip - NULL) return -1; + if (NULL - NULL) return -1; + // Comparing NULL with a pointer-to-member is OK. + if (NULL == spd) return -1; + if (spd == NULL) return -1; + if (NULL != spd) return -1; + if (spd != NULL) return -1; + if (NULL == spf) return -1; + if (spf == NULL) return -1; + if (NULL != spf) return -1; + if (spf != NULL) return -1; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/oldcast1.C b/gcc/testsuite/g++.dg/warn/oldcast1.C new file mode 100644 index 000000000..26c0a5c4d --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/oldcast1.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// { dg-options "-ansi -pedantic-errors -Wold-style-cast" } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 Dec 2001 <nathan@codesourcery.com> + +// PR 5089. old style cast to void should be permitted (think assert) + +void foo () +{ + int i; + float f = (float)i; // { dg-warning "use of old-style cast" "" } + + (void)i; +} + diff --git a/gcc/testsuite/g++.dg/warn/overflow-warn-1.C b/gcc/testsuite/g++.dg/warn/overflow-warn-1.C new file mode 100644 index 000000000..22c512a4f --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/overflow-warn-1.C @@ -0,0 +1,128 @@ +/* Test for diagnostics for constant overflow. */ +/* Origin: Joseph Myers <joseph@codesourcery.com> */ +/* { dg-do compile } */ +/* { dg-options "-fpermissive" } */ + +#include <limits.h> + +enum e { + E0 = INT_MAX, + /* Unsigned overflow wraps around. */ + E1 = UINT_MAX + 1, + /* Overflow in an unevaluated part of an expression is OK (example + in the standard). */ + E2 = 2 || 1 / 0, /* { dg-bogus "warning: division by zero" "" { xfail *-*-* } 14 } */ + E3 = 1 / 0, /* { dg-warning "division by zero" } */ + /* { dg-error "enumerator value for 'E3' is not an integer constant|not a constant expression" "enum error" { target *-*-* } 15 } */ + /* But as in DR#031, the 1/0 in an evaluated subexpression means the + whole expression violates the constraints. */ + E4 = 0 * (1 / 0), /* { dg-warning "division by zero" } */ + /* { dg-error "enumerator value for 'E4' is not an integer constant" "enum error" { xfail *-*-* } 19 } */ + E5 = INT_MAX + 1, /* { dg-warning "integer overflow in expression" } */ + /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 21 } */ + /* Again, overflow in evaluated subexpression. */ + E6 = 0 * (INT_MAX + 1), /* { dg-warning "integer overflow in expression" } */ + /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 24 } */ + /* A cast does not constitute overflow in conversion. */ + E7 = (char) INT_MAX +}; + +struct s { + int a; + int : 0 * (1 / 0); /* { dg-warning "division by zero" } */ + int : 0 * (INT_MAX + 1); /* { dg-warning "integer overflow in expression" } */ + /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 33 } */ +}; + +void +f (void) +{ + /* This expression is not required to be a constant expression, so + it should just involve undefined behavior at runtime. */ + int c = INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */ +} + +/* This expression is neither required to be constant. */ +static int sc = INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */ + + +// Test for overflow in null pointer constant. +void *n = 0; +/* The first two of these involve overflow, so are not null pointer + constants. The third has the overflow in an unevaluated + subexpression, so is a null pointer constant. */ +void *p = 0 * (INT_MAX + 1); /* { dg-warning "integer overflow in expression" } */ +/* { dg-warning "invalid conversion from 'int' to 'void" "null" { target *-*-* } 54 } */ +void *q = 0 * (1 / 0); /* { dg-warning "division by zero" } */ +/* { dg-error "invalid conversion from 'int' to 'void*'" "null" { xfail *-*-* } 56 } */ +void *r = (1 ? 0 : INT_MAX+1); /* { dg-bogus "integer overflow in expression" "" { xfail *-*-* } } */ + +void +g (int i) +{ + switch (i) + { + case 0 * (1/0): /* { dg-warning "division by zero" } */ + ; + case 1 + 0 * (INT_MAX + 1): /* { dg-warning "integer overflow in expression" } */ + /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 67 } */ + ; + } +} + +int +h (void) +{ + return INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */ +} + +int +h1 (void) +{ + return INT_MAX + 1 - INT_MAX; /* { dg-warning "integer overflow in expression" } */ +} + +void fuc (unsigned char); +void fsc (signed char); + +void +h2 (void) +{ + fsc (SCHAR_MAX + 1); + fsc (SCHAR_MIN - 1); /* { dg-warning "overflow in implicit constant conversion" } */ + fsc (UCHAR_MAX); + fsc (UCHAR_MAX + 1); /* { dg-warning "overflow in implicit constant conversion" } */ + fuc (-1); + fuc (UCHAR_MAX + 1); /* { dg-warning "large integer implicitly truncated to unsigned type" } */ + fuc (SCHAR_MIN); + fuc (SCHAR_MIN - 1); /* { dg-warning "large integer implicitly truncated to unsigned type" } */ + fuc (-UCHAR_MAX); /* { dg-warning "large integer implicitly truncated to unsigned type" } */ +} + +void fui (unsigned int); +void fsi (signed int); + +int si; +unsigned ui; + +void +h2i (int x) +{ + /* For some reason, we only give certain warnings for implicit + conversions among values of the same precision with -Wconversion, + while we don't give others at all. */ + fsi ((unsigned)INT_MAX + 1); + si = (unsigned)INT_MAX + 1; + si = x ? (unsigned)INT_MAX + 1 : 1; + fsi ((unsigned)INT_MAX + 2); + si = (unsigned)INT_MAX + 2; + si = x ? (unsigned)INT_MAX + 2 : 1; + fsi (UINT_MAX); + si = UINT_MAX; + fui (-1); + ui = -1; + ui = x ? -1 : 1U; + fui (INT_MIN); + ui = INT_MIN; + ui = x ? INT_MIN : 1U; +} diff --git a/gcc/testsuite/g++.dg/warn/overflow-warn-3.C b/gcc/testsuite/g++.dg/warn/overflow-warn-3.C new file mode 100644 index 000000000..d88c87a53 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/overflow-warn-3.C @@ -0,0 +1,130 @@ +/* Test for diagnostics for constant overflow. Test with -pedantic. */ +/* Origin: Joseph Myers <joseph@codesourcery.com> */ +/* { dg-do compile } */ +/* { dg-options "-fpermissive -pedantic" } */ + +#include <limits.h> + +enum e { + E0 = INT_MAX, + /* Unsigned overflow wraps around. */ + E1 = UINT_MAX + 1, + /* Overflow in an unevaluated part of an expression is OK (example + in the standard). */ + E2 = 2 || 1 / 0, /* { dg-bogus "warning: division by zero" "" { xfail *-*-* } 14 } */ + E3 = 1 / 0, /* { dg-warning "division by zero" } */ + /* { dg-error "enumerator value for 'E3' is not an integer constant|not a constant expression" "enum error" { target *-*-* } 15 } */ + /* But as in DR#031, the 1/0 in an evaluated subexpression means the + whole expression violates the constraints. */ + E4 = 0 * (1 / 0), /* { dg-warning "division by zero" } */ + /* { dg-error "enumerator value for 'E4' is not an integer constant" "enum error" { xfail *-*-* } 19 } */ + E5 = INT_MAX + 1, /* { dg-warning "integer overflow in expression" } */ + /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 21 } */ + /* Again, overflow in evaluated subexpression. */ + E6 = 0 * (INT_MAX + 1), /* { dg-warning "integer overflow in expression" } */ + /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 24 } */ + /* A cast does not constitute overflow in conversion. */ + E7 = (char) INT_MAX +}; + +struct s { + int a; + int : 0 * (1 / 0); /* { dg-warning "division by zero" } */ + int : 0 * (INT_MAX + 1); /* { dg-warning "integer overflow in expression" } */ + /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 33 } */ +}; + +void +f (void) +{ + /* This expression is not required to be a constant expression, so + it should just involve undefined behavior at runtime. */ + int c = INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */ + +} + +/* This expression is neither required to be constant. */ +static int sc = INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */ + + +// Test for overflow in null pointer constant. +void *n = 0; +/* The first two of these involve overflow, so are not null pointer + constants. The third has the overflow in an unevaluated + subexpression, so is a null pointer constant. */ +void *p = 0 * (INT_MAX + 1); /* { dg-warning "integer overflow in expression" } */ +/* { dg-warning "invalid conversion from 'int' to 'void" "null" { target *-*-* } 55 } */ + +void *q = 0 * (1 / 0); /* { dg-warning "division by zero" } */ +/* { dg-warning "invalid conversion from 'int' to 'void*'" "null" { xfail *-*-* } 58 } */ +void *r = (1 ? 0 : INT_MAX+1); /* { dg-bogus "integer overflow in expression" "" { xfail *-*-* } } */ + +void +g (int i) +{ + switch (i) + { + case 0 * (1/0): /* { dg-warning "division by zero" } */ + ; + case 1 + 0 * (INT_MAX + 1): /* { dg-warning "integer overflow in expression" } */ + /* { dg-warning "overflow in constant expression" "constant" { target *-*-* } 69 } */ + ; + } +} + +int +h (void) +{ + return INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */ +} + +int +h1 (void) +{ + return INT_MAX + 1 - INT_MAX; /* { dg-warning "integer overflow in expression" } */ +} + +void fuc (unsigned char); +void fsc (signed char); + +void +h2 (void) +{ + fsc (SCHAR_MAX + 1); /* { dg-warning "overflow in implicit constant conversion" } */ + fsc (SCHAR_MIN - 1); /* { dg-warning "overflow in implicit constant conversion" } */ + fsc (UCHAR_MAX); /* { dg-warning "overflow in implicit constant conversion" } */ + fsc (UCHAR_MAX + 1); /* { dg-warning "overflow in implicit constant conversion" } */ + fuc (-1); + fuc (UCHAR_MAX + 1); /* { dg-warning "large integer implicitly truncated to unsigned type" } */ + fuc (SCHAR_MIN); + fuc (SCHAR_MIN - 1); /* { dg-warning "large integer implicitly truncated to unsigned type" } */ + fuc (-UCHAR_MAX); /* { dg-warning "large integer implicitly truncated to unsigned type" } */ +} + +void fui (unsigned int); +void fsi (signed int); + +int si; +unsigned ui; + +void +h2i (int x) +{ + /* For some reason, we only give certain warnings for implicit + conversions among values of the same precision with -Wconversion, + while we don't give others at all. */ + fsi ((unsigned)INT_MAX + 1); + si = (unsigned)INT_MAX + 1; + si = x ? (unsigned)INT_MAX + 1 : 1; + fsi ((unsigned)INT_MAX + 2); + si = (unsigned)INT_MAX + 2; + si = x ? (unsigned)INT_MAX + 2 : 1; + fsi (UINT_MAX); + si = UINT_MAX; + fui (-1); + ui = -1; + ui = x ? -1 : 1U; + fui (INT_MIN); + ui = INT_MIN; + ui = x ? INT_MIN : 1U; +} diff --git a/gcc/testsuite/g++.dg/warn/overflow-warn-4.C b/gcc/testsuite/g++.dg/warn/overflow-warn-4.C new file mode 100644 index 000000000..374d29428 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/overflow-warn-4.C @@ -0,0 +1,133 @@ +/* Test for diagnostics for constant overflow. Test with -pedantic-errors. */ +/* Origin: Joseph Myers <joseph@codesourcery.com> */ +/* { dg-do compile } */ +/* { dg-options "-pedantic-errors" } */ + +#include <limits.h> + +enum e { + E0 = INT_MAX, + /* Unsigned overflow wraps around. */ + E1 = UINT_MAX + 1, + /* Overflow in an unevaluated part of an expression is OK (example + in the standard). */ + E2 = 2 || 1 / 0, /* { dg-bogus "warning: division by zero" "" { xfail *-*-* } } */ + E3 = 1 / 0, /* { dg-warning "division by zero" } */ + /* { dg-error "enumerator value for 'E3' is not an integer constant|not a constant expression" "enum error" { target *-*-* } 15 } */ + /* But as in DR#031, the 1/0 in an evaluated subexpression means the + whole expression violates the constraints. */ + E4 = 0 * (1 / 0), /* { dg-warning "division by zero" } */ + /* { dg-error "enumerator value for 'E4' is not an integer constant" "enum error" { xfail *-*-* } 19 } */ + E5 = INT_MAX + 1, /* { dg-warning "integer overflow in expression" } */ + /* { dg-error "overflow in constant expression" "constant" { target *-*-* } 21 } */ + /* { dg-error "enumerator value for 'E5' is not an integer constant" "enum error" { target *-*-* } 21 } */ + /* Again, overflow in evaluated subexpression. */ + E6 = 0 * (INT_MAX + 1), /* { dg-warning "integer overflow in expression" } */ + /* { dg-error "overflow in constant expression" "constant" { target *-*-* } 25 } */ + /* { dg-error "enumerator value for 'E6' is not an integer constant" "enum error" { target *-*-* } 25 } */ + /* A cast does not constitute overflow in conversion. */ + E7 = (char) INT_MAX +}; + +struct s { + int a; + int : 0 * (1 / 0); /* { dg-warning "division by zero" } */ + int : 0 * (INT_MAX + 1); /* { dg-warning "integer overflow in expression" } */ + /* { dg-error "overflow in constant expression" "constant" { target *-*-* } 35 } */ + /* { dg-error "bit-field .* width not an integer constant" "" { target *-*-* } 35 } */ +}; + +void +f (void) +{ + /* This expression is not required to be a constant expression, so + it should just involve undefined behavior at runtime. */ + int c = INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */ + +} + +/* This expression is neither required to be constant. */ +static int sc = INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */ + + +// Test for overflow in null pointer constant. +void *n = 0; +/* The first two of these involve overflow, so are not null pointer + constants. The third has the overflow in an unevaluated + subexpression, so is a null pointer constant. */ +void *p = 0 * (INT_MAX + 1); /* { dg-warning "integer overflow in expression" } */ +/* { dg-error "invalid conversion from 'int' to 'void" "null" { target *-*-* } 58 } */ + +void *q = 0 * (1 / 0); /* { dg-warning "division by zero" } */ +/* { dg-error "invalid conversion from 'int' to 'void*'" "null" { xfail *-*-* } 61 } */ +void *r = (1 ? 0 : INT_MAX+1); /* { dg-bogus "integer overflow in expression" "" { xfail *-*-* } } */ + +void +g (int i) +{ + switch (i) + { + case 0 * (1/0): /* { dg-warning "division by zero" } */ + ; + case 1 + 0 * (INT_MAX + 1): /* { dg-warning "integer overflow in expression" } */ + /* { dg-error "overflow in constant expression" "constant" { target *-*-* } 72 } */ + ; + } +} + +int +h (void) +{ + return INT_MAX + 1; /* { dg-warning "integer overflow in expression" } */ +} + +int +h1 (void) +{ + return INT_MAX + 1 - INT_MAX; /* { dg-warning "integer overflow in expression" } */ +} + +void fuc (unsigned char); +void fsc (signed char); + +void +h2 (void) +{ + fsc (SCHAR_MAX + 1); /* { dg-warning "overflow in implicit constant conversion" } */ + fsc (SCHAR_MIN - 1); /* { dg-warning "overflow in implicit constant conversion" } */ + fsc (UCHAR_MAX); /* { dg-warning "overflow in implicit constant conversion" } */ + fsc (UCHAR_MAX + 1); /* { dg-warning "overflow in implicit constant conversion" } */ + fuc (-1); + fuc (UCHAR_MAX + 1); /* { dg-warning "large integer implicitly truncated to unsigned type" } */ + fuc (SCHAR_MIN); + fuc (SCHAR_MIN - 1); /* { dg-warning "large integer implicitly truncated to unsigned type" } */ + fuc (-UCHAR_MAX); /* { dg-warning "large integer implicitly truncated to unsigned type" } */ +} + +void fui (unsigned int); +void fsi (signed int); + +int si; +unsigned ui; + +void +h2i (int x) +{ + /* For some reason, we only give certain warnings for implicit + conversions among values of the same precision with -Wconversion, + while we don't give others at all. */ + fsi ((unsigned)INT_MAX + 1); + si = (unsigned)INT_MAX + 1; + si = x ? (unsigned)INT_MAX + 1 : 1; + fsi ((unsigned)INT_MAX + 2); + si = (unsigned)INT_MAX + 2; + si = x ? (unsigned)INT_MAX + 2 : 1; + fsi (UINT_MAX); + si = UINT_MAX; + fui (-1); + ui = -1; + ui = x ? -1 : 1U; + fui (INT_MIN); + ui = INT_MIN; + ui = x ? INT_MIN : 1U; +} diff --git a/gcc/testsuite/g++.dg/warn/overflow-warn-5.C b/gcc/testsuite/g++.dg/warn/overflow-warn-5.C new file mode 100644 index 000000000..bdfec4a6b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/overflow-warn-5.C @@ -0,0 +1,11 @@ +/* PR c/27273 */ +/* { dg-do compile } */ + +// This used to warn about "overflow in implicit constant conversion", +// which was wrong; 512 is never converted to unsigned char. Rather, an +// appropriate warning would be that the & expression always evaluates to 0 +// because of the limited range of unsigned char. + +unsigned char rx_async(unsigned char p) { + return p & 512; /* { dg-warning "" "" { xfail *-*-* } } */ +} diff --git a/gcc/testsuite/g++.dg/warn/overflow-warn-6.C b/gcc/testsuite/g++.dg/warn/overflow-warn-6.C new file mode 100644 index 000000000..6c7a28b3c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/overflow-warn-6.C @@ -0,0 +1,18 @@ +/* Test non-constant operands in overflowed expressions. */ +/* { dg-do compile } */ +/* { dg-options "-Woverflow" } */ + +#include <limits.h> + +int +h1 (int x) +{ + return x * (0 * (INT_MAX + 1)); /* { dg-warning "integer overflow in expression" } */ +} + +int +h2 (int x) +{ + return ((INT_MAX + 1) * 0) * x; /* { dg-warning "integer overflow in expression" } */ +} + diff --git a/gcc/testsuite/g++.dg/warn/pedantic1.C b/gcc/testsuite/g++.dg/warn/pedantic1.C new file mode 100644 index 000000000..2a4d05536 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pedantic1.C @@ -0,0 +1,11 @@ +// PR10032 +// { dg-options "-pedantic" } + +int main() { + goto label; // { dg-error "" } + + int temp = 1; // { dg-error "" } + + label: // { dg-error "" } + return 1; +} diff --git a/gcc/testsuite/g++.dg/warn/pedantic2.C b/gcc/testsuite/g++.dg/warn/pedantic2.C new file mode 100644 index 000000000..6c834162c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pedantic2.C @@ -0,0 +1,10 @@ +// { dg-options "-pedantic" } + +class foo +{ + foo() {}; + void bar() {}; + + foo(int) {};; // { dg-warning "extra" } + void bar(int) {};; // { dg-warning "extra" } +}; diff --git a/gcc/testsuite/g++.dg/warn/pmf1.C b/gcc/testsuite/g++.dg/warn/pmf1.C new file mode 100644 index 000000000..013c21b6d --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pmf1.C @@ -0,0 +1,18 @@ +// { dg-do compile } + +// Origin: benko@sztaki.hu + +// PR c++/10496: Incorrect pointer to member function diagnostics +// for constant member functions. + +struct a +{ + int f() const; +}; + + +int +a::f() const +{ + int (a::* b)() const = &f; // { dg-error "&a::f" } +} diff --git a/gcc/testsuite/g++.dg/warn/pointer-integer-comparison.C b/gcc/testsuite/g++.dg/warn/pointer-integer-comparison.C new file mode 100644 index 000000000..c6b75a7fc --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pointer-integer-comparison.C @@ -0,0 +1,26 @@ +// { dg-do compile } +// { dg-options "-fsyntax-only -fpermissive" } + +int foo (int i, void *p) +{ + if (i == p) // { dg-warning "ISO C.. forbids comparison between pointer and integer" } + return 0; + else if (i != p) // { dg-warning "ISO C.. forbids comparison between pointer and integer" } + return 1; +} + +int bar (int i, void *p) +{ + if (i < p) // { dg-warning "ISO C.. forbids comparison between pointer and integer" } + return 0; + else if (i >= p) // { dg-warning "ISO C.. forbids comparison between pointer and integer" } + return 1; +} + +int baz (int i, void *p) +{ + if (i <= p) // { dg-warning "ISO C.. forbids comparison between pointer and integer" } + return 0; + else if (i > p) // { dg-warning "ISO C.. forbids comparison between pointer and integer" } + return 1; +} diff --git a/gcc/testsuite/g++.dg/warn/pr11159.C b/gcc/testsuite/g++.dg/warn/pr11159.C new file mode 100644 index 000000000..ed4107a23 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr11159.C @@ -0,0 +1,37 @@ +// PR c++/11159 : erroneous warning in copy ctor with virtual inheritance +// { dg-do compile } +// { dg-options "-Wall -Wextra" } +struct A +{ + A (); +}; + +struct B : virtual A +{ + B (); +}; + +struct C : virtual A +{ + C (); +}; + +struct D : B, C +{ + D (D const&){} +}; + +template <typename Base> +struct E : Base +{ + E (); + + E (E const &) + : Base () + { + }; +}; + +E<C> foo; +E<C> bar (foo); + diff --git a/gcc/testsuite/g++.dg/warn/pr11492.C b/gcc/testsuite/g++.dg/warn/pr11492.C new file mode 100644 index 000000000..d23595f2d --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr11492.C @@ -0,0 +1,12 @@ +// PR11492 +// { dg-do compile } +// { dg-options "-Wsign-compare" } +int main( void ) +{ + unsigned int a; + unsigned char b; + for ( a = 0, b = 2; a > b * 1000; a++ ) /* { dg-bogus "comparison between signed and unsigned integer" } */ + { ; } + + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/pr12242.C b/gcc/testsuite/g++.dg/warn/pr12242.C new file mode 100644 index 000000000..e858c5405 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr12242.C @@ -0,0 +1,57 @@ +// PR 12242: should warn about out-of-range int->enum conversions +// { dg-do compile } +// { dg-options "-Wconversion -fpermissive" } +enum X { A }; +enum Y { B, C, D }; + +void example () +{ + int i = 5; + X x; + Y y; + + x = 10; // { dg-warning "invalid conversion from .int. to .X." } + // { dg-warning "unspecified" "" { target *-*-* } 13 } + x = 1; // { dg-warning "invalid conversion from .int. to .X." } + x = C; // { dg-error "cannot convert .Y. to .X. in assignment" } + x = D; // { dg-error "cannot convert .Y. to .X. in assignment" } + y = A; // { dg-error "cannot convert .X. to .Y. in assignment" } + x = y; // { dg-error "cannot convert .Y. to .X. in assignment" } + x = i; // { dg-warning "invalid conversion from .int. to .X." } +} + +void foo () +{ + X a = static_cast<X> (10); // { dg-warning "unspecified" } + X b = static_cast<X> (0); + X c = static_cast<X> (1); + X d = static_cast<X> (2); // { dg-warning "unspecified" } + X f = static_cast<X> ((int)A); + X g = static_cast<X> (B); + X h = static_cast<X> (C); + X e = static_cast<X> (D); // { dg-warning "unspecified" } +} + +enum QEvent { x = 42 }; + +int bar() +{ + QEvent x = ( QEvent ) 42000; // { dg-warning "unspecified" } + return ( int ) x; +} + +enum W {a,b,c}; +enum Z {d,e,f,g}; +void bazz (int, int, int, int); + +void baz() { + int three = 3; + int four = 4; + bazz ( + W(three), + W(3), + Z(four), + Z(4) // { dg-warning "unspecified" } + ); +} + diff --git a/gcc/testsuite/g++.dg/warn/pr13358-2.C b/gcc/testsuite/g++.dg/warn/pr13358-2.C new file mode 100644 index 000000000..9ab8bbc41 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr13358-2.C @@ -0,0 +1,24 @@ +// PR c++/13358: g++ should accept a long long constant sans LL suffix +// if -Wno-long-long is in use. +// { dg-do compile } +// { dg-require-effective-target int32plus } +// { dg-options "-std=c++98 -pedantic-errors" } + + +void use_longlong () +{ + unsigned long long x1, x2, x3; // { dg-error "ISO C\\+\\+ 1998 does not support 'long long'" } + // make sure we error with hex, decimal and octal + x1 = 0x1b27da572ef3cd86; // { dg-error "integer constant is too large for 'long' type" "long long" { target { llp64 || ilp32 } } } + x2 = 1956772631100509574; // { dg-error "integer constant is too large for 'long' type" "long long" { target { llp64 || ilp32 } } } + x3 = 0154476645345674746606; // { dg-error "integer constant is too large for 'long' type" "long long" { target { llp64 || ilp32 } } } +} + +void use_longlong2 () +{ + unsigned long long x1, x2, x3; // { dg-error "ISO C\\+\\+ 1998 does not support 'long long'" } + // make sure we error with hex, decimal and octal + x1 = 0x1b27da572ef3cd86LL; // { dg-error "long long" } + x2 = 1956772631100509574LL; // { dg-error "long long" } + x3 = 0154476645345674746606LL; // { dg-error "long long" } +} diff --git a/gcc/testsuite/g++.dg/warn/pr13358-3.C b/gcc/testsuite/g++.dg/warn/pr13358-3.C new file mode 100644 index 000000000..f23e7d97e --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr13358-3.C @@ -0,0 +1,24 @@ +// PR c++/13358: g++ should accept a long long constant sans LL suffix +// if -Wno-long-long is in use +// { dg-do compile } +// { dg-require-effective-target int32plus } +// { dg-options "-std=c++0x -pedantic-errors" } + + +void use_longlong () +{ + unsigned long long x1, x2, x3; + // make sure it's ok with hex, decimal and octal + x1 = 0x1b27da572ef3cd86; + x2 = 1956772631100509574; + x3 = 0154476645345674746606; +} + +void use_longlong2 () +{ + unsigned long long x1, x2, x3; + // make sure it's ok with hex, decimal and octal + x1 = 0x1b27da572ef3cd86LL; + x2 = 1956772631100509574LL; + x3 = 0154476645345674746606LL; +} diff --git a/gcc/testsuite/g++.dg/warn/pr13358-4.C b/gcc/testsuite/g++.dg/warn/pr13358-4.C new file mode 100644 index 000000000..b9a59ca62 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr13358-4.C @@ -0,0 +1,24 @@ +// PR c++/13358: g++ should accept a long long constant sans LL suffix +// if -Wno-long-long is in use. +// { dg-do compile } +// { dg-require-effective-target int32plus } +// { dg-options "-std=c++0x -pedantic-errors -Wlong-long" } + + +void use_longlong () +{ + unsigned long long x1, x2, x3; // { dg-warning "ISO C\\+\\+ 1998 does not support 'long long'" } + // make sure we warn with hex, decimal and octal + x1 = 0x1b27da572ef3cd86; // { dg-warning "integer constant is too large for 'long' type" "long long" { target { llp64 || ilp32 } } } + x2 = 1956772631100509574; // { dg-warning "integer constant is too large for 'long' type" "long long" { target { llp64 || ilp32 } } } + x3 = 0154476645345674746606; // { dg-warning "integer constant is too large for 'long' type" "long long" { target { llp64 || ilp32 } } } +} + +void use_longlong2 () +{ + unsigned long long x1, x2, x3; // { dg-warning "ISO C\\+\\+ 1998 does not support 'long long'" } + // make sure we warn with hex, decimal and octal + x1 = 0x1b27da572ef3cd86LL; // { dg-warning "long long" } + x2 = 1956772631100509574LL; // { dg-warning "long long" } + x3 = 0154476645345674746606LL; // { dg-warning "long long" } +} diff --git a/gcc/testsuite/g++.dg/warn/pr13358.C b/gcc/testsuite/g++.dg/warn/pr13358.C new file mode 100644 index 000000000..257616d2f --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr13358.C @@ -0,0 +1,24 @@ +// PR c++/13358: g++ should accept a long long constant sans LL suffix +// if -Wno-long-long is in use. +// { dg-do compile } +// { dg-require-effective-target int32plus } +// { dg-options "-std=c++98 -Wno-long-long -pedantic-errors" } + + +void use_longlong () +{ + unsigned long long x1, x2, x3; + // make sure it's ok with hex, decimal and octal + x1 = 0x1b27da572ef3cd86; + x2 = 1956772631100509574; + x3 = 0154476645345674746606; +} + +void use_longlong2 () +{ + unsigned long long x1, x2, x3; + // make sure it's ok with hex, decimal and octal + x1 = 0x1b27da572ef3cd86LL; + x2 = 1956772631100509574LL; + x3 = 0154476645345674746606LL; +} diff --git a/gcc/testsuite/g++.dg/warn/pr15774-1.C b/gcc/testsuite/g++.dg/warn/pr15774-1.C new file mode 100644 index 000000000..efd4daeb6 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr15774-1.C @@ -0,0 +1,15 @@ +// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ilp32 } } } +// Test that an new declartion with different attributes then old one fail. +extern void foo (int); // { dg-error "ambiguates old declaration" } + +void +bar (void) +{ + foo (1); +} + +void __attribute__((stdcall)) foo (int i) // { dg-error "new declaration" } +{ +} + + diff --git a/gcc/testsuite/g++.dg/warn/pr15774-2.C b/gcc/testsuite/g++.dg/warn/pr15774-2.C new file mode 100644 index 000000000..f890b7af7 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr15774-2.C @@ -0,0 +1,15 @@ +// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ilp32 } } } +// Test that old declaration is used, if new one has no attributes. +extern void __attribute__((stdcall)) foo (int); + +void +bar (void) +{ + foo (1); +} + +void foo (int i) +{ +} + + diff --git a/gcc/testsuite/g++.dg/warn/pr16302.C b/gcc/testsuite/g++.dg/warn/pr16302.C new file mode 100644 index 000000000..a6f1a4574 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr16302.C @@ -0,0 +1,76 @@ +// PR 16302 +/* { dg-do compile } */ +/* { dg-options "-Wlogical-op" } */ +void bar (int); +int +foo (int argc, char *argv[]) +{ + if (argc != 1 || argc != 2) return 1; /* { dg-warning "'or' of collectively exhaustive tests is always true" } */ + if (argc < 0 && argc > 10) return 1; /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + if (argc || !argc) return 1; /* { dg-warning "'or' of collectively exhaustive tests is always true" } */ + if (argc && !argc) return 1; /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + bar (argc != 1 || argc != 2); /* { dg-warning "'or' of collectively exhaustive tests is always true" } */ + bar (argc < 0 && argc > 10); /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + bar (argc || !argc); /* { dg-warning "'or' of collectively exhaustive tests is always true" } */ + bar (argc && !argc); /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + return (argc != 1 || argc != 2) ? 1 : 0 ; /* { dg-warning "'or' of collectively exhaustive tests is always true" } */ + return (argc < 0 && argc > 10) ? 1 : 0; /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + return (argc || !argc) ? 1 : 0; /* { dg-warning "'or' of collectively exhaustive tests is always true" } */ + return (argc && !argc) ? 1 : 0; /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + + if (argc == 2 && argc == 1) return 1; /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + if (argc < 0 && argc > 10) return 1; /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + if (argc || !argc) return 1; /* { dg-warning "'or' of collectively exhaustive tests is always true" } */ + if (argc && !argc) return 1; /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + bar (argc == 2 && argc == 1); /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + bar (argc < 0 && argc > 10); /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + bar (argc || !argc); /* { dg-warning "'or' of collectively exhaustive tests is always true" } */ + bar (argc && !argc); /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + return (argc == 2 && argc == 1) ? 1 : 0 ; /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + return (argc < 0 && argc > 10) ? 1 : 0; /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + return (argc || !argc) ? 1 : 0; /* { dg-warning "'or' of collectively exhaustive tests is always true" } */ + return (argc && !argc) ? 1 : 0; /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + + if (argc == 2 && argc == 1) return 1; /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + if (argc < 0 && argc > 10) return 1; /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + if (!argc || argc) return 1; /* { dg-warning "'or' of collectively exhaustive tests is always true" } */ + if (!argc && argc) return 1; /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + bar (argc == 2 && argc == 1); /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + bar (argc < 0 && argc > 10); /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + bar (!argc || argc); /* { dg-warning "'or' of collectively exhaustive tests is always true" } */ + bar (!argc && argc); /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + return (argc == 2 && argc == 1) ? 1 : 0 ; /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + return (argc < 0 && argc > 10) ? 1 : 0; /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + return (!argc || argc) ? 1 : 0; /* { dg-warning "'or' of collectively exhaustive tests is always true" } */ + return (!argc && argc) ? 1 : 0; /* { dg-warning "'and' of mutually exclusive tests is always false" } */ + + return 0; +} + +int +foo2 (int argc) +{ + if (5 != 1 || 5 != 2) return 1; + if (5 < 0 && 5 > 10) return 1; + if (1 || 0) return 1; + if (0 && 1) return 1; + if (2 || !2) return 1; + if (2 && !2) return 1; + if (!(!2) || !(2)) return 1; + if (!(!2) && !(2)) return 1; + bar (5 != 1 || 5 != 2); + bar (5 < 0 && 5 > 10); + bar (1 || 0); + bar (0 && 1); + bar (2 || !2); + bar (2 && !2); + return (5 != 1 || 5 != 2) ? 1 : 0 ; + return (5 < 0 && 5 > 10) ? 1 : 0; + return (1 || 0) ? 1 : 0 ; + return (0 && 1) ? 1 : 0; + return (2 || !2) ? 1 : 0; + return (2 && !2) ? 1 : 0; + + return 0; +} + diff --git a/gcc/testsuite/g++.dg/warn/pr21983.C b/gcc/testsuite/g++.dg/warn/pr21983.C new file mode 100644 index 000000000..0108169ea --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr21983.C @@ -0,0 +1,7 @@ +// PR c++/21983 +// { dg-do compile } + +struct B { virtual void foo () = 0; }; +struct D1 : public virtual B { virtual void foo () {} }; +struct D2 : public virtual B { virtual void foo () {} }; +struct D : public D1, public D2 { }; // { dg-error "no unique final overrider" } diff --git a/gcc/testsuite/g++.dg/warn/pr23075.C b/gcc/testsuite/g++.dg/warn/pr23075.C new file mode 100644 index 000000000..e5b1b483d --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr23075.C @@ -0,0 +1,9 @@ +// PR c/23075 +// { dg-do compile } +// { dg-options "-O2 -Wreturn-type" } + +int +foo (void) +{ + return; // { dg-error "with no value" } +} // { dg-warning "no return statement" } diff --git a/gcc/testsuite/g++.dg/warn/pr26785.C b/gcc/testsuite/g++.dg/warn/pr26785.C new file mode 100644 index 000000000..f3984d58e --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr26785.C @@ -0,0 +1,10 @@ +// PR 26785 +// { dg-do compile } +// { dg-options "-fshow-column" } + +class foo { + foo::foo // { dg-error "3:extra qualification" } + (int a, + int b, + int c); +}; diff --git a/gcc/testsuite/g++.dg/warn/pr28943.C b/gcc/testsuite/g++.dg/warn/pr28943.C new file mode 100644 index 000000000..046312c0e --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr28943.C @@ -0,0 +1,15 @@ +// PR c++/28943 void and non-void in conditional expression +// { dg-do compile } +// { dg-options "" } + +void debug (const char * string) +{ + return; +} + +int f() +{ + ( true == false ? 0 : debug ("Some string")); // { dg-error "third operand .* type 'void'.* second operand is neither a throw-expression nor of type 'void'" } + ( true == false ? debug ("Some string") : 0 ); // { dg-error "second operand .* type 'void'.* third operand is neither a throw-expression nor of type 'void'" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/pr30551-2.C b/gcc/testsuite/g++.dg/warn/pr30551-2.C new file mode 100644 index 000000000..8334746a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr30551-2.C @@ -0,0 +1,6 @@ +// PR 30551 -Wmain is enabled by -pedantic/-pedantic-errors. +// { dg-do compile } +// { dg-options "-pedantic-errors" } +// { dg-skip-if "-Wmain not enabled with -pedantic on SPU" { spu-*-* } } +int main(char a) {} /* { dg-error "first argument of .*main.* should be .int." } */ +/* { dg-error "main.* takes only zero or two arguments" "" { target *-*-* } 5 } */ diff --git a/gcc/testsuite/g++.dg/warn/pr30551.C b/gcc/testsuite/g++.dg/warn/pr30551.C new file mode 100644 index 000000000..6d7f662c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr30551.C @@ -0,0 +1,6 @@ +// PR 30551 -Wmain is enabled by default. +// { dg-do compile } +// { dg-options "" } +// { dg-skip-if "-Wmain not enabled on SPU" { spu-*-* } } +int main(char a) {} /* { dg-warning "first argument of .*main.* should be .int." } */ +/* { dg-warning "main.* takes only zero or two arguments" "" { target *-*-* } 5 } */ diff --git a/gcc/testsuite/g++.dg/warn/pr30636.C b/gcc/testsuite/g++.dg/warn/pr30636.C new file mode 100644 index 000000000..32ce6edbd --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr30636.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Warray-bounds" } */ + +typedef char one_buffer[512]; +static one_buffer emergency_buffer[4]; + +void free_exception (void *vptr) +{ + char *base = (char *) &emergency_buffer[0][0]; + char *ptr = (char *) vptr; + if (ptr >= base && ptr < base + sizeof (emergency_buffer)) /* { dg-bogus "subscript" } */ + { + /* Do something. */ + __builtin_exit (0); + } +} + diff --git a/gcc/testsuite/g++.dg/warn/pr31246-2.C b/gcc/testsuite/g++.dg/warn/pr31246-2.C new file mode 100644 index 000000000..c9a4cae7e --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr31246-2.C @@ -0,0 +1,9 @@ +// PR 31246 +// { dg-do compile } +// { dg-options "-Wunreachable-code" } +#include <new> + +int* get_ptr(void* ptr) +{ + return new(ptr) int(); +} diff --git a/gcc/testsuite/g++.dg/warn/pr31246.C b/gcc/testsuite/g++.dg/warn/pr31246.C new file mode 100644 index 000000000..a96dc96c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr31246.C @@ -0,0 +1,10 @@ +// PR 31246 +// { dg-do compile } +// { dg-options "-Wunreachable-code -D_GLIBCXX_DEBUG" } +// { dg-xfail-if "lack of weak symbols" { alpha*-dec-osf* } } +#include <vector> + +int main() +{ + std::vector<int>::iterator a; +} diff --git a/gcc/testsuite/g++.dg/warn/pr33160.C b/gcc/testsuite/g++.dg/warn/pr33160.C new file mode 100644 index 000000000..e463e2dfd --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr33160.C @@ -0,0 +1,12 @@ +// PR 33160 +// { dg-do compile } +// { dg-options "-Wall -Wextra -Wpointer-arith -pedantic -Wconversion" } + +typedef int __attribute__((mode(pointer))) intptr_t; +int foo(void) +{ + intptr_t t = 0; + if (t != ((intptr_t)__null)) t = 1; + return 0; +} + diff --git a/gcc/testsuite/g++.dg/warn/pr33738.C b/gcc/testsuite/g++.dg/warn/pr33738.C new file mode 100644 index 000000000..e84fece13 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr33738.C @@ -0,0 +1,26 @@ +// { dg-do run } +// { dg-options "-O2 -Wtype-limits -fstrict-enums" } +extern void link_error (void); + +enum Alpha { + ZERO = 0, ONE, TWO, THREE +}; + +Alpha a2; + +int m1 = -1; +int GetM1() { + return m1; +} + +int main() { + a2 = static_cast<Alpha>(GetM1()); + if (a2 == -1) { // { dg-warning "always false due" } + link_error (); + } + if (-1 == a2) { // { dg-warning "always false due" } + link_error (); + } + return 0; +} + diff --git a/gcc/testsuite/g++.dg/warn/pr34985.C b/gcc/testsuite/g++.dg/warn/pr34985.C new file mode 100644 index 000000000..56437509d --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr34985.C @@ -0,0 +1,9 @@ +/* PR34985: Warning "defined but not used" despite __attribute__((__used__)) */ +/* { dg-do compile } */ +/* { dg-options "-Wall -Wextra -O2" } */ +static void xxyyzz (void); +static void __attribute__((__used__)) xxyyzz(void) +{ +} + +/* { dg-final { scan-assembler "xxyyzz" } } */ diff --git a/gcc/testsuite/g++.dg/warn/pr35602.C b/gcc/testsuite/g++.dg/warn/pr35602.C new file mode 100644 index 000000000..66a569b3d --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr35602.C @@ -0,0 +1,28 @@ +// PR 35602 Bogus warning with -Wsign-conversion +// { dg-do compile } +// { dg-options "-Wconversion -Wsign-conversion" } +struct c +{ + ~c(); + c(); +}; + +int + +main(const int, + const char * const * const) +{ + c x[0UL][0UL] = // { dg-bogus "warning: conversion to .long unsigned int. from .long int. may change the sign of the result" } + { + }; + + c y[0UL] = + { + }; + + int z[0ul][0UL] = + { + }; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/pr35635.C b/gcc/testsuite/g++.dg/warn/pr35635.C new file mode 100644 index 000000000..66ade8b28 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr35635.C @@ -0,0 +1,89 @@ +/* PR 35635 */ +/* { dg-do compile } */ +/* { dg-options "-Wconversion -Wsign-conversion" } */ + +struct unsigned_bit { + unsigned int x:1; +} unsigned_bit; +struct signed_bit { + int x:1; +} signed_bit; +int bar; +int bar2; + +void func1() +{ + /* The result of boolean operators fits in unsiged int:1, thus do + not warn. */ + unsigned_bit.x = (bar != 0); /* { dg-bogus "conversion" } */ + unsigned_bit.x = (bar == 0); /* { dg-bogus "conversion" } */ + unsigned_bit.x = (bar <= 0); /* { dg-bogus "conversion" } */ + unsigned_bit.x = (bar >= 0); /* { dg-bogus "conversion" } */ + unsigned_bit.x = (bar < 0); /* { dg-bogus "conversion" } */ + unsigned_bit.x = (bar > 0); /* { dg-bogus "conversion" } */ + unsigned_bit.x = !bar; /* { dg-bogus "conversion" } */ + unsigned_bit.x = (bar || bar2); /* { dg-bogus "conversion" } */ + unsigned_bit.x = (bar && bar2); /* { dg-bogus "conversion" } */ + + /* Both branches of ? fit in the destination, thus do not warn. */ + unsigned_bit.x = bar != 0 ? 1 : 0; /* { dg-bogus "conversion" } */ + unsigned_bit.x = bar != 0 ? 1.0 : 0.0; /* { dg-bogus "conversion" } */ + + /* At least one branch of ? does not fit in the destination, thus + warn. */ + unsigned_bit.x = bar != 0 ? 2 : 0; /* { dg-warning "conversion" } */ + unsigned_bit.x = bar != 0 ? 0 : -1; /* { dg-warning "conver" } */ +} + +void func2() +{ + signed char schar_x; + + /* Both branches of ? fit in the destination, thus do not warn. */ + schar_x = bar != 0 ? 1 : 0; /* { dg-bogus "conversion" } */ + schar_x = bar != 0 ? 2.0 : 10; /* { dg-bogus "conversion" } */ + + /* At least one branch of ? does not fit in the destination, thus + warn. */ + schar_x = bar != 0 ? 2.1 : 10; /* { dg-warning "conversion" } */ + schar_x = bar != 0 ? (signed char) 1024: -1024; /* { dg-warning "conversion" } */ +} + + + +void func3() +{ + unsigned char uchar_x; + + /* Both branches of ? fit in the destination, thus do not warn. */ + uchar_x = bar != 0 ? 1 : 0; + uchar_x = bar != 0 ? 2.0 : 10; + + /* At least one branch of ? does not fit in the destination, thus + warn. */ + uchar_x = bar != 0 ? 2.1 : 10; /* { dg-warning "conversion" } */ + uchar_x = bar != 0 + ? (unsigned char) 1024 + : -1; /* { dg-warning "negative integer implicitly converted to unsigned type" } */ +} + +void func4() +{ + signed_bit.x = -1; /* { dg-bogus "conversion" } */ + signed_bit.x = bar != 0 ? -1.0 : 0.0; /* { dg-bogus "conversion" } */ + signed_bit.x = bar != 0 ? -1 : 0; /* { dg-bogus "conversion" } */ + + signed_bit.x = 1; /* { dg-warning "conversion" } */ + signed_bit.x = (bar != 0); /* { dg-warning "conversion" } */ + signed_bit.x = (bar == 0); /* { dg-warning "conversion" } */ + signed_bit.x = (bar <= 0); /* { dg-warning "conversion" } */ + signed_bit.x = (bar >= 0); /* { dg-warning "conversion" } */ + signed_bit.x = (bar < 0); /* { dg-warning "conversion" } */ + signed_bit.x = (bar > 0); /* { dg-warning "conversion" } */ + signed_bit.x = !bar; /* { dg-warning "conversion" } */ + signed_bit.x = (bar || bar2); /* { dg-warning "conversion" } */ + signed_bit.x = (bar && bar2); /* { dg-warning "conversion" } */ + signed_bit.x = bar != 0 ? 1 : 0; /* { dg-warning "conversion" } */ + signed_bit.x = bar != 0 ? 2 : 0; /* { dg-warning "conversion" } */ +} + diff --git a/gcc/testsuite/g++.dg/warn/pr35711.C b/gcc/testsuite/g++.dg/warn/pr35711.C new file mode 100644 index 000000000..653269c0e --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr35711.C @@ -0,0 +1,8 @@ +// PR 35711 +// { dg-do compile } +// { dg-options "-Wcast-qual" } + +int* foo (volatile int *p) +{ + return (int*)p; // { dg-warning "cast from type 'volatile int\\*' to type 'int\\*' casts away qualifiers" } +} diff --git a/gcc/testsuite/g++.dg/warn/pr36069.C b/gcc/testsuite/g++.dg/warn/pr36069.C new file mode 100644 index 000000000..efb35c257 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr36069.C @@ -0,0 +1,16 @@ +// PR c++/36069 Strange "warning: suggest parentheses around +// assignment used as truth value" with volatile/non volatile bools +// { dg-do compile } +// { dg-options "-Wparentheses" } +struct foo { + bool a; + volatile bool b,c; + foo() { a = b = c = false; } // { dg-bogus "parentheses" } +}; + +int main() { + bool a; + volatile bool b,c; + a = b = c = false; // { dg-bogus "parentheses" } + foo A; +} diff --git a/gcc/testsuite/g++.dg/warn/pr36921.C b/gcc/testsuite/g++.dg/warn/pr36921.C new file mode 100644 index 000000000..739366910 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr36921.C @@ -0,0 +1,27 @@ +/* PR 36921: comparison operator can be overloaded. Do not emit + warnings in such case. + { dg-do compile } + { dg-options "-Wparentheses" } +*/ +struct A {}; +A operator<(A, A) { return A(); } +A operator>(A, A) { return A(); } +A operator<=(A, A) { return A(); } +A operator>=(A, A) { return A(); } +A operator==(A, A) { return A(); } +A operator!=(A, A) { return A(); } + +int main() { + A() < A() < A(); // should not emit warning + 1 < 2 < 3; // { dg-warning "mathematical meaning" "parentheses" } + A() > A() > A(); // should not emit warning + 1 > 2 > 3; // { dg-warning "mathematical meaning" "parentheses" } + A() <= A() <= A(); // should not emit warning + 1 <= 2 <= 3; // { dg-warning "mathematical meaning" "parentheses" } + A() >= A() >= A(); // should not emit warning + 1 >= 2 >= 3; // { dg-warning "mathematical meaning" "parentheses" } + + A() == A() < A (); // { dg-warning "suggest parentheses" "parentheses" } + A() < A() != A (); // { dg-warning "suggest parentheses" "parentheses" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/pr36954.C b/gcc/testsuite/g++.dg/warn/pr36954.C new file mode 100644 index 000000000..92cea2f38 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr36954.C @@ -0,0 +1,23 @@ +// PR c++/36954 +// { dg-do compile } +// { dg-options "-Wlogical-op -Wextra -Wall" } + +template<class C> void Test() +{ + if ((1 == 2) || (true)) { + } + + if ((1 == 2) || (!false)) { + } + + if (false || true) { + } +} + + + +int main() { + if ((1 == 2) || (true)) { + } +} + diff --git a/gcc/testsuite/g++.dg/warn/pr36999.C b/gcc/testsuite/g++.dg/warn/pr36999.C new file mode 100644 index 000000000..ce2286efc --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr36999.C @@ -0,0 +1,40 @@ +/* PR36999: Erroneous "does not declare anything" warnings. */ +/* { dg-do compile } */ + +class C1 { + public: class C2 { }; +}; + +void cf1 (class C1::C2, void*); // { dg-bogus "does not declare anything" } +void cf2 (void*, class C1::C2); +void cf3 (C1::C2, void*); + +namespace N { + +enum E1 { foo }; +enum E2 { bar }; + +template <class X> +class TC1 { }; + +template <class T, class U> +class TC2 : public TC1<T> { }; + +} + +void +tcf1 (N::TC2<enum N::E1, void*> *arg1, // { dg-bogus "does not declare anything" } + N::TC2<void*, enum N::E1> *arg2, + N::TC2<N::E1, void*> *arg3) +{ +} + +void * +tcf2 (void *x) +{ + return (void *) + (N::TC2<enum N::E1, void*> *) // { dg-bogus "does not declare anything" } + (N::TC2<void*, enum N::E1> *) + (N::TC2<N::E1, void*> *) + x; +} diff --git a/gcc/testsuite/g++.dg/warn/pr5310.C b/gcc/testsuite/g++.dg/warn/pr5310.C new file mode 100644 index 000000000..48a60062f --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr5310.C @@ -0,0 +1,11 @@ +// PR 5310 +// { dg-do compile } +// { dg-options "-pedantic -Wall -Wextra -Wpointer-arith -Wconversion" } +void foo (int); +void foo (long); + +void bar() +{ + foo ((int)__null); + foo ((long)__null); +} diff --git a/gcc/testsuite/g++.dg/warn/pr5645.C b/gcc/testsuite/g++.dg/warn/pr5645.C new file mode 100644 index 000000000..5ca61bdba --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr5645.C @@ -0,0 +1,32 @@ +// PR5645: gcc warns that pure virtual class not explicitly initialized. +// { dg-do compile } +// { dg-options "-Wall -Wextra" } + +class a { +public: + virtual int f() = 0; + virtual int g() = 0; +}; + +class b : public a { +public: + b(); + b(const b& c); + +protected: + int i; +}; + +b::b() {} + +b::b(const b& c) { // { dg-bogus "base class .class a. should be explicitly initialized in the copy constructor" } + i = c.i; +} + +struct X {}; + +struct Y : X +{ + Y (Y const&) {} +}; + diff --git a/gcc/testsuite/g++.dg/warn/pr8570.C b/gcc/testsuite/g++.dg/warn/pr8570.C new file mode 100644 index 000000000..608f4d6b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr8570.C @@ -0,0 +1,13 @@ +// PR c++/8570 +// { dg-do compile } +// { dg-options "" } +template <typename T, typename P> +class X { // { dg-message "note: previous declaration .* used 2" } +public: + X() { } + +private: + template <typename U> friend class X; // { dg-error "redeclared with 1 template parameter" } +}; + +X<int, int> i; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/warn/pr8715.C b/gcc/testsuite/g++.dg/warn/pr8715.C new file mode 100644 index 000000000..330c148bb --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr8715.C @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-Wsign-compare" } */ + +int foo() +{ + unsigned char b = '1'; + + bool x = ~b; /* { dg-warning "promoted ~unsigned is always non-zero" } */ + + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/pragma-system_header1.C b/gcc/testsuite/g++.dg/warn/pragma-system_header1.C new file mode 100644 index 000000000..489761b5b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pragma-system_header1.C @@ -0,0 +1,10 @@ +// PR c++/30500 +// { dg-options "-Wconversion" } + +#include "pragma-system_header1.h" + +void f() +{ + g<int>(); + h<int>(); +} diff --git a/gcc/testsuite/g++.dg/warn/pragma-system_header1.h b/gcc/testsuite/g++.dg/warn/pragma-system_header1.h new file mode 100644 index 000000000..684c6bf12 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pragma-system_header1.h @@ -0,0 +1,7 @@ +#pragma GCC system_header + +template <typename T> + int g() { double d = 0.1; return d; } + +template <typename T> + T h() { double d = 0.1; return d; } diff --git a/gcc/testsuite/g++.dg/warn/pragma-system_header2.C b/gcc/testsuite/g++.dg/warn/pragma-system_header2.C new file mode 100644 index 000000000..a39bea721 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pragma-system_header2.C @@ -0,0 +1,17 @@ +// PR c++/30500 +// { dg-options "-Wconversion" } + +#include "pragma-system_header2.h" + + +void f() +{ + g<int>(); + h<int>(); +} + +// { dg-warning "conversion" "" { target *-*-* } 2 } +// { dg-warning "conversion" "" { target *-*-* } 5 } + +// I couldn't find another way to make this work. +// { dg-prune-output "In file included from" } diff --git a/gcc/testsuite/g++.dg/warn/pragma-system_header2.h b/gcc/testsuite/g++.dg/warn/pragma-system_header2.h new file mode 100644 index 000000000..aa4f0e94d --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pragma-system_header2.h @@ -0,0 +1,5 @@ +template <typename T> + int g() { double d = 0.1; return d; } + +template <typename T> + T h() { double d = 0.1; return d; } diff --git a/gcc/testsuite/g++.dg/warn/pragma-system_header3.C b/gcc/testsuite/g++.dg/warn/pragma-system_header3.C new file mode 100644 index 000000000..a9255c9c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pragma-system_header3.C @@ -0,0 +1,9 @@ +// PR c++/32368 +// { dg-options "-Wall -O" } + +#include "pragma-system_header3.h" + +int main() +{ + return f(); +} diff --git a/gcc/testsuite/g++.dg/warn/pragma-system_header3.h b/gcc/testsuite/g++.dg/warn/pragma-system_header3.h new file mode 100644 index 000000000..e16f38f8a --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pragma-system_header3.h @@ -0,0 +1,7 @@ +#pragma GCC system_header + +static inline int f() +{ + int i; + return i; +} diff --git a/gcc/testsuite/g++.dg/warn/pragma-system_header4.C b/gcc/testsuite/g++.dg/warn/pragma-system_header4.C new file mode 100644 index 000000000..898e10801 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pragma-system_header4.C @@ -0,0 +1,6 @@ +// PR c++/32256 +// { dg-options "-Wall" } + +#include "pragma-system_header4.h" + +void ok() { } diff --git a/gcc/testsuite/g++.dg/warn/pragma-system_header4.h b/gcc/testsuite/g++.dg/warn/pragma-system_header4.h new file mode 100644 index 000000000..c3abae0af --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pragma-system_header4.h @@ -0,0 +1,2 @@ +#pragma GCC system_header +int noreturn() { } diff --git a/gcc/testsuite/g++.dg/warn/pragma-system_header5.C b/gcc/testsuite/g++.dg/warn/pragma-system_header5.C new file mode 100644 index 000000000..771db3d7c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pragma-system_header5.C @@ -0,0 +1,10 @@ +// PR c++/36760 +// { dg-options "-Wextra" } + +#include "pragma-system_header5.h" + +void f() +{ + g<const double>(); + g<volatile void>(); +} diff --git a/gcc/testsuite/g++.dg/warn/pragma-system_header5.h b/gcc/testsuite/g++.dg/warn/pragma-system_header5.h new file mode 100644 index 000000000..5732e4afd --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pragma-system_header5.h @@ -0,0 +1,3 @@ +#pragma GCC system_header + +template <typename T> T g(); diff --git a/gcc/testsuite/g++.dg/warn/private1.C b/gcc/testsuite/g++.dg/warn/private1.C new file mode 100644 index 000000000..c42d6b7e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/private1.C @@ -0,0 +1,16 @@ +// g++ should not complain about A having private [cd]tors. + +class A +{ + A(); + ~A(); +public: + int dummy(); // needed to get bogus warning + static A* get_A (); +}; + +A* A::get_A() +{ + static A a; + return &a; +} diff --git a/gcc/testsuite/g++.dg/warn/register-var-1.C b/gcc/testsuite/g++.dg/warn/register-var-1.C new file mode 100644 index 000000000..6cbd23e2c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/register-var-1.C @@ -0,0 +1,14 @@ +/* PR/18160 */ + +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ + +/* This should yield an error even without -pedantic. */ +/* { dg-options "-ansi" } */ + +void g(int *); + +void f(void) +{ + register int x __asm ("eax"); + g(&x); /* { dg-error "address of explicit register variable" } */ +} diff --git a/gcc/testsuite/g++.dg/warn/register-var-2.C b/gcc/testsuite/g++.dg/warn/register-var-2.C new file mode 100644 index 000000000..28f5df0cf --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/register-var-2.C @@ -0,0 +1,14 @@ +/* PR/18160 */ + +/* { dg-do compile } */ + +/* This should yield an error even without -pedantic. */ +/* { dg-options "-Wall -W" } */ + +void g(int *); + +void f(void) +{ + register int x; + g(&x); /* { dg-warning "address requested for 'x', which is declared 'register'" } */ +} diff --git a/gcc/testsuite/g++.dg/warn/return-reference.C b/gcc/testsuite/g++.dg/warn/return-reference.C new file mode 100644 index 000000000..83021900d --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/return-reference.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +const int* bar(); + +const int& +foo1() +{ + static int empty; + const int* x = bar(); + return (x ? *x : empty); // { dg-bogus ".*" "" { xfail *-*-* } } +} + +const int& +foo2() +{ + static int empty; + const int* x = bar(); + const int& r = (x ? *x : empty); + return (r); +} + diff --git a/gcc/testsuite/g++.dg/warn/return-reference2.C b/gcc/testsuite/g++.dg/warn/return-reference2.C new file mode 100644 index 000000000..190266215 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/return-reference2.C @@ -0,0 +1,21 @@ +// PR c++/26671 + +class A +{ +public: + int first; + int second; + +}; + +int &f() +{ + A a; // { dg-warning "local" } + return a.second; +} + +int &g() +{ + int ar[42]; // { dg-warning "local" } + return ar[20]; +} diff --git a/gcc/testsuite/g++.dg/warn/sentinel.C b/gcc/testsuite/g++.dg/warn/sentinel.C new file mode 100644 index 000000000..5f718f830 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/sentinel.C @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-Wall" } */ +extern void ex (int i, ...) __attribute__ ((__sentinel__(0))); + +void f() +{ + ex (1, 0); /* { dg-warning "missing sentinel in function call" "" } */ + ex (1, 0L); /* { dg-warning "missing sentinel in function call" "" } */ + ex (1, (void *)0); + ex (1, __null); /* { dg-bogus "sentinel" } */ +} diff --git a/gcc/testsuite/g++.dg/warn/sequence-pt-1.C b/gcc/testsuite/g++.dg/warn/sequence-pt-1.C new file mode 100644 index 000000000..05eee82c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/sequence-pt-1.C @@ -0,0 +1,109 @@ +/* Test for sequence point warnings. */ +/* Origin: Michael Meeks in + <URL:http://gcc.gnu.org/ml/gcc-patches/1998-06/msg00316.html>, + adapted to a testcase by Joseph Myers <jsm28@cam.ac.uk>. */ +/* { dg-do compile } */ +/* { dg-options "-Wsequence-point" } */ + +struct s +{ + int a; +}; + +extern int fn (int); +extern int fnb (int, int); +extern int fnc (int *); +extern int sprintf (char *, const char *, ...); + +typedef __SIZE_TYPE__ size_t; + +void +foo (int a, int b, int n, int p, int *ptr, struct s *sptr, + int *ap, int *bp, int **cp, char *ans, int (*fnp[8])(int)) +{ + int len; + + a = a++; /* { dg-warning "undefined" "sequence point warning" } */ + a = --a; /* { dg-warning "undefined" "sequence point warning" } */ + a = ++a + b; /* { dg-warning "undefined" "sequence point warning" } */ + a = a-- + b; /* { dg-warning "undefined" "sequence point warning" } */ + ap[n] = bp[n++]; /* { dg-warning "undefined" "sequence point warning" } */ + ap[--n] = bp[n]; /* { dg-warning "undefined" "sequence point warning" } */ + ap[++n] = bp[--n]; /* { dg-warning "undefined" "sequence point warning" } */ + cp[n][n] = cp[n][n]++; /* { dg-warning "undefined" "sequence point warning" } */ + cp[n][p] = cp[n][n++]; /* { dg-warning "undefined" "sequence point warning" } */ + *ptr++ = (size_t)ptr++; /* { dg-warning "undefined" "sequence point warning" } */ + sptr->a = sptr->a++; /* { dg-warning "undefined" "sequence point warning" } */ + sptr->a = (size_t)(sptr++); /* { dg-warning "undefined" "sequence point warning" } */ + *ptr++ = fn (*ptr); /* { dg-warning "undefined" "sequence point warning" } */ + a = b = a++; /* { dg-warning "undefined" "sequence point warning" } */ + b = a = --b; /* { dg-warning "undefined" "sequence point warning" } */ + a = 1 + (a = 1); /* { dg-warning "undefined" "sequence point warning" } */ + a = (a = b); /* { dg-warning "undefined" "sequence point warning" } */ + a = (a = b) + 1; /* { dg-warning "undefined" "sequence point warning" } */ + a = (bp[a++] = b) + 1; /* { dg-warning "undefined" "sequence point warning" } */ + a = b++ * b++; /* { dg-warning "undefined" "sequence point warning" } */ + a = fnb (b++, b++); /* { dg-warning "undefined" "sequence point warning" } */ + a = (*fnp[b++]) (b++); /* { dg-warning "undefined" "sequence point warning" } */ + a = (*fnp[b]) (b++); /* { dg-warning "undefined" "sequence point warning" } */ + a = (*fnp[b++]) (b); /* { dg-warning "undefined" "sequence point warning" } */ + *ap = fnc (ap++); /* { dg-warning "undefined" "sequence point warning" } */ + (a += b) + (a += n); /* { dg-warning "undefined" "sequence point warning" } */ + a = (b, b++) + (b++, b); /* { dg-warning "undefined" "sequence point warning" } */ + ap[a++] += a; /* { dg-warning "undefined" "sequence point warning" } */ + ap[a+=1] += a; /* { dg-warning "undefined" "sequence point warning" } */ + ap[a++] += a++; /* { dg-warning "undefined" "sequence point warning" } */ + ap[a+=1] += a++; /* { dg-warning "undefined" "sequence point warning" } */ + a = a++, b = a; /* { dg-warning "undefined" "sequence point warning" } */ + b = a, a = a++; /* { dg-warning "undefined" "sequence point warning" } */ + a = (b++ ? n : a) + b; /* { dg-warning "undefined" "sequence point warning" } */ + b ? a = a++ : a; /* { dg-warning "undefined" "sequence point warning" } */ + b && (a = a++); /* { dg-warning "undefined" "sequence point warning" } */ + (a = a++) && b; /* { dg-warning "undefined" "sequence point warning" } */ + b, (a = a++); /* { dg-warning "undefined" "sequence point warning" } */ + (a = a++), b; /* { dg-warning "undefined" "sequence point warning" } */ + a ^= b ^= a ^= b; /* { dg-warning "undefined" "sequence point warning" } */ + + a = a; /* { dg-bogus "undefined" "bogus sequence point warning" } */ + a = (a++ && 4); /* { dg-bogus "undefined" "bogus sequence point warning" } */ + a = ! (a++ && 4); /* { dg-bogus "undefined" "bogus sequence point warning" } */ + a = - (a++ && 4); /* { dg-bogus "undefined" "bogus sequence point warning" } */ + a = (double) (a++ && 4); /* { dg-bogus "undefined" "bogus sequence point warning" } */ + len = sprintf (ans, "%d", len++); /* { dg-bogus "undefined" "bogus sequence point warning" } */ + a = fn (a++); /* { dg-bogus "undefined" "bogus sequence point warning" } */ + b++, (b + b); /* { dg-bogus "undefined" "bogus sequence point warning" } */ + (a = b++), (a = b++); /* { dg-bogus "undefined" "bogus sequence point warning" } */ + a = (b++, b++); /* { dg-bogus "undefined" "bogus sequence point warning" } */ + a = b++ && b++; /* { dg-bogus "undefined" "bogus sequence point warning" } */ + a = b++ || b++; /* { dg-bogus "undefined" "bogus sequence point warning" } */ + a = (b++ ? b++ : a); /* { dg-bogus "undefined" "bogus sequence point warning" } */ + a = (b++ ? a : b++); /* { dg-bogus "undefined" "bogus sequence point warning" } */ + ap[a++] += bp[b]; /* { dg-bogus "undefined" "bogus sequence point warning" } */ + ap[a += 1] += 1; /* { dg-bogus "undefined" "bogus sequence point warning" } */ + *ptr < 128 ? *ptr++ : *(ptr += 2); /* { dg-bogus "undefined" "bogus sequence point warning" } */ + + /* The following will be represented internally with a tree consisting of + many duplicated SAVE_EXPRs. This caused the previous version of the + sequence point warning code to fail by running out of virtual memory. */ + a = ((b & 1 ? 21 : 0) + | (b & 2 ? 22 : 0) + | (b & 3 ? 23 : 0) + | (b & 4 ? 24 : 0) + | (b & 5 ? 25 : 0) + | (b & 6 ? 26 : 0) + | (b & 7 ? 27 : 0) + | (b & 8 ? 28 : 0) + | (b & 9 ? 29 : 0) + | (b & 10 ? 30 : 0) + | (b & 11 ? 31 : 0) + | (b & 12 ? 32 : 0) + | (b & 13 ? 1 : 0) + | (b & 14 ? 2 : 0) + | (b & 15 ? 3 : 0) + | (b & 16 ? 4 : 0) + | (b & 17 ? 5 : 0) + | (b & 18 ? 6 : 0) + | (b & 19 ? 7 : 0) + | (b & 20 ? 8 : 0) + | (b & 21 ? 9 : 0)); +} diff --git a/gcc/testsuite/g++.dg/warn/sequence-pt-2.C b/gcc/testsuite/g++.dg/warn/sequence-pt-2.C new file mode 100644 index 000000000..9a4b618ea --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/sequence-pt-2.C @@ -0,0 +1,46 @@ +/* More sequence point warning tests */ +/* { dg-do compile } */ +/* { dg-options "-Wsequence-point" } */ + +struct s { struct s *nxt; int v; } q; + +int x[10]; + +int foo(int *p) +{ + int i = 0; + + /* Test general-lvalue sequence point warnings */ + (*p) = (*p)++; /* { dg-warning "undefined" "sequence point warning" } */ + p[3] = p[3]++; /* { dg-warning "undefined" "sequence point warning" } */ + p[i] = p[i]++; /* { dg-warning "undefined" "sequence point warning" } */ + x[3] = x[3]++; /* { dg-warning "undefined" "sequence point warning" } */ + q.nxt->nxt->v = q.nxt->nxt->v++; /* { dg-warning "undefined" "sequence point warning" } */ + + /* test expressions that appear elsewhere in the C grammar */ + + { int a = i-i++; (void)a;} /* { dg-warning "undefined" "sequence point warning" } */ + + if ((i-i++) != 0) /* { dg-warning "undefined" "sequence point warning" } */ + return i-i++; /* { dg-warning "undefined" "sequence point warning" } */ + + for (i-i++;;) /* { dg-warning "undefined" "sequence point warning" } */ + ; + + for (; (i-i++) != 0; ) /* { dg-warning "undefined" "sequence point warning" } */ + ; + + for (;;i-i++) /* { dg-warning "undefined" "sequence point warning" } */ + ; + + while ((i-i++) != 0) /* { dg-warning "undefined" "sequence point warning" } */ + ; + + do {} while ((i-i++) != 0); /* { dg-warning "undefined" "sequence point warning" } */ + + switch (i-i++) { /* { dg-warning "undefined" "sequence point warning" } */ + case 0: return 1; + } + + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/sequence-pt-3.C b/gcc/testsuite/g++.dg/warn/sequence-pt-3.C new file mode 100644 index 000000000..58971ca18 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/sequence-pt-3.C @@ -0,0 +1,15 @@ +/* More sequence point warning tests */ +/* { dg-do compile } */ +/* { dg-options "-Wsequence-point" } */ + +void bar(int i, int j) +{ + return; +} + +void foo (int i) +{ + int a = i-i++; (void)a; /* { dg-warning "undefined" "sequence point warning" } */ + + bar (i--, i++); /* { dg-warning "undefined" "sequence point warning" } */ +} diff --git a/gcc/testsuite/g++.dg/warn/sequence-pt-pr17880.C b/gcc/testsuite/g++.dg/warn/sequence-pt-pr17880.C new file mode 100644 index 000000000..01d87be8b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/sequence-pt-pr17880.C @@ -0,0 +1,54 @@ +// PR 17880 +// { dg-do compile } +// { dg-options "-Wsequence-point" } + +int +foo (int x) +{ + unsigned int a; + int b; + + b = (a += 5) > a; // { dg-warning "undefined" "sequence point warning" } + b = (a += 5) + a == 10; // { dg-warning "undefined" "sequence point warning" } + b = (a -= 5) > a; // { dg-warning "undefined" "sequence point warning" } + b = (a -= 5) + a == 10; // { dg-warning "undefined" "sequence point warning" } + b = a-- > a; // { dg-warning "undefined" "sequence point warning" } + b = a-- + a == 10; // { dg-warning "undefined" "sequence point warning" } + b = ++a > a; // { dg-warning "undefined" "sequence point warning" } + b = ++a + a == 10; // { dg-warning "undefined" "sequence point warning" } + + if ((a += 5) > a) return -1; // { dg-warning "undefined" "sequence point warning" } + if ((a += 5) + a == 10) return -1; // { dg-warning "undefined" "sequence point warning" } + if ((a -= 5) > a) return -1; // { dg-warning "undefined" "sequence point warning" } + if ((a -= 5) + a == 10) return -1; // { dg-warning "undefined" "sequence point warning" } + if (a-- > a) return -1; // { dg-warning "undefined" "sequence point warning" } + if (a-- + a == 10) return -1; // { dg-warning "undefined" "sequence point warning" } + if (++a > a) return -1; // { dg-warning "undefined" "sequence point warning" } + if (++a + a == 10) return -1; // { dg-warning "undefined" "sequence point warning" } + do {} while ((a += 5) > a); // { dg-warning "undefined" "sequence point warning" } + while ((a += 5) > a); // { dg-warning "undefined" "sequence point warning" } + for ((a += 5) > a;;); // { dg-warning "undefined" "sequence point warning" } + for (b = (a += 5) > a;;); // { dg-warning "undefined" "sequence point warning" } + for (; (a += 5) > a;); // { dg-warning "undefined" "sequence point warning" } + for (;; b = (a += 5) > a); // { dg-warning "undefined" "sequence point warning" } + for (;; a++ + a++); // { dg-warning "undefined" "sequence point warning" } + if (a) a++ - a--; // { dg-warning "undefined" "sequence point warning" } + ((a +=5) > a) ? a : b; // { dg-warning "undefined" "sequence point warning" } + return (a++ - a--); // { dg-warning "undefined" "sequence point warning" } +} + +void bar (int i) +{ + int a = i++ - i++; // { dg-warning "undefined" "sequence point warning" } +} + +void baz (int i) +{ + switch (i++ + i++) // { dg-warning "undefined" "sequence point warning" } + { + case 1: + i++ - i++; // { dg-warning "undefined" "sequence point warning" } + case 2: + break; + } +} diff --git a/gcc/testsuite/g++.dg/warn/skip-1.C b/gcc/testsuite/g++.dg/warn/skip-1.C new file mode 100644 index 000000000..027c405d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/skip-1.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-Wall" } + +// Check that we don't warn about code that will not be executed. +extern int f2(int); +void +f1(int i) +{ + f2(1 == 1 ? 0 : f2(i >> -10)); + f2(1 == 1 ? 0 : f2(i >> 128)); + f2(1 == 1 ? 0 : f2(i << -10)); + f2(1 == 1 ? 0 : f2(1 << 128)); + f2(1 != 1 ? f2(i >> -10) : 0); + f2(1 != 1 ? f2(i >> 128) : 0); + f2(1 != 1 ? f2(i << -10) : 0); + f2(1 != 1 ? f2(1 << 128) : 0); +} diff --git a/gcc/testsuite/g++.dg/warn/skip-2.C b/gcc/testsuite/g++.dg/warn/skip-2.C new file mode 100644 index 000000000..28f9049a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/skip-2.C @@ -0,0 +1,37 @@ +// { dg-do compile } +// { dg-options "-Wall" } + +extern int f2(int); +extern void f3(); +void +f1(int i) +{ + if (1 == 1 || f2(i >> -10)) + f3(); + if (1 == 1 || f2(i >> 128)) + f3(); + if (1 == 1 || f2(i << -10)) + f3(); + if (1 == 1 || f2(i << 128)) + f3(); + if (1 == 1 || i < 0xffffffff) + f3(); + if (1 == 1 || i >= -0x80000000) + f3(); + if (1 == 0 && f2(i >> -10)) + f3(); + if (1 == 0 && f2(i >> 128)) + f3(); + if (1 == 0 && f2(i << -10)) + f3(); + if (1 == 0 && f2(i << 128)) + f3(); + if (1 == 0 && i < 0xffffffff) + f3(); + if (1 == 0 && i >= -0x80000000) + f3(); + if (1 == 1 && f2(i >> -10)) /* { dg-warning "shift count is negative" } */ + f3(); + if (1 == 0 || f2(i << -10)) /* { dg-warning "shift count is negative" } */ + f3(); +} diff --git a/gcc/testsuite/g++.dg/warn/string1.C b/gcc/testsuite/g++.dg/warn/string1.C new file mode 100644 index 000000000..2670f63d9 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/string1.C @@ -0,0 +1,18 @@ +// PR c++/35652 +// { dg-options "-O" } + +#include <string> +int test() { + // blank line padding, could also be code... + // + // + // + // + // + // + // + // + // + std::string s = ""; + s += 'x' + "y"; // { dg-warning "bounds of constant string" } +} diff --git a/gcc/testsuite/g++.dg/warn/switch1.C b/gcc/testsuite/g++.dg/warn/switch1.C new file mode 100644 index 000000000..49c17e912 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/switch1.C @@ -0,0 +1,15 @@ +// { dg-do compile { target { int32plus } } } + +signed char sc; + +void +foo (void) +{ + switch (sc) + { + case 1: + case 2 * __SCHAR_MAX__ + 3: // { dg-warning "case label value exceeds maximum" } + case - 2 * __SCHAR_MAX__ - 1: // { dg-warning "case label value is less than minimum" } + break; + } +} diff --git a/gcc/testsuite/g++.dg/warn/template-1.C b/gcc/testsuite/g++.dg/warn/template-1.C new file mode 100644 index 000000000..04ea5ae32 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/template-1.C @@ -0,0 +1,15 @@ +//Origin: bangerth@dealii.org +//PR c++/11490 +//Since N is know at instantiation time, there +// should be no warning about comparision between +// unsinged and signed interegers. + +// { dg-do compile } +// { dg-options "-W" } + +template <int N> bool f() { + unsigned int i=0; + return i!=N; // { dg-bogus "signed and unsigned" } +} + +template bool f<2> (); diff --git a/gcc/testsuite/g++.dg/warn/translate-ice-1.C b/gcc/testsuite/g++.dg/warn/translate-ice-1.C new file mode 100644 index 000000000..22e103c29 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/translate-ice-1.C @@ -0,0 +1,45 @@ +// Test ICE in caching printable names for a function. +// { dg-options "-std=c++98 -pedantic -O2" } + +void g (int a) __attribute__((warning("g"))); +void g2 (int a, int *p); +static inline __attribute__((__always_inline__)) void +gg (int a) +{ + if (a == 0) + return g(a); // { dg-warning "attribute" } + __extension__ int v[a]; + return g2(a, v); +} + +void h (int a) __attribute__((warning("h"))); +void h2 (int a, int *p); +static inline __attribute__((__always_inline__)) void +hh (int a) +{ + if (a == 0) + return h(a); // { dg-warning "attribute" } + __extension__ int v[a]; + return h2(a, v); +} + +void i (int a) __attribute__((warning("i"))); +void i2 (int a, int *p); +static inline __attribute__((__always_inline__)) void +ii (int a) +{ + if (a == 0) + return i(a); // { dg-warning "attribute" } + __extension__ int v[a]; + return i2(a, v); +} + +void +f (void) +{ + long long l; // { dg-warning "long long" } + const char *p = __PRETTY_FUNCTION__; + gg(0); + hh(0); + ii(0); +} diff --git a/gcc/testsuite/g++.dg/warn/undefined1.C b/gcc/testsuite/g++.dg/warn/undefined1.C new file mode 100644 index 000000000..87fa3ec5a --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/undefined1.C @@ -0,0 +1,7 @@ +// PR 17256 + +inline static void f1(void); // { dg-warning "used but never" } +void g1(void) { if (0) { f1(); } } + +inline void f2(void); // { dg-warning "used but never" } +void g2(void) { if (0) { f2(); } } diff --git a/gcc/testsuite/g++.dg/warn/unit-1.C b/gcc/testsuite/g++.dg/warn/unit-1.C new file mode 100644 index 000000000..49bc23136 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/unit-1.C @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -Wuninitialized" } */ + +struct a { int mode; }; +int sys_msgctl (void) +{ + struct a setbuf; /* { dg-warning "'setbuf.mode' is used" "" { xfail *-*-* } } */ + return setbuf.mode; +} + diff --git a/gcc/testsuite/g++.dg/warn/unused-result1-Werror.c b/gcc/testsuite/g++.dg/warn/unused-result1-Werror.c new file mode 100644 index 000000000..fc14469c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/unused-result1-Werror.c @@ -0,0 +1,11 @@ +// PR 40614 +// { dg-options "-Werror=unused-result" } +/* { dg-message "some warnings being treated as errors" "" {target "*-*-*"} 0 } */ +class QByteArray { +public: + QByteArray(const QByteArray &); +}; +class QString { + QByteArray toLocal8Bit() const __attribute__ ((warn_unused_result)); + void fooWarnHere() const { toLocal8Bit(); } // { dg-error "ignoring" } +}; diff --git a/gcc/testsuite/g++.dg/warn/unused-result1.C b/gcc/testsuite/g++.dg/warn/unused-result1.C new file mode 100644 index 000000000..466c99e7d --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/unused-result1.C @@ -0,0 +1,10 @@ +// PR c++/27371 + +class QByteArray { +public: + QByteArray(const QByteArray &); +}; +class QString { + QByteArray toLocal8Bit() const __attribute__ ((warn_unused_result)); + void fooWarnHere() const { toLocal8Bit(); } // { dg-warning "ignoring" "" { xfail *-*-* } } +}; diff --git a/gcc/testsuite/g++.dg/warn/var-args1.C b/gcc/testsuite/g++.dg/warn/var-args1.C new file mode 100644 index 000000000..9bd84a7dd --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/var-args1.C @@ -0,0 +1,11 @@ +/* { dg-do compile } */ + +#include <stdarg.h> + +void foo(int, ...) +{ + va_list va; + int i; + i = va_arg(va, int&); /* { dg-error "cannot receive objects" } */ +} + diff --git a/gcc/testsuite/g++.dg/warn/volatile1.C b/gcc/testsuite/g++.dg/warn/volatile1.C new file mode 100644 index 000000000..ac9dd4df3 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/volatile1.C @@ -0,0 +1,12 @@ +// PR c++/26577 + +struct A +{ + A(const A&); + A& operator=(const A&); + void baz() volatile; +}; +void A::baz() volatile +{ + *this; // { dg-warning "indirection will not access" } +} diff --git a/gcc/testsuite/g++.dg/warn/weak1.C b/gcc/testsuite/g++.dg/warn/weak1.C new file mode 100644 index 000000000..8a50030bc --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/weak1.C @@ -0,0 +1,22 @@ +// { dg-do run } +// { dg-require-weak "" } +// The PA HP-UX and Tru64 UNIX dynamic loaders don't support unsatisfied +// weak symbols. +// { dg-skip-if "No unsat" { alpha*-dec-osf* hppa*-*-hpux* } { "*" } { "" } } +// The darwin loader does, but they do need to exist at link time. +// { dg-skip-if "No link unsat" { *-*-darwin* } { "*" } { "" } } +// For kernel modules and static RTPs, the loader treats undefined weak +// symbols in the same way as undefined strong symbols. The test +// therefore fails to load, so skip it. +// { dg-skip-if "" { "*-*-vxworks*" && nonpic } "*" { "-non-static" } } + +extern void foo (void) __attribute__ ((weak)); + +int +main () +{ + if (&foo) + foo (); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/write-strings-default.C b/gcc/testsuite/g++.dg/warn/write-strings-default.C new file mode 100644 index 000000000..ee6b21718 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/write-strings-default.C @@ -0,0 +1,7 @@ +// { dg-do compile } +// Test the default for -Wwrite-strings + +int main() +{ + char* p = "Asgaard"; // { dg-warning "deprecated" } +} diff --git a/gcc/testsuite/g++.dg/warn/write-strings.C b/gcc/testsuite/g++.dg/warn/write-strings.C new file mode 100644 index 000000000..73c814909 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/write-strings.C @@ -0,0 +1,7 @@ +// { dg-do compile } +// { dg-options -Wwrite-strings } + +int main() +{ + char* p = "Asgaard"; // { dg-warning "deprecated" } +} |