diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/ext')
149 files changed, 1953 insertions, 137 deletions
diff --git a/gcc/testsuite/g++.dg/ext/alias-decl-attr1.C b/gcc/testsuite/g++.dg/ext/alias-decl-attr1.C index e83fe44127..06e93416f2 100644 --- a/gcc/testsuite/g++.dg/ext/alias-decl-attr1.C +++ b/gcc/testsuite/g++.dg/ext/alias-decl-attr1.C @@ -1,4 +1,4 @@ -// { dg-options "-std=c++0x" } +// { dg-do compile { target c++11 } } template <unsigned Len, unsigned Align> struct aligned_storage diff --git a/gcc/testsuite/g++.dg/ext/alias-decl-attr2.C b/gcc/testsuite/g++.dg/ext/alias-decl-attr2.C index 83e557c43f..6437212fb1 100644 --- a/gcc/testsuite/g++.dg/ext/alias-decl-attr2.C +++ b/gcc/testsuite/g++.dg/ext/alias-decl-attr2.C @@ -1,4 +1,4 @@ -// { dg-options "-std=c++0x" } +// { dg-do compile { target c++11 } } template<typename T> struct X { diff --git a/gcc/testsuite/g++.dg/ext/alias-decl-attr3.C b/gcc/testsuite/g++.dg/ext/alias-decl-attr3.C index 369aa10e65..e11178ab83 100644 --- a/gcc/testsuite/g++.dg/ext/alias-decl-attr3.C +++ b/gcc/testsuite/g++.dg/ext/alias-decl-attr3.C @@ -1,5 +1,4 @@ -// { dg-options "-std=c++0x" } -// { dg-do run } +// { dg-do run { target c++11 } } template <class T> int diff --git a/gcc/testsuite/g++.dg/ext/alias-decl-attr4.C b/gcc/testsuite/g++.dg/ext/alias-decl-attr4.C index 3e1c1c405d..9bafc42342 100644 --- a/gcc/testsuite/g++.dg/ext/alias-decl-attr4.C +++ b/gcc/testsuite/g++.dg/ext/alias-decl-attr4.C @@ -1,5 +1,4 @@ -// { dg-options "-std=c++0x" } -// { dg-do run } +// { dg-do run { target c++11 } } using global_vector_type __attribute__((vector_size(16))) = float; diff --git a/gcc/testsuite/g++.dg/ext/altivec-2.C b/gcc/testsuite/g++.dg/ext/altivec-2.C index eb8a92942b..e14e6f800f 100644 --- a/gcc/testsuite/g++.dg/ext/altivec-2.C +++ b/gcc/testsuite/g++.dg/ext/altivec-2.C @@ -1,6 +1,6 @@ /* { dg-do compile { target powerpc*-*-* } } */ /* { dg-require-effective-target powerpc_altivec_ok } */ -/* { dg-options "-maltivec -Wall -Wno-unused-but-set-variable" } */ +/* { dg-options "-maltivec -Wall -Wno-unused-but-set-variable -Wno-deprecated" } */ /* This test checks if AltiVec builtins accept const-qualified arguments. */ diff --git a/gcc/testsuite/g++.dg/ext/altivec-7.C b/gcc/testsuite/g++.dg/ext/altivec-7.C index 7c458fb003..038335433f 100644 --- a/gcc/testsuite/g++.dg/ext/altivec-7.C +++ b/gcc/testsuite/g++.dg/ext/altivec-7.C @@ -20,17 +20,17 @@ 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 "_Z3fooDv16_h" } } */ +/* { dg-final { scan-assembler "_Z3fooDv16_a" } } */ +/* { dg-final { scan-assembler "_Z3fooDv16_U6__boolc" } } */ +/* { dg-final { scan-assembler "_Z3fooDv8_t" } } */ +/* { dg-final { scan-assembler "_Z3fooDv8_s" } } */ +/* { dg-final { scan-assembler "_Z3fooDv8_U6__bools" } } */ +/* { dg-final { scan-assembler "_Z3fooDv4_j" } } */ +/* { dg-final { scan-assembler "_Z3fooDv4_i" } } */ +/* { dg-final { scan-assembler "_Z3fooDv4_U6__booli" } } */ +/* { dg-final { scan-assembler "_Z3fooDv4_f" } } */ +/* { dg-final { scan-assembler "_Z3fooDv8_u7__pixel" } } */ /* { dg-final { scan-assembler "_Z3fooi" } } */ /* { dg-final { scan-assembler "_Z3fooj" } } */ /* { dg-final { scan-assembler "_Z3foof" } } */ diff --git a/gcc/testsuite/g++.dg/ext/anon-struct4.C b/gcc/testsuite/g++.dg/ext/anon-struct4.C index 5d0bf71ae6..0097ba1244 100644 --- a/gcc/testsuite/g++.dg/ext/anon-struct4.C +++ b/gcc/testsuite/g++.dg/ext/anon-struct4.C @@ -1,5 +1,5 @@ // PR c++/14401 -struct { struct { int& i ; } bar ; } foo ; // { dg-error "uninitialized" "uninit" } -// { dg-warning "anonymous" "anon" { target c++98 } 3 } -// { dg-message "should be initialized" "ref-uninit" { target *-*-* } 3 } +struct { struct { int& i ; } bar ; } foo ; // { dg-error "deleted|uninitialized" "uninit" } +// { dg-warning "anonymous" "anon" { target { ! c++11 } } 3 } +// { dg-message "should be initialized" "ref-uninit" { target { ! c++11 } } 3 } diff --git a/gcc/testsuite/g++.dg/ext/anon-struct5.C b/gcc/testsuite/g++.dg/ext/anon-struct5.C index 8b697ccbca..ec022251cb 100644 --- a/gcc/testsuite/g++.dg/ext/anon-struct5.C +++ b/gcc/testsuite/g++.dg/ext/anon-struct5.C @@ -2,12 +2,12 @@ struct A { - struct { static int i; }; // { dg-error "prohibits anonymous structs|an anonymous struct" } + struct { static int i; }; // { dg-error "prohibits anonymous structs|an anonymous struct|unnamed class" } void foo() { i; } }; struct B { - union { static int i; }; // { dg-error "an anonymous union|member of a union" } + union { static int i; }; // { dg-error "an anonymous union|member of a union|unnamed class" } void foo() { i; } }; diff --git a/gcc/testsuite/g++.dg/ext/anon-struct6.C b/gcc/testsuite/g++.dg/ext/anon-struct6.C index 11a7bbd607..66d4b32719 100644 --- a/gcc/testsuite/g++.dg/ext/anon-struct6.C +++ b/gcc/testsuite/g++.dg/ext/anon-struct6.C @@ -4,7 +4,7 @@ struct A { struct { // { dg-error "anonymous struct cannot have function members" } - struct { static int i; }; // { dg-error "prohibits anonymous structs|non-static data members" } + struct { static int i; }; // { dg-error "prohibits anonymous structs|non-static data members|unnamed class" } void foo() { i; } }; // { dg-error "prohibits anonymous structs" } }; diff --git a/gcc/testsuite/g++.dg/ext/asm12.C b/gcc/testsuite/g++.dg/ext/asm12.C new file mode 100644 index 0000000000..9823a8fd7e --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asm12.C @@ -0,0 +1,14 @@ +// PR c++/55619 +// { dg-do compile } + +typedef int V __attribute__ ((vector_size (4 * sizeof (int)))); + +static const V C = { 0x201, 0, 0, 0 }; +static const int D = 0x201; + +void +f () +{ + __asm volatile ("" : : "m" (C)); + __asm volatile ("" : : "m" (D)); +} diff --git a/gcc/testsuite/g++.dg/ext/attr-alias-3.C b/gcc/testsuite/g++.dg/ext/attr-alias-3.C new file mode 100644 index 0000000000..7f6aa2cbc3 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attr-alias-3.C @@ -0,0 +1,8 @@ +// PR c++/56134 +// { dg-require-alias "" } + +char a; +class Q +{ + static char q __attribute__ ((alias ("a"))); +}; diff --git a/gcc/testsuite/g++.dg/ext/attrib32.C b/gcc/testsuite/g++.dg/ext/attrib32.C index e4dfe4e9f6..31a92b8f45 100644 --- a/gcc/testsuite/g++.dg/ext/attrib32.C +++ b/gcc/testsuite/g++.dg/ext/attrib32.C @@ -12,7 +12,7 @@ void bar() typedef union U1 { int i; } U2 __attribute__((transparent_union)); // { dg-warning "ignored" } -static void foo2(U1) {} // { dg-error "previously defined" } +static void foo2(U1) {} // { dg-message "previously defined" } static void foo2(U2) {} // { dg-error "redefinition" } void bar2(U1 u1, U2 u2) diff --git a/gcc/testsuite/g++.dg/ext/attrib46.C b/gcc/testsuite/g++.dg/ext/attrib46.C new file mode 100644 index 0000000000..1c71990fc5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib46.C @@ -0,0 +1,4 @@ +// PR c++/40821 + +struct __attribute__((aligned(8)) S1 { int i; }; // { dg-error "expected" } +struct __attribute__( aligned(8) S2 { int i; }; // { dg-error "expected" } diff --git a/gcc/testsuite/g++.dg/ext/attrib47.C b/gcc/testsuite/g++.dg/ext/attrib47.C new file mode 100644 index 0000000000..22f49084bc --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib47.C @@ -0,0 +1,21 @@ +// { dg-do compile } +// { dg-options "-O2" } + +class A +{ + public: + template <class T> + T foo(T a) __attribute__ ((noinline)); +}; + +template <class T> + T A::foo(T a) + { + return a+1; + } + +int bar(A a) { + return a.foo(1); +} + +// { dg-final { scan-assembler "_ZN1A3fooIiEET_S1_" } } diff --git a/gcc/testsuite/g++.dg/ext/attrib48.C b/gcc/testsuite/g++.dg/ext/attrib48.C new file mode 100644 index 0000000000..19a9959109 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib48.C @@ -0,0 +1,6 @@ +// PR c++/54652 + +typedef unsigned L __attribute__ ((aligned)); +typedef unsigned L __attribute__ ((aligned)); + +L l; diff --git a/gcc/testsuite/g++.dg/ext/attribute-test-1.C b/gcc/testsuite/g++.dg/ext/attribute-test-1.C index 7df68930fc..93e08d7ef8 100644 --- a/gcc/testsuite/g++.dg/ext/attribute-test-1.C +++ b/gcc/testsuite/g++.dg/ext/attribute-test-1.C @@ -36,3 +36,4 @@ int main() /* Ignore a warning that is irrelevant to the purpose of this test. */ /* { dg-prune-output ".*GCC vector returned by reference.*" } */ +/* { dg-prune-output "changes the ABI" } */ diff --git a/gcc/testsuite/g++.dg/ext/attribute-test-2.C b/gcc/testsuite/g++.dg/ext/attribute-test-2.C index 187067318f..d7c417dcca 100644 --- a/gcc/testsuite/g++.dg/ext/attribute-test-2.C +++ b/gcc/testsuite/g++.dg/ext/attribute-test-2.C @@ -50,3 +50,4 @@ int main() /* Ignore a warning that is irrelevant to the purpose of this test. */ /* { dg-prune-output ".*GCC vector returned by reference.*" } */ +/* { dg-prune-output "changes the ABI" } */ diff --git a/gcc/testsuite/g++.dg/ext/attribute-test-3.C b/gcc/testsuite/g++.dg/ext/attribute-test-3.C index 050cbb4ed3..4b0939ea3a 100644 --- a/gcc/testsuite/g++.dg/ext/attribute-test-3.C +++ b/gcc/testsuite/g++.dg/ext/attribute-test-3.C @@ -52,3 +52,4 @@ int main() { /* Ignore a warning that is irrelevant to the purpose of this test. */ /* { dg-prune-output ".*GCC vector returned by reference.*" } */ +/* { dg-prune-output "changes the ABI" } */ diff --git a/gcc/testsuite/g++.dg/ext/attribute-test-4.C b/gcc/testsuite/g++.dg/ext/attribute-test-4.C index 4783ee8a40..c3e949a9bd 100644 --- a/gcc/testsuite/g++.dg/ext/attribute-test-4.C +++ b/gcc/testsuite/g++.dg/ext/attribute-test-4.C @@ -49,3 +49,4 @@ int main() { /* Ignore a warning that is irrelevant to the purpose of this test. */ /* { dg-prune-output ".*GCC vector returned by reference.*" } */ +/* { dg-prune-output "changes the ABI" } */ diff --git a/gcc/testsuite/g++.dg/ext/bases.C b/gcc/testsuite/g++.dg/ext/bases.C index 0582f72eb8..43f71925dc 100644 --- a/gcc/testsuite/g++.dg/ext/bases.C +++ b/gcc/testsuite/g++.dg/ext/bases.C @@ -1,5 +1,5 @@ -// { dg-options "-std=gnu++0x -w" } -// { dg-do run } +// { dg-options "-w" } +// { dg-do run { target c++11 } } #include<typeinfo> #include<cassert> diff --git a/gcc/testsuite/g++.dg/ext/builtin-bswap1.C b/gcc/testsuite/g++.dg/ext/builtin-bswap1.C new file mode 100644 index 0000000000..787ecba43a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin-bswap1.C @@ -0,0 +1,22 @@ +// PR c/37743 +// { dg-do compile } + +#if defined(__UINT32_TYPE__) && defined(__INT32_TYPE__) + +void foo (__UINT32_TYPE__); +void foo (__INT32_TYPE__); + +void +bar (__UINT32_TYPE__ x) +{ + foo (__builtin_bswap32 (x)); +} + +#else + +void +bar () +{ +} + +#endif diff --git a/gcc/testsuite/g++.dg/ext/builtin-line1.C b/gcc/testsuite/g++.dg/ext/builtin-line1.C new file mode 100644 index 0000000000..21a4f59a46 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin-line1.C @@ -0,0 +1,17 @@ +// __builtin_LINE gets the location where the default argument is expanded. +// { dg-do run } + +#include <cassert> +struct Foo +{ + int line; + Foo( int line = __builtin_LINE() ) + : line( line ) + {} +}; + +int main() +{ + assert (Foo().line == __LINE__); + assert ((new Foo)->line == __LINE__); +} diff --git a/gcc/testsuite/g++.dg/ext/builtin-offsetof1.C b/gcc/testsuite/g++.dg/ext/builtin-offsetof1.C new file mode 100644 index 0000000000..5c5e9cf246 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin-offsetof1.C @@ -0,0 +1,9 @@ +// PR c++/51413 +// { dg-options "-w" } + +struct A +{ + static void foo(); +}; + +int i = __builtin_offsetof(A, foo[1]); // { dg-error "neither a single identifier nor a sequence of member accesses and array references" } diff --git a/gcc/testsuite/g++.dg/ext/builtin30.C b/gcc/testsuite/g++.dg/ext/builtin30.C new file mode 100644 index 0000000000..d0a75fb173 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/builtin30.C @@ -0,0 +1,27 @@ +// { dg-do compile } +// { dg-options "-O2" } + +typedef __SIZE_TYPE__ size_t; +extern "C" { +extern void __chk_fail (void); +extern int snprintf (char *, size_t, const char *, ...); +extern inline __attribute__((gnu_inline, always_inline)) int snprintf (char *a, size_t b, const char *fmt, ...) +{ + if (__builtin_object_size (a, 0) != -1UL && __builtin_object_size (a, 0) < b) + __chk_fail (); + return __builtin_snprintf (a, b, fmt, __builtin_va_arg_pack ()); +} +extern int snprintf (char *, size_t, const char *, ...) __asm ("mysnprintf"); +} + +char buf[10]; + +int +main (void) +{ + snprintf (buf, 10, "%d%d\n", 10, 10); + return 0; +} + +// { dg-final { scan-assembler "mysnprintf" } } +// { dg-final { scan-assembler-not "__chk_fail" } } diff --git a/gcc/testsuite/g++.dg/ext/cleanup-1.C b/gcc/testsuite/g++.dg/ext/cleanup-1.C index 8e83537549..7cf14c9981 100644 --- a/gcc/testsuite/g++.dg/ext/cleanup-1.C +++ b/gcc/testsuite/g++.dg/ext/cleanup-1.C @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-Wall" } */ +/* { dg-options "-Wall -ftrack-macro-expansion=0" } */ /* Validate expected warnings and errors. */ #define U __attribute__((unused)) diff --git a/gcc/testsuite/g++.dg/ext/cleanup-10.C b/gcc/testsuite/g++.dg/ext/cleanup-10.C index eeb607b298..66c7b76bb6 100644 --- a/gcc/testsuite/g++.dg/ext/cleanup-10.C +++ b/gcc/testsuite/g++.dg/ext/cleanup-10.C @@ -1,4 +1,4 @@ -/* { dg-do run { target hppa*-*-hpux* *-*-linux* powerpc*-*-darwin* *-*-darwin[912]* } } */ +/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */ /* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */ /* Verify that cleanups work with exception handling through signal frames on alternate stack. */ diff --git a/gcc/testsuite/g++.dg/ext/cleanup-11.C b/gcc/testsuite/g++.dg/ext/cleanup-11.C index 0b6d11ce26..6e96521412 100644 --- a/gcc/testsuite/g++.dg/ext/cleanup-11.C +++ b/gcc/testsuite/g++.dg/ext/cleanup-11.C @@ -1,4 +1,4 @@ -/* { dg-do run { target hppa*-*-hpux* *-*-linux* powerpc*-*-darwin* *-*-darwin[912]* } } */ +/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* 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. */ diff --git a/gcc/testsuite/g++.dg/ext/cleanup-8.C b/gcc/testsuite/g++.dg/ext/cleanup-8.C index be66768489..ccf9bef681 100644 --- a/gcc/testsuite/g++.dg/ext/cleanup-8.C +++ b/gcc/testsuite/g++.dg/ext/cleanup-8.C @@ -1,4 +1,4 @@ -/* { dg-do run { target hppa*-*-hpux* *-*-linux* powerpc*-*-darwin* *-*-darwin[912]* } } */ +/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */ /* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */ /* Verify that cleanups work with exception handling through signal frames. */ diff --git a/gcc/testsuite/g++.dg/ext/cleanup-9.C b/gcc/testsuite/g++.dg/ext/cleanup-9.C index 87f8283998..dcdfcae0da 100644 --- a/gcc/testsuite/g++.dg/ext/cleanup-9.C +++ b/gcc/testsuite/g++.dg/ext/cleanup-9.C @@ -1,4 +1,4 @@ -/* { dg-do run { target hppa*-*-hpux* *-*-linux* powerpc*-*-darwin* *-*-darwin[912]* } } */ +/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */ /* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */ /* Verify that cleanups work with exception handling through realtime signal frames. */ diff --git a/gcc/testsuite/g++.dg/ext/complex8.C b/gcc/testsuite/g++.dg/ext/complex8.C index 9b8ac1b186..4d79cc645d 100644 --- a/gcc/testsuite/g++.dg/ext/complex8.C +++ b/gcc/testsuite/g++.dg/ext/complex8.C @@ -1,6 +1,5 @@ // PR libstdc++/48760 -// { dg-options -std=c++0x } -// { dg-do run } +// { dg-do run { target c++11 } } constexpr _Complex int i{1,2}; constexpr _Complex int j{3}; diff --git a/gcc/testsuite/g++.dg/ext/complit13.C b/gcc/testsuite/g++.dg/ext/complit13.C new file mode 100644 index 0000000000..c12678ba86 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complit13.C @@ -0,0 +1,11 @@ +// PR c++/10207 +// { dg-options "" } + +typedef struct { } EmptyStruct; +typedef struct { EmptyStruct Empty; } DemoStruct; + +void Func() +{ + DemoStruct Demo; + Demo.Empty = (EmptyStruct) {}; +} diff --git a/gcc/testsuite/g++.dg/ext/complit14.C b/gcc/testsuite/g++.dg/ext/complit14.C new file mode 100644 index 0000000000..aed765dc55 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complit14.C @@ -0,0 +1,11 @@ +// PR c++/61614 +// { dg-options "" } + +int Fn (...); + +void +Test () +{ + int j = Fn ((const int[]) { 0 }); // OK + unsigned long sz = sizeof Fn ((const int[]) { 0 }); // Error +} diff --git a/gcc/testsuite/g++.dg/ext/desig5.C b/gcc/testsuite/g++.dg/ext/desig5.C new file mode 100644 index 0000000000..48cce3183b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/desig5.C @@ -0,0 +1,7 @@ +// PR c++/55951 + +enum { A }; + +static const char *a[] = { + [A] = "a" +}; diff --git a/gcc/testsuite/g++.dg/ext/desig6.C b/gcc/testsuite/g++.dg/ext/desig6.C new file mode 100644 index 0000000000..f71d6eeecd --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/desig6.C @@ -0,0 +1,18 @@ +// PR c++/57041 +// { dg-do compile { target c++11 } } +// { dg-options "" } + +template<typename T> +union u { + T a; + char b; +}; + +template<typename T> +u<T> make_u(T t) { + return { .a = t }; +} + +int main() { + return make_u<int>(1).a; +} diff --git a/gcc/testsuite/g++.dg/ext/flexary3.C b/gcc/testsuite/g++.dg/ext/flexary3.C new file mode 100644 index 0000000000..906877b11b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/flexary3.C @@ -0,0 +1,10 @@ +// PR c++/54441 +// { dg-options "" } + +struct s { char c[]; }; + +int main() +{ + struct s s = { .c = 0 }; // { dg-error "initializer" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/gnu-inline-global-reject.C b/gcc/testsuite/g++.dg/ext/gnu-inline-global-reject.C index d9e2660955..7e84fa773e 100644 --- a/gcc/testsuite/g++.dg/ext/gnu-inline-global-reject.C +++ b/gcc/testsuite/g++.dg/ext/gnu-inline-global-reject.C @@ -4,53 +4,53 @@ */ /* { dg-do compile } */ -/* { dg-options " -ansi -Wno-long-long" } */ +/* { dg-options " -ansi -Wno-long-long -ftrack-macro-expansion=0" } */ #include "gnu-inline-common.h" #undef fn #define fn pfx(func_decl_inline_before) -decl(inline, fn) // { dg-error "previous" "" } +decl(inline, fn) // { dg-message "previous" "" } gnuindef(fn, 0) // { dg-error "redeclared" "" } #undef fn #define fn pfx(func_decl_inline_after) -gnuindef(fn, 0) // { dg-error "previous" "" } +gnuindef(fn, 0) // { dg-message "previous" "" } decl(inline, fn) // { dg-error "redeclared" "" } #undef fn #define fn pfx(func_def_gnuin_redef) -gnuindef(fn, 0) // { dg-error "previous" "" } +gnuindef(fn, 0) // { dg-message "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, 0) // { dg-message "previous" "" } def(inline, fn, 1) // { dg-error "redefinition" "" } #undef fn #define fn pfx(func_def_inline_after) -gnuindef(fn, 0) // { dg-error "previous" "" } +gnuindef(fn, 0) // { dg-message "previous" "" } def(inline, fn, 1) // { dg-error "redeclare" "" } #undef fn #define fn pfx(func_def_inline_before) -def(inline, fn, 0) // { dg-error "previous" "" } +def(inline, fn, 0) // { dg-message "previous" "" } gnuindef(fn, 1) // { dg-error "redefinition" "" } #undef fn #define fn pfx(func_def_before) -def(, fn, 0) // { dg-error "previous" "" } +def(, fn, 0) // { dg-message "previous" "" } gnuindef(fn, 1) // { dg-error "redefinition" "" } #undef fn #define fn pfx(func_decl_static_inline_before) -decl(static inline, fn) // { dg-error "previous" "" } +decl(static inline, fn) // { dg-message "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" "" } +gnuindef(fn, 0) // { dg-message "previous" "" } decl(static, fn) def(static inline, fn, 1) // { dg-error "redeclare" "" } diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_constructor-2.C b/gcc/testsuite/g++.dg/ext/has_nothrow_constructor-2.C index 9191c3e97f..8123fe93d1 100644 --- a/gcc/testsuite/g++.dg/ext/has_nothrow_constructor-2.C +++ b/gcc/testsuite/g++.dg/ext/has_nothrow_constructor-2.C @@ -1,5 +1,5 @@ // PR c++/55842 -// { dg-options -std=c++11 } +// { dg-do compile { target c++11 } } template <class=void> struct number { number() noexcept(noexcept(0)) { } diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_copy-7.C b/gcc/testsuite/g++.dg/ext/has_nothrow_copy-7.C index e0ecef44a2..10891b6b59 100644 --- a/gcc/testsuite/g++.dg/ext/has_nothrow_copy-7.C +++ b/gcc/testsuite/g++.dg/ext/has_nothrow_copy-7.C @@ -1,5 +1,4 @@ -// { dg-do run } -// { dg-options "-std=c++0x" } +// { dg-do run { target c++11 } } #include <cassert> struct S { diff --git a/gcc/testsuite/g++.dg/ext/has_nothrow_copy-8.C b/gcc/testsuite/g++.dg/ext/has_nothrow_copy-8.C index e1be1a0a77..b6862298d3 100644 --- a/gcc/testsuite/g++.dg/ext/has_nothrow_copy-8.C +++ b/gcc/testsuite/g++.dg/ext/has_nothrow_copy-8.C @@ -1,5 +1,5 @@ // PR c++/56268 -// { dg-options -std=c++11 } +// { dg-do compile { target c++11 } } template <class T> struct A { diff --git a/gcc/testsuite/g++.dg/ext/int128-3.C b/gcc/testsuite/g++.dg/ext/int128-3.C new file mode 100644 index 0000000000..f62b62d106 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/int128-3.C @@ -0,0 +1,12 @@ +// Test for int128 enums. +// { dg-do compile { target int128 } } +// { dg-options "" } + +enum E { + e1 = 0xffffffffffffffff, + e2, e3 +} e = e3; + +#define SA(I,X) int a##I[(X)? 1 : -1] + +SA(1, sizeof(E) == sizeof(__int128)); diff --git a/gcc/testsuite/g++.dg/ext/int128-4.C b/gcc/testsuite/g++.dg/ext/int128-4.C new file mode 100644 index 0000000000..7e5a5020ff --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/int128-4.C @@ -0,0 +1,20 @@ +// Test for int128 arithmetic conversions. +// { dg-do compile { target int128 } } +// { dg-require-effective-target c++11 } +// { dg-options "" } + +template <class T, class U> struct same; +template <class T> struct same<T,T> { }; +#define assert_same(T,U) (same<T,U>()) + +int main() +{ + long long ll; + unsigned long long ull; + __int128 i8; + unsigned __int128 u8; + assert_same (decltype (ll+i8), __int128); + assert_same (decltype (ull+i8), __int128); + assert_same (decltype (ll+u8), unsigned __int128); + assert_same (decltype (ull+u8), unsigned __int128); +} diff --git a/gcc/testsuite/g++.dg/ext/is_base_of_incomplete-2.C b/gcc/testsuite/g++.dg/ext/is_base_of_incomplete-2.C new file mode 100644 index 0000000000..54862585d0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_base_of_incomplete-2.C @@ -0,0 +1,5 @@ +struct T; + +int check1[__is_base_of(T, T) ? 1 : -1]; +int check2[__is_base_of(T, const T) ? 1 : -1]; +int check3[__is_base_of(volatile T, T) ? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/ext/is_empty2.C b/gcc/testsuite/g++.dg/ext/is_empty2.C new file mode 100644 index 0000000000..d1bf64c0a6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_empty2.C @@ -0,0 +1,11 @@ +// PR c++/36797 + +template <int> struct A { }; + +template <class T> +int foo (A<__is_empty (T)>* = 0); // { dg-error "built-in trait" } + +int main () +{ + foo<int>(); +} diff --git a/gcc/testsuite/g++.dg/ext/is_final.C b/gcc/testsuite/g++.dg/ext/is_final.C index 7833f3a101..b3875ad04a 100644 --- a/gcc/testsuite/g++.dg/ext/is_final.C +++ b/gcc/testsuite/g++.dg/ext/is_final.C @@ -1,6 +1,5 @@ // PR c++/51365 -// { dg-do compile } -// { dg-options "-std=c++0x" } +// { dg-do compile { target c++11 } } struct A { }; static_assert( ! __is_final (A), "A not final" ); diff --git a/gcc/testsuite/g++.dg/ext/is_literal_type1.C b/gcc/testsuite/g++.dg/ext/is_literal_type1.C index 21570d2d6e..b146bdee9f 100644 --- a/gcc/testsuite/g++.dg/ext/is_literal_type1.C +++ b/gcc/testsuite/g++.dg/ext/is_literal_type1.C @@ -1,6 +1,5 @@ // PR c++/48771 -// { dg-do compile } -// { dg-options "-std=c++0x" } +// { dg-do compile { target c++11 } } struct NonLiteral { NonLiteral(); diff --git a/gcc/testsuite/g++.dg/ext/is_pod.C b/gcc/testsuite/g++.dg/ext/is_pod.C index 939665d8d3..d073889c83 100644 --- a/gcc/testsuite/g++.dg/ext/is_pod.C +++ b/gcc/testsuite/g++.dg/ext/is_pod.C @@ -1,5 +1,4 @@ -// { dg-do run } -// { dg-options "-std=c++0x" } +// { dg-do run { target c++11 } } #include <cassert> struct A diff --git a/gcc/testsuite/g++.dg/ext/ivdep-1.C b/gcc/testsuite/g++.dg/ext/ivdep-1.C new file mode 100644 index 0000000000..751154deba --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/ivdep-1.C @@ -0,0 +1,18 @@ +// PR c++/60267 +// { dg-do compile } +// { dg-options "-O3" } + +template <int N> +void +foo (int *a, int *b, int *c) +{ +#pragma GCC ivdep + for (int i = 0; i < N; i++) + a[i] = b[i] * c[i]; +} + +void +bar (int *a, int *b, int *c) +{ + foo <64> (a, b, c); +} diff --git a/gcc/testsuite/g++.dg/ext/label13.C b/gcc/testsuite/g++.dg/ext/label13.C index db349b5cbf..0887d46a2f 100644 --- a/gcc/testsuite/g++.dg/ext/label13.C +++ b/gcc/testsuite/g++.dg/ext/label13.C @@ -8,7 +8,7 @@ struct C C(); }; -C::C() // { dg-bogus "can never be copied" "" { xfail { { *-apple-darwin* alpha*-dec-osf* } || { hppa*-*-hpux* && { ! lp64 } } } } } +C::C() // { dg-bogus "can never be copied" "" } { static void *labelref = &&label; goto *labelref; diff --git a/gcc/testsuite/g++.dg/ext/label13a.C b/gcc/testsuite/g++.dg/ext/label13a.C new file mode 100644 index 0000000000..3be8e31148 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/label13a.C @@ -0,0 +1,25 @@ +// PR c++/41090 +// { dg-do run } +// { dg-options "-save-temps" } +// { dg-final { scan-assembler "_ZN1CC4Ev" } } +// { dg-final cleanup-saved-temps } + +int i; +struct A { A() {} }; +struct C: virtual A +{ + C(); +}; + +C::C() +{ + static void *labelref = &&label; + goto *labelref; + label: i = 1; +} + +int main() +{ + C c; + return (i != 1); +} diff --git a/gcc/testsuite/g++.dg/ext/label14.C b/gcc/testsuite/g++.dg/ext/label14.C new file mode 100644 index 0000000000..d1a8b0d529 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/label14.C @@ -0,0 +1,17 @@ +// PR c++/53812 +// { dg-do compile } +// { dg-options "" } + +struct T { T () : t(0) {}; int t; ~T (); }; +struct S { void *operator [] (T); }; +void bar (S &, void *, void *); + +void +foo (S &x, T &y) +{ + bar (x, &&l1, &&l2); +l1: + goto *x[y]; +l2: + bar (x, &&l1, &&l2); +} diff --git a/gcc/testsuite/g++.dg/ext/label5.C b/gcc/testsuite/g++.dg/ext/label5.C index fc611cd415..34ca90d87b 100644 --- a/gcc/testsuite/g++.dg/ext/label5.C +++ b/gcc/testsuite/g++.dg/ext/label5.C @@ -2,5 +2,5 @@ // PR c++/24052 struct A { }; -int main() { b: A() && && b; } // { dg-error "A\\(\\) && && *b" } +int main() { b: A() && && b; } // { dg-error "operand types are 'A' and 'void\\*'" } // { dg-message "candidate|operator&&|no known conversion" "additional" { target *-*-* } 5 } diff --git a/gcc/testsuite/g++.dg/ext/mv1.C b/gcc/testsuite/g++.dg/ext/mv1.C new file mode 100644 index 0000000000..4eedbff7b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv1.C @@ -0,0 +1,132 @@ +/* Test case to check if Multiversioning works. */ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-require-ifunc "" } */ +/* { dg-options "-O2 -fPIC" } */ + +#include <assert.h> + +/* Default version. */ +int foo (); // Extra declaration that is merged with the second one. +int foo () __attribute__ ((target("default"))); +/* The other versions of foo. Mix up the ordering and + check if the dispatching does it in the order of priority. */ +/* Check combination of target attributes. */ +int foo () __attribute__ ((target("arch=corei7,popcnt"))); +/* The target operands in this declaration and the definition are re-ordered. + This should still work. */ +int foo () __attribute__ ((target("ssse3,avx2"))); + +/* Check for all target attributes for which dispatchers are available. */ +/* Check arch= */ +int foo () __attribute__((target("arch=core2"))); +int foo () __attribute__((target("arch=corei7"))); +int foo () __attribute__((target("arch=atom"))); +/* Check ISAs */ +int foo () __attribute__((target("avx"))); +int foo () __attribute__ ((target("arch=core2,sse4.2"))); +/* Check more arch=. */ +int foo () __attribute__((target("arch=amdfam10"))); +int foo () __attribute__((target("arch=bdver1"))); +int foo () __attribute__((target("arch=bdver2"))); + +int (*p)() = &foo; +int main () +{ + int val = foo (); + assert (val == (*p)()); + + /* Check in the exact same order in which the dispatching + is expected to happen. */ + if (__builtin_cpu_is ("bdver1")) + assert (val == 1); + else if (__builtin_cpu_is ("bdver2")) + assert (val == 2); + else if (__builtin_cpu_supports ("avx2") + && __builtin_cpu_supports ("ssse3")) + assert (val == 3); + else if (__builtin_cpu_supports ("avx")) + assert (val == 4); + else if (__builtin_cpu_is ("corei7") + && __builtin_cpu_supports ("popcnt")) + assert (val == 5); + else if (__builtin_cpu_is ("corei7")) + assert (val == 6); + else if (__builtin_cpu_is ("amdfam10h")) + assert (val == 7); + else if (__builtin_cpu_is ("core2") + && __builtin_cpu_supports ("sse4.2")) + assert (val == 8); + else if (__builtin_cpu_is ("core2")) + assert (val == 9); + else if (__builtin_cpu_is ("atom")) + assert (val == 10); + else + assert (val == 0); + + return 0; +} + +int __attribute__ ((target("default"))) +foo () +{ + return 0; +} + +int __attribute__ ((target("arch=corei7,popcnt"))) +foo () +{ + return 5; +} +int __attribute__ ((target("avx2,ssse3"))) +foo () +{ + return 3; +} + +int __attribute__ ((target("arch=core2"))) +foo () +{ + return 9; +} + +int __attribute__ ((target("arch=corei7"))) +foo () +{ + return 6; +} + +int __attribute__ ((target("arch=atom"))) +foo () +{ + return 10; +} + +int __attribute__ ((target("avx"))) +foo () +{ + return 4; +} + +int __attribute__ ((target("arch=core2,sse4.2"))) +foo () +{ + return 8; +} + +int __attribute__ ((target("arch=amdfam10"))) +foo () +{ + return 7; +} + +int __attribute__ ((target("arch=bdver1"))) +foo () +{ + return 1; +} + +int __attribute__ ((target("arch=bdver2"))) +foo () +{ + return 2; +} diff --git a/gcc/testsuite/g++.dg/ext/mv10.C b/gcc/testsuite/g++.dg/ext/mv10.C new file mode 100644 index 0000000000..5dfe36372c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv10.C @@ -0,0 +1,12 @@ +// { dg-do assemble { target i?86-*-* x86_64-*-* } } +// { dg-options "" } + +__attribute__((target ("popcnt"), used)) +void foo (void) +{ +} + +__attribute__((target ("popcnt","avx"), used)) +void foo (void) +{ +} diff --git a/gcc/testsuite/g++.dg/ext/mv11.C b/gcc/testsuite/g++.dg/ext/mv11.C new file mode 100644 index 0000000000..1f5c576f0a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv11.C @@ -0,0 +1,23 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-options "-msse2" } + +int foo () __attribute__ ((target("default"))); +int foo () __attribute__ ((target("sse2"))); + +int +main () +{ + return foo (); +} + +int __attribute__ ((target("default"))) +foo () +{ + return 0; +} + +int __attribute__ ((target("sse2"))) +foo () +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/mv12-aux.cc b/gcc/testsuite/g++.dg/ext/mv12-aux.cc new file mode 100644 index 0000000000..611c679bbc --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv12-aux.cc @@ -0,0 +1,10 @@ +// Test case to check if multiversioning works as expected when the versions +// are defined in different files. Auxiliary file for mv12.C. + +#include "mv12.h" + +__attribute__ ((target ("sse4.2"))) +int foo () +{ + return 1; +} diff --git a/gcc/testsuite/g++.dg/ext/mv12.C b/gcc/testsuite/g++.dg/ext/mv12.C new file mode 100644 index 0000000000..8b2e423404 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv12.C @@ -0,0 +1,22 @@ +// Test case to check if multiversioning works as expected when the versions +// are defined in different files. + +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-require-ifunc "" } +// { dg-options "-O2" } +// { dg-additional-sources "mv12-aux.cc" } + +#include "mv12.h" + +int main () +{ + if (__builtin_cpu_supports ("sse4.2")) + return foo () - 1; + return foo (); +} + +__attribute__ ((target ("default"))) +int foo () +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/mv12.h b/gcc/testsuite/g++.dg/ext/mv12.h new file mode 100644 index 0000000000..650358d835 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv12.h @@ -0,0 +1,4 @@ +// Header file used by mv12.C and mv12-aux.cc. + +int foo () __attribute__ ((target ("default"))); +int foo () __attribute__ ((target ("sse4.2"))); diff --git a/gcc/testsuite/g++.dg/ext/mv13.C b/gcc/testsuite/g++.dg/ext/mv13.C new file mode 100644 index 0000000000..5674d19c97 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv13.C @@ -0,0 +1,18 @@ +// Test case to check if multiversioning functions that are extern "C" +// generates errors. + +// { dg-do compile { target i?86-*-* x86_64-*-* } } + +extern "C" +__attribute__ ((target ("default"))) +int foo () // { dg-message "previously defined here" } +{ + return 0; +} + +extern "C" +__attribute__ ((target ("sse4.2"))) +int foo () // { dg-error "redefinition" } +{ + return 1; +} diff --git a/gcc/testsuite/g++.dg/ext/mv14.C b/gcc/testsuite/g++.dg/ext/mv14.C new file mode 100644 index 0000000000..e36e08d50c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv14.C @@ -0,0 +1,40 @@ +/* Test case to check if Multiversioning works. */ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-require-ifunc "" } */ +/* { dg-options "-O2 -fPIC" } */ + +#include <assert.h> + +/* Default version. */ +int foo (); // Extra declaration that is merged with the second one. +int foo () __attribute__ ((target("default"))); + +int foo () __attribute__ ((target("arch=corei7"))); + +int (*p)() = &foo; +int main () +{ + int val = foo (); + assert (val == (*p)()); + + /* Check in the exact same order in which the dispatching + is expected to happen. */ + if (__builtin_cpu_is ("corei7")) + assert (val == 5); + else + assert (val == 0); + + return 0; +} + +int __attribute__ ((target("default"))) +foo () +{ + return 0; +} + +int __attribute__ ((target("arch=corei7"))) +foo () +{ + return 5; +} diff --git a/gcc/testsuite/g++.dg/ext/mv15.C b/gcc/testsuite/g++.dg/ext/mv15.C new file mode 100644 index 0000000000..42e39d24c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv15.C @@ -0,0 +1,40 @@ +/* Test case to check if Multiversioning works. */ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-require-ifunc "" } */ +/* { dg-options "-O2 -fPIC" } */ + +#include <assert.h> + +/* Default version. */ +int foo (); // Extra declaration that is merged with the second one. +int foo () __attribute__ ((target("default"))); + +int foo () __attribute__ ((target("arch=nehalem"))); + +int (*p)() = &foo; +int main () +{ + int val = foo (); + assert (val == (*p)()); + + /* Check in the exact same order in which the dispatching + is expected to happen. */ + if (__builtin_cpu_is ("corei7")) + assert (val == 5); + else + assert (val == 0); + + return 0; +} + +int __attribute__ ((target("default"))) +foo () +{ + return 0; +} + +int __attribute__ ((target("arch=nehalem"))) +foo () +{ + return 5; +} diff --git a/gcc/testsuite/g++.dg/ext/mv16.C b/gcc/testsuite/g++.dg/ext/mv16.C new file mode 100644 index 0000000000..8992bfc6fc --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv16.C @@ -0,0 +1,65 @@ +// Test that dispatching can choose the right multiversion +// for Intel CPUs with the same internal GCC processor id +// but slighly different sets of x86 extensions. + +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-require-ifunc "" } +// { dg-options "-O2" } + +#include <assert.h> + +int __attribute__ ((target("default"))) +foo () +{ + return 0; +} + +int __attribute__ ((target("arch=nehalem"))) +foo () +{ + return 4; +} + +int __attribute__ ((target("arch=westmere"))) +foo () +{ + return 5; +} + +int __attribute__ ((target("arch=sandybridge"))) +foo () +{ + return 8; +} + +int __attribute__ ((target("arch=ivybridge"))) +foo () +{ + return 9; +} + +int __attribute__ ((target("arch=haswell"))) +foo () +{ + return 12; +} + +int main () +{ + int val = foo (); + + if (__builtin_cpu_is ("nehalem")) + assert (val == 4); + else if (__builtin_cpu_is ("westmere")) + assert (val == 5); + else if (__builtin_cpu_is ("sandybridge")) + assert (val == 8); + else if (__builtin_cpu_is ("ivybridge")) + assert (val == 9); + else if (__builtin_cpu_is ("haswell")) + assert (val == 12); + else + assert (val == 0); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/mv2.C b/gcc/testsuite/g++.dg/ext/mv2.C new file mode 100644 index 0000000000..869e99b4fa --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv2.C @@ -0,0 +1,118 @@ +/* Test case to check if Multiversioning chooses the correct + dispatching order when versions are for various ISAs. */ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-require-ifunc "" } */ +/* { dg-options "-O2" } */ + +#include <assert.h> + +/* Default version. */ +int foo () __attribute__ ((target ("default"))); +/* The dispatch checks should be in the exact reverse order of the + declarations below. */ +int foo () __attribute__ ((target ("mmx"))); +int foo () __attribute__ ((target ("sse"))); +int foo () __attribute__ ((target ("sse2"))); +int foo () __attribute__ ((target ("sse3"))); +int foo () __attribute__ ((target ("ssse3"))); +int foo () __attribute__ ((target ("sse4.1"))); +int foo () __attribute__ ((target ("sse4.2"))); +int foo () __attribute__ ((target ("popcnt"))); +int foo () __attribute__ ((target ("avx"))); +int foo () __attribute__ ((target ("avx2"))); + +int main () +{ + int val = foo (); + + if (__builtin_cpu_supports ("avx2")) + assert (val == 1); + else if (__builtin_cpu_supports ("avx")) + assert (val == 2); + else if (__builtin_cpu_supports ("popcnt")) + assert (val == 3); + else if (__builtin_cpu_supports ("sse4.2")) + assert (val == 4); + else if (__builtin_cpu_supports ("sse4.1")) + assert (val == 5); + else if (__builtin_cpu_supports ("ssse3")) + assert (val == 6); + else if (__builtin_cpu_supports ("sse3")) + assert (val == 7); + else if (__builtin_cpu_supports ("sse2")) + assert (val == 8); + else if (__builtin_cpu_supports ("sse")) + assert (val == 9); + else if (__builtin_cpu_supports ("mmx")) + assert (val == 10); + else + assert (val == 0); + + return 0; +} + +int __attribute__ ((target("default"))) +foo () +{ + return 0; +} + +int __attribute__ ((target("mmx"))) +foo () +{ + return 10; +} + +int __attribute__ ((target("sse"))) +foo () +{ + return 9; +} + +int __attribute__ ((target("sse2"))) +foo () +{ + return 8; +} + +int __attribute__ ((target("sse3"))) +foo () +{ + return 7; +} + +int __attribute__ ((target("ssse3"))) +foo () +{ + return 6; +} + +int __attribute__ ((target("sse4.1"))) +foo () +{ + return 5; +} + +int __attribute__ ((target("sse4.2"))) +foo () +{ + return 4; +} + +int __attribute__ ((target("popcnt"))) +foo () +{ + return 3; +} + +int __attribute__ ((target("avx"))) +foo () +{ + return 2; +} + +int __attribute__ ((target("avx2"))) +foo () +{ + return 1; +} diff --git a/gcc/testsuite/g++.dg/ext/mv3.C b/gcc/testsuite/g++.dg/ext/mv3.C new file mode 100644 index 0000000000..ec2aa1ffec --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv3.C @@ -0,0 +1,36 @@ +/* Test case to check if a call to a multiversioned function + is replaced with a direct call to the particular version when + the most specialized version's target attributes match the + caller. + + In this program, foo is multiversioned but there is no default + function. This is an error if the call has to go through a + dispatcher. However, the call to foo in bar can be replaced + with a direct call to the popcnt version of foo. Hence, this + test should pass. */ + +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-O2" } */ + + +int __attribute__ ((target ("sse"))) +foo () +{ + return 1; +} +int __attribute__ ((target ("popcnt"))) +foo () +{ + return 0; +} + +int __attribute__ ((target ("popcnt"))) +bar () +{ + return foo (); +} + +int main () +{ + return bar (); +} diff --git a/gcc/testsuite/g++.dg/ext/mv4.C b/gcc/testsuite/g++.dg/ext/mv4.C new file mode 100644 index 0000000000..ff1cc2f63f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv4.C @@ -0,0 +1,24 @@ +/* Test case to check if the compiler generates an error message + when the default version of a multiversioned function is absent + and its pointer is taken. */ + +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-require-ifunc "" } */ +/* { dg-options "-O2" } */ + +int __attribute__ ((target ("sse"))) +foo () +{ + return 1; +} +int __attribute__ ((target ("popcnt"))) +foo () +{ + return 0; +} + +int main () +{ + int (*p)() = &foo; /* { dg-error "use of multiversioned function without a default" {} } */ + return (*p)(); +} diff --git a/gcc/testsuite/g++.dg/ext/mv5.C b/gcc/testsuite/g++.dg/ext/mv5.C new file mode 100644 index 0000000000..fd62eee015 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv5.C @@ -0,0 +1,25 @@ +/* Test case to check if multiversioned functions are still generated if they are + marked comdat with inline keyword. */ + +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-require-ifunc "" } */ +/* { dg-options "-O2" } */ + + +/* Default version. */ +inline int __attribute__ ((target ("default"))) +foo () +{ + return 0; +} + +inline int __attribute__ ((target ("popcnt"))) +foo () +{ + return 0; +} + +int main () +{ + return foo (); +} diff --git a/gcc/testsuite/g++.dg/ext/mv6.C b/gcc/testsuite/g++.dg/ext/mv6.C new file mode 100644 index 0000000000..2273065996 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv6.C @@ -0,0 +1,28 @@ +/* Test to check if member version multiversioning works correctly. */ + +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-require-ifunc "" } */ +/* { dg-options "-march=x86-64" } */ + +class Foo +{ + public: + /* Default version of foo. */ + __attribute__ ((target("default"))) + int foo () + { + return 0; + } + /* corei7 version of foo. */ + __attribute__ ((target("arch=corei7"))) + int foo () + { + return 0; + } +}; + +int main () +{ + Foo f; + return f.foo (); +} diff --git a/gcc/testsuite/g++.dg/ext/mv7.C b/gcc/testsuite/g++.dg/ext/mv7.C new file mode 100644 index 0000000000..64c04fac60 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv7.C @@ -0,0 +1,12 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-options "" } + +__attribute__((target ("default"))) +void foo (void) // { dg-message "previously defined here" } +{ +} + +__attribute__((target (128))) +void foo (void) // { dg-error "(not a string|redefinition)" } +{ +} diff --git a/gcc/testsuite/g++.dg/ext/mv8.C b/gcc/testsuite/g++.dg/ext/mv8.C new file mode 100644 index 0000000000..2e98dd7ad8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv8.C @@ -0,0 +1,7 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-options "" } + +__attribute__((target (11,12))) +void foo (void) // { dg-error "not a string" } +{ +} diff --git a/gcc/testsuite/g++.dg/ext/mv9.C b/gcc/testsuite/g++.dg/ext/mv9.C new file mode 100644 index 0000000000..c59651e102 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/mv9.C @@ -0,0 +1,9 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-options "" } + +void foo (); +void foo () __attribute__((target ("sse4"))); +void foo () __attribute__((target ("default"))); // { dg-message "previous declaration" } +void foo () // { dg-error "attribute for multi-versioned" } +{ +} diff --git a/gcc/testsuite/g++.dg/ext/pr56790-1.C b/gcc/testsuite/g++.dg/ext/pr56790-1.C new file mode 100644 index 0000000000..ae465fa3e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr56790-1.C @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-ccp1" } */ +/* { dg-prune-output "changes the ABI" } */ + +typedef long vec __attribute__ ((vector_size (2 * sizeof (long)))); + +vec f (void) +{ + vec a = { 5, 7 }; + vec b = { 11, 13 }; + vec m = { -1, 0 }; + return m ? a : b; +} + +/* { dg-final { scan-tree-dump "{ 5, 13 }" "ccp1" } } */ +/* { dg-final { scan-tree-dump-not "VEC_COND_EXPR" "ccp1" } } */ +/* { dg-final { cleanup-tree-dump "ccp1" } } */ diff --git a/gcc/testsuite/g++.dg/ext/pr57362.C b/gcc/testsuite/g++.dg/ext/pr57362.C new file mode 100644 index 0000000000..71c53d3761 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr57362.C @@ -0,0 +1,198 @@ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-require-ifunc "" } */ + +__attribute__((target("default"))) +int foo(void) { return 1; } +__attribute__((target("128bit-long-double"))) +int foo(void) { return 1; } +__attribute__((target("80387"))) +int foo(void) { return 1; } +__attribute__((target("96bit-long-double"))) +int foo(void) { return 1; } +__attribute__((target("long-double-80"))) +int foo(void) { return 1; } +__attribute__((target("long-double-64"))) +int foo(void) { return 1; } +__attribute__((target("accumulate-outgoing-args"))) +int foo(void) { return 1; } +__attribute__((target("align-double"))) +int foo(void) { return 1; } +__attribute__((target("align-stringops"))) +int foo(void) { return 1; } +__attribute__((target("fancy-math-387"))) +int foo(void) { return 1; } +__attribute__((target("force-drap"))) +int foo(void) { return 1; } +__attribute__((target("fp-ret-in-387"))) +int foo(void) { return 1; } +__attribute__((target("hard-float"))) +int foo(void) { return 1; } +__attribute__((target("ieee-fp"))) +int foo(void) { return 1; } +__attribute__((target("inline-all-stringops"))) +int foo(void) { return 1; } +__attribute__((target("inline-stringops-dynamically"))) +int foo(void) { return 1; } +__attribute__((target("intel-syntax"))) +int foo(void) { return 1; } +__attribute__((target("ms-bitfields"))) +int foo(void) { return 1; } +__attribute__((target("no-align-stringops"))) +int foo(void) { return 1; } +__attribute__((target("no-fancy-math-387"))) +int foo(void) { return 1; } +__attribute__((target("no-push-args"))) +int foo(void) { return 1; } +__attribute__((target("no-red-zone"))) +int foo(void) { return 1; } +__attribute__((target("omit-leaf-frame-pointer"))) +int foo(void) { return 1; } +__attribute__((target("pc32"))) +int foo(void) { return 1; } +__attribute__((target("pc64"))) +int foo(void) { return 1; } +__attribute__((target("pc80"))) +int foo(void) { return 1; } +__attribute__((target("push-args"))) +int foo(void) { return 1; } +__attribute__((target("red-zone"))) +int foo(void) { return 1; } +__attribute__((target("rtd"))) +int foo(void) { return 1; } +__attribute__((target("soft-float"))) +int foo(void) { return 1; } +__attribute__((target("sseregparm"))) +int foo(void) { return 1; } +__attribute__((target("stackrealign"))) +int foo(void) { return 1; } +__attribute__((target("stack-arg-probe"))) +int foo(void) { return 1; } +__attribute__((target("tls-direct-seg-refs"))) +int foo(void) { return 1; } +__attribute__((target("vect8-ret-in-mem"))) +int foo(void) { return 1; } +__attribute__((target("recip"))) +int foo(void) { return 1; } +__attribute__((target("cld"))) +int foo(void) { return 1; } +__attribute__((target("vzeroupper"))) +int foo(void) { return 1; } +__attribute__((target("dispatch-scheduler"))) +int foo(void) { return 1; } +__attribute__((target("prefer-avx128"))) +int foo(void) { return 1; } +__attribute__((target("32"))) +int foo(void) { return 1; } +__attribute__((target("64"))) +int foo(void) { return 1; } +__attribute__((target("x32"))) +int foo(void) { return 1; } +__attribute__((target("mmx"))) +int foo(void) { return 1; } +__attribute__((target("3dnow"))) +int foo(void) { return 1; } +__attribute__((target("3dnowa"))) +int foo(void) { return 1; } +__attribute__((target("sse"))) +int foo(void) { return 1; } +__attribute__((target("sse2"))) +int foo(void) { return 1; } +__attribute__((target("sse3"))) +int foo(void) { return 1; } +__attribute__((target("ssse3"))) +int foo(void) { return 1; } +__attribute__((target("sse4.1"))) +int foo(void) { return 1; } +__attribute__((target("sse4.2"))) +int foo(void) { return 1; } +__attribute__((target("sse4"))) +int foo(void) { return 1; } +__attribute__((target("no-sse4"))) +int foo(void) { return 1; } +__attribute__((target("sse5"))) +int foo(void) { return 1; } +__attribute__((target("avx"))) +int foo(void) { return 1; } +__attribute__((target("avx2"))) +int foo(void) { return 1; } +__attribute__((target("fma"))) +int foo(void) { return 1; } +__attribute__((target("sse4a"))) +int foo(void) { return 1; } +__attribute__((target("fma4"))) +int foo(void) { return 1; } +__attribute__((target("xop"))) +int foo(void) { return 1; } +__attribute__((target("lwp"))) +int foo(void) { return 1; } +__attribute__((target("abm"))) +int foo(void) { return 1; } +__attribute__((target("popcnt"))) +int foo(void) { return 1; } +__attribute__((target("bmi"))) +int foo(void) { return 1; } +__attribute__((target("bmi2"))) +int foo(void) { return 1; } +__attribute__((target("lzcnt"))) +int foo(void) { return 1; } +__attribute__((target("hle"))) +int foo(void) { return 1; } +__attribute__((target("rdseed"))) +int foo(void) { return 1; } +__attribute__((target("prfchw"))) +int foo(void) { return 1; } +__attribute__((target("adx"))) +int foo(void) { return 1; } +__attribute__((target("fxsr"))) +int foo(void) { return 1; } +__attribute__((target("xsave"))) +int foo(void) { return 1; } +__attribute__((target("xsaveopt"))) +int foo(void) { return 1; } +__attribute__((target("tbm"))) +int foo(void) { return 1; } +__attribute__((target("cx16"))) +int foo(void) { return 1; } +__attribute__((target("sahf"))) +int foo(void) { return 1; } +__attribute__((target("movbe"))) +int foo(void) { return 1; } +__attribute__((target("crc32"))) +int foo(void) { return 1; } +__attribute__((target("aes"))) +int foo(void) { return 1; } +__attribute__((target("pclmul"))) +int foo(void) { return 1; } +__attribute__((target("sse2avx"))) +int foo(void) { return 1; } +__attribute__((target("fsgsbase"))) +int foo(void) { return 1; } +__attribute__((target("rdrnd"))) +int foo(void) { return 1; } +__attribute__((target("f16c"))) +int foo(void) { return 1; } +__attribute__((target("fentry"))) +int foo(void) { return 1; } +__attribute__((target("8bit-idiv"))) +int foo(void) { return 1; } +__attribute__((target("avx256-split-unaligned-load"))) +int foo(void) { return 1; } +__attribute__((target("avx256-split-unaligned-store"))) +int foo(void) { return 1; } +__attribute__((target("rtm"))) +int foo(void) { return 1; } +//--------------- + +#include <stdio.h> + int main (void) + { + int result; + result = foo(); + printf("Result is %d\n", result); + return result; + } + +/* { dg-prune-output "attribute.* is unknown" } */ +/* { dg-prune-output "missing 'target' attribute*" } */ +/* { dg-prune-output "redefinition of 'int foo" } */ +/* { dg-prune-output "No dispatcher found for" } */ diff --git a/gcc/testsuite/g++.dg/ext/pr57509.C b/gcc/testsuite/g++.dg/ext/pr57509.C new file mode 100644 index 0000000000..b89d9094d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr57509.C @@ -0,0 +1,15 @@ +/* { dg-do compile { target c++11 } } */ + +template <bool> struct enable_if {}; +template <> struct enable_if<true> {typedef void type;}; +template <class T> void f (T& v) { v = __builtin_shuffle (v, v); } +template <class T> void g (T const&) {} +template <class T> auto g (T const& x) -> typename enable_if<sizeof(__builtin_shuffle(x,x))!=2>::type {} +typedef int v4i __attribute__((vector_size(4*sizeof(int)))); +typedef float v4f __attribute__((vector_size(4*sizeof(float)))); +int main(){ + v4i a = {1,2,3,0}; + f(a); + v4f b = {1,2,3,0}; + g(b); +} diff --git a/gcc/testsuite/g++.dg/ext/pr57548.C b/gcc/testsuite/g++.dg/ext/pr57548.C new file mode 100644 index 0000000000..1cc728d294 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr57548.C @@ -0,0 +1,25 @@ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-require-ifunc "" } */ + +int fum (); // Extra declaration that is merged with the second one. +int fum () __attribute__ ((target("default"))); + + +int fum () __attribute__((target( "mmx"))); +int fum () __attribute__((target( "popcnt"))); +int fum () __attribute__((target( "sse"))); +int fum () __attribute__((target( "sse2"))); +int fum () __attribute__((target( "sse3"))); +int fum () __attribute__((target( "ssse3"))); +int fum () __attribute__((target( "sse4.1"))); +int fum () __attribute__((target( "sse4.2"))); +int fum () __attribute__((target( "avx"))); +int fum () __attribute__((target( "avx2"))); + +int fum () __attribute__((target("arch=core2"))); +int fum () __attribute__((target("arch=corei7"))); +int fum () __attribute__((target("arch=atom"))); + +int (*p)() = &fum; + +int j = fum(); diff --git a/gcc/testsuite/g++.dg/ext/pr57735.C b/gcc/testsuite/g++.dg/ext/pr57735.C new file mode 100644 index 0000000000..0eb95006dd --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr57735.C @@ -0,0 +1,145 @@ +/* { dg-do compile { target arm*-*-* } } */ +/* { dg-options "-march=armv5te -marm -mtune=xscale -mfloat-abi=soft -O1" } */ + +typedef unsigned int size_t; +__extension__ +typedef long long int int64_t; +namespace WTF { + template<typename T> class RefPtr { + public: + inline T* operator->() const { return m_ptr; } + T* m_ptr; + }; +} +using WTF::RefPtr; +namespace JSC { + class ExecState; + class JSString; + typedef int64_t EncodedJSValue; + class JSValue { + public: + static EncodedJSValue encode(JSValue); + JSString* toString(ExecState*) const; + }; +} +typedef unsigned char LChar; + typedef short unsigned int UChar; +namespace WTF { + template<typename T, size_t inlineCapacity = 0> + class Vector { + public: + template<typename U> bool tryAppend(const U*, size_t); + }; +} +using WTF::Vector; +namespace WTF { +template<typename CharType> inline bool isASCIIDigit(CharType c) +{ +} +template<typename CharType> inline bool isASCIIHexDigit(CharType c) +{ + return isASCIIDigit(c) || ((c | 0x20) >= 'a' && (c | 0x20) <= 'f'); +} + class StringImpl; +} +using WTF::StringImpl; +namespace WTF { +class StringImpl { +public: + unsigned length() const { return m_length; } + unsigned m_length; +}; +} +namespace JSC { + class Register { + }; +class UString { +public: + unsigned length() const + { + return m_impl->length(); + } + const LChar* characters8() const + { + } + RefPtr<StringImpl> m_impl; +}; + class ExecState : private Register { + public: + JSValue argument(size_t argument) + { + } + }; + class JSCell { + }; + class JSString : public JSCell { + public: + const UString& value(ExecState*) const; + }; +class JSStringBuilder { +public: + void append(const UChar u) + { + m_okay &= buffer16.tryAppend(&u, 1); + } + Vector<UChar, 64> buffer16; + bool m_okay; +}; +template <typename T> +class Lexer { +public: + static unsigned char convertHex(int c1, int c2); +}; +} +namespace WTF { +namespace Unicode { + int UTF8SequenceLength(char); + int decodeUTF8Sequence(const char*); +} +} +using namespace WTF; +using namespace Unicode; +namespace JSC { +template <typename CharType> +static JSValue decode(ExecState* exec, const CharType* characters, int length, const char* doNotUnescape, bool strict) +{ + JSStringBuilder builder; + int k = 0; + UChar u = 0; + while (k < length) { + const CharType* p = characters + k; + CharType c = *p; + if (c == '%') { + int charLen = 0; + if (k <= length - 3 && isASCIIHexDigit(p[1]) && isASCIIHexDigit(p[2])) { + const char b0 = Lexer<CharType>::convertHex(p[1], p[2]); + const int sequenceLen = UTF8SequenceLength(b0); + if (sequenceLen && k <= length - sequenceLen * 3) { + charLen = sequenceLen * 3; + char sequence[5]; + if (charLen != 0) { + const int character = decodeUTF8Sequence(sequence); + if (character < 0 || character >= 0x110000) + charLen = 0; + else if (character >= 0x10000) { + builder.append(static_cast<UChar>(0xD800 | ((character - 0x10000) >> 10))); + } else + u = static_cast<UChar>(character); + } + } + } + } + } +} +static JSValue decode(ExecState* exec, const char* doNotUnescape, bool strict) +{ + UString str = exec->argument(0).toString(exec)->value(exec); + return decode(exec, str.characters8(), str.length(), doNotUnescape, strict); +} +EncodedJSValue globalFuncDecodeURI(ExecState* exec) +{ + static const char do_not_unescape_when_decoding_URI[] = + "#$&+,/:;=?@"; + return JSValue::encode(decode(exec, do_not_unescape_when_decoding_URI, true)); +} +} diff --git a/gcc/testsuite/g++.dg/ext/pr58834.C b/gcc/testsuite/g++.dg/ext/pr58834.C new file mode 100644 index 0000000000..0293033317 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr58834.C @@ -0,0 +1,5 @@ +template<typename> void foo() +{ + int i __attribute__((vector_size(2*sizeof(int)))); + (void) __builtin_shuffle(i, i); +} diff --git a/gcc/testsuite/g++.dg/ext/pr59378.C b/gcc/testsuite/g++.dg/ext/pr59378.C new file mode 100644 index 0000000000..19d06b5930 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr59378.C @@ -0,0 +1,8 @@ +// { dg-do compile } +typedef int v4si __attribute__ ((vector_size (4*sizeof(int)))); +template<int C> +void traverse(v4si& bounds){ + v4si m = {0,1,2,3}; + bounds = __builtin_shuffle(bounds, m); +} +template void traverse<0>(v4si&); diff --git a/gcc/testsuite/g++.dg/ext/pr59706.C b/gcc/testsuite/g++.dg/ext/pr59706.C new file mode 100644 index 0000000000..b82b45e2d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr59706.C @@ -0,0 +1,21 @@ +// PR middle-end/59706 +// { dg-do compile } + +extern struct S s; +struct T { T (); ~T (); int t; } t; + +void +foo () +{ + #pragma GCC ivdep + while (s) // { dg-error "could not convert" } + ; +} + +void +bar () +{ + #pragma GCC ivdep + while (t) // { dg-error "could not convert" } + ; +} diff --git a/gcc/testsuite/g++.dg/ext/restrict2.C b/gcc/testsuite/g++.dg/ext/restrict2.C new file mode 100644 index 0000000000..f053210028 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/restrict2.C @@ -0,0 +1,8 @@ +// PR c++/60872 +// { dg-options "" } + +typedef double *__restrict T; +void f(T* p) +{ + void *p2 = p; +} diff --git a/gcc/testsuite/g++.dg/ext/sizeof-complit.C b/gcc/testsuite/g++.dg/ext/sizeof-complit.C new file mode 100644 index 0000000000..6cf6d4e1fa --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/sizeof-complit.C @@ -0,0 +1,5 @@ +// PR c++/18126 +// { dg-options "" } + +struct s { int a; int b; }; +char x[((sizeof (struct s){ 1, 2 }) == sizeof (struct s)) ? 1 : -1]; diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr15.C b/gcc/testsuite/g++.dg/ext/stmtexpr15.C new file mode 100644 index 0000000000..83a831cdd4 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr15.C @@ -0,0 +1,7 @@ +// PR c++/59097 +// { dg-options "" } + +void foo() +{ + int x[({ return; })]; // { dg-error "non-integral" } +} diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr16.C b/gcc/testsuite/g++.dg/ext/stmtexpr16.C new file mode 100644 index 0000000000..ddce40c050 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr16.C @@ -0,0 +1,10 @@ +// PR c++/63455 +// { dg-options "-std=gnu++11" } + +int main() +{ + int x = 0; + + // without '+0', gcc 4.6 gives a different error (no ICE though) + decltype(({ int y = x; y; })+0) v1 = 0; +} diff --git a/gcc/testsuite/g++.dg/ext/strncpy-chk1.C b/gcc/testsuite/g++.dg/ext/strncpy-chk1.C index 7770ba9312..ebafc99887 100644 --- a/gcc/testsuite/g++.dg/ext/strncpy-chk1.C +++ b/gcc/testsuite/g++.dg/ext/strncpy-chk1.C @@ -1,6 +1,7 @@ // PR c++/40502 // { dg-do compile } // { dg-options "-O2" } +// { dg-skip-if "packed attribute missing for struct A" { "epiphany-*-*" } { "*" } { "" } } struct A { char x[12], y[35]; }; struct B { char z[50]; }; diff --git a/gcc/testsuite/g++.dg/ext/sync-4.C b/gcc/testsuite/g++.dg/ext/sync-4.C new file mode 100644 index 0000000000..24bc663999 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/sync-4.C @@ -0,0 +1,121 @@ +/* { dg-do run { target hppa*-*-hpux* *-*-linux* *-*-gnu* powerpc*-*-darwin* *-*-darwin[912]* } } */ +/* { dg-require-effective-target sync_long_long_runtime } */ +/* { dg-options "-fexceptions -fnon-call-exceptions -O2" } */ + +/* Verify that the builtin functions are correctly marked as trapping + when using -fnon-call-exceptions. */ + +#include <stdlib.h> +#include <signal.h> + +typedef int ditype __attribute__ ((mode (DI))); + +#define FN(IDX, RET, CALL) \ +static RET f ## IDX (void *p) __attribute__ ((noinline)); \ +static RET \ +f ## IDX (void *p) \ +{ \ + return CALL; \ +} \ +static void \ +t ## IDX () \ +{ \ + try \ + { \ + f ## IDX(0); \ + } \ + catch (...) \ + { \ + return; \ + } \ + abort(); \ +} + +FN(1, ditype, (__sync_fetch_and_add((ditype*)p, 1))) +FN(2, ditype, (__sync_fetch_and_sub((ditype*)p, 1))) +FN(3, ditype, (__sync_fetch_and_or((ditype*)p, 1))) +FN(4, ditype, (__sync_fetch_and_and((ditype*)p, 1))) +FN(5, ditype, (__sync_fetch_and_xor((ditype*)p, 1))) +FN(6, ditype, (__sync_fetch_and_nand((ditype*)p, 1))) + +FN( 7, ditype, (__sync_add_and_fetch((ditype*)p, 1))) +FN( 8, ditype, (__sync_sub_and_fetch((ditype*)p, 1))) +FN( 9, ditype, (__sync_or_and_fetch((ditype*)p, 1))) +FN(10, ditype, (__sync_and_and_fetch((ditype*)p, 1))) +FN(11, ditype, (__sync_xor_and_fetch((ditype*)p, 1))) +FN(12, ditype, (__sync_nand_and_fetch((ditype*)p, 1))) + +FN(13, bool, (__sync_bool_compare_and_swap((ditype*)p, 1, 2))) +FN(14, ditype, (__sync_val_compare_and_swap((ditype*)p, 1, 2))) + +FN(15, ditype, (__sync_lock_test_and_set((ditype*)p, 1))) +FN(16, void, (__sync_lock_release((ditype*)p))) + +FN(17, bool, (__atomic_test_and_set((ditype*)p, __ATOMIC_SEQ_CST))) +FN(18, void, (__atomic_clear((ditype*)p, __ATOMIC_SEQ_CST))) + +FN(19, void, (__atomic_exchange((ditype*)p, (ditype*)0, (ditype*)0, __ATOMIC_SEQ_CST))) +FN(20, ditype, (__atomic_exchange_n((ditype*)p, 1, 2))) + +FN(21, void, (__atomic_load((ditype*)p, (ditype*)0, __ATOMIC_SEQ_CST))) +FN(22, ditype, (__atomic_load_n((ditype*)p, __ATOMIC_SEQ_CST))) + +FN(23, bool, (__atomic_compare_exchange((ditype*)p, (ditype*)0, (ditype*)0, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))) +FN(24, bool, (__atomic_compare_exchange_n((ditype*)p, (ditype*)0, 1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST))) + +FN(25, void, (__atomic_store((ditype*)p, (ditype*)0, __ATOMIC_SEQ_CST))) +FN(26, void, (__atomic_store_n((ditype*)p, 1, __ATOMIC_SEQ_CST))) + +FN(27, ditype, (__atomic_add_fetch((ditype*)p, 1, __ATOMIC_SEQ_CST))) +FN(28, ditype, (__atomic_sub_fetch((ditype*)p, 1, __ATOMIC_SEQ_CST))) +FN(29, ditype, (__atomic_and_fetch((ditype*)p, 1, __ATOMIC_SEQ_CST))) +FN(30, ditype, (__atomic_nand_fetch((ditype*)p, 1, __ATOMIC_SEQ_CST))) +FN(31, ditype, (__atomic_xor_fetch((ditype*)p, 1, __ATOMIC_SEQ_CST))) +FN(32, ditype, (__atomic_or_fetch((ditype*)p, 1, __ATOMIC_SEQ_CST))) + +FN(33, ditype, (__atomic_fetch_add((ditype*)p, 1, __ATOMIC_SEQ_CST))) +FN(34, ditype, (__atomic_fetch_sub((ditype*)p, 1, __ATOMIC_SEQ_CST))) +FN(35, ditype, (__atomic_fetch_and((ditype*)p, 1, __ATOMIC_SEQ_CST))) +FN(36, ditype, (__atomic_fetch_nand((ditype*)p, 1, __ATOMIC_SEQ_CST))) +FN(37, ditype, (__atomic_fetch_xor((ditype*)p, 1, __ATOMIC_SEQ_CST))) +FN(38, ditype, (__atomic_fetch_or((ditype*)p, 1, __ATOMIC_SEQ_CST))) + +static void +handler(int) +{ + sigset_t clear; + + sigfillset (&clear); + sigprocmask (SIG_UNBLOCK, &clear, NULL); + throw 0; +} + +int +main () +{ + signal (SIGSEGV, handler); + signal (SIGBUS, handler); + + t1(); + t2(); + t3(); + t4(); + t5(); + t6(); + t7(); + t8(); + t9(); + t10(); + t11(); + t12(); + t13(); + t14(); + t15(); + t16(); + t17(); + t18(); + t19(); + t20(); + + exit(0); +} diff --git a/gcc/testsuite/g++.dg/ext/timevar2.C b/gcc/testsuite/g++.dg/ext/timevar2.C new file mode 100644 index 0000000000..74c4fc8cfa --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/timevar2.C @@ -0,0 +1,14 @@ +// PR c++/57524 +// { dg-options "-ftime-report" } +// { dg-prune-output "wall" } +// { dg-prune-output "times" } +// { dg-prune-output "TOTAL" } +// { dg-prune-output "checks" } + +namespace detail { +namespace indirect_traits {} +using namespace indirect_traits; +void fn1() { +using namespace detail; +} +} diff --git a/gcc/testsuite/g++.dg/ext/traits1.C b/gcc/testsuite/g++.dg/ext/traits1.C new file mode 100644 index 0000000000..24099e53cd --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/traits1.C @@ -0,0 +1,4 @@ +// PR c++/58504 + +template<bool = __has_nothrow_assign(void)> struct A {}; +A<> a; diff --git a/gcc/testsuite/g++.dg/ext/transparent-union.C b/gcc/testsuite/g++.dg/ext/transparent-union.C new file mode 100644 index 0000000000..1231563610 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/transparent-union.C @@ -0,0 +1,5 @@ +// PR c++/53761 + +typedef union { // { dg-error "type transparent" } + double x; +} __attribute__(( __transparent_union__ )) example_t; diff --git a/gcc/testsuite/g++.dg/ext/typeof10.C b/gcc/testsuite/g++.dg/ext/typeof10.C index 1b357ad9d7..614538527a 100644 --- a/gcc/testsuite/g++.dg/ext/typeof10.C +++ b/gcc/testsuite/g++.dg/ext/typeof10.C @@ -5,7 +5,7 @@ template<int> struct A { void foo() { - typedef int T; // { dg-error "previous" } + typedef int T; // { dg-message "previous" } typedef __typeof__(*this) T; // { dg-error "conflicting" } } }; diff --git a/gcc/testsuite/g++.dg/ext/underlying_type1.C b/gcc/testsuite/g++.dg/ext/underlying_type1.C index a8f68d3d60..999cd9f35b 100644 --- a/gcc/testsuite/g++.dg/ext/underlying_type1.C +++ b/gcc/testsuite/g++.dg/ext/underlying_type1.C @@ -8,7 +8,7 @@ template<typename T> { typedef __underlying_type(T) type; }; // { dg-error "not an enumeration" } __underlying_type(int) i1; // { dg-error "not an enumeration|invalid" } -__underlying_type(A) i2; // { dg-error "expected" } +__underlying_type(A) i2; // { dg-error "expected|type" } __underlying_type(B) i3; // { dg-error "not an enumeration|invalid" } __underlying_type(U) i4; // { dg-error "not an enumeration|invalid" } diff --git a/gcc/testsuite/g++.dg/ext/underlying_type10.C b/gcc/testsuite/g++.dg/ext/underlying_type10.C index cb57407fe8..66ba02e997 100644 --- a/gcc/testsuite/g++.dg/ext/underlying_type10.C +++ b/gcc/testsuite/g++.dg/ext/underlying_type10.C @@ -1,5 +1,4 @@ -// { dg-do run } -// { dg-options "-std=c++0x" } +// { dg-do run { target c++11 } } #include <cassert> diff --git a/gcc/testsuite/g++.dg/ext/underlying_type3.C b/gcc/testsuite/g++.dg/ext/underlying_type3.C index b78cc7dd3f..1209171f2d 100644 --- a/gcc/testsuite/g++.dg/ext/underlying_type3.C +++ b/gcc/testsuite/g++.dg/ext/underlying_type3.C @@ -1,5 +1,4 @@ -// { dg-do compile } -// { dg-options "-std=c++0x" } +// { dg-do compile { target c++11 } } template<typename T1, typename T2> struct is_same diff --git a/gcc/testsuite/g++.dg/ext/underlying_type5.C b/gcc/testsuite/g++.dg/ext/underlying_type5.C index a9c19924b9..aad53006ee 100644 --- a/gcc/testsuite/g++.dg/ext/underlying_type5.C +++ b/gcc/testsuite/g++.dg/ext/underlying_type5.C @@ -1,5 +1,4 @@ -// { dg-do compile } -// { dg-options "-std=c++0x" } +// { dg-do compile { target c++11 } } template<typename T1, typename T2> struct is_same diff --git a/gcc/testsuite/g++.dg/ext/underlying_type6.C b/gcc/testsuite/g++.dg/ext/underlying_type6.C index 50f528856d..91be4d5d99 100644 --- a/gcc/testsuite/g++.dg/ext/underlying_type6.C +++ b/gcc/testsuite/g++.dg/ext/underlying_type6.C @@ -1,5 +1,4 @@ -// { dg-do compile } -// { dg-options "-std=c++0x" } +// { dg-do compile { target c++11 } } template<typename T1, typename T2> struct is_same diff --git a/gcc/testsuite/g++.dg/ext/underlying_type7.C b/gcc/testsuite/g++.dg/ext/underlying_type7.C index 872fe52b00..2d6ec51792 100644 --- a/gcc/testsuite/g++.dg/ext/underlying_type7.C +++ b/gcc/testsuite/g++.dg/ext/underlying_type7.C @@ -1,5 +1,4 @@ -// { dg-do compile } -// { dg-options "-std=c++0x" } +// { dg-do compile { target c++11 } } enum E1 : unsigned { E1_en = 1 }; enum E2 : char { E2_en = 1 }; diff --git a/gcc/testsuite/g++.dg/ext/underlying_type8.C b/gcc/testsuite/g++.dg/ext/underlying_type8.C index 0bbed2b489..95e76fa247 100644 --- a/gcc/testsuite/g++.dg/ext/underlying_type8.C +++ b/gcc/testsuite/g++.dg/ext/underlying_type8.C @@ -1,5 +1,4 @@ -// { dg-do compile } -// { dg-options "-std=c++0x" } +// { dg-do compile { target c++11 } } enum E1 : unsigned { E1_en = 1 }; enum E2 : char { E2_en = 1 }; diff --git a/gcc/testsuite/g++.dg/ext/underlying_type9.C b/gcc/testsuite/g++.dg/ext/underlying_type9.C index 9ffd24439a..2c564560e3 100644 --- a/gcc/testsuite/g++.dg/ext/underlying_type9.C +++ b/gcc/testsuite/g++.dg/ext/underlying_type9.C @@ -1,5 +1,4 @@ -// { dg-do compile } -// { dg-options "-std=c++0x" } +// { dg-do compile { target c++11 } } template<typename T1, typename T2> struct is_same diff --git a/gcc/testsuite/g++.dg/ext/utf-array-short-wchar.C b/gcc/testsuite/g++.dg/ext/utf-array-short-wchar.C index a549f69738..2ce774abc4 100644 --- a/gcc/testsuite/g++.dg/ext/utf-array-short-wchar.C +++ b/gcc/testsuite/g++.dg/ext/utf-array-short-wchar.C @@ -1,7 +1,7 @@ /* 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" } */ +/* { dg-do compile { target c++11 } } */ +/* { dg-options "-fshort-wchar" } */ const char s_0[] = "ab"; const char s_1[] = u"ab"; /* { dg-error "from wide string" } */ diff --git a/gcc/testsuite/g++.dg/ext/utf-array.C b/gcc/testsuite/g++.dg/ext/utf-array.C index 6a14f79e5f..21e438693a 100644 --- a/gcc/testsuite/g++.dg/ext/utf-array.C +++ b/gcc/testsuite/g++.dg/ext/utf-array.C @@ -1,7 +1,7 @@ /* 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" } */ +/* { dg-do compile { target c++11 } } */ +// { dg-options "" } const char s_0[] = "ab"; const char s_1[] = u"ab"; /* { dg-error "from wide string" } */ diff --git a/gcc/testsuite/g++.dg/ext/utf-badconcat.C b/gcc/testsuite/g++.dg/ext/utf-badconcat.C index bab020e4fe..4079b83879 100644 --- a/gcc/testsuite/g++.dg/ext/utf-badconcat.C +++ b/gcc/testsuite/g++.dg/ext/utf-badconcat.C @@ -1,7 +1,6 @@ /* 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" } */ +/* { dg-do compile { target c++11 } } */ const void *s0 = u"a" "b"; const void *s1 = "a" u"b"; diff --git a/gcc/testsuite/g++.dg/ext/utf-badconcat2.C b/gcc/testsuite/g++.dg/ext/utf-badconcat2.C index 499b323fc1..0d3fe33039 100644 --- a/gcc/testsuite/g++.dg/ext/utf-badconcat2.C +++ b/gcc/testsuite/g++.dg/ext/utf-badconcat2.C @@ -1,6 +1,5 @@ // Test unsupported concatenation of UTF-8 string literals. -// { dg-do compile } -// { dg-options "-std=c++0x" } +// { dg-do compile { target c++11 } } const void *s0 = u8"a" "b"; const void *s1 = "a" u8"b"; diff --git a/gcc/testsuite/g++.dg/ext/utf-cvt.C b/gcc/testsuite/g++.dg/ext/utf-cvt.C index 286a0d0071..366c3d4179 100644 --- a/gcc/testsuite/g++.dg/ext/utf-cvt.C +++ b/gcc/testsuite/g++.dg/ext/utf-cvt.C @@ -1,7 +1,7 @@ /* 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" } */ +/* { dg-do compile { target c++11 } } */ +/* { dg-options "-Wall -Wconversion -Wsign-conversion -Wsign-promo" } */ extern void f_c (char); extern void fsc (signed char); diff --git a/gcc/testsuite/g++.dg/ext/utf-cxx0x.C b/gcc/testsuite/g++.dg/ext/utf-cxx0x.C index 1daa0dee48..221ccf0934 100644 --- a/gcc/testsuite/g++.dg/ext/utf-cxx0x.C +++ b/gcc/testsuite/g++.dg/ext/utf-cxx0x.C @@ -1,7 +1,6 @@ /* 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" } */ +/* { dg-do compile { target c++11 } } */ #define u L #define U L diff --git a/gcc/testsuite/g++.dg/ext/utf-cxx98.C b/gcc/testsuite/g++.dg/ext/utf-cxx98.C index a8dd13a4e3..365118e396 100644 --- a/gcc/testsuite/g++.dg/ext/utf-cxx98.C +++ b/gcc/testsuite/g++.dg/ext/utf-cxx98.C @@ -8,9 +8,7 @@ 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 + diff --git a/gcc/testsuite/g++.dg/ext/utf-dflt.C b/gcc/testsuite/g++.dg/ext/utf-dflt.C index 04849bfbf0..c2b127d5dd 100644 --- a/gcc/testsuite/g++.dg/ext/utf-dflt.C +++ b/gcc/testsuite/g++.dg/ext/utf-dflt.C @@ -8,9 +8,7 @@ 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 + diff --git a/gcc/testsuite/g++.dg/ext/utf-dflt2.C b/gcc/testsuite/g++.dg/ext/utf-dflt2.C index fd2222f672..ab18ef52fd 100644 --- a/gcc/testsuite/g++.dg/ext/utf-dflt2.C +++ b/gcc/testsuite/g++.dg/ext/utf-dflt2.C @@ -3,7 +3,6 @@ // { dg-options "-std=c++98" } const void *s0 = u8"a"; // { dg-error "was not declared" } - // { dg-error "expected ',' or ';'" "" { target *-*-* } 5 } #define u8 "a" diff --git a/gcc/testsuite/g++.dg/ext/utf-gnuxx0x.C b/gcc/testsuite/g++.dg/ext/utf-gnuxx0x.C index 0a6967fe40..221ccf0934 100644 --- a/gcc/testsuite/g++.dg/ext/utf-gnuxx0x.C +++ b/gcc/testsuite/g++.dg/ext/utf-gnuxx0x.C @@ -1,7 +1,6 @@ /* 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" } */ +/* { dg-do compile { target c++11 } } */ #define u L #define U L diff --git a/gcc/testsuite/g++.dg/ext/utf-gnuxx98.C b/gcc/testsuite/g++.dg/ext/utf-gnuxx98.C index fc8068b7e9..b3be121e2d 100644 --- a/gcc/testsuite/g++.dg/ext/utf-gnuxx98.C +++ b/gcc/testsuite/g++.dg/ext/utf-gnuxx98.C @@ -8,9 +8,7 @@ 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 + diff --git a/gcc/testsuite/g++.dg/ext/utf-mangle.C b/gcc/testsuite/g++.dg/ext/utf-mangle.C index a131887882..546566f083 100644 --- a/gcc/testsuite/g++.dg/ext/utf-mangle.C +++ b/gcc/testsuite/g++.dg/ext/utf-mangle.C @@ -1,7 +1,6 @@ // 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" } +// { dg-do compile { target c++11 } } void f0 (char16_t c) {} void f1 (char32_t c) {} diff --git a/gcc/testsuite/g++.dg/ext/utf-rtti.C b/gcc/testsuite/g++.dg/ext/utf-rtti.C index b5d201b4d7..202625789e 100644 --- a/gcc/testsuite/g++.dg/ext/utf-rtti.C +++ b/gcc/testsuite/g++.dg/ext/utf-rtti.C @@ -1,7 +1,6 @@ /* 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" } */ +/* { dg-do link { target c++11 } } */ #include <typeinfo> diff --git a/gcc/testsuite/g++.dg/ext/utf-type.C b/gcc/testsuite/g++.dg/ext/utf-type.C index 41a83ff2ef..7e15647972 100644 --- a/gcc/testsuite/g++.dg/ext/utf-type.C +++ b/gcc/testsuite/g++.dg/ext/utf-type.C @@ -1,8 +1,8 @@ /* 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" } */ +/* { dg-do run { target c++11 } } */ +/* { dg-options "-Wall -Werror" } */ extern "C" void abort (void); diff --git a/gcc/testsuite/g++.dg/ext/utf-typedef-cxx0x.C b/gcc/testsuite/g++.dg/ext/utf-typedef-cxx0x.C index 641e836e41..3503f11a26 100644 --- a/gcc/testsuite/g++.dg/ext/utf-typedef-cxx0x.C +++ b/gcc/testsuite/g++.dg/ext/utf-typedef-cxx0x.C @@ -1,7 +1,6 @@ /* 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" } */ +/* { dg-do compile { target c++11 } } */ 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-typespec.C b/gcc/testsuite/g++.dg/ext/utf-typespec.C index 6a4af25598..aa10b72530 100644 --- a/gcc/testsuite/g++.dg/ext/utf-typespec.C +++ b/gcc/testsuite/g++.dg/ext/utf-typespec.C @@ -1,7 +1,6 @@ /* 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" } */ +/* { dg-do compile { target c++11 } } */ signed char16_t c0; /* { dg-error "signed" } */ signed char32_t c1; /* { dg-error "signed" } */ diff --git a/gcc/testsuite/g++.dg/ext/utf16-1.C b/gcc/testsuite/g++.dg/ext/utf16-1.C index fa07de912d..8754e4d824 100644 --- a/gcc/testsuite/g++.dg/ext/utf16-1.C +++ b/gcc/testsuite/g++.dg/ext/utf16-1.C @@ -1,7 +1,7 @@ /* 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" } */ +/* { dg-do run { target c++11 } } */ +/* { dg-options "-Wall -Werror" } */ extern "C" void abort (void); diff --git a/gcc/testsuite/g++.dg/ext/utf16-2.C b/gcc/testsuite/g++.dg/ext/utf16-2.C index d7a6056f81..4951e03443 100644 --- a/gcc/testsuite/g++.dg/ext/utf16-2.C +++ b/gcc/testsuite/g++.dg/ext/utf16-2.C @@ -1,7 +1,7 @@ /* 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" } */ +/* { dg-do run { target c++11 } } */ +/* { dg-options "-Wall -Werror" } */ extern "C" void abort (void); diff --git a/gcc/testsuite/g++.dg/ext/utf16-3.C b/gcc/testsuite/g++.dg/ext/utf16-3.C index 183347b6ee..370dcf1dc7 100644 --- a/gcc/testsuite/g++.dg/ext/utf16-3.C +++ b/gcc/testsuite/g++.dg/ext/utf16-3.C @@ -1,7 +1,7 @@ /* 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" } */ +/* { dg-do run { target c++11 } } */ +/* { dg-options "-Wall -Werror" } */ extern "C" void abort (void); diff --git a/gcc/testsuite/g++.dg/ext/utf16-4.C b/gcc/testsuite/g++.dg/ext/utf16-4.C index 21cdb53bde..807b77524a 100644 --- a/gcc/testsuite/g++.dg/ext/utf16-4.C +++ b/gcc/testsuite/g++.dg/ext/utf16-4.C @@ -1,7 +1,7 @@ /* 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" } */ +/* { dg-do compile { target c++11 } } */ + const static char16_t c0 = u''; /* { dg-error "empty character" } */ const static char16_t c1 = u'ab'; /* { dg-warning "constant too long" } */ diff --git a/gcc/testsuite/g++.dg/ext/utf32-1.C b/gcc/testsuite/g++.dg/ext/utf32-1.C index 98465a0a1b..848d3a93b4 100644 --- a/gcc/testsuite/g++.dg/ext/utf32-1.C +++ b/gcc/testsuite/g++.dg/ext/utf32-1.C @@ -1,7 +1,7 @@ /* 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" } */ +/* { dg-do run { target c++11 } } */ +/* { dg-options "-Wall -Werror" } */ extern "C" void abort (void); diff --git a/gcc/testsuite/g++.dg/ext/utf32-2.C b/gcc/testsuite/g++.dg/ext/utf32-2.C index e2256ba746..843e9b43e8 100644 --- a/gcc/testsuite/g++.dg/ext/utf32-2.C +++ b/gcc/testsuite/g++.dg/ext/utf32-2.C @@ -1,7 +1,7 @@ /* 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" } */ +/* { dg-do run { target c++11 } } */ +/* { dg-options "-Wall -Werror" } */ extern "C" void abort (void); diff --git a/gcc/testsuite/g++.dg/ext/utf32-3.C b/gcc/testsuite/g++.dg/ext/utf32-3.C index bba893cef5..f5d1db0d03 100644 --- a/gcc/testsuite/g++.dg/ext/utf32-3.C +++ b/gcc/testsuite/g++.dg/ext/utf32-3.C @@ -1,7 +1,7 @@ /* 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" } */ +/* { dg-do run { target c++11 } } */ +/* { dg-options "-Wall -Werror" } */ extern "C" void abort (void); diff --git a/gcc/testsuite/g++.dg/ext/utf32-4.C b/gcc/testsuite/g++.dg/ext/utf32-4.C index 744fea7c59..0b270304a0 100644 --- a/gcc/testsuite/g++.dg/ext/utf32-4.C +++ b/gcc/testsuite/g++.dg/ext/utf32-4.C @@ -1,7 +1,6 @@ /* 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" } */ +/* { dg-do compile { target c++11 } } */ const static char32_t c0 = U''; /* { dg-error "empty character" } */ const static char32_t c1 = U'ab'; /* { dg-warning "constant too long" } */ diff --git a/gcc/testsuite/g++.dg/ext/utf8-1.C b/gcc/testsuite/g++.dg/ext/utf8-1.C index 203b326af7..a1a3518a49 100644 --- a/gcc/testsuite/g++.dg/ext/utf8-1.C +++ b/gcc/testsuite/g++.dg/ext/utf8-1.C @@ -1,6 +1,6 @@ -// { dg-do run } +// { dg-do run { target c++11 } } // { dg-require-iconv "ISO-8859-2" } -// { dg-options "-std=c++0x -fexec-charset=ISO-8859-2" } +// { dg-options "-fexec-charset=ISO-8859-2" } const char *str1 = "h\u00e1\U0000010Dky "; const char *str2 = "\u010d\u00E1rky\n"; diff --git a/gcc/testsuite/g++.dg/ext/utf8-2.C b/gcc/testsuite/g++.dg/ext/utf8-2.C index 417a8bfdc1..bafe6e8351 100644 --- a/gcc/testsuite/g++.dg/ext/utf8-2.C +++ b/gcc/testsuite/g++.dg/ext/utf8-2.C @@ -1,5 +1,5 @@ -// { dg-do compile } -// { dg-options "-std=c++0x" } +// { dg-do compile { target c++11 } } +// { dg-options "" } const char s0[] = u8"ab"; const char16_t s1[] = u8"ab"; // { dg-error "from non-wide" } diff --git a/gcc/testsuite/g++.dg/ext/va-arg1.C b/gcc/testsuite/g++.dg/ext/va-arg1.C index 079db2e5c6..5606128e5f 100644 --- a/gcc/testsuite/g++.dg/ext/va-arg1.C +++ b/gcc/testsuite/g++.dg/ext/va-arg1.C @@ -4,5 +4,5 @@ struct A {}; void foo() { - ++__builtin_va_arg(0, A); // { dg-error "'\\+\\+va_arg\\(0, A\\)'" } + ++__builtin_va_arg(0, A); // { dg-error "operand type is 'A'" } } diff --git a/gcc/testsuite/g++.dg/ext/vector17.C b/gcc/testsuite/g++.dg/ext/vector17.C new file mode 100644 index 0000000000..eb389be01a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector17.C @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +typedef double __attribute__((vector_size(1024) )) vec; + +template <class T> +void f (T *p) +{ + p->~T(); +} +void g (vec *p) +{ + f(p); +} diff --git a/gcc/testsuite/g++.dg/ext/vector18.C b/gcc/testsuite/g++.dg/ext/vector18.C new file mode 100644 index 0000000000..402558ef93 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector18.C @@ -0,0 +1,13 @@ +/* { dg-do compile { target c++11 } } */ + +typedef signed char __attribute__((vector_size(128) )) vec; + +template <class A, class B> +auto f (A *a, B b) -> decltype (*a + b); + +void f (...) {} + +void g (vec *v, long long l) +{ + f (v, l); +} diff --git a/gcc/testsuite/g++.dg/ext/vector19.C b/gcc/testsuite/g++.dg/ext/vector19.C new file mode 100644 index 0000000000..a41e8d5170 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector19.C @@ -0,0 +1,51 @@ +/* { dg-do compile { target c++11 } } */ + +typedef double vec __attribute__((vector_size(2*sizeof(double)))); +typedef signed char vec2 __attribute__((vector_size(16))); +typedef unsigned char vec2u __attribute__((vector_size(16))); + +void f (vec *x, vec *y, vec *z) +{ + *x = (*y < *z) ? *x : *y; +} + +void g (vec *x, vec *y, vec *z) +{ + *x = (*y < *z) ? *x : 42; +} + +void h (vec *x, vec *y, vec *z) +{ + *x = (*y < *z) ? 3. : *y; +} + +void i1 (vec *x, vec *y, vec *z) +{ + auto c = *y < *z; + *x = c ? *x : *y; +} + +void i2 (vec2 *x, vec2 *y, vec2u *z) +{ + *x = *y ? *x : *y; + *y = *z ? *x : *y; +} + +void j (vec2 *x, vec2 *y, vec2 *z, vec *t) +{ + *x = (*y < *z) ? *x : 4.2; /* { dg-error "" } */ + *y = (*x < *z) ? 2.5 : *y; /* { dg-error "" } */ + *t = *t ? *t : *t; /* { dg-error "" } */ + *z = (*x < *z) ? '1' : '0'; +} + +template <class A, class B> +auto k (A *a, B b) -> decltype (*a ? *a : b); + +void k (...) {} + +void l (vec2 *v, double x) +{ + k (v, x); +} + diff --git a/gcc/testsuite/g++.dg/ext/vector20.C b/gcc/testsuite/g++.dg/ext/vector20.C new file mode 100644 index 0000000000..2199a22e48 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector20.C @@ -0,0 +1,6 @@ +/* { dg-do compile { target c++11 } } */ + +typedef long vec __attribute__((vector_size (2 * sizeof (long)))); +constexpr vec v = { 3, 4 }; +constexpr vec s = v + v; +constexpr vec w = __builtin_shuffle (v, v); diff --git a/gcc/testsuite/g++.dg/ext/vector21.C b/gcc/testsuite/g++.dg/ext/vector21.C new file mode 100644 index 0000000000..71634c3278 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector21.C @@ -0,0 +1,39 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-gimple" } */ + +typedef int vec __attribute__ ((vector_size (4 * sizeof (int)))); + +void f1 (vec *x) +{ + *x = (*x >= 0) ? *x : -*x; +} +void f2 (vec *x) +{ + *x = (0 < *x) ? *x : -*x; +} +void g1 (vec *x) +{ + *x = (*x < 0) ? -*x : *x; +} +void g2 (vec *x) +{ + *x = (0 > *x) ? -*x : *x; +} +void h (vec *x, vec *y) +{ + *x = (*x < *y) ? *y : *x; +} +void i (vec *x, vec *y) +{ + *x = (*x < *y) ? *x : *y; +} +void j (vec *x, vec *y) +{ + *x = (*x < *y) ? *x : *x; +} + +/* { dg-final { scan-tree-dump-times "ABS_EXPR" 4 "gimple" } } */ +/* { dg-final { scan-tree-dump "MIN_EXPR" "gimple" } } */ +/* { dg-final { scan-tree-dump "MAX_EXPR" "gimple" } } */ +/* { dg-final { scan-tree-dump-not "VEC_COND_EXPR" "gimple" } } */ +/* { dg-final { cleanup-tree-dump "gimple" } } */ diff --git a/gcc/testsuite/g++.dg/ext/vector22.C b/gcc/testsuite/g++.dg/ext/vector22.C new file mode 100644 index 0000000000..7c0279c68a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector22.C @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-gimple" } */ + +typedef unsigned vec __attribute__((vector_size(4*sizeof(int)))); + +/* Disabled after PR57286 +void f(vec*a,vec*b){ + *a=(*a)?-1:(*b<10); + *b=(*b)?(*a<10):0; +} +*/ +void g(vec*a,vec*b){ + *a=(*a)?(*a<*a):-1; + *b=(*b)?-1:(*b<*b); +} +void h(vec*a){ + *a=(~*a==5); +} + +/* { dg-final { scan-tree-dump-not "~" "gimple" } } */ +/* { dg-final { scan-tree-dump-not "VEC_COND_EXPR" "gimple" } } */ +/* { dg-final { cleanup-tree-dump "gimple" } } */ diff --git a/gcc/testsuite/g++.dg/ext/vector23.C b/gcc/testsuite/g++.dg/ext/vector23.C new file mode 100644 index 0000000000..461d8a9e96 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector23.C @@ -0,0 +1,28 @@ +/* { dg-do compile { target c++1y } } */ +/* { dg-options "-Wsign-conversion" } */ +// Ignore warning on some powerpc-linux configurations. +// { dg-prune-output "non-standard ABI extension" } +// Ignore warning on Linux/x86 +// { dg-prune-output "changes the ABI" } + +typedef double vecd __attribute__((vector_size(4*sizeof(double)))); +typedef float vecf __attribute__((vector_size(8*sizeof(float)))); +typedef long vecl __attribute__((vector_size(4*sizeof(long)))); +typedef short vecs __attribute__((vector_size(8*sizeof(short)))); +typedef char vecc __attribute__((vector_size(16*sizeof(char)))); + +auto f(vecf*a,float d,long long i){ + return (*a<0)?d:i; // { dg-error "truncation" } +} +auto g(vecc*a){ + return (*a<0)?3LL:42UL; // { dg-error "inferred scalar type" } +} +auto h(vecd*a){ + return (*a<0)?'a':'c'; // { dg-error "inferred scalar type \[^\\n\]*double" } +} +auto i(vecc*a){ + return (*a<0)?1:0.; // { dg-error "inferred scalar type" } +} +auto j(vecl*a,long i,unsigned long k){ + return (*a<0)?i:k; // { dg-warning "may change the sign" } +} diff --git a/gcc/testsuite/g++.dg/ext/vector24.C b/gcc/testsuite/g++.dg/ext/vector24.C new file mode 100644 index 0000000000..3eca7fb0bf --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector24.C @@ -0,0 +1,8 @@ +// { dg-do compile { target c++11 } } + +typedef long vec __attribute__((vector_size(2*sizeof(long)))); +constexpr vec v = { 33, 42 }; +constexpr auto l0 = v[0]; +constexpr auto l1 = v[1]; +static_assert(l0==33,"Fail"); +static_assert(l1==42,"Fail"); diff --git a/gcc/testsuite/g++.dg/ext/vector25.C b/gcc/testsuite/g++.dg/ext/vector25.C new file mode 100644 index 0000000000..6c1f5d0987 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector25.C @@ -0,0 +1,6 @@ +volatile int i __attribute__((vector_size(8))); + +void foo() +{ + i += i; +} diff --git a/gcc/testsuite/g++.dg/ext/vector26.C b/gcc/testsuite/g++.dg/ext/vector26.C new file mode 100644 index 0000000000..1d7a1e4716 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector26.C @@ -0,0 +1,9 @@ +// PR c++/59633 +// In C++98, the definition of bar is an error. In C++11, bar implicitly +// gets internal linkage. +// { dg-options "-mmmx" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ + +typedef enum { e } T __attribute__((vector_size(8))); +static void foo(T t) {} +void bar (T t) {} // { dg-error "no linkage" "" { target { ! c++11 } } } +// { dg-final { scan-assembler-not "globl\[ \t]*_Z3bar" { target c++11 } } } diff --git a/gcc/testsuite/g++.dg/ext/vector27.C b/gcc/testsuite/g++.dg/ext/vector27.C new file mode 100644 index 0000000000..288e13c558 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector27.C @@ -0,0 +1,7 @@ +// PR c++/58845 + +void foo() +{ + int v __attribute__((vector_size(8))); + v = v || v; // { dg-bogus "" "" { xfail *-*-* } } +} diff --git a/gcc/testsuite/g++.dg/ext/vector5.C b/gcc/testsuite/g++.dg/ext/vector5.C index e5304bcb12..68f711fe23 100644 --- a/gcc/testsuite/g++.dg/ext/vector5.C +++ b/gcc/testsuite/g++.dg/ext/vector5.C @@ -4,5 +4,5 @@ void foo() { int __attribute__((vector_size(8))) v; - v = 1/v; // { dg-error "invalid operands of types" } + v = 1/v; } diff --git a/gcc/testsuite/g++.dg/ext/visibility/anon6.C b/gcc/testsuite/g++.dg/ext/visibility/anon6.C index 951de4964e..c55432add8 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/anon6.C +++ b/gcc/testsuite/g++.dg/ext/visibility/anon6.C @@ -1,9 +1,11 @@ // PR c++/33094 // { dg-final { scan-assembler "1BIiE1cE" } } // { dg-final { scan-assembler-not "globl.*1BIiE1cE" } } -// { dg-final { scan-assembler-not "1CIiE1cE" } } +// { dg-final { scan-assembler-not "comdat" } } +// { dg-final { scan-assembler-not "weak" } } +// { dg-final { scan-assembler-not "1AIiE1cE" } } -// Test that B<int>::c is emitted as an internal symbol, and C<int>::c is +// Test that B<int>::c is emitted as an internal symbol, and A<int>::c is // not emitted. namespace @@ -18,7 +20,7 @@ namespace template <typename T> class B { - static const T c = 0; + __attribute__ ((__used__)) static const T c = 0; }; template <typename T> const T B<T>::c; diff --git a/gcc/testsuite/g++.dg/ext/visibility/anon8.C b/gcc/testsuite/g++.dg/ext/visibility/anon8.C index 5e58b55199..b8507497d3 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/anon8.C +++ b/gcc/testsuite/g++.dg/ext/visibility/anon8.C @@ -29,5 +29,5 @@ int main () call<&B2::fn2> (); // { dg-error "linkage|no matching" } call<&fn3> (); call<&B1::fn4> (); - call<&fn5> (); // { dg-error "linkage|no matching" "" { target c++98 } } + call<&fn5> (); // { dg-error "linkage|no matching" "" { target { ! c++11 } } } } diff --git a/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C b/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C index 4300d1ab16..c13161d3ce 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C +++ b/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C @@ -1,7 +1,7 @@ /* 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.*Foo.methodEv" { target { ! { *-*-solaris2* *-*-darwin* } } } } } */ /* { dg-final { scan-assembler "\\.(internal|hidden).*Foo.methodEv" { target *-*-solaris2* } } } */ #pragma GCC visibility push(hidden) diff --git a/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C b/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C index f566cd2f41..25e9ceac07 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C +++ b/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C @@ -1,7 +1,7 @@ /* 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.*Foo.methodEv" { target { ! { *-*-solaris2* *-*-darwin* } } } } } */ /* { dg-final { scan-assembler "\\.(internal|hidden).*Foo.methodEv" { target *-*-solaris2* } } } */ #pragma GCC visibility push(hidden) diff --git a/gcc/testsuite/g++.dg/ext/visibility/template11.C b/gcc/testsuite/g++.dg/ext/visibility/template11.C new file mode 100644 index 0000000000..fb47fe2aff --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/template11.C @@ -0,0 +1,20 @@ +// PR c++/51930 +// { dg-require-visibility "" } +// { dg-options "-fvisibility=hidden" } +// { dg-final { scan-not-hidden "_ZN13template_testI4testE8functionEv" } } + +struct test { }; + +template<typename T> +struct template_test +{ + __attribute__((visibility("default"))) + void function(); +}; + +template<typename T> +void template_test<T>::function() { } + +template +struct __attribute__((visibility("default"))) +template_test<test>; diff --git a/gcc/testsuite/g++.dg/ext/vla1.C b/gcc/testsuite/g++.dg/ext/vla1.C index f3725354fc..55ae5c8af0 100644 --- a/gcc/testsuite/g++.dg/ext/vla1.C +++ b/gcc/testsuite/g++.dg/ext/vla1.C @@ -9,7 +9,7 @@ class A { A (int); }; A::A (int i) { - int ar[1][i]; // { dg-error "variable length array" } + int ar[1][i]; // { dg-error "array" } ar[0][0] = 0; } diff --git a/gcc/testsuite/g++.dg/ext/vla11.C b/gcc/testsuite/g++.dg/ext/vla11.C index 8f3be9e56c..e448be325f 100644 --- a/gcc/testsuite/g++.dg/ext/vla11.C +++ b/gcc/testsuite/g++.dg/ext/vla11.C @@ -1,5 +1,6 @@ // Test that auto works with VLAs. -// { dg-options -std=c++0x } +// { dg-do compile { target c++11 } } +// { dg-options "" { target { ! c++1y } } } void bar(int n) { diff --git a/gcc/testsuite/g++.dg/ext/vla12.C b/gcc/testsuite/g++.dg/ext/vla12.C new file mode 100644 index 0000000000..bca836507a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vla12.C @@ -0,0 +1,28 @@ +// VLA sizeof test +// { dg-do compile } +// { dg-options "" } + +int +f1 (int i) +{ + char a[sizeof (i) + 6 + i]; + char b[sizeof (a) + 1]; + return sizeof (b); +} + +int +f2 (int i) +{ + char a[sizeof (i) + 6 + i]; + char b[sizeof (a)]; + return sizeof (b); +} + +int +f3 (int i) +{ + char a[sizeof (i) + 6 + i]; + char b[sizeof (i) + i]; + char c[sizeof (a) + sizeof (b) + 7]; + return sizeof (c); +} diff --git a/gcc/testsuite/g++.dg/ext/vla13.C b/gcc/testsuite/g++.dg/ext/vla13.C new file mode 100644 index 0000000000..719c35b16b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vla13.C @@ -0,0 +1,8 @@ +// PR c++/54583 +// { dg-options "-Wunused-value" } + +void fred() +{ + int n=10; + double (*x)[n]; +} diff --git a/gcc/testsuite/g++.dg/ext/vla14.C b/gcc/testsuite/g++.dg/ext/vla14.C new file mode 100644 index 0000000000..278cb63b93 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vla14.C @@ -0,0 +1,23 @@ +// PR c++/21113 +// { dg-options "" } + +void +f (int n) +{ + goto label; // { dg-error "from here" } + int a[n]; // { dg-error "crosses initialization" } +label: // { dg-error "jump to label" } + ; +} + +void +g (int n) +{ + switch (1) + { + case 1: + int (*a)[n]; // { dg-error "crosses initialization" } + default: // { dg-error "jump to case label" } + ; + } +} diff --git a/gcc/testsuite/g++.dg/ext/vla15.C b/gcc/testsuite/g++.dg/ext/vla15.C new file mode 100644 index 0000000000..feeb49ff28 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vla15.C @@ -0,0 +1,20 @@ +// PR c++/44613 +// { dg-do run } +// { dg-options "" } + +void *volatile p; + +int +main (void) +{ + int n = 0; + lab:; + int x[n % 1000 + 1]; + x[0] = 1; + x[n % 1000] = 2; + p = x; + n++; + if (n < 1000000) + goto lab; + return 0; +} diff --git a/gcc/testsuite/g++.dg/ext/vla4.C b/gcc/testsuite/g++.dg/ext/vla4.C index ecec908074..90e4160679 100644 --- a/gcc/testsuite/g++.dg/ext/vla4.C +++ b/gcc/testsuite/g++.dg/ext/vla4.C @@ -6,7 +6,7 @@ void f(int i) { try { int a[i]; - throw &a; // { dg-error "variable size" } + throw &a; // { dg-error "int \\(\\*\\)\\\[i\\\]" } } catch (int (*)[i]) { // { dg-error "variable size" } } } diff --git a/gcc/testsuite/g++.dg/ext/vla5.C b/gcc/testsuite/g++.dg/ext/vla5.C index 021d484694..ca58309176 100644 --- a/gcc/testsuite/g++.dg/ext/vla5.C +++ b/gcc/testsuite/g++.dg/ext/vla5.C @@ -6,5 +6,5 @@ void test (int a) { - new (char[a]); + new (char[a]); // { dg-warning "parentheses" } } diff --git a/gcc/testsuite/g++.dg/ext/vla8.C b/gcc/testsuite/g++.dg/ext/vla8.C index 7b7428d07a..9e2d6bdad4 100644 --- a/gcc/testsuite/g++.dg/ext/vla8.C +++ b/gcc/testsuite/g++.dg/ext/vla8.C @@ -8,8 +8,8 @@ struct AvlTreeIter AvlTreeIter() { - new (void* [Num()]); + new (void* [Num()]); // { dg-warning "parentheses" } } }; -AvlTreeIter<int> a; +AvlTreeIter<int> a; // { dg-message "from here" } diff --git a/gcc/testsuite/g++.dg/ext/weak5.C b/gcc/testsuite/g++.dg/ext/weak5.C new file mode 100644 index 0000000000..f2924a0b6d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/weak5.C @@ -0,0 +1,12 @@ +// PR c++/36107 +// { dg-do assemble } +// { dg-require-weak "" } + +class Test { + public: + Test() __attribute__((weak)); +}; + +void test() { + Test test; +} |