diff options
Diffstat (limited to 'gcc/testsuite/g++.dg')
102 files changed, 1690 insertions, 29 deletions
diff --git a/gcc/testsuite/g++.dg/asan/use-after-scope-1.C b/gcc/testsuite/g++.dg/asan/use-after-scope-1.C new file mode 100644 index 00000000000..fd875ad7a13 --- /dev/null +++ b/gcc/testsuite/g++.dg/asan/use-after-scope-1.C @@ -0,0 +1,21 @@ +// { dg-do run } +// { dg-shouldfail "asan" } + +#include <functional> + +int main() { + std::function<int()> function; + { + int v = 0; + function = [&v]() + { + return v; + }; + } + return function(); +} + + +// { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" } +// { dg-output "READ of size 4 at.*" } +// { dg-output ".*'v' <== Memory access at offset \[0-9\]* is inside this variable.*" } diff --git a/gcc/testsuite/g++.dg/asan/use-after-scope-2.C b/gcc/testsuite/g++.dg/asan/use-after-scope-2.C new file mode 100644 index 00000000000..92a4bd13029 --- /dev/null +++ b/gcc/testsuite/g++.dg/asan/use-after-scope-2.C @@ -0,0 +1,40 @@ +// { dg-do run } +// { dg-shouldfail "asan" } + +#include <stdio.h> + +struct Test +{ + Test () + { + my_value = 0; + } + + ~Test () + { + fprintf (stderr, "Value: %d\n", *my_value); + } + + void init (int *v) + { + my_value = v; + } + + int *my_value; +}; + +int main(int argc, char **argv) +{ + Test t; + + { + int x = argc; + t.init(&x); + } + + return 0; +} + +// { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" } +// { dg-output "READ of size 4 at.*" } +// { dg-output ".*'x' <== Memory access at offset \[0-9\]* is inside this variable.*" } diff --git a/gcc/testsuite/g++.dg/asan/use-after-scope-3.C b/gcc/testsuite/g++.dg/asan/use-after-scope-3.C new file mode 100644 index 00000000000..172f374704b --- /dev/null +++ b/gcc/testsuite/g++.dg/asan/use-after-scope-3.C @@ -0,0 +1,22 @@ +// { dg-do run } +// { dg-shouldfail "asan" } + +struct IntHolder { + int val; +}; + +const IntHolder *saved; + +void save(const IntHolder &holder) { + saved = &holder; +} + +int main(int argc, char *argv[]) { + save({10}); + int x = saved->val; // BOOM + return x; +} + +// { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" } +// { dg-output "READ of size 4 at.*" } +// { dg-output ".*'<unknown>' <== Memory access at offset \[0-9\]* is inside this variable.*" } diff --git a/gcc/testsuite/g++.dg/asan/use-after-scope-4.C b/gcc/testsuite/g++.dg/asan/use-after-scope-4.C new file mode 100644 index 00000000000..c3b6932609b --- /dev/null +++ b/gcc/testsuite/g++.dg/asan/use-after-scope-4.C @@ -0,0 +1,36 @@ +/* Caused ICE in in make_decl_rtl, at varasm.c:1311. */ +/* { dg-do compile } */ + +class A +{ +public: + A () : value (123) {} + int value; +}; + +template <typename StoredFunction> class B +{ +public: + template <typename F> B (F p1) : mFunction (p1) { mFunction (); } + StoredFunction mFunction; +}; +template <typename Function> +void +NS_NewRunnableFunction (Function p1) +{ + (B<Function> (p1)); +} +class C +{ + void DispatchConnectionCloseEvent (A); + void AsyncCloseConnectionWithErrorMsg (const A &); +}; +void +C::AsyncCloseConnectionWithErrorMsg (const A &) +{ + { + A message; + NS_NewRunnableFunction ( + [this, message] { DispatchConnectionCloseEvent (message); }); + } +} diff --git a/gcc/testsuite/g++.dg/asan/use-after-scope-types-1.C b/gcc/testsuite/g++.dg/asan/use-after-scope-types-1.C new file mode 100644 index 00000000000..bedcfa4edb9 --- /dev/null +++ b/gcc/testsuite/g++.dg/asan/use-after-scope-types-1.C @@ -0,0 +1,17 @@ +// { dg-do run } +// { dg-shouldfail "asan" } + +#include "use-after-scope-types.h" + +int main() +{ + using Tests = void (*)(); + Tests t = &test<bool>; + t(); + + return 0; +} + +// { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" } +// { dg-output "WRITE of size " } +// { dg-output ".*'x' <== Memory access at offset \[0-9\]* is inside this variable.*" } diff --git a/gcc/testsuite/g++.dg/asan/use-after-scope-types-2.C b/gcc/testsuite/g++.dg/asan/use-after-scope-types-2.C new file mode 100644 index 00000000000..75a01d9eb36 --- /dev/null +++ b/gcc/testsuite/g++.dg/asan/use-after-scope-types-2.C @@ -0,0 +1,17 @@ +// { dg-do run } +// { dg-shouldfail "asan" } + +#include "use-after-scope-types.h" + +int main() +{ + using Tests = void (*)(); + Tests t = &test<float>; + t(); + + return 0; +} + +// { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" } +// { dg-output "WRITE of size " } +// { dg-output ".*'x' <== Memory access at offset \[0-9\]* is inside this variable.*" } diff --git a/gcc/testsuite/g++.dg/asan/use-after-scope-types-3.C b/gcc/testsuite/g++.dg/asan/use-after-scope-types-3.C new file mode 100644 index 00000000000..3350c69c6ae --- /dev/null +++ b/gcc/testsuite/g++.dg/asan/use-after-scope-types-3.C @@ -0,0 +1,17 @@ +// { dg-do run } +// { dg-shouldfail "asan" } + +#include "use-after-scope-types.h" + +int main() +{ + using Tests = void (*)(); + Tests t = &test<void *>; + t(); + + return 0; +} + +// { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" } +// { dg-output "WRITE of size " } +// { dg-output ".*'x' <== Memory access at offset \[0-9\]* is inside this variable.*" } diff --git a/gcc/testsuite/g++.dg/asan/use-after-scope-types-4.C b/gcc/testsuite/g++.dg/asan/use-after-scope-types-4.C new file mode 100644 index 00000000000..44f4d3b09f5 --- /dev/null +++ b/gcc/testsuite/g++.dg/asan/use-after-scope-types-4.C @@ -0,0 +1,17 @@ +// { dg-do run } +// { dg-shouldfail "asan" } + +#include "use-after-scope-types.h" + +int main() +{ + using Tests = void (*)(); + Tests t = &test<std::vector<std::string>>; + t(); + + return 0; +} + +// { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" } +// { dg-output "READ of size " } +// { dg-output ".*'x' <== Memory access at offset \[0-9\]* is inside this variable.*" } diff --git a/gcc/testsuite/g++.dg/asan/use-after-scope-types-5.C b/gcc/testsuite/g++.dg/asan/use-after-scope-types-5.C new file mode 100644 index 00000000000..42abc2a0ccd --- /dev/null +++ b/gcc/testsuite/g++.dg/asan/use-after-scope-types-5.C @@ -0,0 +1,17 @@ +// { dg-do run } +// { dg-shouldfail "asan" } + +#include "use-after-scope-types.h" + +int main() +{ + using Tests = void (*)(); + Tests t = &test<char[1000]>; + t(); + + return 0; +} + +// { dg-output "ERROR: AddressSanitizer: stack-use-after-scope on address.*(\n|\r\n|\r)" } +// { dg-output "WRITE of size " } +// { dg-output ".*'x' <== Memory access at offset \[0-9\]* is inside this variable.*" } diff --git a/gcc/testsuite/g++.dg/asan/use-after-scope-types.h b/gcc/testsuite/g++.dg/asan/use-after-scope-types.h new file mode 100644 index 00000000000..b96b02ba88c --- /dev/null +++ b/gcc/testsuite/g++.dg/asan/use-after-scope-types.h @@ -0,0 +1,30 @@ +#include <stdlib.h> +#include <string> +#include <vector> + +template <class T> struct Ptr { + void Store(T *ptr) { t = ptr; } + + void Access() { *t = {}; } + + T *t; +}; + +template <class T, size_t N> struct Ptr<T[N]> { + using Type = T[N]; + void Store(Type *ptr) { t = *ptr; } + + void Access() { *t = {}; } + + T *t; +}; + +template <class T> __attribute__((noinline)) void test() { + Ptr<T> ptr; + { + T x; + ptr.Store(&x); + } + + ptr.Access(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/addressof3.C b/gcc/testsuite/g++.dg/cpp0x/addressof3.C new file mode 100644 index 00000000000..fa517908ae3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/addressof3.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +struct S { int foo (); int s; }; +int a[10]; +int b; +S c; +int d = __builtin_addressof (a)[0][0]; +int e = __builtin_addressof (b)[0]; +int f = __builtin_addressof (c)->foo (); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-inhctor1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-inhctor1.C index ee8757f4dcf..98691101e86 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-inhctor1.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-inhctor1.C @@ -9,7 +9,7 @@ struct A struct B : A { - using A::A; // { dg-error "A::i" } + using A::A; // { dg-prune-output "A::i" } }; -constexpr B b(0); // { dg-error "B::B" } +constexpr B b(0); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C index 228e8ec6609..4fc67a4a56a 100644 --- a/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C @@ -1,4 +1,5 @@ // { dg-do compile { target c++11 } } +// { dg-options -fno-new-inheriting-ctors } struct A { diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor11a.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor11a.C new file mode 100644 index 00000000000..61b251eb0ba --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor11a.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } +// { dg-options -fnew-inheriting-ctors } + +struct A +{ + A(int, ...); +}; + +struct B: A +{ + using A::A; +}; + +B b1(42); +B b2(42, 1.0); // { dg-bogus "ellipsis" "" { xfail *-*-* } } diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C index c2d33bff4ff..a0b518c19d3 100644 --- a/gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor15.C @@ -2,6 +2,7 @@ // constructors was a deliberate choice. // { dg-do compile { target c++11 } } +// { dg-options -fno-new-inheriting-ctors } struct A { A(int); }; struct B: public A diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor15a.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor15a.C new file mode 100644 index 00000000000..a9abb8428a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor15a.C @@ -0,0 +1,14 @@ +// P0136 caused us to start inheriting base copy constructors. +// { dg-do compile { target c++11 } } +// { dg-options -fnew-inheriting-ctors } + +struct A { A(int); }; +struct B: public A +{ + using A::A; +}; + +A a (42); + +B b1 (24); // inherited +B b2 (a); // also inherited now diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor22.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor22.C new file mode 100644 index 00000000000..1b0e2425cc2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor22.C @@ -0,0 +1,16 @@ +// { dg-do compile { target c++11 } } + +class A { }; +template<typename> using UniquePtr = int; +template<typename AllocPolicy> struct BufferList { + BufferList(unsigned, unsigned, unsigned, AllocPolicy = AllocPolicy()); +}; +class D : BufferList<A> { + using BufferList::BufferList; +}; +template<typename , typename... Args> UniquePtr<D> MakeUnique(Args... aArgs) +{ + D d(aArgs...); + return 0; +} +UniquePtr<D> setCloneBuffer_impl_buf = MakeUnique<D>(0, 0, 0); diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C index e8dc84d32ec..8cbeed66047 100644 --- a/gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor3.C @@ -1,4 +1,5 @@ // { dg-do compile { target c++11 } } +// { dg-options -fno-new-inheriting-ctors } struct B1 { B1(int); diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor3a.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor3a.C new file mode 100644 index 00000000000..c9b4ea11412 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor3a.C @@ -0,0 +1,21 @@ +// { dg-do compile { target c++11 } } +// { dg-options -fnew-inheriting-ctors } + +struct B1 { + B1(int); +}; +struct B2 { + B2(int); +}; +struct D1 : B1, B2 { + using B1::B1; + using B2::B2; +}; // ambiguous +struct D2 : B1, B2 { + using B1::B1; + using B2::B2; + D2(int); // OK: user declaration supersedes both implicit declarations +}; + +D2 d2(42); +D1 d1(42); // { dg-error "ambiguous" } diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C index 8c79c833a32..d0038c16a14 100644 --- a/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C @@ -15,7 +15,7 @@ void test() { D1 e; // { dg-error "deleted" } D1 has no default constructor } struct D2 : B2 { - using B2::B2; // { dg-error "no match" } implicitly declares D2(double) + using B2::B2; // { dg-error "B1::B1" } B1 b; }; D2 f(1.0); // { dg-error "deleted" } B1 has no default constructor diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C index 676605db9e9..5bfdd499d46 100644 --- a/gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor9.C @@ -9,7 +9,7 @@ protected: struct B: A { - using A::A; // { dg-message "protected" } + using A::A; }; B b(42); // { dg-error "this context" } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr77948-1.C b/gcc/testsuite/g++.dg/cpp0x/pr77948-1.C new file mode 100644 index 00000000000..e7795e95b7f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr77948-1.C @@ -0,0 +1,10 @@ +// PR c++/77948 +// { dg-do compile } +// { dg-options "-std=c++11 -std=gnu++11" } + +void +foo () +{ + auto qfp = 1.0q; // { dg-error "unsupported" "" { target { ! has_q_floating_suffix } } } + auto Qfp = 1.0Q; // { dg-error "unsupported" "" { target { ! has_q_floating_suffix } } } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr77948-2.C b/gcc/testsuite/g++.dg/cpp0x/pr77948-2.C new file mode 100644 index 00000000000..7b84c5fdea1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr77948-2.C @@ -0,0 +1,10 @@ +// PR c++/77948 +// { dg-do compile } +// { dg-options "-std=gnu++11 -std=c++11" } + +void +foo () +{ + auto qfp = 1.0q; // { dg-error "unable to find numeric literal operator" } + auto Qfp = 1.0Q; // { dg-error "unable to find numeric literal operator" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr77948-3.C b/gcc/testsuite/g++.dg/cpp0x/pr77948-3.C new file mode 100644 index 00000000000..64d4f5b14cc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr77948-3.C @@ -0,0 +1,10 @@ +// PR c++/77948 +// { dg-do compile } +// { dg-options "-std=c++11 -std=gnu++98" } + +void +foo () +{ + double qfp = 1.0q; // { dg-error "unsupported" "" { target { ! has_q_floating_suffix } } } + double Qfp = 1.0Q; // { dg-error "unsupported" "" { target { ! has_q_floating_suffix } } } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr77948-4.C b/gcc/testsuite/g++.dg/cpp0x/pr77948-4.C new file mode 100644 index 00000000000..7b66b983bfa --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr77948-4.C @@ -0,0 +1,10 @@ +// PR c++/77948 +// { dg-do compile } +// { dg-options "-std=c++11 -std=c++98" } + +void +foo () +{ + double qfp = 1.0q; // { dg-error "unsupported" "" { target { ! has_q_floating_suffix } } } + double Qfp = 1.0Q; // { dg-error "unsupported" "" { target { ! has_q_floating_suffix } } } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr77948-5.C b/gcc/testsuite/g++.dg/cpp0x/pr77948-5.C new file mode 100644 index 00000000000..bec34a15fbd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr77948-5.C @@ -0,0 +1,10 @@ +// PR c++/77948 +// { dg-do compile } +// { dg-options "-std=gnu++98 -std=c++11" } + +void +foo () +{ + auto qfp = 1.0q; // { dg-error "unable to find numeric literal operator" } + auto Qfp = 1.0Q; // { dg-error "unable to find numeric literal operator" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr77948-6.C b/gcc/testsuite/g++.dg/cpp0x/pr77948-6.C new file mode 100644 index 00000000000..b8a13b5540a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr77948-6.C @@ -0,0 +1,10 @@ +// PR c++/77948 +// { dg-do compile } +// { dg-options "-std=c++98 -std=c++11" } + +void +foo () +{ + auto qfp = 1.0q; // { dg-error "unable to find numeric literal operator" } + auto Qfp = 1.0Q; // { dg-error "unable to find numeric literal operator" } +} diff --git a/gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C b/gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C index 6928d6bcbd8..2f3b01efc38 100644 --- a/gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C +++ b/gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C @@ -109,8 +109,8 @@ #ifndef __cpp_inheriting_constructors # error "__cpp_inheriting_constructors" -#elif __cpp_inheriting_constructors!= 200802 -# error "__cpp_inheriting_constructors != 200802" +#elif __cpp_inheriting_constructors!= 201511 +# error "__cpp_inheriting_constructors != 201511" #endif #ifndef __cpp_ref_qualifiers diff --git a/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C b/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C index dc30a9b3cf8..3b141ef67c4 100644 --- a/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C +++ b/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C @@ -102,8 +102,8 @@ #ifndef __cpp_inheriting_constructors # error "__cpp_inheriting_constructors" -#elif __cpp_inheriting_constructors!= 200802 -# error "__cpp_inheriting_constructors != 200802" +#elif __cpp_inheriting_constructors!= 201511 +# error "__cpp_inheriting_constructors != 201511" #endif #ifndef __cpp_ref_qualifiers diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-udt.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-udt.C index 3597fa8053a..1b0f65e6381 100644 --- a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-udt.C +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-udt.C @@ -14,7 +14,7 @@ struct S bool shadow = false; }; -extern "C" void printf(...); +extern "C" int printf(const char*, ...); #define assert(e) if (e); else \ printf ("%s:%d: !(%s)\n", __FILE__, __LINE__, #e), __builtin_abort (); diff --git a/gcc/testsuite/g++.dg/cpp1y/pr67980.C b/gcc/testsuite/g++.dg/cpp1y/pr67980.C new file mode 100644 index 00000000000..1b8154538fc --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/pr67980.C @@ -0,0 +1,23 @@ +// { dg-do compile { target c++14 } } + +template <int Y, class T> +constexpr T cpp14_constexpr_then(T value) { + if (Y < 0) + return (value << -Y); + else + return 0; +} + +template <int Y, class T> +constexpr T cpp14_constexpr_else(T value) { + if (Y > 0) + return 0; + else + return (value << -Y); +} + +int main() +{ + cpp14_constexpr_then<1>(0); + cpp14_constexpr_else<1>(0); +} diff --git a/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C b/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C index e023e6a622d..f4658a96067 100644 --- a/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C +++ b/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C @@ -90,8 +90,8 @@ #ifndef __cpp_inheriting_constructors # error "__cpp_inheriting_constructors" -#elif __cpp_inheriting_constructors!= 200802 -# error "__cpp_inheriting_constructors != 200802" +#elif __cpp_inheriting_constructors!= 201511 +# error "__cpp_inheriting_constructors != 201511" #endif #ifndef __cpp_ref_qualifiers @@ -380,6 +380,12 @@ # error "__cpp_capture_star_this != 201603" #endif +#ifndef __cpp_noexcept_function_type +# error "__cpp_noexcept_function_type" +#elif __cpp_noexcept_function_type != 201510 +# error "__cpp_noexcept_function_type != 201510" +#endif + #ifdef __has_cpp_attribute # if ! __has_cpp_attribute(maybe_unused) diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor1.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor1.C new file mode 100644 index 00000000000..bf9df415c05 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor1.C @@ -0,0 +1,5 @@ +// { dg-do compile { target c++11 } } + +struct A { }; +struct B: A { }; +struct C: B { using A::A; }; // { dg-error "direct" } diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor22.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor22.C new file mode 100644 index 00000000000..02ec58a3e8e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor22.C @@ -0,0 +1,33 @@ +// Testcase from P0136 +// { dg-do compile { target c++11 } } + +struct B1 { + template <class... Ts> + B1(int, Ts...) { } +}; + +struct B2 { + B2(double) { } +}; + +int get(); + +struct D1 : B1 { // { dg-message "B1::B1" } + using B1::B1; // inherits B1(int, ...) + int x; + int y = get(); +}; + +void test() { + D1 d(2, 3, 4); // OK: B1 is initialized by calling B1(2, 3, 4), + // then d.x is default-initialized (no initialization is performed), + // then d.y is initialized by calling get() + D1 e; // { dg-error "" } D1 has a deleted default constructor +} + +struct D2 : B2 { + using B2::B2; // { dg-message "B1::B1" } + B1 b; +}; + +D2 f(1.0); // { dg-error "" } B1 has no default constructor diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor23.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor23.C new file mode 100644 index 00000000000..0c862f7573f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor23.C @@ -0,0 +1,19 @@ +// Testcase from P0136 +// { dg-do compile { target c++11 } } +// { dg-options "-fnew-inheriting-ctors -fdump-tree-gimple" } + +struct W { W(int); }; +struct V: W { using W::W; }; +struct X : virtual V { using V::V; X() = delete; }; +struct Y : X { using X::X; }; +struct Z : Y, virtual V { using Y::Y; }; +Z z(0); // OK: initialization of Y does not invoke default constructor of X + +// Check that we're passing this and __vtt along to the Y inheriting +// constructor, but not the int parameter. +// { dg-final { scan-assembler "_ZN1YCI21WEi" } } +// { dg-final { scan-tree-dump "Y::Y ._2, _3.;" "gimple" } } + +// And that we *are* passing the int along to V::V. +// { dg-final { scan-assembler "_ZN1VCI21WEi" } } +// { dg-final { scan-tree-dump "V::V .this, _1.;" "gimple" } } diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor24.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor24.C new file mode 100644 index 00000000000..21450196da0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor24.C @@ -0,0 +1,27 @@ +// Testcase from P0136 +// { dg-do compile { target c++11 } } +// { dg-options -fnew-inheriting-ctors } + +struct A { A(int); }; +struct B : A { using A::A; }; + +struct C1 : B { using B::B; }; +struct C2 : B { using B::B; }; + +struct D1 : C1, C2 { + using C1::C1; + using C2::C2; +}; + +struct V1 : virtual B { using B::B; }; +struct V2 : virtual B { using B::B; }; + +struct D2 : V1, V2 { + using V1::V1; + using V2::V2; +}; + +D1 d1(0); // { dg-error "" } ambiguous +D2 d2(0); // OK: initializes virtual B base class, which initializes the A base + // class then initializes the V1 and V2 base classes as if by a + // defaulted default constructor diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor25.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor25.C new file mode 100644 index 00000000000..66cd2dabb0d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor25.C @@ -0,0 +1,9 @@ +// Testcase from P0136 +// { dg-do compile { target c++11 } } + +struct M { M(); M(int); }; +struct N : M { using M::M; }; +struct O : M {}; +struct P : N, O { using N::N; using O::O; }; +P p(0); // OK: use M(0) to initialize N's base class, + // use M() to initialize O's base class diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor26.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor26.C new file mode 100644 index 00000000000..28dc33227a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor26.C @@ -0,0 +1,17 @@ +// Testcase from P0136 +// { dg-do compile { target c++11 } } +// { dg-options -fnew-inheriting-ctors } + +struct A { + template<typename T> A(T, typename T::type = 0); + A(int); +}; +struct B : A { + using A::A; + B(int); +}; +B b(42L); // now calls B(int), used to call B<long>(long), + // which called A(int) due to substitution failure + // in A<long>(long). + +// { dg-final { scan-assembler "_ZN1BC1Ei" } } diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor27.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor27.C new file mode 100644 index 00000000000..97f26346b78 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor27.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + A(int = 0); +}; + +struct B: A +{ + B(); + using A::A; +}; + +B b1(1); +B b; diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor28.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor28.C new file mode 100644 index 00000000000..55e1d8c943f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor28.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } +// { dg-options -fnew-inheriting-ctors } + +struct V { V(int); }; +struct W : virtual V { using V::V; }; +struct X : virtual W, virtual V { using W::W; }; +X x(0); diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor29.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor29.C new file mode 100644 index 00000000000..97f26346b78 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor29.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + A(int = 0); +}; + +struct B: A +{ + B(); + using A::A; +}; + +B b1(1); +B b; diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor30.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor30.C new file mode 100644 index 00000000000..494dd91bb80 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor30.C @@ -0,0 +1,17 @@ +// { dg-do compile { target c++11 } } + +struct A +{ + A(double); +}; + +struct B: A +{ + B(short); + using A::A; +}; + +int main() +{ + B b(1); // { dg-error "ambiguous" } +} diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor31.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor31.C new file mode 100644 index 00000000000..3ce080d115b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor31.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++11 } } + +struct B; +struct A +{ + A(const B&, int = 0); +}; + +struct B: A +{ + using A::A; +}; + +extern B b; +B b2{b}; diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor32.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor32.C new file mode 100644 index 00000000000..7ce85b0af2e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor32.C @@ -0,0 +1,16 @@ +// { dg-do compile { target c++11 } } + +struct B; +struct A +{ + A(const B&, int = 0); +}; + +struct B: A +{ + using A::A; + B(B&); +}; + +extern const B b; +B b2{b}; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor33.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor33.C new file mode 100644 index 00000000000..0e8520745a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor33.C @@ -0,0 +1,23 @@ +// { dg-do link { target c++11 } } +// { dg-options -fnew-inheriting-ctors } + +struct A +{ + A() { } + A(const A&); // should never be called +}; + +struct B +{ + B(A) { } +}; + +struct C: B +{ + using B::B; +}; + +int main() +{ + C c{A()}; +} diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor34.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor34.C new file mode 100644 index 00000000000..f47b2a4dc2f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor34.C @@ -0,0 +1,18 @@ +// { dg-do compile { target c++11 } } +// { dg-options -fnew-inheriting-ctors } + +class A +{ + A(int); + friend void f(); +}; + +struct B: A +{ + using A::A; +}; + +void f() +{ + B b(42); +} diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor35.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor35.C new file mode 100644 index 00000000000..87f4452c666 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor35.C @@ -0,0 +1,21 @@ +// Core 1715 +// { dg-do compile { target c++11 } } +// { dg-options -fno-new-inheriting-ctors } + +template<class T> struct S { +private: + typedef int X; + friend struct B; +}; + +struct B { + template<class T> B(T, typename T::X); +}; + +struct D: B { + using B::B; // { dg-prune-output "private" } +}; + +S<int> s; +B b(s, 2); // Okay, thanks to friendship. +D d(s, 2); // { dg-error "" } was an error before P0136 diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor35a.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor35a.C new file mode 100644 index 00000000000..47f69de41b8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor35a.C @@ -0,0 +1,21 @@ +// Core 1715 +// { dg-do compile { target c++11 } } +// { dg-options -fnew-inheriting-ctors } + +template<class T> struct S { +private: + typedef int X; + friend struct B; +}; + +struct B { + template<class T> B(T, typename T::X); +}; + +struct D: B { + using B::B; +}; + +S<int> s; +B b(s, 2); // Okay, thanks to friendship. +D d(s, 2); // Now OK as well. diff --git a/gcc/testsuite/g++.dg/cpp1z/launder3.C b/gcc/testsuite/g++.dg/cpp1z/launder3.C new file mode 100644 index 00000000000..2a2afc5cad1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/launder3.C @@ -0,0 +1,38 @@ +// { dg-do run { target c++11 } } +// { dg-additional-options "-O2" } + +#include <cassert> + +void * +operator new (decltype (sizeof (0)), void *p) +{ + return p; +} + +namespace std +{ + template <typename T> + T * + launder (T *p) + { + return __builtin_launder (p); + } +} + +struct A +{ + const int x; +}; + +struct B +{ + A a; +}; + +int +main () +{ + B b{{42}}; + new (&b.a) A{666}; + assert(std::launder(&b.a)->x == 666); +} diff --git a/gcc/testsuite/g++.dg/cpp1z/launder4.C b/gcc/testsuite/g++.dg/cpp1z/launder4.C new file mode 100644 index 00000000000..3a65eb27f2e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/launder4.C @@ -0,0 +1,40 @@ +// { dg-do run { target c++11 } } +// { dg-additional-options "-O2" } + +#include <cassert> + +void * +operator new (decltype (sizeof (0)), void *p) +{ + return p; +} + +namespace std +{ + template <typename T> + T * + launder (T *p) + { + return __builtin_launder (p); + } +} + +struct A +{ + int& x; +}; + +struct B +{ + A a; +}; + +int +main () +{ + int x = 42; + B b{{x}}; + int y = 666; + new (&b.a) A{y}; + assert(std::launder(&b.a)->x == 666); +} diff --git a/gcc/testsuite/g++.dg/cpp1z/launder5.C b/gcc/testsuite/g++.dg/cpp1z/launder5.C new file mode 100644 index 00000000000..483d6f29297 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/launder5.C @@ -0,0 +1,25 @@ +// { dg-do run { target c++11 } } +// { dg-additional-options "-O2" } +// { dg-additional-sources "launder5.cc" } + +#include <cassert> +#include "launder5.h" + +namespace std +{ + template <typename T> + T * + launder (T *p) + { + return __builtin_launder (p); + } +} + + +int +main () +{ + B b{{42}}; + f(b); + assert(std::launder(&b.a)->x == 666); +} diff --git a/gcc/testsuite/g++.dg/cpp1z/launder5.cc b/gcc/testsuite/g++.dg/cpp1z/launder5.cc new file mode 100644 index 00000000000..f9d867db332 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/launder5.cc @@ -0,0 +1,12 @@ +#include "launder5.h" + +void * +operator new (decltype (sizeof (0)), void *p) +{ + return p; +} + +void f(B& b) +{ + new (&b.a) A{666}; +} diff --git a/gcc/testsuite/g++.dg/cpp1z/launder5.h b/gcc/testsuite/g++.dg/cpp1z/launder5.h new file mode 100644 index 00000000000..b66103aefba --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/launder5.h @@ -0,0 +1,16 @@ +#ifndef GCC_TEST_LAUNDER5_H +#define GCC_TEST_LAUNDER5_H + +struct A +{ + const int x; +}; + +struct B +{ + A a; +}; + +void f(B& b); + +#endif diff --git a/gcc/testsuite/g++.dg/cpp1z/launder6.C b/gcc/testsuite/g++.dg/cpp1z/launder6.C new file mode 100644 index 00000000000..babc4b433ad --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/launder6.C @@ -0,0 +1,24 @@ +// { dg-do run { target c++11 } } +// { dg-additional-options "-O2" } +// { dg-additional-sources "launder6.cc" } +#include <cassert> +#include "launder6.h" + +namespace std +{ + template <typename T> + T * + launder (T *p) + { + return __builtin_launder (p); + } +} + +int +main () +{ + int x = 42; + B b{{x}}; + f(b); + assert(std::launder(&b.a)->x == 666); +} diff --git a/gcc/testsuite/g++.dg/cpp1z/launder6.cc b/gcc/testsuite/g++.dg/cpp1z/launder6.cc new file mode 100644 index 00000000000..1822891a0a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/launder6.cc @@ -0,0 +1,14 @@ +#include "launder6.h" + +void * +operator new (decltype (sizeof (0)), void *p) +{ + return p; +} + +int y = 666; + +void f(B& b) +{ + new (&b.a) A{y}; +} diff --git a/gcc/testsuite/g++.dg/cpp1z/launder6.h b/gcc/testsuite/g++.dg/cpp1z/launder6.h new file mode 100644 index 00000000000..eca2ad46f18 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/launder6.h @@ -0,0 +1,16 @@ +#ifndef GCC_TEST_LAUNDER6_H +#define GCC_TEST_LAUNDER6_H + +struct A +{ + int& x; +}; + +struct B +{ + A a; +}; + +void f(B& b); + +#endif diff --git a/gcc/testsuite/g++.dg/cpp1z/noexcept-type1.C b/gcc/testsuite/g++.dg/cpp1z/noexcept-type1.C new file mode 100644 index 00000000000..62e1322e35a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/noexcept-type1.C @@ -0,0 +1,8 @@ +// Testcase from P0012r1 +// { dg-options -std=c++1z } + +void (*p)() throw(int); +void (**pp)() noexcept = &p; // { dg-error "" } cannot convert to pointer to noexcept function + +struct S { typedef void (*p)(); operator p(); }; +void (*q)() noexcept = S(); // { dg-error "" } cannot convert to pointer to noexcept function diff --git a/gcc/testsuite/g++.dg/cpp1z/noexcept-type11.C b/gcc/testsuite/g++.dg/cpp1z/noexcept-type11.C new file mode 100644 index 00000000000..bcd4d8d613d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/noexcept-type11.C @@ -0,0 +1,3 @@ +// { dg-options "-Wall -std=c++14" } + +void f(int(*)() noexcept) { } // { dg-warning "mangled" } diff --git a/gcc/testsuite/g++.dg/cpp1z/noexcept-type12.C b/gcc/testsuite/g++.dg/cpp1z/noexcept-type12.C new file mode 100644 index 00000000000..39820af136e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/noexcept-type12.C @@ -0,0 +1,23 @@ +// { dg-options -std=c++1z } + +template <class R, class... A, bool B> +void f(R (*)(A...) noexcept(B)) { } + +template <class R, class... A, bool B> +void f2(R (*)(A...) noexcept(B)) { } + +void g(int); +void h(int) noexcept; + +int main() +{ + f(g); + f2(h); +} + +// { dg-final { scan-assembler "_Z1fIvJiELb0EEvPDOT1_EFT_DpT0_E" } } +// { dg-final { scan-assembler "_Z2f2IvJiELb1EEvPDOT1_EFT_DpT0_E" } } + +void f3(void (*)() noexcept) { } + +// { dg-final { scan-assembler "_Z2f3PDoFvvE" } } diff --git a/gcc/testsuite/g++.dg/cpp1z/noexcept-type2.C b/gcc/testsuite/g++.dg/cpp1z/noexcept-type2.C new file mode 100644 index 00000000000..747bb194c30 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/noexcept-type2.C @@ -0,0 +1,10 @@ +// Test for function pointer conversion on template arguments. +// { dg-options -std=c++1z } + +template <void (*P)()> struct A { }; + +void f() noexcept { }; +constexpr void (*p)() noexcept = f; + +A<f> a; +A<p> b; diff --git a/gcc/testsuite/g++.dg/cpp1z/noexcept-type3.C b/gcc/testsuite/g++.dg/cpp1z/noexcept-type3.C new file mode 100644 index 00000000000..9303da87b8c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/noexcept-type3.C @@ -0,0 +1,13 @@ +// Test for overload resolution. +// { dg-options -std=c++1z } + +void f(void (*)() noexcept) = delete; +void f(void (*)()) { } +void g() {} +void h() noexcept {} + +int main() +{ + f(g); + f(h); // { dg-error "deleted" } +} diff --git a/gcc/testsuite/g++.dg/cpp1z/noexcept-type4.C b/gcc/testsuite/g++.dg/cpp1z/noexcept-type4.C new file mode 100644 index 00000000000..621da9341ea --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/noexcept-type4.C @@ -0,0 +1,16 @@ +// Test for deduction. +// { dg-options -std=c++1z } + +template <class R, class... A> +void f(R (*)(A...)); +void g(int) noexcept; + +template <class R, class... A> +void h(R (*)(A...) noexcept); +void i(int); + +int main() +{ + f(g); + h(i); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/cpp1z/noexcept-type5.C b/gcc/testsuite/g++.dg/cpp1z/noexcept-type5.C new file mode 100644 index 00000000000..9e5d20224e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/noexcept-type5.C @@ -0,0 +1,25 @@ +// Test for composite pointer type. +// { dg-options -std=c++1z } + +typedef void (*P)(); +typedef void (*NP)() noexcept; + +void f(); +void g() noexcept; + +bool b; + +template <class T, class U> struct Same; +template <class T> struct Same<T,T> { }; + +Same<decltype(b ? &f : &g),P> s; + +int main() +{ + P p = 0; + NP np = 0; + + p == np; + p != np; + p < np; +} diff --git a/gcc/testsuite/g++.dg/cpp1z/noexcept-type6.C b/gcc/testsuite/g++.dg/cpp1z/noexcept-type6.C new file mode 100644 index 00000000000..50684571b62 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/noexcept-type6.C @@ -0,0 +1,13 @@ +// Test for lambda conversion. +// { dg-options -std=c++1z } + +void f() +{ + auto l = []() noexcept { return 0; }; + int (*p)() noexcept = l; + int (*q)() = l; + + auto l2 = []{ return 0; }; + p = l2; // { dg-error "" } + q = l2; +} diff --git a/gcc/testsuite/g++.dg/cpp1z/noexcept-type7.C b/gcc/testsuite/g++.dg/cpp1z/noexcept-type7.C new file mode 100644 index 00000000000..1f78114dc74 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/noexcept-type7.C @@ -0,0 +1,14 @@ +// Test for static_cast. +// { dg-options -std=c++1z } + +void f() +{ + typedef void (*P)(); + typedef void (*NP)() noexcept; + + P p; + NP np; + + static_cast<P>(np); + static_cast<NP>(p); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/cpp1z/noexcept-type8.C b/gcc/testsuite/g++.dg/cpp1z/noexcept-type8.C new file mode 100644 index 00000000000..0182e3a3111 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/noexcept-type8.C @@ -0,0 +1,22 @@ +// Test for exception handling. +// { dg-options -std=c++1z } +// { dg-do run } + +void f() {} +void g() noexcept {} + +int main() +{ + try { throw g; } + catch (void (*)()) { } + + try { throw g; } + catch (void (*)() noexcept) { } + + try { throw f; } + catch (void (*)()) { } + + try { throw f; } + catch (void (*)() noexcept) { __builtin_abort(); } + catch (...) { } +} diff --git a/gcc/testsuite/g++.dg/cpp1z/noexcept-type9.C b/gcc/testsuite/g++.dg/cpp1z/noexcept-type9.C new file mode 100644 index 00000000000..a29618a3001 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/noexcept-type9.C @@ -0,0 +1,18 @@ +// Test for PMF template args. +// { dg-options -std=c++1z } +// { dg-do compile } + +struct A +{ + void f() noexcept; + void g(); +}; + +template <void (A::*)()> struct B { }; +template <void (A::*)() noexcept> struct C { }; + +B<&A::f> b1; +B<&A::g> b2; + +C<&A::f> c1; +C<&A::g> c2; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp1z/using1.C b/gcc/testsuite/g++.dg/cpp1z/using1.C new file mode 100644 index 00000000000..1ed939d45fd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/using1.C @@ -0,0 +1,23 @@ +// Test for hiding of used base functions when all the conversion sequences are +// equivalent, needed to avoid a regression on inherited default ctors. + +struct A +{ + void f(short,int=0); + void g(char,int=0); +}; + +struct B:A +{ + using A::f; + void f(short); + using A::g; + void g(short); +}; + +int main() +{ + B().f(1); // OK, derived f hides base f for single arg + B().f(1,2); // OK, base f can still be called with two args + B().g(1); // { dg-error "" } signatures differ, ambiguous +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/constexpr-var-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/constexpr-var-1.C index 045d5fed744..19062e29fd5 100644 --- a/gcc/testsuite/g++.dg/debug/dwarf2/constexpr-var-1.C +++ b/gcc/testsuite/g++.dg/debug/dwarf2/constexpr-var-1.C @@ -1,6 +1,6 @@ // { dg-do compile } // { dg-options "-O -std=c++11 -g -dA -gno-strict-dwarf" } -// { dg-final { scan-assembler-times " DW_AT_const_expr" 2 } } +// { dg-final { scan-assembler-times " DW_AT_const_expr" 2 { xfail *-*-aix* } } } constexpr int a = 5; struct S diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/inline-var-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/inline-var-1.C new file mode 100644 index 00000000000..f4f4b6d77d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/inline-var-1.C @@ -0,0 +1,27 @@ +// { dg-do compile } +// { dg-options "-O -std=c++1z -g -dA -gno-strict-dwarf" } +// { dg-require-weak "" } +// { dg-final { scan-assembler-times "0x3\[^\n\r]* DW_AT_inline" 6 { xfail *-*-aix* } } } +// { dg-final { scan-assembler-times "0x1\[^\n\r]* DW_AT_inline" 2 { xfail *-*-aix* } } } +// { dg-final { scan-assembler-times " DW_AT_declaration" 6 { xfail *-*-aix* } } } +// { dg-final { scan-assembler-times " DW_AT_specification" 6 { xfail *-*-aix* } } } +// { dg-final { scan-assembler-times " DW_AT_\[^\n\r]*linkage_name" 7 { xfail *-*-aix* } } } + +inline int a; +struct S +{ + static inline double b = 4.0; + static constexpr int c = 2; + static constexpr inline char d = 3; +} s; +template <int N> +inline int e = N; +int &f = e<2>; +template <int N> +struct T +{ + static inline double g = 4.0; + static constexpr int h = 2; + static inline constexpr char i = 3; +}; +T<5> t; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/ptrdmem-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/ptrdmem-1.C new file mode 100644 index 00000000000..5d65196f7af --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/ptrdmem-1.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// { dg-options "-O -std=c++11 -g -dA -gno-strict-dwarf" } +// { dg-final { scan-assembler-times "DIE \\(\[^\n\]*\\) DW_TAG_ptr_to_member_type" 1 { xfail { powerpc-ibm-aix* } } } } +// { dg-final { scan-assembler-times " DW_AT_use_location" 1 { xfail { powerpc-ibm-aix* } } } } +// { dg-final { scan-assembler-not " DW_AT_reference" { xfail { powerpc-ibm-aix* } } } } + +struct S; +typedef int S::*pdm; +pdm pmf = 0; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/ref-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/ref-2.C index dd1f457d3ec..43939c9d697 100644 --- a/gcc/testsuite/g++.dg/debug/dwarf2/ref-2.C +++ b/gcc/testsuite/g++.dg/debug/dwarf2/ref-2.C @@ -1,7 +1,7 @@ // { dg-do compile { target c++11 } } // { dg-options "-g -gno-strict-dwarf -dA" } -// { dg-final { scan-assembler-times " DW_AT_reference" 1 } } -// { dg-final { scan-assembler-times " DW_AT_rvalue_reference" 1 } } +// { dg-final { scan-assembler-times " DW_AT_reference" 1 { xfail *-*-aix* } } } +// { dg-final { scan-assembler-times " DW_AT_rvalue_reference" 1 { xfail *-*-aix* } } } struct S { diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/ref-3.C b/gcc/testsuite/g++.dg/debug/dwarf2/ref-3.C new file mode 100644 index 00000000000..d7932d8a237 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/ref-3.C @@ -0,0 +1,56 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-g -gno-strict-dwarf -dA" } +// { dg-final { scan-assembler-times " DW_AT_reference" 5 { xfail *-*-aix* } } } +// { dg-final { scan-assembler-times " DW_AT_rvalue_reference" 5 { xfail *-*-aix* } } } +// { dg-final { scan-assembler-times "DIE \\(\[^\n\]*\\) DW_TAG_subroutine_type" 6 { xfail *-*-aix* } } } +// { dg-final { scan-assembler-times "DIE \\(\[^\n\]*\\) DW_TAG_ptr_to_member_type" 7 { xfail *-*-aix* } } } +// { dg-final { scan-assembler-times " DW_AT_use_location" 1 { xfail *-*-aix* } } } + +struct S +{ + void foo1 (); + void bar1 () &; + void baz1 () &&; + void foo2 () const; + void bar2 () const &; + void baz2 () const &&; + void foo3 () const; + void bar3 () const &; + void baz3 () const &&; + int d; +}; + +void +test () +{ + S s; + auto o1 = &S::foo1; + auto r1 = &S::bar1; + auto z1 = &S::baz1; + auto o2 = &S::foo2; + auto r2 = &S::bar2; + auto z2 = &S::baz2; + auto o3 = &S::foo3; + auto r3 = &S::bar3; + auto z3 = &S::baz3; + auto d1 = &S::d; + void (S::*o4) () const; + o4 = &S::foo3; + void (S::*r4) () const &; + r4 = &S::bar3; + void (S::*z4) () const &&; + z4 = &S::baz3; + (s.*o1) (); + (s.*r1) (); + (S ().*z1) (); + (s.*o2) (); + (s.*r2) (); + (S ().*z2) (); + (s.*o3) (); + (s.*r3) (); + (S ().*z3) (); + (s.*o4) (); + (s.*r4) (); + (S ().*z4) (); + s.*d1 = 2; +} diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/ref-4.C b/gcc/testsuite/g++.dg/debug/dwarf2/ref-4.C new file mode 100644 index 00000000000..00cf81f4bcc --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/ref-4.C @@ -0,0 +1,11 @@ +// { dg-do compile { target c++11 } } +// { dg-options "-g -gno-strict-dwarf -dA" } +// { dg-final { scan-assembler-times "DIE \\(\[^\n\]*\\) DW_TAG_typedef" 2 { xfail *-*-aix* } } } +// { dg-final { scan-assembler-times "DIE \\(\[^\n\]*\\) DW_TAG_ptr_to_member_type" 2 { xfail *-*-aix* } } } +// { dg-final { scan-assembler-times "DIE \\(\[^\n\]*\\) DW_TAG_subroutine_type" 1 { xfail *-*-aix* } } } + +struct A { void foo (); int a; }; +typedef void (A::*PMF) (); +typedef int A::*PMI; +PMF pmf; +PMI pmi; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/refqual-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/refqual-1.C new file mode 100644 index 00000000000..221008e9981 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/refqual-1.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-O -std=c++11 -g -dA -gno-strict-dwarf" } +// { dg-final { scan-assembler-times "DIE \\(\[^\n\]*\\) DW_TAG_ptr_to_member_type" 1 { xfail { powerpc-ibm-aix* } } } } +// { dg-final { scan-assembler-times " DW_AT_reference" 2 { xfail { powerpc-ibm-aix* } } } } +// { dg-final { scan-assembler-not " DW_AT_use_location" { xfail { powerpc-ibm-aix* } } } } +/* It is not clear what if anything we should output for + DW_AT_use_location in a pointer to member function, so we don't + output it for now. */ + +struct S { + void mf(void) &; +}; + +void S::mf() & {} + +typedef void (S::*pmft)(void) &; +pmft pmf = &S::mf; diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/refqual-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/refqual-2.C new file mode 100644 index 00000000000..ddf33c1971e --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/refqual-2.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-O -std=c++11 -g -dA -gno-strict-dwarf" } +// { dg-final { scan-assembler-times "DIE \\(\[^\n\]*\\) DW_TAG_ptr_to_member_type" 1 { xfail { powerpc-ibm-aix* } } } } +// { dg-final { scan-assembler-times " DW_AT_rvalue_reference" 2 { xfail { powerpc-ibm-aix* } } } } +// { dg-final { scan-assembler-not " DW_AT_use_location" { xfail { powerpc-ibm-aix* } } } } +/* It is not clear what if anything we should output for + DW_AT_use_location in a pointer to member function, so we don't + output it for now. */ + +struct S { + void mf(void) &&; +}; + +void S::mf() && {} + +typedef void (S::*pmft)(void) &&; +pmft pmf = &S::mf; diff --git a/gcc/testsuite/g++.dg/eh/spec2.C b/gcc/testsuite/g++.dg/eh/spec2.C index 64807dd2677..8107f019eb7 100644 --- a/gcc/testsuite/g++.dg/eh/spec2.C +++ b/gcc/testsuite/g++.dg/eh/spec2.C @@ -2,9 +2,9 @@ struct S { void f (void); }; -typedef void f1 (void) throw (int); // { dg-error "exception" } -typedef void (*f2) (void) throw (int); // { dg-error "exception" } -typedef void (S::*f3) (void) throw (int); // { dg-error "exception" } +typedef void f1 (void) throw (int); // { dg-error "exception" "" { target c++14_down } } +typedef void (*f2) (void) throw (int); // { dg-error "exception" "" { target c++14_down } } +typedef void (S::*f3) (void) throw (int); // { dg-error "exception" "" { target c++14_down } } void (*f4) (void) throw (int); void (S::*f5) (void) throw (int); diff --git a/gcc/testsuite/g++.dg/ext/visibility/anon1.C b/gcc/testsuite/g++.dg/ext/visibility/anon1.C index 1f3be3b774b..0135f931a6f 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/anon1.C +++ b/gcc/testsuite/g++.dg/ext/visibility/anon1.C @@ -2,7 +2,7 @@ // Test for anonymous namespace internal linkage // { dg-do compile } -// { dg-final { scan-assembler-not "globl.*_ZN.*1fEv" } } +// { dg-final { scan-assembler-not "globl.*_ZN.*1fEv" { xfail *-*-aix* } } } // { dg-require-visibility "" } namespace diff --git a/gcc/testsuite/g++.dg/ext/visibility/anon2.C b/gcc/testsuite/g++.dg/ext/visibility/anon2.C index 49022963127..dcf0e64fa23 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/anon2.C +++ b/gcc/testsuite/g++.dg/ext/visibility/anon2.C @@ -1,7 +1,7 @@ // Test for propagation of anonymous namespace internal linkage // { dg-do compile } -// { dg-final { scan-assembler-not "globl.*_Z1fv" } } +// { dg-final { scan-assembler-not "globl.*_Z1fv" { xfail *-*-aix* } } } // { dg-require-visibility "" } namespace diff --git a/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C b/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C index c13161d3ceb..b6bc0c5466a 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* *-*-darwin* } } } } } */ +/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" { target { ! { *-*-solaris2* *-*-darwin* *-*-aix* } } } } } */ /* { 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 25e9ceac076..8499ceff60a 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* *-*-darwin* } } } } } */ +/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" { target { ! { *-*-solaris2* *-*-darwin* *-*-aix* } } } } } */ /* { dg-final { scan-assembler "\\.(internal|hidden).*Foo.methodEv" { target *-*-solaris2* } } } */ #pragma GCC visibility push(hidden) diff --git a/gcc/testsuite/g++.dg/init/new15.C b/gcc/testsuite/g++.dg/init/new15.C index b93b43c833f..1f57f07dfc3 100644 --- a/gcc/testsuite/g++.dg/init/new15.C +++ b/gcc/testsuite/g++.dg/init/new15.C @@ -1,6 +1,6 @@ // PR c++/9782 -extern "C" void printf(const char*, ...); +extern "C" int printf(const char*, ...); template <int> struct A { diff --git a/gcc/testsuite/g++.dg/ipa/inline-1.C b/gcc/testsuite/g++.dg/ipa/inline-1.C index 9ea614b295d..d570dc67e28 100644 --- a/gcc/testsuite/g++.dg/ipa/inline-1.C +++ b/gcc/testsuite/g++.dg/ipa/inline-1.C @@ -3,7 +3,7 @@ /* { dg-add-options bind_pic_locally } */ namespace std { - extern "C" void puts(const char *s); + extern "C" int puts(const char *s); } template <class T, class E> void diff --git a/gcc/testsuite/g++.dg/ipa/inline-2.C b/gcc/testsuite/g++.dg/ipa/inline-2.C index cc5b2559ae7..eb0f21b1247 100644 --- a/gcc/testsuite/g++.dg/ipa/inline-2.C +++ b/gcc/testsuite/g++.dg/ipa/inline-2.C @@ -3,7 +3,7 @@ /* { dg-add-options bind_pic_locally } */ namespace std { - extern "C" void puts(const char *s); + extern "C" int puts(const char *s); } template <class T, class E> void diff --git a/gcc/testsuite/g++.dg/ipa/pr78188.C b/gcc/testsuite/g++.dg/ipa/pr78188.C new file mode 100644 index 00000000000..f6ee654471e --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr78188.C @@ -0,0 +1,20 @@ +// { dg-do compile } +// { dg-options "-O2 -fno-exceptions" } + +int a; +static void __attribute__((noinline)) foo () { a = 1; } +static void __attribute__((noinline)) foo2 () { a = 2; } + +struct X +{ + virtual void bar (int i) { if (!i) { foo (); __builtin_abort (); } } +}; + +void baz (int i) +{ + if (!i) + { foo2 (); __builtin_abort (); } +} + +X xx; + diff --git a/gcc/testsuite/g++.dg/lto/20080908-1_0.C b/gcc/testsuite/g++.dg/lto/20080908-1_0.C index 8b761c0844c..42b20cb3b3a 100644 --- a/gcc/testsuite/g++.dg/lto/20080908-1_0.C +++ b/gcc/testsuite/g++.dg/lto/20080908-1_0.C @@ -1,5 +1,5 @@ /* { dg-lto-do run } */ -extern "C" { extern void *memcpy (void *, const void *, unsigned); } +extern "C" { extern void *memcpy (void *, const void *, __SIZE_TYPE__); } inline int bci (const float &source) diff --git a/gcc/testsuite/g++.dg/opt/pr64411.C b/gcc/testsuite/g++.dg/opt/pr64411.C new file mode 100644 index 00000000000..122b9eec414 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr64411.C @@ -0,0 +1,28 @@ +// PR target/64411 +// { dg-do compile { target { { i?86-*-* x86_64-*-* } && lp64 } } } +// { dg-options "-Os -mcmodel=medium -fPIC -fschedule-insns -fselective-scheduling" } + +typedef __SIZE_TYPE__ size_t; + +extern "C" long strtol () + { return 0; } + +static struct { + void *sp[2]; +} info; + +union S813 +{ + void * c[5]; +} +s813; + +S813 a813[5]; +S813 check813 (S813, S813 *, S813); + +void checkx813 () +{ + __builtin_memset (&s813, '\0', sizeof (s813)); + __builtin_memset (&info, '\0', sizeof (info)); + check813 (s813, &a813[1], a813[2]); +} diff --git a/gcc/testsuite/g++.dg/opt/pr65105-4.C b/gcc/testsuite/g++.dg/opt/pr65105-4.C new file mode 100644 index 00000000000..d79ba1abab0 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr65105-4.C @@ -0,0 +1,19 @@ +// PR target/65105 +// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } } +// { dg-options "-O2 -march=slm" } + +struct s { + long long l1, l2, l3, l4, l5; +} *a; +long long b; +long long fn1() +{ + try + { + b = (a->l1 | a->l2 | a->l3 | a->l4 | a->l5); + return a->l1; + } + catch (int) + { + } +} diff --git a/gcc/testsuite/g++.dg/opt/pr71529.C b/gcc/testsuite/g++.dg/opt/pr71529.C new file mode 100644 index 00000000000..148527f00c4 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr71529.C @@ -0,0 +1,22 @@ +// PR middle-end/71529 +// { dg-do compile { target { { i?86-*-* x86_64-*-* } && { ! x32 } } } } +// { dg-options "-fcheck-pointer-bounds -mmpx -O2" } + +class c1 +{ + public: + virtual ~c1 (); +}; + +class c2 +{ + public: + virtual ~c2 (); +}; + +class c3 : c1, c2 { }; + +int main (int, char **) +{ + c3 obj; +} diff --git a/gcc/testsuite/g++.dg/pr78229.C b/gcc/testsuite/g++.dg/pr78229.C new file mode 100644 index 00000000000..a52141b6b83 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr78229.C @@ -0,0 +1,24 @@ +/* { dg-do compile { target x86_64-*-* i?86-*-* } } */ +/* { dg-options "-O2 -mbmi -w" } */ + +void a(); +inline int b(int c) { + int d = c; + return __builtin_ia32_tzcnt_u32(d); +} +struct e {}; +int f, g, h; +void fn3() { + float j; + &j; + { + e k; + while (h) { + if (g == 0) + continue; + int i = b(g); + f = i; + } + a(); + } +} diff --git a/gcc/testsuite/g++.dg/tc1/dr20.C b/gcc/testsuite/g++.dg/tc1/dr20.C index fe586212995..93338518190 100644 --- a/gcc/testsuite/g++.dg/tc1/dr20.C +++ b/gcc/testsuite/g++.dg/tc1/dr20.C @@ -2,7 +2,7 @@ // Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> // DR20: Some clarifications needed for 12.8 para 15 -extern "C" void printf(const char*, ...); +extern "C" int printf(const char*, ...); extern "C" void abort(void); int count = 0; diff --git a/gcc/testsuite/g++.dg/template/func2.C b/gcc/testsuite/g++.dg/template/func2.C index b0f691d242b..746f0e279a7 100644 --- a/gcc/testsuite/g++.dg/template/func2.C +++ b/gcc/testsuite/g++.dg/template/func2.C @@ -5,7 +5,7 @@ fptr zeroptr = 0; template<typename T, fptr F> struct foo { }; template<typename T> struct foo<T,zeroptr> { }; // { dg-error "not a valid template argument" "not valid" { target *-*-* } 6 } -// { dg-error "must be the address" "must be the address " { target *-*-* } 6 } +// { dg-message "must be the address" "must be the address " { target *-*-* } 6 } // The rest is needed to trigger the ICE in 4.0 to 4.3: void f() { } diff --git a/gcc/testsuite/g++.dg/torture/pr77822.C b/gcc/testsuite/g++.dg/torture/pr77822.C new file mode 100644 index 00000000000..4dc428b63ee --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr77822.C @@ -0,0 +1,30 @@ +// PR target/77822 +// { dg-do compile } + +using UINT8 = char; +using UINT32 = int; +using UINT64 = long; +class A +{ + void m_fn1 (); + struct B + { + UINT32 m_multiplier; + }; + UINT8 m_datawidth; + UINT8 m_subunits; + B m_subunit_infos[]; +}; +int a; +UINT64 b; +void +A::m_fn1 () +{ + int c = 32, d = m_datawidth / c; + for (int e = 0; e < d; e++) + { + UINT32 f = e * 32; + if (b >> f & 1) + m_subunit_infos[m_subunits].m_multiplier = a; + } +} diff --git a/gcc/testsuite/g++.dg/torture/pr77919-2.C b/gcc/testsuite/g++.dg/torture/pr77919-2.C new file mode 100644 index 00000000000..d61e704cb44 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr77919-2.C @@ -0,0 +1,10 @@ +// PR rtl-optimization/77919 +// { dg-do compile } + +typedef _Complex long long B; +struct A { A (double) {} _Complex double i; }; +typedef struct { B b; } C; +struct D { D (const B &x) : b (x) {} B b; }; +static inline B foo (const double *x) { C *a; a = (C *) x; return a->b; } +static inline D baz (const A &x) { return foo ((double *) &x); } +D b = baz (0); diff --git a/gcc/testsuite/g++.dg/torture/pr78189.C b/gcc/testsuite/g++.dg/torture/pr78189.C new file mode 100644 index 00000000000..9b65d2b5a63 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr78189.C @@ -0,0 +1,41 @@ +/* { dg-do run } */ +/* { dg-additional-options "-ftree-slp-vectorize -fno-vect-cost-model" } */ + +#include <cstddef> + +struct A +{ + void * a; + void * b; +}; + +struct alignas(16) B +{ + void * pad; + void * misaligned; + void * pad2; + + A a; + + void Null(); +}; + +void B::Null() +{ + a.a = nullptr; + a.b = nullptr; +} + +void __attribute__((noinline,noclone)) +NullB(void * misalignedPtr) +{ + B* b = reinterpret_cast<B*>(reinterpret_cast<char *>(misalignedPtr) - offsetof(B, misaligned)); + b->Null(); +} + +int main() +{ + B b; + NullB(&b.misaligned); + return 0; +} diff --git a/gcc/testsuite/g++.dg/torture/pr78224.C b/gcc/testsuite/g++.dg/torture/pr78224.C new file mode 100644 index 00000000000..bb85339e8f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr78224.C @@ -0,0 +1,51 @@ +// { dg-do compile } + +extern "C"{ + float sqrtf(float); +} + +inline float squareroot(const float f) +{ + return sqrtf(f); +} + +inline int squareroot(const int f) +{ + return static_cast<int>(sqrtf(static_cast<float>(f))); +} + +template <class T> +class vector2d +{ +public: + vector2d(T nx, T ny) : X(nx), Y(ny) {} + T getLength() const { return squareroot( X*X + Y*Y ); } + T X; + T Y; +}; + +vector2d<int> getMousePos(); + +class Client +{ +public: + Client(); + ~Client(); +}; + +void the_game(float turn_amount) +{ + Client client; + bool first = true; + + while (1) { + if (first) { + first = false; + } else { + int dx = getMousePos().X; + int dy = getMousePos().Y; + + turn_amount = vector2d<float>(dx, dy).getLength(); + } + } +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-1.C b/gcc/testsuite/g++.dg/tree-ssa/inline-1.C index 1abfa324ad5..4497facb87b 100644 --- a/gcc/testsuite/g++.dg/tree-ssa/inline-1.C +++ b/gcc/testsuite/g++.dg/tree-ssa/inline-1.C @@ -3,7 +3,7 @@ /* { dg-add-options bind_pic_locally } */ namespace std { - extern "C" void puts(const char *s); + extern "C" int puts(const char *s); } template <class T, class E> void diff --git a/gcc/testsuite/g++.dg/tree-ssa/inline-2.C b/gcc/testsuite/g++.dg/tree-ssa/inline-2.C index 53e609ecd8f..79f807cd220 100644 --- a/gcc/testsuite/g++.dg/tree-ssa/inline-2.C +++ b/gcc/testsuite/g++.dg/tree-ssa/inline-2.C @@ -3,7 +3,7 @@ /* { dg-add-options bind_pic_locally } */ namespace std { - extern "C" void puts(const char *s); + extern "C" int puts(const char *s); } template <class T, class E> void diff --git a/gcc/testsuite/g++.dg/warn/Wimplicit-fallthrough-2.C b/gcc/testsuite/g++.dg/warn/Wimplicit-fallthrough-2.C new file mode 100644 index 00000000000..cacaf55bb49 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wimplicit-fallthrough-2.C @@ -0,0 +1,66 @@ +// PR c++/77886 +// { dg-do compile } +// { dg-options "-Wimplicit-fallthrough" } + +template <int N> +int +foo (int x, int y) +{ + switch (x) + { + case 1: + x++; // { dg-bogus "this statement may f\[ahlotu\]*gh" } + // FALLTHROUGH + case 2: + x++; + break; + case 3: + x++; // { dg-bogus "this statement may f\[ahlotu\]*gh" } + // FALLTHROUGH + lab: + case 4: + x++; + break; + case 5: + x++; // { dg-bogus "this statement may f\[ahlotu\]*gh" } + // FALLTHROUGH + default: + x++; + break; + case 26: + goto lab; + } +#if __cplusplus >= 201103L + switch (y) + { + case 1: + y++; // { dg-bogus "this statement may f\[ahlotu\]*gh" } + [[fallthrough]]; + case 2: + y++; + break; + case 3: + y++; // { dg-bogus "this statement may f\[ahlotu\]*gh" } + [[fallthrough]]; + lab2: + case 4: + y++; + break; + case 5: + y++; // { dg-bogus "this statement may f\[ahlotu\]*gh" } + [[fallthrough]]; + default: + y++; + break; + case 26: + goto lab2; + } +#endif + return x + y; +} + +int +bar (int x, int y) +{ + return foo<0> (x, y); +} diff --git a/gcc/testsuite/g++.dg/warn/Wshadow-compatible-local-1.C b/gcc/testsuite/g++.dg/warn/Wshadow-compatible-local-1.C new file mode 100644 index 00000000000..aac68619c3a --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wshadow-compatible-local-1.C @@ -0,0 +1,63 @@ +/* { dg-do compile } */ +/* { dg-options -Wshadow=compatible-local } */ + +class Bar { +}; + +class ChildBar : public Bar { +}; + +Bar bar; + +class Foo { + private: + int val; + + public: + int func1(int x) { + int val; + val = x; + return val; + } + + int func2(int i) { // { dg-message "note: shadowed declaration is here" } + int a = 3; // { dg-message "note: shadowed declaration is here" } + + for (int i = 0; i < 5; ++i) { // { dg-warning "shadows a parameter" } + for (int i = 0; i < 3; ++i) { // { dg-warning "shadows a previous local" } + int a = i; // { dg-warning "shadows a previous local" } + func1(a); + } + } + + return a; + } + + int func3() { + int bar; + float func1 = 0.3; + int f = 5; // { dg-message "note: shadowed declaration is here" } + + if (func1 > 1) { + float f = 2.0; // { dg-warning "shadows a previous local" } + bar = f; + } + else + bar = 1; + return bar; + } + + void func4() { + Bar *bar; // { dg-bogus "shadowed declaration" } + ChildBar *cbp; // { dg-bogus "shadowed declaration" } + Bar *bp; // { dg-message "note: shadowed declaration is here" } + if (val) { + int bar; // { dg-bogus "shadows a previous local" } + Bar *cbp; // { dg-bogus "shadows a previous local" } + ChildBar *bp; // { dg-warning "shadows a previous local" } + func1(bar); + } + } +}; + +// { dg-message "note: shadowed declaration" "" { target *-*-* } 26 } diff --git a/gcc/testsuite/g++.dg/warn/Wshadow-local-1.C b/gcc/testsuite/g++.dg/warn/Wshadow-local-1.C new file mode 100644 index 00000000000..dba6db5d1c2 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wshadow-local-1.C @@ -0,0 +1,35 @@ +/* { dg-do compile } */ +/* { dg-options -Wshadow=local } */ + +struct status +{ + int member; + void foo2 (); + + inline static int foo3 (int member) + { + return member; + } +}; + +int decl1; // { dg-bogus "shadowed declaration" } +int decl2; // { dg-bogus "shadowed declaration" } +void foo (struct status &status, + double decl1) // { dg-bogus "shadows a global" } +{ +} + +void foo1 (int d) +{ + double d; // { dg-error "shadows a parameter" } +} + +void status::foo2 () +{ + int member; // { dg-bogus "shadows a member" } + int decl2; // { dg-bogus "shadows a global" } + int local; // { dg-message "note: shadowed declaration is here" } + { + int local; // { dg-warning "shadows a previous local" } + } +} diff --git a/gcc/testsuite/g++.dg/warn/Wshadow-local-2.C b/gcc/testsuite/g++.dg/warn/Wshadow-local-2.C new file mode 100644 index 00000000000..fe42c89d242 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wshadow-local-2.C @@ -0,0 +1,63 @@ +/* { dg-do compile } */ +/* { dg-options -Wshadow=local } */ + +class Bar { +}; + +class ChildBar : public Bar { +}; + +Bar bar; // { dg-bogus "shadowed declaration" } + +class Foo { + private: + int val; + + public: + int func1(int x) { + int val; // { dg-bogus "shadows a member" } + val = x; + return val; + } + + int func2(int i) { // { dg-message "shadowed declaration is here" } + int a = 3; // { dg-message "shadowed declaration is here" } + + for (int i = 0; i < 5; ++i) { // { dg-warning "shadows a parameter" } + for (int i = 0; i < 3; ++i) { // { dg-warning "shadows a previous local" } + int a = i; // { dg-warning "shadows a previous local" } + func1(a); + } + } + + return a; + } + + int func3() { + int bar; // { dg-bogus "shadows a global" } + float func1 = 0.3; // { dg-bogus "shadows a member" } + int f = 5; // { dg-message "shadowed declaration is here" } + + if (func1 > 1) { + float f = 2.0; // { dg-warning "shadows a previous local" } + bar = f; + } + else + bar = 1; + return bar; + } + + void func4() { + Bar *bar; // { dg-message "shadowed declaration is here" } + ChildBar *cbp; // { dg-message "shadowed declaration is here" } + Bar *bp; // { dg-message "shadowed declaration is here" } + if (val) { + int bar; // { dg-warning "shadows a previous local" } + Bar *cbp; // { dg-warning "shadows a previous local" } + ChildBar *bp; // { dg-warning "shadows a previous local" } + func1(bar); + } + } +}; + +// { dg-message "shadowed declaration is here" "" { target *-*-* } 26 } |