diff options
Diffstat (limited to 'gcc-4.9/gcc/testsuite/g++.dg')
135 files changed, 1895 insertions, 77 deletions
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/aarch64_guard1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/aarch64_guard1.C index ca1778b87..e2669a89f 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/abi/aarch64_guard1.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/aarch64_guard1.C @@ -13,5 +13,4 @@ int *foo () } // { dg-final { scan-assembler _ZGVZ3foovE1x,8,8 } } -// { dg-final { scan-tree-dump "_ZGVZ3foovE1x & 1" "original" } } -// { dg-final { cleanup-tree-dump "original" } } +// { dg-final { scan-tree-dump "& 1" "original" } } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/no-weak1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/no-weak1.C new file mode 100644 index 000000000..d53901531 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/no-weak1.C @@ -0,0 +1,13 @@ +// { dg-options "-fno-weak" } +// { dg-final { scan-assembler "local\[ \t\]*_ZZL1fvE1i" { target x86_64-*-*gnu } } } + +static inline void f() +{ + static int i; + ++i; +}; + +int main() +{ + f(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/spec1.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/spec1.C new file mode 100644 index 000000000..153c0cfe7 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/spec1.C @@ -0,0 +1,4 @@ +// { dg-final { scan-assembler-not "weak" } } + +template <class T> struct A { static int i; }; +template<> int A<int>::i = 42; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/asan/pr62017.C b/gcc-4.9/gcc/testsuite/g++.dg/asan/pr62017.C new file mode 100644 index 000000000..74ef37fd2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/asan/pr62017.C @@ -0,0 +1,17 @@ +// PR c++/62017 +// { dg-do run } + +struct A +{ + int x; + virtual ~A () {} +}; +struct B : public virtual A {}; +struct C : public virtual A {}; +struct D : public B, virtual public C {}; + +int +main () +{ + D d; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c b/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c index 2cf08946e..2884c25f3 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c +++ b/gcc-4.9/gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c @@ -1,5 +1,5 @@ /* Structure layout test generator. - Copyright (C) 2004, 2005, 2007, 2008, 2009, 2011, 2012 + Copyright (C) 2004-2014 Free Software Foundation, Inc. Contributed by Jakub Jelinek <jakub@redhat.com>. @@ -44,7 +44,7 @@ along with GCC; see the file COPYING3. If not see #endif const char *dg_options[] = { -"/* { dg-options \"%s-I%s\" } */\n", +"/* { dg-options \"%s-I%s -Wno-abi\" } */\n", "/* { dg-options \"%s-I%s -mno-mmx -Wno-abi\" { target i?86-*-* x86_64-*-* } } */\n", "/* { dg-options \"%s-I%s -fno-common\" { target hppa*-*-hpux* powerpc*-*-darwin* *-*-mingw32* *-*-cygwin* } } */\n", "/* { dg-options \"%s-I%s -mno-mmx -fno-common -Wno-abi\" { target i?86-*-darwin* x86_64-*-darwin* i?86-*-mingw32* x86_64-*-mingw32* i?86-*-cygwin* } } */\n", diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-44.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-44.C new file mode 100644 index 000000000..bd20b54f1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/alias-decl-44.C @@ -0,0 +1,43 @@ +// PR c++/63849 +// { dg-do compile { target c++11 } } + +template <class _T, class...> +using First = _T; // we should not use this + // alias with only + // one pack parameter (?) + +template <template <class...> class _Successor, + int, + class... _Xs> +struct Overlay +{ + using O = _Successor<_Xs...>; +}; + +template <class... _Pack> +struct List +{ + template <int _s> + using O = typename Overlay<List, _s, _Pack...>::O; + + template <template <class...> class _S> + using Pass = _S<_Pack...>; + + template <int _i> + using At = typename O<_i> + ::template Pass<First>; +}; + +template <int _i> +using At = typename List<int, char> +::template At<_i>; + +template <int _i> +void func_crash(At<_i>&) {} + +int main(int argc, char *argv[]) +{ + char ccc; + int iii; + func_crash<0>(iii); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-63241.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-63241.C new file mode 100644 index 000000000..2553cae34 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-63241.C @@ -0,0 +1,13 @@ +// PR c++/63241 +// { dg-do compile { target c++11 } } + +struct A { + constexpr A(int){} +}; + +int main() { + int i = 1; + A array[2][2] = + {{{0}, {i}}, + {{0}, {0}}}; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-63265.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-63265.C new file mode 100644 index 000000000..aa0ce5e7c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-63265.C @@ -0,0 +1,19 @@ +// PR c++/63265 +// { dg-do compile { target c++11 } } + +#define LSHIFT (sizeof(unsigned int) * __CHAR_BIT__) + +template <int lshift> +struct SpuriouslyWarns1 { + static constexpr unsigned int v = lshift < LSHIFT ? 1U << lshift : 0; +}; + +static_assert(SpuriouslyWarns1<LSHIFT>::v == 0, "Impossible occurred"); + +template <int lshift> +struct SpuriouslyWarns2 { + static constexpr bool okay = lshift < LSHIFT; + static constexpr unsigned int v = okay ? 1U << lshift : 0; +}; + +static_assert(SpuriouslyWarns2<LSHIFT>::v == 0, "Impossible occurred"); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist8.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist8.C new file mode 100644 index 000000000..3d859a852 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-initlist8.C @@ -0,0 +1,7 @@ +// PR c++/63415 +// { dg-do compile { target c++11 } } + +template <typename T> +struct A { + static constexpr int value = int(T{}); +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted9.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted9.C new file mode 100644 index 000000000..af97be7c3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/deleted9.C @@ -0,0 +1,31 @@ +// PR c++/64352 +// { dg-do compile { target c++11 } } + +template<bool B> struct bool_type +{ static constexpr bool value = B; }; + +using true_type = bool_type<true>; +using false_type = bool_type<false>; + +template<typename T> T&& declval(); + +template<typename...> struct void_ { using type = void; }; +template<typename... I> using void_t = typename void_<I...>::type; + +template<typename _Tp, typename = void> +struct _Has_addressof_free: false_type { }; + +template<typename _Tp> +struct _Has_addressof_free +<_Tp, void_t<decltype( operator&(declval<const _Tp&>()) )>> +: true_type { }; + +struct foo {}; +void operator&(foo) = delete; + +int main() +{ + static_assert( !_Has_addressof_free<int>::value, "" ); + // error: use of deleted function 'void operator&(foo)' + static_assert( !_Has_addressof_free<foo>::value, "" ); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist89.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist89.C new file mode 100644 index 000000000..e221664e3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist89.C @@ -0,0 +1,4 @@ +// PR c++/64029 +// { dg-do compile { target c++11 } } + +const int (&in)[]{1,2,3,4,5}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template14.C new file mode 100644 index 000000000..b73ef753e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template14.C @@ -0,0 +1,11 @@ +// PR c++/62219 +// { dg-do compile { target c++11 } } + +template< class = void > +struct S +{ + friend void foo( S ) + { + [](){}; + } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual16.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual16.C new file mode 100644 index 000000000..1d7650bb6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/ref-qual16.C @@ -0,0 +1,12 @@ +// PR c++/64297 +// { dg-do compile { target c++11 } } + +struct A { + typedef int X; + template <int> X m_fn1() const; +}; +template <typename> struct is_function {}; +is_function<int() const &> i; +struct D { + template <typename Y, typename = is_function<Y>> D(Y); +} b(&A::m_fn1<0>); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic161.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic161.C new file mode 100644 index 000000000..ac6eaf6a3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic161.C @@ -0,0 +1,51 @@ +// PR c++/63139 +// { dg-do compile { target c++11 } } + +template<typename ...T> +struct type_list {}; + +template<typename ...T> +struct make_type_list +{ + using type = type_list<T...>; +}; + +// The bug disappears if you use make_type_list directly. +template<typename ...T> +using make_type_list_t = typename make_type_list<T...>::type; + + +struct ContainerEndA {}; + +template<typename ...Ts> +struct ContainerA +{ + using type = make_type_list_t<Ts..., ContainerEndA>; +}; + + +struct ContainerEndB {}; + +template<typename ...Ts> +struct ContainerB +{ + using type = make_type_list_t<Ts..., ContainerEndB>; +}; + +template<typename T, typename U> +struct is_same +{ + static const bool value = false; +}; + +template<typename T> +struct is_same<T, T> +{ + static const bool value = true; +}; + +#define SA(X) static_assert((X), #X) + +SA((is_same<ContainerB<>::type, type_list<ContainerEndB>>::value)); +SA((!is_same<ContainerA<>::type, type_list<ContainerEndB>>::value)); +SA((!is_same<ContainerA<>::type, ContainerB<>::type>::value)); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic162.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic162.C new file mode 100644 index 000000000..9e5386deb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic162.C @@ -0,0 +1,14 @@ +// PR c++/63405 +// { dg-do compile { target c++11 } } + +template <typename _Tp> _Tp forward(_Tp); +template <typename Args> struct Format { Format(int, Args); }; +template <typename... Args> auto format(Args &&... args) -> Format<Args...> { + return {0, args...}; +} + +template <typename... Args> void msg(Args... args) { + format(forward(args)...); +} + +void some_function() { msg('x'); } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/feat-cxx11-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/feat-cxx11-neg.C new file mode 100644 index 000000000..8719577c5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/feat-cxx11-neg.C @@ -0,0 +1,40 @@ +// { dg-do compile { target c++11_only } } +// { dg-options "-pedantic-errors" } + +// These *are* defined in C++14 onwards. + +#ifndef __cpp_binary_literals +# error "__cpp_binary_literals" // { dg-error "error" } +#endif + +#ifndef __cpp_init_captures +# error "__cpp_init_captures" // { dg-error "error" } +#endif + +#ifndef __cpp_generic_lambdas +# error "__cpp_generic_lambdas" // { dg-error "error" } +#endif + +#ifndef __cpp_decltype_auto +# error "__cpp_decltype_auto" // { dg-error "error" } +#endif + +#ifndef __cpp_return_type_deduction +# error "__cpp_return_type_deduction" // { dg-error "error" } +#endif + +#ifndef __cpp_variable_templates +# error "__cpp_variable_templates" // { dg-error "error" } +#endif + +#ifndef __cpp_digit_separators +# error "__cpp_digit_separators" // { dg-error "error" } +#endif + +#ifndef __cpp_attribute_deprecated +# error "__cpp_attribute_deprecated" // { dg-error "error" } +#endif + +#ifndef __cpp_runtime_arrays +# error "__cpp_runtime_arrays" // { dg-error "error" } +#endif diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C new file mode 100644 index 000000000..606a5cec6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/feat-cxx11.C @@ -0,0 +1,81 @@ +// { dg-do compile } +// { dg-options "-std=gnu++11" } + +#ifndef __cpp_unicode_characters +# error "__cpp_unicode_characters" +#elif __cpp_unicode_characters != 200704 +# error "__cpp_unicode_characters != 200704" +#endif + +#ifndef __cpp_raw_strings +# error "__cpp_raw_strings" +#elif __cpp_raw_strings != 200710 +# error "__cpp_raw_strings != 200710" +#endif + +#ifndef __cpp_unicode_literals +# error "__cpp_unicode_literals" +#elif __cpp_unicode_literals != 200710 +# error "__cpp_unicode_literals != 200710" +#endif + +#ifndef __cpp_user_defined_literals +# error "__cpp_user_defined_literals" +#elif __cpp_user_defined_literals != 200809 +# error "__cpp_user_defined_literals != 200809" +#endif + +#ifndef __cpp_lambdas +# error "__cpp_lambdas" +#elif __cpp_lambdas != 200907 +# error "__cpp_lambdas != 200907" +#endif + +#ifndef __cpp_constexpr +# error "__cpp_constexpr" +#elif __cpp_constexpr != 200704 +# error "__cpp_constexpr != 200704" +#endif + +#ifndef __cpp_static_assert +# error "__cpp_static_assert" +#elif __cpp_static_assert != 200410 +# error "__cpp_static_assert != 200410" +#endif + +#ifndef __cpp_decltype +# error "__cpp_decltype" +#elif __cpp_decltype != 200707 +# error "__cpp_decltype != 200707" +#endif + +#ifndef __cpp_attributes +# error "__cpp_attributes" +#elif __cpp_attributes != 200809 +# error "__cpp_attributes != 200809" +#endif + +#ifndef __cpp_rvalue_reference +# error "__cpp_rvalue_reference" +#elif __cpp_rvalue_reference != 200610 +# error "__cpp_rvalue_reference != 200610" +#endif + +#ifndef __cpp_variadic_templates +# error "__cpp_variadic_templates" +#elif __cpp_variadic_templates != 200704 +# error "__cpp_variadic_templates != 200704" +#endif + +#ifndef __cpp_alias_templates +# error "__cpp_alias_templates" +#elif __cpp_alias_templates != 200704 +# error "__cpp_alias_templates != 200704" +#endif + +// These C++14 features are allowed in C++11 in non-ANSI modes. +#ifndef __cpp_binary_literals +# error "__cpp_binary_literals" +#elif __cpp_binary_literals != 201304 +# error "__cpp_binary_literals != 201304" +#endif diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C new file mode 100644 index 000000000..8a05f6660 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/feat-cxx14.C @@ -0,0 +1,231 @@ +// { dg-do compile { target c++1y } } +// { dg-options "-I${srcdir}/g++.dg/cpp1y -I${srcdir}/g++.dg/cpp1y/testinc" } + +// Begin C++11 tests. + +#ifndef __cpp_unicode_characters +# error "__cpp_unicode_characters" +#elif __cpp_unicode_characters != 200704 +# error "__cpp_unicode_characters != 200704" +#endif + +#ifndef __cpp_raw_strings +# error "__cpp_raw_strings" +#elif __cpp_raw_strings != 200710 +# error "__cpp_raw_strings != 200710" +#endif + +#ifndef __cpp_unicode_literals +# error "__cpp_unicode_literals" +#elif __cpp_unicode_literals != 200710 +# error "__cpp_unicode_literals != 200710" +#endif + +#ifndef __cpp_user_defined_literals +# error "__cpp_user_defined_literals" +#elif __cpp_user_defined_literals != 200809 +# error "__cpp_user_defined_literals != 200809" +#endif + +#ifndef __cpp_lambdas +# error "__cpp_lambdas" +#elif __cpp_lambdas != 200907 +# error "__cpp_lambdas != 200907" +#endif + +#ifndef __cpp_constexpr +# error "__cpp_constexpr" +#elif __cpp_constexpr != 200704 +# error "__cpp_constexpr != 200704" +#endif + +#ifndef __cpp_static_assert +# error "__cpp_static_assert" +#elif __cpp_static_assert != 200410 +# error "__cpp_static_assert != 200410" +#endif + +#ifndef __cpp_decltype +# error "__cpp_decltype" +#elif __cpp_decltype != 200707 +# error "__cpp_decltype != 200707" +#endif + +#ifndef __cpp_attributes +# error "__cpp_attributes" +#elif __cpp_attributes != 200809 +# error "__cpp_attributes != 200809" +#endif + +#ifndef __cpp_rvalue_reference +# error "__cpp_rvalue_reference" +#elif __cpp_rvalue_reference != 200610 +# error "__cpp_rvalue_reference != 200610" +#endif + +#ifndef __cpp_variadic_templates +# error "__cpp_variadic_templates" +#elif __cpp_variadic_templates != 200704 +# error "__cpp_variadic_templates != 200704" +#endif + +#ifndef __cpp_alias_templates +# error "__cpp_alias_templates" +#elif __cpp_alias_templates != 200704 +# error "__cpp_alias_templates != 200704" +#endif + +// Begin C++14 tests. + +#ifndef __cpp_binary_literals +# error "__cpp_binary_literals" +#elif __cpp_binary_literals != 201304 +# error "__cpp_binary_literals != 201304" +#endif + +#ifndef __cpp_init_captures +# error "__cpp_init_captures" +#elif __cpp_init_captures != 201304 +# error "__cpp_init_captures != 201304" +#endif + +#ifndef __cpp_generic_lambdas +# error "__cpp_generic_lambdas" +#elif __cpp_generic_lambdas != 201304 +# error "__cpp_generic_lambdas != 201304" +#endif + +// TODO: Change 200704 to 201304 when C++14 constexpr goes in. +#ifndef __cpp_constexpr +# error "__cpp_constexpr" +#elif __cpp_constexpr != 200704 +# error "__cpp_constexpr != 200704" +#endif + +#ifndef __cpp_decltype_auto +# error "__cpp_decltype_auto" +#elif __cpp_decltype_auto != 201304 +# error "__cpp_decltype_auto != 201304" +#endif + +#ifndef __cpp_return_type_deduction +# error "__cpp_return_type_deduction" +#elif __cpp_return_type_deduction != 201304 +# error "__cpp_return_type_deduction != 201304" +#endif + +#ifndef __cpp_runtime_arrays +# error "__cpp_runtime_arrays" +#elif __cpp_runtime_arrays != 201304 +# error "__cpp_runtime_arrays != 201304" +#endif + +// Aggregate initializers not in yet. +#ifdef __cpp_aggregate_nsdmi +# error "__cpp_aggregate_nsdmi" +#endif + +// Variable templates not in yet. +#ifdef __cpp_variable_templates +# error "__cpp_variable_templates" +#endif + +#ifndef __cpp_digit_separators +# error "__cpp_digit_separators" +#elif __cpp_digit_separators != 201309 +# error "__cpp_digit_separators != 201309" +#endif + +#ifndef __cpp_attribute_deprecated +# error "__cpp_attribute_deprecated" +#elif __cpp_attribute_deprecated != 201309 +# error "__cpp_attribute_deprecated != 201309" +#endif + +// Sized deallocation not in yet. +#ifdef __cpp_sized_deallocation +# error "__cpp_sized_deallocation" +#endif + +// Begin include checks. + +// Check for __has_include macro. +#ifndef __has_include +# error "__has_include" +#endif + +// Quoted complex.h should find at least the bracket version (use operator). +#if __has_include__ "complex.h" +#else +# error "complex.h" +#endif + +// Try known bracket header (use operator). +#if __has_include__(<complex>) +#else +# error "<complex>" +#endif + +// Define and use a macro to invoke the operator. +#define sluggo(TXT) __has_include__(TXT) + +#if sluggo(<complex>) +#else +# error "<complex>" +#endif + +#if ! sluggo(<complex>) +# error "<complex>" +#else +#endif + +// Quoted complex.h should find at least the bracket version. +#if __has_include("complex.h") +#else +# error "complex.h" +#endif + +// Try known local quote header. +#if __has_include("complex_literals.h") +#else +# error "\"complex_literals.h\"" +#endif + +// Try nonexistent bracket header. +#if __has_include(<stuff>) +# error "<stuff>" +#else +#endif + +// Try nonexistent quote header. +#if __has_include("phlegm") +# error "\"phlegm\"" +#else +#endif + +// Test __has_include_next. +#if __has_include("phoobhar.h") +# include "phoobhar.h" +#else +# error "__has_include(\"phoobhar.h\")" +#endif + +// Try a macro. +#define COMPLEX_INC "complex.h" +#if __has_include(COMPLEX_INC) +#else +# error COMPLEX_INC +#endif + +// Realistic use of __has_include. +#if __has_include(<array>) +# define STD_ARRAY 1 +# include <array> + template<typename _Tp, size_t _Num> + using array = std::array<_Tp, _Num>; +#elif __has_include(<tr1/array>) +# define TR1_ARRAY 1 +# include <tr1/array> + template<typename _Tp, size_t _Num> + typedef std::tr1::array<_Tp, _Num> array; +#endif diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/feat-cxx98-neg.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/feat-cxx98-neg.C new file mode 100644 index 000000000..b99b57efe --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/feat-cxx98-neg.C @@ -0,0 +1,99 @@ +// { dg-do compile { target c++98_only } } +// { dg-options "-ansi" } + +#ifndef __cpp_runtime_arrays +# error "__cpp_runtime_arrays" // { dg-error "error" } +#endif + +#ifndef __cpp_unicode_characters +# error "__cpp_unicode_characters" // { dg-error "error" } +#endif + +#ifndef __cpp_raw_strings +# error "__cpp_raw_strings" // { dg-error "error" } +#endif + +#ifndef __cpp_unicode_literals +# error "__cpp_unicode_literals" // { dg-error "error" } +#endif + +#ifndef __cpp_user_defined_literals +# error "__cpp_user_defined_literals" // { dg-error "error" } +#endif + +#ifndef __cpp_lambdas +# error "__cpp_lambdas" // { dg-error "error" } +#endif + +#ifndef __cpp_constexpr +# error "__cpp_constexpr" // { dg-error "error" } +#endif + +#ifndef __cpp_static_assert +# error "__cpp_static_assert" // { dg-error "error" } +#endif + +#ifndef __cpp_decltype +# error "__cpp_decltype" // { dg-error "error" } +#endif + +#ifndef __cpp_attributes +# error "__cpp_attributes" // { dg-error "error" } +#endif + +#ifndef __cpp_rvalue_reference +# error "__cpp_rvalue_reference" // { dg-error "error" } +#endif + +#ifndef __cpp_variadic_templates +# error "__cpp_variadic_templates" // { dg-error "error" } +#endif + +#ifndef __cpp_alias_templates +# error "__cpp_alias_templates" // { dg-error "error" } +#endif + +// C++14 + +// C++98 gets binary literals. +//#ifndef __cpp_binary_literals +//# error "__cpp_binary_literals" +//#endif + +#ifndef __cpp_init_captures +# error "__cpp_init_captures" // { dg-error "error" } +#endif + +#ifndef __cpp_generic_lambdas +# error "__cpp_generic_lambdas" // { dg-error "error" } +#endif + +#ifndef __cpp_decltype_auto +# error "__cpp_decltype_auto" // { dg-error "error" } +#endif + +#ifndef __cpp_return_type_deduction +# error "__cpp_return_type_deduction" // { dg-error "error" } +#endif + +// Aggregate initializers not in yet. +//#ifdef __cpp_aggregate_nsdmi +//# error "__cpp_aggregate_nsdmi" +//#endif + +#ifndef __cpp_variable_templates +# error "__cpp_variable_templates" // { dg-error "error" } +#endif + +#ifndef __cpp_digit_separators +# error "__cpp_digit_separators" // { dg-error "error" } +#endif + +#ifndef __cpp_attribute_deprecated +# error "__cpp_attribute_deprecated" // { dg-error "error" } +#endif + +// Sized deallocation not in yet. +//#ifdef __cpp_sized_deallocation +//# error "__cpp_sized_deallocation" +//#endif diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/feat-cxx98.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/feat-cxx98.C new file mode 100644 index 000000000..a0a2b75e3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/feat-cxx98.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++98_only } } +// { dg-options "" } + +// These C++14 features are allowed in C++98 in non-ANSI modes. +#ifndef __cpp_binary_literals +# error "__cpp_binary_literals" +#elif __cpp_binary_literals != 201304 +# error "__cpp_binary_literals != 201304" +#endif diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/paren1.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/paren1.C new file mode 100644 index 000000000..809f25100 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/paren1.C @@ -0,0 +1,31 @@ +// PR c++/63437 +// { dg-do compile { target c++11 } } + +struct X // movable but not copyable +{ + X() = default; + X(X &&) = default; + + X(const X &) = delete; +}; + +X non_parenthesized() +{ + X x; + return x; // works +} + +X parenthesized() +{ + X x; + return (x); // error: use of deleted function 'X::X(const X&)' +} + +template <class T> +T parenthesized_t() +{ + T t; + return (t); +} + +template X parenthesized_t<X>(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/phoobhar.h b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/phoobhar.h new file mode 100644 index 000000000..7feec3649 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/phoobhar.h @@ -0,0 +1,16 @@ + +int +phoo(); + +int +bhar(); + +#ifndef __has_include_next +# error "__has_include_next" +#else +# if __has_include_next("phoobhar.h") +# include_next "phoobhar.h" +# else +# error "__has_include_next(\"phoobhar.h\")" +# endif +#endif diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr57644.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr57644.C new file mode 100644 index 000000000..080572168 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr57644.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++1y } } + +struct Foo +{ + unsigned i: 32; +}; + +int +main() +{ + Foo f{}; + return f.i; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-2.C index eb8a92942..e14e6f800 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ext/altivec-2.C +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/ext/stmtexpr16.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/stmtexpr16.C new file mode 100644 index 000000000..ddce40c05 --- /dev/null +++ b/gcc-4.9/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-4.9/gcc/testsuite/g++.dg/gomp/pr63249.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr63249.C new file mode 100644 index 000000000..80f763a4c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr63249.C @@ -0,0 +1,35 @@ +// PR c++/63249 +// { dg-do compile } +// { dg-options "-Wall -W -fopenmp" } + +template <int N> +int +foo (int *v, int A, int B) // { dg-bogus "set but not used" } +{ + int r = 0; + int a = 2; // { dg-bogus "set but not used" } + int b = 4; // { dg-bogus "set but not used" } +#pragma omp target map(to: v[a:b]) + r |= v[3]; +#pragma omp target map(to: v[A:B]) + r |= v[3]; + return r; +} + +template <typename T> +int +bar (T *v, T A, T B) // { dg-bogus "set but not used" } +{ + T r = 0, a = 2, b = 4; // { dg-bogus "set but not used" } +#pragma omp target map(to: v[a:b]) + r |= v[3]; +#pragma omp target map(to: v[A:B]) + r |= v[3]; + return r; +} + +int +baz (int *v, int A, int B) +{ + return foo<0> (v, A, B) + bar (v, A, B); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/const9.C b/gcc-4.9/gcc/testsuite/g++.dg/init/const9.C index ba1dfd4bc..d733e9533 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/init/const9.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/init/const9.C @@ -1,5 +1,5 @@ // PR c++/55893 -// { dg-final { scan-assembler-not "rodata" } } +// { dg-final { scan-assembler-not "rodata" { target { ! hppa*-*-* } } } } struct foo { diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-1.C index de0f665c4..710a99c6f 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-1.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-1.C @@ -1,6 +1,6 @@ /* Verify that simple virtual calls are converted to direct calls by ipa-cp. */ /* { dg-do run } */ -/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-10.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-10.C index 658442e34..b58e1e036 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-10.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-10.C @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O3 -fdump-ipa-inline -fdump-ipa-cp -fno-early-inlining" } */ +/* { dg-options "-O3 -fdump-ipa-inline -fdump-ipa-cp -fno-early-inlining -fdevirtualize" } */ class wxPaintEvent { }; struct wxDCBase { diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-11.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-11.C index e31832b87..dae47f700 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-11.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-11.C @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-ipa-inline --param=early-inlining-insns-comdat=0 -fno-devirtualize-speculatively" } */ +/* { dg-options "-O2 -fdump-ipa-inline --param=early-inlining-insns-comdat=0 -fno-devirtualize-speculatively -fdevirtualize" } */ int baz (); struct A { diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-12.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-12.C index 16bae4d8d..4d713714c 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-12.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-12.C @@ -1,5 +1,5 @@ // { dg-do compile { target c++11 } } -// { dg-options "-O -fdump-ipa-inline" } +// { dg-options "-O -fdump-ipa-inline -fdevirtualize" } class Foo { diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-13.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-13.C index b338a4c34..4b2ff069b 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-13.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-13.C @@ -1,6 +1,6 @@ /* { dg-do run } */ /* Call to foo should be devirtualized because there are no derived types of A. */ -/* { dg-options "-O2 -fdump-tree-ssa" } */ +/* { dg-options "-O2 -fdump-tree-ssa -fdevirtualize" } */ namespace { class A { public: diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-14.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-14.C index 456d44f84..517173065 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-14.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-14.C @@ -2,7 +2,7 @@ because the constructor of A is unreachable and therefore the virtual method table referring to A::foo is optimized out. */ /* { dg-do run } */ -/* { dg-options "-O2 -fdump-tree-ssa" } */ +/* { dg-options "-O2 -fdump-tree-ssa -fdevirtualize" } */ class B { public: virtual int foo(void) diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-15.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-15.C index 2ea85f487..2c041b5a2 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-15.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-15.C @@ -1,7 +1,7 @@ /* Check that we speculatively devirutalize call to FOO to B::foo becuase A is noreturn. */ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-ipa-devirt -fdump-tree-optimized" } */ +/* { dg-options "-O2 -fdump-ipa-devirt -fdump-tree-optimized -fdevirtualize" } */ class A { public: virtual int foo(void) diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-16.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-16.C index 85567867f..d0ac06134 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-16.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-16.C @@ -1,7 +1,7 @@ /* We shall devirtualize to unreachable. No anonymous type method should surivve reachability. */ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-ipa-whole-program" } */ +/* { dg-options "-O2 -fdump-ipa-whole-program -fdevirtualize" } */ namespace { class B { public: diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-17.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-17.C index 9edfd73af..56e4294ab 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-17.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-17.C @@ -1,7 +1,7 @@ /* We shall devirtualize to B::foo since it is the only live candidate of an anonymous type. */ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-ipa-whole-program" } */ +/* { dg-options "-O2 -fdump-ipa-whole-program -fdevirtualize" } */ namespace { class B { public: diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-18.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-18.C index dbbe597c9..6729d7c42 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-18.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-18.C @@ -1,7 +1,7 @@ /* We shall devirtualize to unreachable. No anonymous type method should surivve reachability. */ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-ssa" } */ +/* { dg-options "-O2 -fdump-tree-ssa -fdevirtualize" } */ namespace { class B { public: diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-19.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-19.C index 13686e3e0..8fb82a288 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-19.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-19.C @@ -2,7 +2,7 @@ Previously we were failing by considering CLOBBER statement to be a type change. */ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-ipa-cp" } */ +/* { dg-options "-O2 -fdump-ipa-cp -fdevirtualize" } */ struct A { void operator==(const A &); }; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-2.C index d3181e4c0..95eba9c60 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-2.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-2.C @@ -1,7 +1,7 @@ /* Verify that simple virtual calls using this pointer are converted to direct calls by ipa-cp. */ /* { dg-do run } */ -/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp" } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-20.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-20.C index 0ea245baf..85e064b99 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-20.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-20.C @@ -1,6 +1,6 @@ #include <stdlib.h> /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-release_ssa" } */ +/* { dg-options "-O2 -fdump-tree-release_ssa -fdevirtualize" } */ namespace { struct A { int a; virtual int foo() {return a;} void bar() {a=7;} }; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-21.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-21.C index 675bd08d7..7791cb94f 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-21.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-21.C @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-O3 -fno-early-inlining -fno-ipa-sra -fdump-ipa-cp" } */ +/* { dg-options "-O3 -fno-early-inlining -fno-ipa-sra -fdump-ipa-cp -fdevirtualize" } */ /* Main purpose is to verify that we do not produce wrong devirtualization to C::m_fn1. We currently devirtualize to B::m_fn1, so check that. */ #include <stdlib.h> diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C index 37e766945..194d60004 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O3 -fno-early-inlining -fno-ipa-sra -fdump-ipa-cp" } */ +/* { dg-options "-O3 -fno-early-inlining -fno-ipa-sra -fdump-ipa-cp -fdevirtualize" } */ class A {}; class B { public: diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-23.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-23.C index 98d86aee8..52e3c9cef 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-23.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-23.C @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-O3 -fno-partial-inlining -fdump-ipa-cp -fno-devirtualize-speculatively" } */ +/* { dg-options "-O3 -fno-partial-inlining -fdump-ipa-cp -fno-devirtualize-speculatively -fdevirtualize" } */ /* Main purpose is to verify that we do not produce wrong devirtualization to C::m_fn1. We currently devirtualize to B::m_fn1, so check that. */ #include <stdlib.h> diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-24.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-24.C index 01bfdc2ec..4bba9b0c9 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-24.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-24.C @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O3 -fno-ipa-sra -fdump-ipa-inline -fdump-ipa-cp" } */ +/* { dg-options "-O3 -fno-ipa-sra -fdump-ipa-inline -fdump-ipa-cp --param=early-inlining-insns-comdat=0 -fdevirtualize" } */ void pad(void); class A {}; class B { diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-25.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-25.C index 1da44f5d1..fed7a96ef 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-25.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-25.C @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O3 -fdump-ipa-cp" } */ +/* { dg-options "-O3 -fdump-ipa-cp -fdevirtualize" } */ class ert_RefCounter { protected: diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-26.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-26.C index 2df429c34..f8b33e288 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-26.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-26.C @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O3 -fdump-ipa-devirt" } */ +/* { dg-options "-O3 -fdump-ipa-devirt -fdevirtualize" } */ struct A { int a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-27.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-27.C index 749f40af1..eb064990b 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-27.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-27.C @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O3 -fdump-tree-optimized" } */ +/* { dg-options "-O3 -fdump-tree-optimized -fdevirtualize" } */ struct A { int a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28.C index e18b81897..9bfef924d 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28.C @@ -1,5 +1,5 @@ // PR c++/58678 -// { dg-options "-O3 -fdump-ipa-devirt" } +// { dg-options "-O3 -fdump-ipa-devirt -fdevirtualize" } struct A { virtual ~A(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28a.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28a.C new file mode 100644 index 000000000..65d5fcdf3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-28a.C @@ -0,0 +1,15 @@ +// PR c++/58678 +// { dg-options "-O3 -flto -shared -fPIC -Wl,--no-undefined" } +// { dg-do link { target { { gld && fpic } && shared } } } + +struct A { + virtual ~A(); +}; +struct B : A { + virtual int m_fn1(); +}; +void fn1(B* b) { + delete b; +} + +int main() {} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-29.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-29.C index b4f24a104..ebfd01b60 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-29.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-29.C @@ -1,7 +1,7 @@ /* { dg-do run { target c++11 } } */ /* There is a devirtualizable call. In PR60306 we deduced wrong target to cxa_pure_virtual. For gcc 4.10 we temporarily disable the devirtualization. */ -/* { dg-options "-O3" } */ +/* { dg-options "-O3 -fdevirtualize" } */ #include <vector> diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-3.C index a68eb024f..45ad33756 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-3.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-3.C @@ -1,7 +1,7 @@ /* Verify that simple virtual calls on an object refrence are converted to simple calls by ipa-cp. */ /* { dg-do run } */ -/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-30.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-30.C index c4ac6940a..b147476f7 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-30.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-30.C @@ -1,5 +1,5 @@ // PR c++/58678 -// { dg-options "-O3 -fdump-ipa-devirt" } +// { dg-options "-O3 -fdump-ipa-devirt -fdevirtualize" } // We shouldn't speculatively devirtualize to ~B because B is an abstract // class; any actual object passed to f will be of some derived class which diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-31.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-31.C index 64c44ba1e..16c782025 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-31.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-31.C @@ -1,4 +1,4 @@ -/* { dg-options "-O2 -std=c++11 -fdump-ipa-inline" } */ +/* { dg-options "-O2 -std=c++11 -fdump-ipa-inline -fdevirtualize" } */ #include <new> class EmbeddedObject { diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-39.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-39.C index fbeea126e..38e280899 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-39.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-39.C @@ -1,5 +1,5 @@ // PR c++/61214 -/* { dg-options "-O2 -fdump-tree-optimized" } */ +/* { dg-options "-O2 -fdump-tree-optimized -fdevirtualize" } */ struct Base { @@ -24,5 +24,4 @@ int main() return 0; } -/* { dg-final { scan-tree-dump-not "OBJ_TYPE_REF" "optimized" } } */ -/* { dg-final { cleanup-tree-dump "optimized" } } */ +/* { dg-final { scan-assembler-not "_ZN3Foo5cloneEv" } } */ diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-4.C index 72c883b3f..64f8eb05d 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-4.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-4.C @@ -1,7 +1,7 @@ /* Verify that ipa-co can convert virtual calls to direct ones even when a typecast to an ancestor is involved along the way. */ /* { dg-do run } */ -/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-40.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-40.C new file mode 100644 index 000000000..9c3bdf5e9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-40.C @@ -0,0 +1,21 @@ +// PR c++/62224 +// { dg-options "-O2" } +// For 4.9, we don't want to devirtualize f and thus create a reference to g. + +struct A +{ + virtual void f () = 0; +}; + +class B : A +{ + virtual void f () { g(); } + void g(); +}; + +void h (A *a) +{ + a->f (); +} + +// { dg-final { scan-assembler-not "_ZN1B1gEv" } } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-5.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-5.C index 575bc0271..980b59617 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-5.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-5.C @@ -2,7 +2,7 @@ ones even when a typecast to an ancestor is involved along the way and that ancestor is not the first one with virtual functions. */ /* { dg-do run } */ -/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-6.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-6.C index e9a5d7093..4599878d1 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-6.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-6.C @@ -2,7 +2,7 @@ spot that foo changes the dynamic type of the passed object. */ /* { dg-do run } */ -/* { dg-options "-O3" } */ +/* { dg-options "-O3 -fdevirtualize" } */ extern "C" void abort (void); extern "C" void *malloc(__SIZE_TYPE__); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-7.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-7.C index 1c5912230..d2059baf6 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-7.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-7.C @@ -1,7 +1,7 @@ /* Verify that IPA-CP can do devirtualization even if the virtual call comes from a method that has been early-inlined into a descendant. */ /* { dg-do run } */ -/* { dg-options "-O3 -fdump-ipa-cp" } */ +/* { dg-options "-O3 -fdump-ipa-cp -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-9.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-9.C index dc6c6c940..ce4febd9f 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-9.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-9.C @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-ipa-whole-program --param=early-inlining-insns-comdat=0" } */ +/* { dg-options "-O2 -fdump-ipa-whole-program --param=early-inlining-insns-comdat=0 -fdevirtualize" } */ double foo (); struct B { diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-1.C index dcd804659..5e1348baa 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-1.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-1.C @@ -1,7 +1,7 @@ /* Verify that ipa-cp correctly detects the dynamic type of an object under construction when doing devirtualization. */ /* { dg-do run } */ -/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-2.C index b9a36e29f..451b2293e 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-2.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-2.C @@ -1,7 +1,7 @@ /* Verify that ipa-cp correctly detects the dynamic type of an object under construction when doing devirtualization. */ /* { dg-do run } */ -/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-3.C index c8791f79e..321eea478 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-3.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-3.C @@ -1,7 +1,7 @@ /* Verify that ipa-cp correctly detects the dynamic type of an object under construction when doing devirtualization. */ /* { dg-do run } */ -/* { dg-options "-O3 -fno-inline" } */ +/* { dg-options "-O3 -fno-inline -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-4.C index 56d41e496..24dfe3dab 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-4.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-4.C @@ -1,7 +1,7 @@ /* Verify that ipa-cp correctly detects the dynamic type of an object under construction when doing devirtualization. */ /* { dg-do run } */ -/* { dg-options "-O3 -fno-inline" } */ +/* { dg-options "-O3 -fno-inline -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-5.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-5.C index 637d7d4be..f3d6b0014 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-5.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-5.C @@ -1,7 +1,7 @@ /* Verify that ipa-cp correctly detects the dynamic type of an object under construction when doing devirtualization. */ /* { dg-do run } */ -/* { dg-options "-O3 -fno-early-inlining -fno-inline" } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-6.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-6.C index f9b8b6954..8e5a2bf47 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-6.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-6.C @@ -1,7 +1,7 @@ /* Verify that ipa-cp correctly detects the dynamic type of an object under construction when doing devirtualization. */ /* { dg-do run } */ -/* { dg-options "-O3 -fno-inline" } */ +/* { dg-options "-O3 -fno-inline -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-7.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-7.C index 2e76cbe40..08f2d3043 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-7.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-7.C @@ -2,7 +2,7 @@ object within another one when looking for dynamic type change . */ /* { dg-do run } */ /* { dg-require-effective-target nonpic } */ -/* { dg-options "-O3 -Wno-attributes" } */ +/* { dg-options "-O3 -Wno-attributes -fdevirtualize" } */ extern "C" void abort (void); namespace std { diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-8.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-8.C index 309644d92..2e417ec2c 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-8.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-c-8.C @@ -1,7 +1,7 @@ /* Verify that ipa-cp correctly detects the dynamic type of an object under construction when doing devirtualization. */ /* { dg-do run } */ -/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized" } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-d-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-d-1.C index 3897a7782..d84dd9fe0 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-d-1.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-d-1.C @@ -1,7 +1,7 @@ /* Verify that ipa-cp correctly detects the dynamic type of an object under destruction when doing devirtualization. */ /* { dg-do run } */ -/* { dg-options "-O3 -fno-early-inlining -fno-inline" } */ +/* { dg-options "-O3 -fno-early-inlining -fno-inline -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-g-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-g-1.C index 175f24efb..41f23453c 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-g-1.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-g-1.C @@ -1,5 +1,5 @@ // { dg-do compile } -// { dg-options "-O2 -fdump-ipa-cp -fdump-tree-optimized" } +// { dg-options "-O2 -fdump-ipa-cp -fdump-tree-optimized -fdevirtualize" } struct S { S(); virtual void xyzzy(); void otherstuff(); }; struct R { int a; S s; R(); }; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C index 32f7258a4..f530adad2 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-1.C @@ -1,7 +1,7 @@ /* Verify that virtual calls are folded even early inlining puts them into one function with the definition. */ /* { dg-do run } */ -/* { dg-options "-O2 -fdump-tree-fre1-details" } */ +/* { dg-options "-O2 -fdump-tree-fre1-details -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-2.C index 5bddc2fcb..bce0e96ed 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-2.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/imm-devirt-2.C @@ -1,7 +1,7 @@ /* Verify that virtual calls are folded even early inlining puts them into one function with the definition. */ /* { dg-do run } */ -/* { dg-options "-O2 -fdump-tree-fre1-details" } */ +/* { dg-options "-O2 -fdump-tree-fre1-details -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-1.C index bc4dfea5c..39dbf59f0 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-1.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-1.C @@ -1,7 +1,7 @@ /* Verify that simple virtual calls are inlined even without early inlining. */ /* { dg-do run { target nonpic } } */ -/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */ +/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-2.C index 001cff204..0607ffbbe 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-2.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-2.C @@ -1,7 +1,7 @@ /* Verify that simple virtual calls using this pointer are inlined even without early inlining.. */ /* { dg-do run { target nonpic } } */ -/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */ +/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-3.C index 637a6aecc..5b6322ed1 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-3.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-3.C @@ -1,7 +1,7 @@ /* Verify that simple virtual calls on an object refrence are inlined even without early inlining. */ /* { dg-do run { target nonpic } } */ -/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */ +/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-4.C index f5b8f8e5d..5358ebfde 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-4.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-4.C @@ -2,7 +2,7 @@ inlining, even when a typecast to an ancestor is involved along the way. */ /* { dg-do run { target nonpic } } */ -/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */ +/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-5.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-5.C index d78173d69..33c1d7bf5 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-5.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-5.C @@ -1,7 +1,7 @@ /* Verify that virtual call inlining does not pick a wrong method when there is a user defined ancestor in an object. */ /* { dg-do run { target nonpic } } */ -/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */ +/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-7.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-7.C index 9d725a508..e6ba8505d 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-7.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-7.C @@ -2,7 +2,7 @@ inlining, even when a typecast to an ancestor is involved along the way and that ancestor is not the first one with virtual functions. */ /* { dg-do run { target nonpic } } */ -/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */ +/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-8.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-8.C index eebfc6af1..606049aad 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-8.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-8.C @@ -1,7 +1,7 @@ /* Verify that virtual calls are inlined (ithout early inlining) even when their caller is itself indirectly inlined. */ /* { dg-do run { target nonpic } } */ -/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */ +/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-9.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-9.C index 586c3af30..dec234e06 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-9.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/ivinline-9.C @@ -3,7 +3,7 @@ way and that ancestor itself has an ancestor wich is not the primary base class. */ /* { dg-do run { target nonpic } } */ -/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp" } */ +/* { dg-options "-O3 -fdump-ipa-inline -fno-early-inlining -fno-ipa-cp -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60600.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60600.C index b9039cb85..4d0db6be4 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60600.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60600.C @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O3 -fdump-ipa-cp" } */ +/* { dg-options "-O3 -fdump-ipa-cp -fdevirtualize" } */ struct data { data(int); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-4.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-4.C index eb9eb627f..d290450cd 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-4.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-4.C @@ -1,5 +1,5 @@ // { dg-do run } -// { dg-options "-O3 -fdump-ipa-cp" } +// { dg-options "-O3 -fdump-ipa-cp -fdevirtualize" } struct Distraction { diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr61654.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr61654.C new file mode 100644 index 000000000..d07e4586b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr61654.C @@ -0,0 +1,40 @@ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +/* The bug only presented itself on a 32 bit i386 but in theory it might also + pop up elsewhere and we do not want to put -m32 options to testcase + options. */ + +struct A +{ + virtual int a (int, int = 0) = 0; + void b (); + void c (); + int d; +}; + +struct B : virtual A +{ + int a (int, int); + int e; +}; + +int f; + +void +A::b () +{ + a (0); +} + +void +A::c () +{ + a (f); +} + +int +B::a (int, int) +{ + return e; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr62015.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr62015.C new file mode 100644 index 000000000..950b46e75 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr62015.C @@ -0,0 +1,55 @@ +/* { dg-do run } */ +/* { dg-options "-O3 -std=c++11" } */ + + +extern "C" int printf(const char *fmt, ...); +extern "C" void abort(void); + +struct Side { + enum _Value { Left, Right, Invalid }; + + constexpr Side() : _value(Invalid) {} + constexpr Side(_Value value) : _value(value) {} + operator _Value() const { return (_Value)_value; } + + private: + char _value; +}; + +struct A { + void init(); + void adjust(Side side, bool final); + void move(Side side); +}; + +void A::init() +{ + adjust(Side::Invalid, false); +} + +static void __attribute__((noinline)) +check (int v, int final) +{ + if (v != 0) + abort(); +} + + +__attribute__((noinline)) +void A::adjust(Side side, bool final) +{ + check ((int)side, final); +} + +void A::move(Side side) +{ + adjust(side, false); + adjust(side, true); +} + +int main() +{ + A t; + t.move(Side::Left); + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr63306.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr63306.C new file mode 100644 index 000000000..e22a4c2a0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr63306.C @@ -0,0 +1,14 @@ +// PR c++/63306 +// { dg-do compile { target c++11 } } + +template <typename...> +class A; + +class B +{ + B (const int &, const A<int, int> &); +}; + +B::B (const int &, const A<int, int> &) +{ +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr63838.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr63838.C new file mode 100644 index 000000000..d67364900 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr63838.C @@ -0,0 +1,56 @@ +// PR ipa/63838 +// { dg-do run } +// { dg-options "-O2 -fdump-ipa-pure-const" } +// { dg-final { scan-ipa-dump-not "Function found to be nothrow: void foo" "pure-const" } } +// { dg-final { scan-ipa-dump-not "Function found to be nothrow: void bar" "pure-const" } } +// { dg-final { cleanup-ipa-dump "pure-const" } } + +__attribute__((noinline, noclone)) static void bar (int); +volatile int v; +void (*fn) (); +struct S { S () { v++; } ~S () { v++; } }; + +__attribute__((noinline, noclone)) static void +foo (int x) +{ + v++; + if (x == 5) + bar (x); +} + +__attribute__((noinline, noclone)) static void +bar (int x) +{ + v++; + if (x == 6) + foo (x); + else if (x == 5) + fn (); +} + +__attribute__((noinline, noclone)) int +baz (int x) +{ + S s; + foo (x); +} + +void +throw0 () +{ + throw 0; +} + +int +main () +{ + fn = throw0; + asm volatile ("" : : : "memory"); + try + { + baz (5); + } + catch (int) + { + } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr64068.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr64068.C new file mode 100644 index 000000000..95288836c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr64068.C @@ -0,0 +1,49 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +typedef int PROV_ENUMALGS_EX, PCCRYPT_OID_INFO; +class A { + int m_fn2(); + virtual bool m_fn1(PCCRYPT_OID_INFO); +}; +int fn1(); +void fn2(); +int A::m_fn2() { m_fn1(0); } + +bool fn3() { + for (;;) { + if (fn1()) { + if (fn1() != 259) + fn2(); + break; + } + return 1; + } + return 0; +} + +class B { +public: + B() { fn3(); } +}; +class C : A { + bool m_fn1(PCCRYPT_OID_INFO) { m_fn3(); } + int isSupportedByProvider_algId; + PROV_ENUMALGS_EX isSupportedByProvider_outEnumAlgs; + PROV_ENUMALGS_EX isSupportedByProvider_enumAlgs; + bool m_fn3() { + while (1) { + if (fn1()) { + if (fn1() != 259) + fn2(); + break; + } + if (isSupportedByProvider_algId) + isSupportedByProvider_outEnumAlgs = isSupportedByProvider_enumAlgs; + return 1; + } + return 0; + } +}; + +void fn4() { B(); } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/type-inheritance-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/type-inheritance-1.C index 818002ec1..a0c151122 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/ipa/type-inheritance-1.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/type-inheritance-1.C @@ -1,7 +1,7 @@ /* Verify that callgraph construction keeps FOO for possible devirtualization and removes BAR. */ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-ipa-visibility" } */ +/* { dg-options "-O2 -fdump-ipa-visibility -fdevirtualize" } */ extern "C" void abort (void); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr62026.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr62026.C new file mode 100644 index 000000000..63766a85b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr62026.C @@ -0,0 +1,22 @@ +// { dg-lto-do link } +// { dg-lto-options {{-flto -O3 -r -nostdlib}} } +class C; +class F { + virtual C m_fn1(); +}; +class C { + public: + virtual int *m_fn3(int); +}; +class G : F, C { + int offsets; + int *m_fn3(int); +}; +C *a; +int *G::m_fn3(int) { + if (offsets) return 0; +} + +void fn1() { + for (;;) a->m_fn3(0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt1.C index f9b4dc2fc..2524dd138 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt1.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt1.C @@ -1,5 +1,5 @@ // { dg-do compile } -// { dg-options "-O2" } +// { dg-options "-O2 -fdevirtualize" } // { dg-final { scan-assembler "xyzzy" } } struct S { S(); virtual void xyzzy(); }; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt2.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt2.C index cf4842bd4..ef8c1a123 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt2.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt2.C @@ -1,5 +1,5 @@ // { dg-do compile } -// { dg-options "-O2" } +// { dg-options "-O2 -fdevirtualize" } /* Using -mshort-calls avoids loading the function addresses in registers and thus getting the counts wrong. */ // { dg-additional-options "-mshort-calls" {target epiphany-*-*} } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt3.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt3.C index 673867361..1f3331c5d 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt3.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt3.C @@ -1,5 +1,5 @@ // { dg-do compile } -// { dg-options "-O2" } +// { dg-options "-O2 -fdevirtualize" } class ert_RefCounter { protected: diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt4.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt4.C index 5a24eecbd..72f56afca 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt4.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt4.C @@ -1,8 +1,7 @@ // PR lto/53808 -// Devirtualization + inlining should produce a non-virtual -// call to ~foo. -// { dg-options "-O -fdevirtualize" } -// { dg-final { scan-assembler "_ZN3fooD2Ev" } } +// Devirtualization should not produce an external ref to ~bar. +// { dg-options "-O2" } +// { dg-final { scan-assembler-not "_ZN3barD0Ev" } } struct foo { virtual ~foo(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt5.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt5.C new file mode 100644 index 000000000..f839cbeae --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/devirt5.C @@ -0,0 +1,19 @@ +// PR c++/61659 +// { dg-options "-O3" } +// { dg-final { scan-assembler-not "_ZN6parserIiE9getOptionEv" } } + +struct generic_parser_base { + virtual void getOption(); + void getExtraOptionNames() { getOption(); } +}; +template <class DataType> struct parser : public generic_parser_base { + virtual void getOption() {} +}; +struct PassNameParser : public parser<int> { + PassNameParser(); +}; +struct list { + PassNameParser Parser; + virtual void getExtraOptionNames() { return Parser.getExtraOptionNames(); } +}; +list PassList; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/flifetime-dse1.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/flifetime-dse1.C new file mode 100644 index 000000000..733d28a79 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/flifetime-dse1.C @@ -0,0 +1,23 @@ +// { dg-options "-O3 -fno-lifetime-dse" } +// { dg-do run } + +typedef __SIZE_TYPE__ size_t; +inline void * operator new (size_t, void *p) { return p; } + +struct A +{ + int i; + A() {} + ~A() {} +}; + +int main() +{ + int ar[1]; + + A* ap = new(ar) A; + ap->i = 42; + ap->~A(); + + if (ar[0] != 42) __builtin_abort(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr54442.C b/gcc-4.9/gcc/testsuite/g++.dg/pr54442.C new file mode 100644 index 000000000..a48956561 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/pr54442.C @@ -0,0 +1,12 @@ +/* { dg-do compile } */ + +struct S +{ + void s (int) const throw (); + void s (int) throw (); +}; + +typedef int index_t; + +void (S::*f) (index_t) = &S::s; +void (S::*g) (index_t) const = &S::s; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr62079.C b/gcc-4.9/gcc/testsuite/g++.dg/pr62079.C new file mode 100644 index 000000000..919c3e5de --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/pr62079.C @@ -0,0 +1,78 @@ +// { dg-do compile } +// { dg-options "-std=c++11 -O2 -fnon-call-exceptions" } + +template < typename > class allocator; + +template < class _CharT > struct char_traits; +template < typename _CharT, typename _Traits = char_traits < _CharT >, + typename _Alloc = allocator < _CharT > >class basic_string; +typedef basic_string < char >string; + +template < typename _Tp > class new_allocator +{ + template < typename _Tp1 > struct rebind + { + typedef new_allocator < _Tp1 > other; + }; +}; + +template < typename _Tp > using __allocator_base = new_allocator < _Tp >; +template < typename _Tp > class allocator:public __allocator_base < _Tp > +{ +}; + +template < typename _CharT, typename _Traits, typename _Alloc > + class basic_string +{ +public: + basic_string (const _CharT * __s, const _Alloc & __a = _Alloc ()); + ~basic_string ()noexcept; +}; + +template < typename T > struct add_reference +{ + typedef T & type; +}; + +template < typename ... Values > class tuple; +template <> class tuple <> +{ +}; + +template < typename Head, typename ... Tail > class tuple < Head, Tail ... >:private tuple < + Tail ... + > +{ + typedef tuple < Tail ... >inherited; +public: + template < typename ... VValues > + tuple (const tuple < VValues ... >&other):inherited (other.tail ()), + m_head (other.head ()) + { + } + typename add_reference < const Head >::type head () const + { + return m_head; + } + const inherited & tail () const + { + return *this; + } + Head m_head; +}; + +template < typename T > struct make_tuple_result +{ + typedef T type; +}; + +template < typename ... Values > + tuple < typename make_tuple_result < + Values >::type ... >make_tuple (const Values & ... values); + +int +main () +{ + tuple < int, float, string > t3c = + make_tuple (17, 2.718281828, string ("Fun")); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr64037.C b/gcc-4.9/gcc/testsuite/g++.dg/pr64037.C new file mode 100644 index 000000000..e5cd0e2ee --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/pr64037.C @@ -0,0 +1,27 @@ +// { dg-do run { target i?86-*-* x86_64-*-* } } +// { dg-options "-std=c++11 -Os" } + +enum class X : unsigned char { + V = 2, +}; + +static void +__attribute__((noinline,noclone)) +foo(unsigned &out, unsigned a, X b) +{ + out = static_cast<unsigned>(b); +} + +int main() +{ + unsigned deadbeef = 0xDEADBEEF; + asm volatile ("" : "+d" (deadbeef), "+c" (deadbeef)); + + unsigned out; + foo(out, 2, X::V); + + if (out != 2) + __builtin_abort (); + + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/friend56.C b/gcc-4.9/gcc/testsuite/g++.dg/template/friend56.C new file mode 100644 index 000000000..7dd5d486f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/template/friend56.C @@ -0,0 +1,13 @@ +// Make sure we don't mistakenly mark f as DECL_COMDAT. +// { dg-final { scan-assembler "_Z1fv" } } + +void f(); + +template <class T> struct A +{ + friend void f(); +}; + +A<int> a; + +void f() { } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent14.C b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent14.C new file mode 100644 index 000000000..b257d9baf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/template/non-dependent14.C @@ -0,0 +1,7 @@ +// PR c++/64251 + +class DictionaryValue {}; +template <typename T> void CreateValue(T) { + DictionaryValue(0); + CreateValue(0); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/offsetof3.C b/gcc-4.9/gcc/testsuite/g++.dg/template/offsetof3.C new file mode 100644 index 000000000..b17374645 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/template/offsetof3.C @@ -0,0 +1,18 @@ +// PR c++/64487 + +struct foo { + int member; +}; + +template < int N> +struct bar {}; + +template <int N> +struct qux { + static bar<N+__builtin_offsetof(foo,member)> static_member; +}; + +template <int N> +bar<N+__builtin_offsetof(foo,member)> qux<N>::static_member; + +int main() { } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem29.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem29.C new file mode 100644 index 000000000..7700c0b97 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ptrmem29.C @@ -0,0 +1,10 @@ +// PR c++/62659 + +struct D { + typedef int (D::*cont_func)(); + template <cont_func> struct B; + template <cont_func cont_f> void wait(B<cont_f> ***); + + int done(); + template <bool> void fix() { wait<&D::done>(0); } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/ref9.C b/gcc-4.9/gcc/testsuite/g++.dg/template/ref9.C new file mode 100644 index 000000000..983f62788 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/template/ref9.C @@ -0,0 +1,15 @@ +// PR c++/63658 + +struct Descriptor {}; + +template <Descriptor & D> +struct foo +{ + void size (); +}; + +Descriptor g_descriptor = {}; + +template<> void foo<g_descriptor>::size() +{ +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/spec38.C b/gcc-4.9/gcc/testsuite/g++.dg/template/spec38.C new file mode 100644 index 000000000..6f06f1495 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/template/spec38.C @@ -0,0 +1,6 @@ +// PR ipa/61659 + +// { dg-final { scan-assembler "_Z1fIiEvPT_" } } + +template <typename T> inline void f (T *); +template <> void f (int *) { } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr62121.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr62121.C new file mode 100644 index 000000000..de1196a62 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr62121.C @@ -0,0 +1,12 @@ +// { dg-do compile } +class A +{ + virtual double operator()(); +}; +class B : A +{ +public: + double operator()(); +}; +extern B a[]; +int b = a[0](); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr62175.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr62175.C new file mode 100644 index 000000000..bcdea61e1 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr62175.C @@ -0,0 +1,36 @@ +// { dg-do compile } +// { dg-additional-options "-ftrapv" } + +struct B { + B(int = 0); +}; +int c; +int *d; +struct G { + G(); + int numProcs_; +}; +int fn1(); +B fn2() { + if (c) + return 0; + return B(); +} + +long &fn3(long &p1, long &p2) { + if (p2 < p1) + return p2; + return p1; +} + +void fn4(long p1) { + long a = fn1(); + fn2(); + int b = fn3(p1, a); + for (int i; i < b; ++i) + d[0] = 0; + for (; a < p1; ++a) + d[a] = 0; +} + +G::G() { fn4(numProcs_ + 1); } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr63632.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr63632.C new file mode 100644 index 000000000..48cd86924 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr63632.C @@ -0,0 +1,5 @@ +// PR bootstrap/63632 +// { dg-do link } +// { dg-options "-fno-lto" } + +int main () {} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/func_reorder_gold_plugin_1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/func_reorder_gold_plugin_1.C index c58f3ca94..9c532c195 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/func_reorder_gold_plugin_1.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/func_reorder_gold_plugin_1.C @@ -38,7 +38,7 @@ int main () /* { dg-final-use { scan-assembler "\.string \"Weight 1000 1000\"" } } */ /* { dg-final-use { scan-assembler "\.string \"Weight 1001 1001\"" } } */ /* Check if main is next to foo or bar */ -/* { dg-final-use { scan-file linker.dump "Callgraph group : *\(_Z3foov main|main _Z3foov|_Z3barv main|main _Z3barv\).*\n" } } */ +/* { dg-final-use { scan-file linker.dump "Callgraph group : *\.*(_Z3foov main|main _Z3foov|_Z3barv main|main _Z3barv\).*\n" } } */ /* { dg-final-use { scan-file linker.dump ".text\..*\._Z9notcalledv entry count = 0 computed = 0 max count = 0" } } */ /* { dg-final-use { scan-file linker.dump "Moving .* section\\(s\\) to new segment" } } */ /* { dg-final-use { cleanup-saved-temps } } */ diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/buildinfo.txt b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/buildinfo.txt new file mode 100644 index 000000000..c7a82f77e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/buildinfo.txt @@ -0,0 +1 @@ +Test -fprofile-generate-buildinfo option diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/comdat_fixup.h b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/comdat_fixup.h new file mode 100644 index 000000000..bf28164a0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/comdat_fixup.h @@ -0,0 +1,5 @@ +class Foo +{ + public: + int foo(int x) { return x; } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/comdat_fixup_0.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/comdat_fixup_0.C new file mode 100644 index 000000000..7743a0b36 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/comdat_fixup_0.C @@ -0,0 +1,9 @@ +/* { dg-options "-O2 -fno-inline -fprofile-generate-buildinfo=$srcdir/g++.dg/tree-prof/lipo/buildinfo.txt" } */ +#include <stdio.h> + +extern int foo1(int x); +extern int foo2(int x); +int main() +{ + printf ("Result = %d\n", foo1(1) + foo2(1)); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/comdat_fixup_1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/comdat_fixup_1.C new file mode 100644 index 000000000..5f24dc1eb --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/comdat_fixup_1.C @@ -0,0 +1,7 @@ +/* { dg-options "-O2 -fno-inline" } */ +#include "comdat_fixup.h" +int foo1(int x) +{ + Foo f; + return f.foo(x); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/comdat_fixup_2.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/comdat_fixup_2.C new file mode 100644 index 000000000..1416129c0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/comdat_fixup_2.C @@ -0,0 +1,7 @@ +/* { dg-options "-O2 -fno-inline" } */ +#include "comdat_fixup.h" +int foo2(int x) +{ + Foo f; + return f.foo(x); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/indir-call-prof_0.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/indir-call-prof_0.C index b34b937fd..78fd0c583 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/indir-call-prof_0.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/indir-call-prof_0.C @@ -1,4 +1,4 @@ -/* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-profile" } */ +/* { dg-options "-O2 -fdump-tree-optimized -fdump-ipa-profile --param=lipo-sampling-period=1" } */ struct A { A () {} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/static1_0.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/static1_0.C new file mode 100644 index 000000000..525480dab --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/static1_0.C @@ -0,0 +1,48 @@ +// { dg-options "-std=c++11 -O2" } + +// A test case for static var promotion on targets like powerpc, where +// the static initializer data is loaded via indirection through +// TOC. Ensure that the global label for static initializer data is +// unique via *.cmo* suffix. + +// Bug: after static var promotion in two different modules, we have +// the following which leads to multiple definition of ._41" error during +// link time. + +// Module 1 Module 2 +// .hidden ._41.cmo.1 .hidden ._41.cmo.3 +// .globl ._41 .globl ._41 +// ._41: ._41: +// ... ... + + +// Instead we should use the appropriate unique names for initializer +// data as in the following. + +// Module 1 Module 2 +// .hidden ._41.cmo.1 .hidden ._41.cmo.3 +// .globl ._41.cmo.1 .globl ._41.cmo.3 +// ._41.cmo.1: ._41.cmo.3: +// ... ... + +class A { + public: + int f(int x) const; +}; + +class B { + public: + int f(int x) const; +}; + +int main() +{ + A *a = new A(); + B *b = new B(); + int total = 0; + for (int i=0; i<3; ++i) { + total += a->f(1); + total += b->f(1); + } + return (total > 0) ? 0 : 1; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/static1_1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/static1_1.C new file mode 100644 index 000000000..0236e16d3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/static1_1.C @@ -0,0 +1,14 @@ +/* { dg-options "-std=c++11 -O2" } */ + +#include <vector> + +class A { + public: + int f(int x) const; +}; + +static const std::vector<int> point1_{42}; + +int A::f(int x) const { + return x+1; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/static1_2.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/static1_2.C new file mode 100644 index 000000000..d39095de5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/static1_2.C @@ -0,0 +1,14 @@ +/* { dg-options "-std=c++11 -O2" } */ + +#include <vector> + +class B { + public: + int f(int x) const; +}; + +static const std::vector<int> point2_{43}; + +int B::f(int x) const { + return x+1; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/tls.h b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/tls.h new file mode 100644 index 000000000..5eb102d74 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/tls.h @@ -0,0 +1,16 @@ +extern int NextId(); + +class TLSClass { + public: + TLSClass() { + id = NextId(); + bar = 1; + } + ~TLSClass() {} + int id; + int bar; +}; +extern TLSClass* NextTLSClass(); +extern void *SetTLSClass(TLSClass *a); +extern TLSClass *GetTLSClass(); +extern thread_local TLSClass* current_tls_; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/tls2.h b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/tls2.h new file mode 100644 index 000000000..9ba0945c2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/tls2.h @@ -0,0 +1,15 @@ +extern int NextId(); + +class TLSClass { + public: + TLSClass() { + id = NextId(); + bar = 1; + } + ~TLSClass() {} + int id; + int bar; +}; +extern TLSClass* NextTLSClass(); +extern void *SetTLSClass(TLSClass *a); +extern TLSClass *GetTLSClass(); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/tls2_0.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/tls2_0.C new file mode 100644 index 000000000..9ccd5b96b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/tls2_0.C @@ -0,0 +1,10 @@ +// { dg-options "-std=c++11 -O2 --param=lipo-sampling-period=1" } +#include "tls2.h" + +static thread_local TLSClass* current_tls_ = NextTLSClass(); +void *SetTLSClass(TLSClass *a) { + current_tls_ = a; +} +TLSClass *GetTLSClass() { + return current_tls_; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/tls2_1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/tls2_1.C new file mode 100644 index 000000000..43c108526 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/tls2_1.C @@ -0,0 +1,31 @@ +// { dg-options "-std=c++11 -O2 --param=lipo-sampling-period=1" } +#include <stdio.h> +#include <stdlib.h> +#include <new> +#include "tls2.h" +TLSClass* NextTLSClass() { + return new TLSClass(); +} +int NextId() { + static int id = 0; + return id++; +} +static thread_local TLSClass* current_tls2_ = NextTLSClass(); +void *SetTLSClass2(TLSClass *a) { + current_tls2_ = a; +} +int main() { + int i = 0; + if (GetTLSClass()->id != i++) + abort(); + TLSClass *A = NextTLSClass(); + SetTLSClass(A); + if (GetTLSClass()->id != i++) + abort(); + if (current_tls2_->id != i++) + abort(); + A = NextTLSClass(); + SetTLSClass2(A); + if (current_tls2_->id != i++) + abort(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/tls_0.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/tls_0.C new file mode 100644 index 000000000..f3e5e376e --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/tls_0.C @@ -0,0 +1,10 @@ +// { dg-options "-std=c++11 -O2 --param=lipo-sampling-period=1" } +#include "tls.h" + +thread_local TLSClass* current_tls_ = NextTLSClass(); +void *SetTLSClass(TLSClass *a) { + current_tls_ = a; +} +TLSClass *GetTLSClass() { + return current_tls_; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/tls_1.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/tls_1.C new file mode 100644 index 000000000..fcf8c2101 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/lipo/tls_1.C @@ -0,0 +1,38 @@ +// { dg-options "-std=c++11 -O2 --param=lipo-sampling-period=1" } +#include <stdio.h> +#include <stdlib.h> +#include <new> +#include "tls.h" +TLSClass* NextTLSClass() { + return new TLSClass(); +} +int NextId() { + static int id = 0; + return id++; +} +void *SetTLSClassHere(TLSClass *a) { + current_tls_ = a; +} +thread_local TLSClass* current_tls2_ = NextTLSClass(); +void *SetTLSClass2(TLSClass *a) { + current_tls2_ = a; +} +int main() { + int i = 0; + if (GetTLSClass()->id != i++) + abort(); + TLSClass *A = NextTLSClass(); + SetTLSClass(A); + if (GetTLSClass()->id != i++) + abort(); + A = NextTLSClass(); + SetTLSClassHere(A); + if (GetTLSClass()->id != i++) + abort(); + if (current_tls2_->id != i++) + abort(); + A = NextTLSClass(); + SetTLSClass2(A); + if (current_tls2_->id != i++) + abort(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/partition_patch.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/partition_patch.C new file mode 100644 index 000000000..b1225a0f8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/partition_patch.C @@ -0,0 +1,19 @@ +// Check if patching works with function splitting. +// { dg-require-effective-target freorder } +// { dg-options "-O2 -fnon-call-exceptions -freorder-blocks-and-partition " { target { ! x86_64-*-* } } } +// { dg-options "-O2 -fnon-call-exceptions -freorder-blocks-and-partition -mpatch-functions-for-instrumentation -fno-optimize-sibling-calls " { target x86_64-*-* } } + +int k; + +int +main () +{ + try + { + if (k) + throw 6; + } + catch (...) + { + } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr63581.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr63581.C new file mode 100644 index 000000000..c8caf0765 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-prof/pr63581.C @@ -0,0 +1,91 @@ +// { dg-require-effective-target freorder } +/* { dg-options "-O2 -g -fno-peel-loops" } */ + +struct page { + int i; +} global; + +__attribute__((noinline)) static struct page* find_page1 (int i) +{ + if ( i< 150) + return 0; + global.i = i; + return &global; +} + +__attribute__((noinline)) static struct page* find_page2 (int i) +{ + global.i = i; + return &global; +} + +volatile int ii; +__attribute__((noinline)) static int zero (void) +{ + return ii; +} + +static inline int uptodate (struct page* p) +{ + return (p->i < 709); +} + +static struct page* bar(int i) +{ + struct page *page; + +repeat: + page = find_page1 (i); + if (!page) { + page = find_page2 (i); + if (!page) + return 0; + if (zero () ) { + zero (); + goto repeat; + } + } + return page; +} + +__attribute__((noinline)) int foo (int n) +{ + struct page *page; + +retry: + page = bar (n); + if (page == 0) + return 0; + if (uptodate (page)) + goto out; + + zero (); + if (page->i < 0) { + zero (); + goto retry; + } +out: + return 1; +} + +__attribute__((noinline)) int hot (void) +{ + int i; + int sum = 0; + + for (i = 0; i < 433038; i++) + sum+=i; + + return sum; +} + +int main(void) +{ + int i; + + global.i = hot (); + for (i = 0; i < 858; i++) + foo (i); + + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr63841.C b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr63841.C new file mode 100644 index 000000000..2a2c78f9f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tree-ssa/pr63841.C @@ -0,0 +1,35 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +#include <string> + +std::string __attribute__ ((noinline)) comp_test_write() { + std::string data; + + for (int i = 0; i < 2; ++i) { + char b = 1 >> (i * 8); + data.append(&b, 1); + } + + return data; +} + +std::string __attribute__ ((noinline)) comp_test_write_good() { + std::string data; + + char b; + for (int i = 0; i < 2; ++i) { + b = 1 >> (i * 8); + data.append(&b, 1); + } + + return data; +} + +int main() { + std::string good = comp_test_write_good(); + std::string bad = comp_test_write(); + + if (good != bad) + __builtin_abort (); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tsan/atomic_free.C b/gcc-4.9/gcc/testsuite/g++.dg/tsan/atomic_free.C index 26d01ae3f..20429f159 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/tsan/atomic_free.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/tsan/atomic_free.C @@ -1,18 +1,23 @@ /* { dg-shouldfail "tsan" } */ +/* { dg-additional-options "-ldl" } */ #include <pthread.h> -#include <unistd.h> +#include "tsan_barrier.h" + +static pthread_barrier_t barrier; void *Thread(void *a) { __atomic_fetch_add((int*)a, 1, __ATOMIC_SEQ_CST); + barrier_wait(&barrier); return 0; } int main() { + barrier_init(&barrier, 2); int *a = new int(0); pthread_t t; pthread_create(&t, 0, Thread, a); - sleep(1); + barrier_wait(&barrier); delete a; pthread_join(t, 0); } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tsan/atomic_free2.C b/gcc-4.9/gcc/testsuite/g++.dg/tsan/atomic_free2.C index 1fe512cde..3b6a8e3af 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/tsan/atomic_free2.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/tsan/atomic_free2.C @@ -1,19 +1,24 @@ /* { dg-shouldfail "tsan" } */ +/* { dg-additional-options "-ldl" } */ #include <pthread.h> -#include <unistd.h> +#include "tsan_barrier.h" + +static pthread_barrier_t barrier; void *Thread(void *a) { - sleep(1); + barrier_wait(&barrier); __atomic_fetch_add((int*)a, 1, __ATOMIC_SEQ_CST); return 0; } int main() { + barrier_init(&barrier, 2); int *a = new int(0); pthread_t t; pthread_create(&t, 0, Thread, a); delete a; + barrier_wait(&barrier); pthread_join(t, 0); } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tsan/cond_race.C b/gcc-4.9/gcc/testsuite/g++.dg/tsan/cond_race.C index a93761477..d72d0fb54 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/tsan/cond_race.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/tsan/cond_race.C @@ -1,10 +1,12 @@ /* { dg-shouldfail "tsan" } */ +/* { dg-additional-options "-ldl" } */ /* { dg-output "ThreadSanitizer: data race.*" } */ /* { dg-output "pthread_cond_signal.*" } */ -#include <stdio.h> -#include <stdlib.h> #include <pthread.h> +#include "tsan_barrier.h" + +static pthread_barrier_t barrier; struct Ctx { pthread_mutex_t m; @@ -18,10 +20,12 @@ void *thr(void *p) { c->done = true; pthread_mutex_unlock(&c->m); pthread_cond_signal(&c->c); + barrier_wait(&barrier); return 0; } int main() { + barrier_init(&barrier, 2); Ctx *c = new Ctx(); pthread_mutex_init(&c->m, 0); pthread_cond_init(&c->c, 0); @@ -31,6 +35,7 @@ int main() { while (!c->done) pthread_cond_wait(&c->c, &c->m); pthread_mutex_unlock(&c->m); + barrier_wait(&barrier); delete c; pthread_join(th, 0); } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/tsan/tsan_barrier.h b/gcc-4.9/gcc/testsuite/g++.dg/tsan/tsan_barrier.h new file mode 100644 index 000000000..5d37a6475 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/tsan/tsan_barrier.h @@ -0,0 +1,14 @@ +/* TSAN-invisible barriers. Link with -ldl. */ +#include <pthread.h> +#include <dlfcn.h> + +static __typeof(pthread_barrier_wait) *barrier_wait; + +static +void barrier_init (pthread_barrier_t *barrier, unsigned count) +{ + void *h = dlopen ("libpthread.so.0", RTLD_LAZY); + barrier_wait = (__typeof (pthread_barrier_wait) *) + dlsym (h, "pthread_barrier_wait"); + pthread_barrier_init (barrier, NULL, count); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr61272.C b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr61272.C new file mode 100644 index 000000000..064678d37 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr61272.C @@ -0,0 +1,24 @@ +// PR sanitizer/61272 +// { dg-do compile } +// { dg-options "-fsanitize=undefined -std=c++11" } + +namespace std +{ + template < typename _Tp > class allocator; + template < typename _Alloc > struct allocator_traits { + private: + template < typename _Tp > auto construct ( _Alloc & __a, _Tp * __p)-> // { dg-error "is private" } + decltype (_S_construct (__a, __p)) { } + }; + namespace __gnu_cxx + { + template < typename _Alloc > struct __alloc_traits:std::allocator_traits < _Alloc > // { dg-error "within this context" } + { + typedef std::allocator_traits < _Alloc > _Base_type; + using _Base_type::construct; + }; + template < typename _Tp, typename _Alloc > struct _Vector_base { typedef typename __gnu_cxx::__alloc_traits < _Alloc >::template rebind < _Tp >::other _Tp_alloc_type; }; // { dg-error "no class template" } + template < typename _Tp, typename _Alloc = std::allocator < _Tp > >class vector : protected _Vector_base < _Tp, _Alloc > { }; + template < typename NumberT > struct Point2d { }; + typedef Point2d < int >GdsPoint; + class GdsPointList : public vector < GdsPoint > {};}} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr63913.C b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr63913.C new file mode 100644 index 000000000..34dceb4d8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/ubsan/pr63913.C @@ -0,0 +1,12 @@ +// PR sanitizer/63913 +// { dg-do compile } +// { dg-options "-fsanitize=bool -fnon-call-exceptions" } + +struct B { B (); ~B (); }; + +double +foo (bool *x) +{ + B b; + return *x; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-6.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-6.C new file mode 100644 index 000000000..95fb7e2db --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-parm-6.C @@ -0,0 +1,8 @@ +// PR c++/61465 +// { dg-do compile { target c++11 } } +// { dg-options "-Wunused-but-set-parameter" } + +struct Foo { + Foo(void* x) : y{static_cast<char*>(x)} {} + char* y; +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-22.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-22.C new file mode 100644 index 000000000..8ae46c17f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wunused-var-22.C @@ -0,0 +1,12 @@ +// PR c++/63657 +// { dg-options "-Wunused-variable" } + +class Bar +{ + virtual ~Bar() {} +}; +Bar& getbar(); +void bar() +{ + Bar& b = getbar(); // { dg-warning "unused" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/register-parm-1.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/register-parm-1.C new file mode 100644 index 000000000..44232d3cf --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/register-parm-1.C @@ -0,0 +1,9 @@ +// PR c++/60955 +// { dg-options "-Wextra" } + +unsigned int erroneous_warning(register int a) { + if ((a) & 0xff) return 1; else return 0; +} +unsigned int no_erroneous_warning(register int a) { + if (a & 0xff) return 1; else return 0; +} |