diff options
author | Ben Cheng <bccheng@google.com> | 2014-04-22 13:33:12 -0700 |
---|---|---|
committer | Ben Cheng <bccheng@google.com> | 2014-04-22 13:33:12 -0700 |
commit | e3cc64dec20832769406aa38cde83c7dd4194bf4 (patch) | |
tree | ef8e39be37cfe0cb69d850043b7924389ff17164 /gcc-4.9/gcc/testsuite/g++.dg | |
parent | f33c7b3122b1d7950efa88067c9a156229ba647b (diff) | |
download | toolchain_gcc-e3cc64dec20832769406aa38cde83c7dd4194bf4.tar.gz toolchain_gcc-e3cc64dec20832769406aa38cde83c7dd4194bf4.tar.bz2 toolchain_gcc-e3cc64dec20832769406aa38cde83c7dd4194bf4.zip |
[4.9] GCC 4.9.0 official release refresh
Change-Id: Ic99a7da8b44b789a48aeec93b33e93944d6e6767
Diffstat (limited to 'gcc-4.9/gcc/testsuite/g++.dg')
59 files changed, 1450 insertions, 150 deletions
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag3.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag3.C index 05fd58e94..13cb3c2f2 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag3.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag3.C @@ -1,5 +1,4 @@ -// An explicit specialization doesn't get the tag from its template unless -// it is specified there, too. +// An explicit specialization gets the tag from its template. // { dg-final { scan-assembler "_ZN3FooB5cxx11IcE1fEv" } } template<typename T> @@ -12,12 +11,12 @@ struct __attribute ((abi_tag("cxx11"))) Foo template<> struct __attribute ((abi_tag("cxx11"))) -Foo<int> +Foo<int> // { dg-warning "attribute" } { int f(); }; -// { dg-final { scan-assembler "_ZN3FooIdE1fEv" } } +// { dg-final { scan-assembler "_ZN3FooB5cxx11IdE1fEv" } } template<> struct Foo<double> diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag6.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag6.C new file mode 100644 index 000000000..94ea2f37b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag6.C @@ -0,0 +1,25 @@ +// PR c++/60642 + +struct __attribute((abi_tag("test"))) foo +{ + void f(); + virtual ~foo(); +}; + +template<typename> +struct __attribute((abi_tag("test"))) bar +{ + void f(); + virtual ~bar(); +}; + +int main() +{ + foo f; + f.f(); + + bar<int> b; + b.f(); +} + +// { dg-final { scan-assembler "_ZTV3barB4testIiE" } } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag7.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag7.C new file mode 100644 index 000000000..4c47725c5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/abi-tag7.C @@ -0,0 +1,9 @@ +// PR c++/60642 + +template<typename T> +class __attribute((abi_tag("foo"))) test{ }; + +template class __attribute((abi_tag("foo"))) test<int>; // { dg-warning "attribute" } + +void f(test<char>*) {} +// { dg-final { scan-assembler "_Z1fP4testB3fooIcE" } } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/abi/thunk6.C b/gcc-4.9/gcc/testsuite/g++.dg/abi/thunk6.C new file mode 100644 index 000000000..6df51c24b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/abi/thunk6.C @@ -0,0 +1,19 @@ +// PR c++/60566 +// We need to emit the construction vtable thunk for ~C even if we aren't +// going to use it. + +struct A +{ + virtual void f() = 0; + virtual ~A() {} +}; + +struct B: virtual A { int i; }; +struct C: virtual A { int i; ~C(); }; + +C::~C() {} + +int main() {} + +// { dg-final { scan-assembler "_ZTv0_n32_N1CD1Ev" { target lp64 } } } +// { dg-final { scan-assembler "_ZTv0_n16_N1CD1Ev" { target ilp32 } } } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/cilk-plus.exp b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/cilk-plus.exp index 204a75458..0cb6539cb 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/cilk-plus.exp +++ b/gcc-4.9/gcc/testsuite/g++.dg/cilk-plus/cilk-plus.exp @@ -17,62 +17,55 @@ # Written by Balaji V. Iyer <balaji.v.iyer@intel.com> load_lib g++-dg.exp +load_lib cilk-plus-dg.exp if { ![check_effective_target_cilkplus] } { return; } -set library_var [get_multilibs] -# Pointing the ld_library_path to the Cilk Runtime library binaries. -append ld_library_path ":${library_var}/libcilkrts/.libs" -set_ld_library_path_env_vars - -global TEST_EXTRA_LIBS -set TEST_EXTRA_LIBS "-L${library_var}/libcilkrts/.libs" - dg-init -# Run the tests that are shared with C. -g++-dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/PS/*.c]] "" -dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/SE/*.c]] "-O3" " " -dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/SE/*.c]] " " " " -dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/SE/*.c]] "-g -O2" " " -# Run the C++ only tests. -g++-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C]] "" -dg-finish +if [cilkplus_init] { + # Run the tests that are shared with C. + g++-dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/PS/*.c]] "" + dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/SE/*.c]] "-O3" " " + dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/SE/*.c]] " " " " + dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/SE/*.c]] "-g -O2" " " + # Run the C++ only tests. + g++-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C]] "" -dg-init -dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -fcilkplus" " " -dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -O1 -fcilkplus" " " -dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -O2 -ftree-vectorize -fcilkplus" " " -dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -O3 -fcilkplus" " " -dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -g -fcilkplus" " " -dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -g -O1 -fcilkplus" " " -dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -g -O2 -ftree-vectorize -fcilkplus" " " -dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -g -O3 -fcilkplus" " " -dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -O3 -ftree-vectorize -fcilkplus -g" " " + dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -O1 -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -O2 -ftree-vectorize -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -O3 -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -g -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -g -O1 -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -g -O2 -ftree-vectorize -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -g -O3 -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/AN/*.c]] " -O3 -ftree-vectorize -fcilkplus -g" " " -dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -fcilkplus" " " -dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -O0 -fcilkplus" " " -dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -O1 -fcilkplus" " " -dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -O2 -ftree-vectorize -fcilkplus" " " -dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -O3 -fcilkplus" " " -dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -g -fcilkplus" " " -dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -g -O0 -fcilkplus" " " -dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -g -O1 -fcilkplus" " " -dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -g -O2 -ftree-vectorize -fcilkplus" " " -dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -g -O3 -fcilkplus" " " -dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -O3 -ftree-vectorize -fcilkplus -g" " " + dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -O0 -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -O1 -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -O2 -ftree-vectorize -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -O3 -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -g -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -g -O0 -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -g -O1 -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -g -O2 -ftree-vectorize -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -g -O3 -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/AN/*.cc]] " -O3 -ftree-vectorize -fcilkplus -g" " " -if { [check_libcilkrts_available] } { - dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/CK/*.cc]] " -O1 -fcilkplus" " " - dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/CK/*.cc]] " -O3 -fcilkplus" " " - dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/CK/*.cc]] " -g -fcilkplus" " " - dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/CK/*.cc]] " -g -O2 -fcilkplus" " " + if { [check_libcilkrts_available] } { + dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/CK/*.cc]] " -O1 -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/CK/*.cc]] " -O3 -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/CK/*.cc]] " -g -fcilkplus" " " + dg-runtest [lsort [glob -nocomplain $srcdir/g++.dg/cilk-plus/CK/*.cc]] " -g -O2 -fcilkplus" " " - dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/CK/*.c]] " -O1" " " - dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/CK/*.c]] " -O3" " " - dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/CK/*.c]] " -g" " " - dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/CK/*.c]] " -g -O2" " " - } + dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/CK/*.c]] " -O1" " " + dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/CK/*.c]] " -O3" " " + dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/CK/*.c]] " -g" " " + dg-runtest [lsort [glob -nocomplain $srcdir/c-c++-common/cilk-plus/CK/*.c]] " -g -O2" " " + } +} +cilkplus_finish dg-finish -unset TEST_EXTRA_LIBS diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto42.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto42.C new file mode 100644 index 000000000..fea4c28d8 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/auto42.C @@ -0,0 +1,9 @@ +// PR c++/60628 +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +void foo(int i) +{ + auto x[1] = { 0 }; // { dg-error "array of .auto" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice15.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice15.C new file mode 100644 index 000000000..576fd4150 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/constexpr-ice15.C @@ -0,0 +1,12 @@ +// PR c++/58207 +// { dg-do compile { target c++11 } } + +struct A +{ + virtual bool foo (); +}; + +struct B : public A +{ + constexpr B () : A (&::n) {} // { dg-error "declared" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted2.C index bd83c7fb2..63be99754 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted2.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/defaulted2.C @@ -35,7 +35,7 @@ struct D: public C struct E { - const B b; + const B b; // { dg-message "should be initialized" } E() { } // { dg-error "uninitialized" } }; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist81.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist81.C new file mode 100644 index 000000000..5978c6388 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist81.C @@ -0,0 +1,25 @@ +// PR c++/60713 +// { dg-options "-O" } +// { dg-do compile { target c++11 } } + +template < class x0, class x1, class x2, class x3, class x4 > +int *x5 (x0 *, x2 (x1::*)(x3, x4)); + +class x6 +{ + void x7 (); + struct x8 + { + int *x9; + }; + void x10 (x8); + void x11 (int *, int *); +}; + +void +x6::x7 () +{ + x10 ({ + x5 (this, &x6::x11) + }); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist82.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist82.C new file mode 100644 index 000000000..3b9ccad66 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/initlist82.C @@ -0,0 +1,20 @@ +// PR c++/60708 +// { dg-do compile { target c++11 } } + +template <class T, class U> struct mypair { + mypair(T, U) {} +}; + +template<typename T> struct S { + mypair<T *, int> get_pair() noexcept { + return mypair<T*,int>(nullptr, 0); + } +}; + +static void foo(const mypair<char *, int> (&a)[2]) noexcept { } + +int main() +{ + S<char> s; + foo({s.get_pair(), s.get_pair()}); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C index 898f685aa..dcea1690d 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval.C @@ -5,3 +5,5 @@ template <class T> struct A { }; A<decltype([]{ return 1; }())> a; // { dg-error "lambda.*unevaluated context" } +// { dg-prune-output "template argument" } +// { dg-prune-output "invalid type" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval2.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval2.C new file mode 100644 index 000000000..14cb29874 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-uneval2.C @@ -0,0 +1,7 @@ +// PR c++/60375 +// { dg-do compile { target c++11 } } + +struct A +{ + decltype( [](){ return this; }() ) x; // { dg-error "unevaluated" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31439.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31439.C index f75373555..df50e41cd 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31439.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/pr31439.C @@ -1,7 +1,7 @@ // { dg-do compile { target c++11 } } template<typename...> struct A; -template<char> struct A<> {}; // { dg-error "not used in partial specialization|anonymous|declaration" } +template<char> struct A<> {}; // { dg-error "not deducible|anonymous|declaration" } template<typename T, typename... U> struct A<T, U...> : A<U...> {}; // { dg-error "incomplete type" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic154.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic154.C new file mode 100644 index 000000000..198f9c5ba --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic154.C @@ -0,0 +1,8 @@ +// PR c++/60374 +// { dg-do compile { target c++11 } } + +template<typename> struct A {}; + +template<typename...T> struct A<T::T...> {}; // { dg-error "typename|partial|T" } + +A<int> a; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic155.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic155.C new file mode 100644 index 000000000..d912317bd --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic155.C @@ -0,0 +1,4 @@ +// { dg-do compile { target c++11 } } + +template <typename T> struct A {}; +template <int... I> struct B: A<I...> {}; // { dg-error "type" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic156.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic156.C new file mode 100644 index 000000000..7d3c97d68 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/variadic156.C @@ -0,0 +1,6 @@ +// PR c++/52844 +// { dg-do compile { target c++11 } } + +template < class > struct V { }; +template < int...Is > void f ( V < Is...>) { } // { dg-error "mismatch|type" } +auto g ( ) -> decltype ( f ( V < long > ( ) ) ) ; // { dg-error "matching" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-33964.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-33964.C index 9e40737d5..8cbc0d647 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-33964.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp0x/vt-33964.C @@ -6,7 +6,7 @@ struct foo }; template<typename ... Args> -struct foo< typename Args::is_applied... > // { dg-error "not used|Args" } +struct foo< typename Args::is_applied... > // { dg-error "not deducible|Args" } { static bool const value = false; }; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn25.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn25.C index 628a685f7..24680f16d 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn25.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/auto-fn25.C @@ -1,6 +1,7 @@ // PR c++/60574 -// { dg-options "-flto" } // { dg-do compile { target c++1y } } +// { dg-require-effective-target lto } +// { dg-options "-flto" } struct A { diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60573.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60573.C new file mode 100644 index 000000000..2f607071c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60573.C @@ -0,0 +1,28 @@ +// PR c++/60573 +// { dg-do compile { target c++1y } } +// { dg-options "" } + +struct A +{ + struct B + { + void foo(auto); + }; + + void B::foo(auto) {} // { dg-error "cannot define" } + + struct X + { + struct Y + { + struct Z + { + void foo(auto); + }; + }; + + void Y::Z::foo(auto) {} // { dg-error "cannot define" } + }; + + void X::Y::Z::foo(auto) {} // { dg-error "cannot define" } +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60626.C b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60626.C new file mode 100644 index 000000000..39ea43815 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/cpp1y/pr60626.C @@ -0,0 +1,7 @@ +// PR c++/60626 +// { dg-do compile { target c++1y } } +// { dg-options "" } + +struct A {}; + +void (*A::p)(auto) = 0; // { dg-error "static member|non-template" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vla14.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla14.C new file mode 100644 index 000000000..278cb63b9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla14.C @@ -0,0 +1,23 @@ +// PR c++/21113 +// { dg-options "" } + +void +f (int n) +{ + goto label; // { dg-error "from here" } + int a[n]; // { dg-error "crosses initialization" } +label: // { dg-error "jump to label" } + ; +} + +void +g (int n) +{ + switch (1) + { + case 1: + int (*a)[n]; // { dg-error "crosses initialization" } + default: // { dg-error "jump to case label" } + ; + } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ext/vla15.C b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla15.C new file mode 100644 index 000000000..feeb49ff2 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/ext/vla15.C @@ -0,0 +1,20 @@ +// PR c++/44613 +// { dg-do run } +// { dg-options "" } + +void *volatile p; + +int +main (void) +{ + int n = 0; + lab:; + int x[n % 1000 + 1]; + x[0] = 1; + x[n % 1000] = 2; + p = x; + n++; + if (n < 1000000) + goto lab; + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr60682.C b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr60682.C new file mode 100644 index 000000000..fdd7a204c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/gomp/pr60682.C @@ -0,0 +1,44 @@ +// PR middle-end/60682 +// { dg-do compile } +// { dg-options "-O2 -fopenmp-simd" } + +struct A +{ + float a; + A () {} + A (const A &x) { a = x.a; } +}; + +struct B +{ + A a[16]; +}; + +struct C +{ + float a[1]; + C () {} + C (const C &x) { a[0] = x.a[0]; } +}; + +struct D +{ + C a[16]; +}; + +void +foo (int x, B &y, D &z) +{ +#pragma omp simd + for (int i = 0; i < x; ++i) + { + A a; + y.a[i] = a; + } +#pragma omp simd + for (int i = 0; i < x; ++i) + { + C a; + z.a[i] = a; + } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/const10.C b/gcc-4.9/gcc/testsuite/g++.dg/init/const10.C new file mode 100644 index 000000000..ecd0db450 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/init/const10.C @@ -0,0 +1,33 @@ +// PR C++/52369 +// { dg-do compile { target c++11 } } + +class B // { dg-message "implicitly deleted" } + // { dg-error "uninitialized" "" { target c++11 } 4 } +{ + int const v_; // { dg-message "should be initialized" } +}; + +struct D : B {}; // { dg-error "deleted" } + +class A // { dg-message "implicitly deleted" } + // { dg-error "uninitialized" "" { target c++11 } 12 } +{ + int& ref; // { dg-message "should be initialized" } +}; + +struct C : A {}; // { dg-error "deleted" } + +void f() +{ + D d; // { dg-error "use of deleted" } + new D; // { dg-error "use of deleted" } + D(); // { dg-error "use of deleted" } + new D(); // { dg-error "use of deleted" } + + C c; // { dg-error "use of deleted" } + new C; // { dg-error "use of deleted" } + C(); // { dg-error "use of deleted" } + new C(); // { dg-error "use of deleted" } +} + + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/const11.C b/gcc-4.9/gcc/testsuite/g++.dg/init/const11.C new file mode 100644 index 000000000..08d5185c0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/init/const11.C @@ -0,0 +1,29 @@ +// PR C++/52369 +// { dg-do compile { target { ! c++11 } } } + +class B +{ + int const v_; // { dg-message "should be initialized" } +}; + +struct D : B {}; + +class A +{ + int& ref; // { dg-message "should be initialized" } +}; + +struct C : A {}; + +void f() +{ + D d; // { dg-error "uninitialized" } + new D; // { dg-error "uninitialized" } + D(); + new D(); + + C c; // { dg-error "uninitialized" } + new C; // { dg-error "uninitialized" } + C(); // { dg-error "value-initialization" } + new C(); // { dg-error "value-initialization" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ctor4-1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor4-1.C new file mode 100644 index 000000000..1333b35f9 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor4-1.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +class foo { +public: + foo(); +}; + +class bar: public foo { // { dg-error "uninitialized" } + // { dg-message "implicitly deleted" "" { target c++11 } 8 } +private: + int const a; // { dg-message "should be initialized" } +}; + +foo::foo() { +} + +int main(int argc, char **argv) +{ + bar x; // { dg-error "deleted" "" { target c++11 } } + // { dg-message "synthesized" "" { target { ! c++11 } } 19 } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ctor4.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor4.C index 1c92bb973..21034b679 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/init/ctor4.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor4.C @@ -6,9 +6,10 @@ public: foo(); }; -class bar: public foo { // { dg-error "reference|bar::bar" } +class bar: public foo { // { dg-error "uninitialized" } + // { dg-message "implicitly deleted" "" { target c++11 } 9 } private: - int &a; + int &a; // { dg-message "should be initialized" } }; foo::foo() { @@ -16,5 +17,6 @@ foo::foo() { int main(int argc, char **argv) { - bar x; // { dg-message "synthesized|deleted" } + bar x; // { dg-error "deleted" "" { target c++11 } } + // { dg-message "synthesized" "" { target { ! c++11 } } 20 } } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/ctor8.C b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor8.C index 7eb72eb83..3c37790c0 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/init/ctor8.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/init/ctor8.C @@ -1,6 +1,6 @@ // PR c++/29039 -typedef struct S { // { dg-error "reference" "" { target c++11 } } +typedef struct S { // { dg-error "reference" "" { target c++11 } } int &r; }; // { dg-warning "'typedef' was ignored" } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr25811.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr25811.C index 0a462be54..c29f40607 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/init/pr25811.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr25811.C @@ -1,51 +1,60 @@ // PR c++/25811 // { dg-do compile } -struct A1 // { dg-error "uninitialized" "" { target c++11 } } +struct A1 // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 4 } { - int const j; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int const j; // { dg-message "should be initialized" } }; -struct A2 // { dg-error "uninitialized" "" { target c++11 } } +struct A2 // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 10 } { - int const volatile i; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int const volatile i; // { dg-message "should be initialized" } }; -struct A3 // { dg-error "uninitialized" "" { target c++11 } } +struct A3 // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 16 } { - int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int& ref; // { dg-message "should be initialized" } }; -struct A4 // { dg-error "uninitialized" "" { target c++11 } } +struct A4 // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 22 } { - int const& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int const& ref; // { dg-message "should be initialized" } }; -struct A5 // { dg-error "uninitialized" "" { target c++11 } } +struct A5 // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 28 } { - int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } - int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int& ref; // { dg-message "should be initialized" } + int const i; // { dg-message "should be initialized" } }; -template <class T> struct S1 // { dg-error "uninitialized" "" { target c++11 } } +template <class T> struct S1 // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 35 } { - T const i; // { dg-message "should be initialized" "" { target { ! c++11 } } } + T const i; // { dg-message "should be initialized" } }; -template <class T> struct S2 // { dg-error "uninitialized" "" { target c++11 } } +template <class T> struct S2 // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 41 } { - T const volatile i; // { dg-message "should be initialized" "" { target { ! c++11 } } } + T const volatile i; // { dg-message "should be initialized" } }; -template <class T> struct S3 // { dg-error "uninitialized" "" { target c++11 } } +template <class T> struct S3 // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 47 } { - T& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } + T& ref; // { dg-message "should be initialized" } }; -template <class T> struct S4 // { dg-error "uninitialized" "" { target c++11 } } +template <class T> struct S4 // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 53 } { - T const i; // { dg-message "should be initialized" "" { target { ! c++11 } } } - T& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } + T const i; // { dg-message "should be initialized" } + T& ref; // { dg-message "should be initialized" } }; struct X @@ -55,44 +64,50 @@ struct X int const& r; }; -struct Y11 // { dg-error "uninitialized" "" { target c++11 } } +struct Y11 // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 67 } { - int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int const i; // { dg-message "should be initialized" } }; -struct Y1 // { dg-error "deleted" "" { target c++11 } } +struct Y1 // { dg-error "deleted" "" { target c++11 } } { Y11 a[1]; }; -struct Y22 // { dg-error "uninitialized" "" { target c++11 } } +struct Y22 // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 78 } { - int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int& ref; // { dg-message "should be initialized" } }; -struct Y2 // { dg-error "deleted" "" { target c++11 } } +struct Y2 // { dg-error "deleted" "" { target c++11 } } { Y22 a[1]; }; -struct Z1 // { dg-error "uninitialized" "" { target c++11 } } +struct Z1 // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 89 } { - int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int const i; // { dg-message "should be initialized" } }; -struct Z2 // { dg-error "uninitialized" "" { target c++11 } } +struct Z2 // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 95 } { - int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int& ref; // { dg-message "should be initialized" } }; -struct Z3 // { dg-error "uninitialized" "" { target c++11 } } +struct Z3 // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 101 } { - int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int const i; // { dg-message "should be initialized" } }; -struct Z4 // { dg-error "uninitialized" "" { target c++11 } } +struct Z4 // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 107 } { - int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int& ref; // { dg-message "should be initialized" } }; struct Z5 @@ -100,7 +115,7 @@ struct Z5 int i; }; -struct Z // { dg-error "deleted" "" { target c++11 } } +struct Z // { dg-error "deleted" "" { target c++11 } } { Z1 z1; Z2 z2; @@ -109,9 +124,10 @@ struct Z // { dg-error "deleted" "" { target c++11 } } Z5 z5; }; -union U // { dg-error "uninitialized" "" { target c++11 } } +union U // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 127 } { - int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int const i; // { dg-message "should be initialized" } }; void f1 () diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr29043.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr29043.C index f341f8c8f..c81c39cb0 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/init/pr29043.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr29043.C @@ -1,9 +1,10 @@ // PR c++/29043 // { dg-do compile } -struct S // { dg-error "uninitialized" "" { target c++11 } } +struct S // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 4 } { - int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int const i; // { dg-message "should be initialized" } }; class C @@ -13,9 +14,10 @@ public: S s; }; -struct S2 // { dg-error "uninitialized" "" { target c++11 } } +struct S2 // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 17 } { - int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int& ref; // { dg-message "should be initialized" } }; class C2 @@ -33,9 +35,10 @@ class C3 }; }; -struct S4 // { dg-error "uninitialized" "" { target c++11 } } +struct S4 // { dg-message "implicitly deleted" "" { target c++11 } } + // { dg-error "uninitialized" "" { target c++11 } 38 } { - int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int const i; // { dg-message "should be initialized" } }; struct C4 @@ -46,7 +49,7 @@ struct C4 struct C5 { - C5() {} // { dg-message "uninitialized" } + C5() {} // { dg-error "uninitialized" } int const iit[ 1 ]; }; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr43719.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr43719.C index 81930d07d..c8cebc2de 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/init/pr43719.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr43719.C @@ -1,51 +1,51 @@ // PR c++/43719 // { dg-do compile } -struct A1 // { dg-error "uninitialized" "" { target c++11 } } +struct A1 // { dg-error "uninitialized" "" { target c++11 } } { - int const j; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int const j; // { dg-message "should be initialized" } }; -struct A2 // { dg-error "uninitialized" "" { target c++11 } } +struct A2 // { dg-error "uninitialized" "" { target c++11 } } { - int const volatile i; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int const volatile i; // { dg-message "should be initialized" } }; -struct A3 // { dg-error "uninitialized" "" { target c++11 } } +struct A3 // { dg-error "uninitialized" "" { target c++11 } } { - int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int& ref; // { dg-message "should be initialized" } }; -struct A4 // { dg-error "uninitialized" "" { target c++11 } } +struct A4 // { dg-error "uninitialized" "" { target c++11 } } { - int const& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int const& ref; // { dg-message "should be initialized" } }; -struct A5 // { dg-error "uninitialized" "" { target c++11 } } +struct A5 // { dg-error "uninitialized" "" { target c++11 } } { - int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } - int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int& ref; // { dg-message "should be initialized" } + int const i; // { dg-message "should be initialized" } }; template <class T> struct S1 // { dg-error "uninitialized" "" { target c++11 } } { - T const i; // { dg-message "should be initialized" "" { target { ! c++11 } } } + T const i; // { dg-message "should be initialized" } }; template <class T> struct S2 // { dg-error "uninitialized" "" { target c++11 } } { - T const volatile i; // { dg-message "should be initialized" "" { target { ! c++11 } } } + T const volatile i; // { dg-message "should be initialized" } }; template <class T> struct S3 // { dg-error "uninitialized" "" { target c++11 } } { - T& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } + T& ref; // { dg-message "should be initialized" } }; template <class T> struct S4 // { dg-error "uninitialized" "" { target c++11 } } { - T const i; // { dg-message "should be initialized" "" { target { ! c++11 } } } - T& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } + T const i; // { dg-message "should be initialized" } + T& ref; // { dg-message "should be initialized" } }; struct X @@ -55,9 +55,9 @@ struct X int const& r; }; -struct Y11 // { dg-error "uninitialized" "" { target c++11 } } +struct Y11 // { dg-error "uninitialized" "" { target c++11 } } { - int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int const i; // { dg-message "should be initialized" } }; struct Y1 // { dg-error "deleted" "" { target c++11 } } @@ -65,9 +65,9 @@ struct Y1 // { dg-error "deleted" "" { target c++11 } } Y11 a[1]; }; -struct Y22 // { dg-error "uninitialized" "" { target c++11 } } +struct Y22 // { dg-error "uninitialized" "" { target c++11 } } { - int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int& ref; // { dg-message "should be initialized" } }; struct Y2 // { dg-error "deleted" "" { target c++11 } } @@ -75,24 +75,24 @@ struct Y2 // { dg-error "deleted" "" { target c++11 } } Y22 a[1]; }; -struct Z1 // { dg-error "uninitialized" "" { target c++11 } } +struct Z1 // { dg-error "uninitialized" "" { target c++11 } } { - int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int const i; // { dg-message "should be initialized" } }; -struct Z2 // { dg-error "uninitialized" "" { target c++11 } } +struct Z2 // { dg-error "uninitialized" "" { target c++11 } } { - int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int& ref; // { dg-message "should be initialized" } }; -struct Z3 // { dg-error "uninitialized" "" { target c++11 } } +struct Z3 // { dg-error "uninitialized" "" { target c++11 } } { - int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int const i; // { dg-message "should be initialized" } }; -struct Z4 // { dg-error "uninitialized" "" { target c++11 } } +struct Z4 // { dg-error "uninitialized" "" { target c++11 } } { - int& ref; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int& ref; // { dg-message "should be initialized" } }; struct Z5 @@ -109,9 +109,9 @@ struct Z // { dg-error "deleted" "" { target c++11 } } Z5 z5; }; -union U // { dg-error "uninitialized" "" { target c++11 } } +union U // { dg-error "uninitialized" "" { target c++11 } } { - int const i; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int const i; // { dg-message "should be initialized" } }; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/pr44086.C b/gcc-4.9/gcc/testsuite/g++.dg/init/pr44086.C index 96b5bef1c..c3e9d4e56 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/init/pr44086.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/init/pr44086.C @@ -1,9 +1,9 @@ // PR c++/44086 // { dg-do compile } -struct A // { dg-error "uninitialized" "" { target c++11 } } +struct A // { dg-error "uninitialized" "" { target c++11 } } { - int const i : 2; // { dg-message "should be initialized" "" { target { ! c++11 } } } + int const i : 2; // { dg-message "should be initialized" } }; void f() diff --git a/gcc-4.9/gcc/testsuite/g++.dg/init/uninitialized1.C b/gcc-4.9/gcc/testsuite/g++.dg/init/uninitialized1.C index 1e4f7ae84..e8509ff4b 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/init/uninitialized1.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/init/uninitialized1.C @@ -1,8 +1,8 @@ // PR c++/58126 -struct A { // { dg-error "uninitialized" "" { target c++11 } } - const int value1; - int& value2; +struct A { // { dg-error "uninitialized" "" { target c++11 } } + const int value1; // { dg-message "should be initialized" } + int& value2; // { dg-message "should be initialized" } }; struct B : A { }; // { dg-error "deleted" "" { target c++11 } } 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 99f60afe3..675bd08d7 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 @@ -37,5 +37,5 @@ main() { class C c; } -/* { dg-final { scan-ipa-dump "Discovered a virtual call to" "cp" } } */ +/* { dg-final { scan-ipa-dump "Discovered a virtual call to" "cp" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "cp" } } */ 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 a32c7d674..98d86aee8 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 @@ -45,5 +45,5 @@ main() { class C c; } -/* { dg-final { scan-ipa-dump "Discovered a virtual call to" "cp" } } */ +/* { dg-final { scan-ipa-dump "Discovered a virtual call to" "cp" { xfail *-*-* } } } */ /* { dg-final { cleanup-ipa-dump "cp" } } */ diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60600.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60600.C new file mode 100644 index 000000000..00c368e63 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60600.C @@ -0,0 +1,34 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-ipa-cp" } */ + +struct data { + data(int); +}; + +struct top { + virtual int topf(); +}; + +struct intermediate: top { + int topf() /* override */ { return 0; } +}; + +struct child1: top { + void childf() + { + data d(topf()); + } +}; + +struct child2: intermediate {}; + +void test(top& t) +{ + child1& c = static_cast<child1&>(t); + c.childf(); + child2 d; + test(d); +} + +/* { dg-final { scan-ipa-dump "Type inconsident devirtualization" "cp" } } */ +/* { dg-final { cleanup-ipa-dump "cp" } } */ diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-1.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-1.C new file mode 100644 index 000000000..7a0b91893 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-1.C @@ -0,0 +1,50 @@ +// { dg-do compile } +// { dg-options "-O3" } + +class ASN1Object +{ +public: + virtual ~ASN1Object (); +}; +class A +{ + virtual unsigned m_fn1 () const; +}; +class B +{ +public: + ASN1Object Element; + virtual unsigned m_fn1 (bool) const; +}; +template <class BASE> class C : public BASE +{ +}; + +class D : ASN1Object, public B +{ +}; +class G : public D +{ + unsigned m_fn1 (bool) const {} +}; +class F : A +{ +public: + F (A); + unsigned m_fn1 () const + { + int a; + a = m_fn2 ().m_fn1 (0); + return a; + } + const B &m_fn2 () const { return m_groupParameters; } + C<G> m_groupParameters; +}; +template <class D> void BenchMarkKeyAgreement (int *, int *, int) +{ + A f; + D d (f); +} + +void BenchmarkAll2 () { BenchMarkKeyAgreement<F>(0, 0, 0); } + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-2.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-2.C new file mode 100644 index 000000000..c6e614cc0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-2.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// { dg-options "-O3" } + +struct B { virtual unsigned f () const; }; +struct C { virtual void f (); }; +struct F { virtual unsigned f (bool) const; ~F (); }; +struct J : C, F {}; +struct G : J { unsigned f (bool) const { return 0; } }; +struct H : B +{ + H (int); + unsigned f () const { return ((const F &) h).f (0); } + G h; +}; +H h (0); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-3.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-3.C new file mode 100644 index 000000000..21b1f58a0 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-3.C @@ -0,0 +1,81 @@ +// { dg-do run } +// { dg-options "-O3" } + +struct Distraction +{ + char fc[8]; + virtual Distraction * return_self () + { return this; } +}; + +namespace { + +struct A; +static A * __attribute__ ((noinline, noclone)) get_an_A (); + +static int go; + +struct A +{ + int fi; + + A () : fi(777) {} + A (int pi) : fi (pi) {} + virtual A * foo (int p) = 0; +}; + +struct B; +static B * __attribute__ ((noinline, noclone)) get_a_B (); + +struct B : public Distraction, A +{ + B () : Distraction(), A() { } + B (int pi) : Distraction (), A (pi) {} + virtual B * foo (int p) + { + int o = fi; + for (int i = 0; i < p; i++) + o += i + i * i; + go = o; + + return get_a_B (); + } +}; + + +struct B gb1 (1111), gb2 (2); +static B * __attribute__ ((noinline, noclone)) +get_a_B () +{ + return &gb1; +} + +static A * __attribute__ ((noinline, noclone)) +get_an_A () +{ + return &gb2; +} + +} + +static int __attribute__ ((noinline, noclone)) +get_a_number () +{ + return 5; +} + +extern "C" void abort (void); + +int main (int argc, char *argv[]) +{ + for (int i = 0; i < get_a_number (); i++) + { + struct A *p = get_an_A (); + struct A *r = p->foo (4); + if (r->fi != 1111) + abort (); + if (go != 22) + abort (); + } + return 0; +} 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 new file mode 100644 index 000000000..eb9eb627f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/pr60640-4.C @@ -0,0 +1,85 @@ +// { dg-do run } +// { dg-options "-O3 -fdump-ipa-cp" } + +struct Distraction +{ + char fc[8]; + virtual Distraction * return_self () + { return this; } +}; + +namespace { + +struct A; +static A * __attribute__ ((noinline, noclone)) get_an_A (); + +static int go; + +struct A +{ + int fi; + + A () : fi(777) {} + A (int pi) : fi (pi) {} + virtual void foo (int p) = 0; +}; + +struct B : public Distraction, A +{ + B () : Distraction(), A() { } + B (int pi) : Distraction (), A (pi) {} + virtual void foo (int p) + { + int o = fi; + for (int i = 0; i < p; i++) + o += i + i * i; + go = o; + } +}; + + +struct B gb (2); +static A * __attribute__ ((noinline, noclone)) +get_an_A () +{ + return &gb; +} + +} + +static int __attribute__ ((noinline, noclone)) +get_a_number () +{ + return 5; +} + +extern "C" void abort (void); + +static void __attribute__ ((noinline, noclone)) +bar () +{ + for (int i = 0; i < get_a_number (); i++) + { + struct A *p = get_an_A (); + p->foo (4); + if (go != 22) + abort (); + } +} + +int main (int argc, char *argv[]) +{ + for (int i = 0; i < get_a_number (); i++) + { + struct A *p = get_an_A (); + p->foo (4); + if (go != 22) + abort (); + } + + bar (); + return 0; +} + +/* { dg-final { scan-ipa-dump-times "Thunk fixed offset" 2 "cp"} } */ +/* { dg-final { cleanup-ipa-dump "cp" } } */ diff --git a/gcc-4.9/gcc/testsuite/g++.dg/lto/pr60567_0.C b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr60567_0.C new file mode 100644 index 000000000..966a3c3bc --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/lto/pr60567_0.C @@ -0,0 +1,23 @@ +// PR lto/60567 +// { dg-lto-do link } +// { dg-lto-options { { -flto -fno-use-linker-plugin } } } +// { dg-extra-ld-options "-r -nostdlib" } + +#pragma implementation +struct S {}; + +#pragma interface +struct T +{ + virtual void foo (const S &) = 0; +}; + +struct U +{ + virtual void bar (const S &) = 0; +}; + +struct V : public T, public U +{ + virtual void bar (const S &) {} +}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr56999.C b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr56999.C index 6db2f270e..8d89ffa16 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/opt/pr56999.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/opt/pr56999.C @@ -159,6 +159,7 @@ TypeCompartment::addPendingRecompile (JSContext *cx, const RecompileInfo & info) pendingRecompiles->append (info); } volatile JITScript *JSScript::JITScriptHandle::UNJITTABLE; +#pragma GCC visibility pop int main () { diff --git a/gcc-4.9/gcc/testsuite/g++.dg/pr49718.C b/gcc-4.9/gcc/testsuite/g++.dg/pr49718.C index d7f2710a9..b1cc5deb7 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/pr49718.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/pr49718.C @@ -2,7 +2,8 @@ /* { dg-options "-O2 -finstrument-functions" } */ /* { dg-additional-options "-mno-explicit-relocs" { target alpha*-*-* } } */ /* { dg-additional-options "-mno-relax-pic-calls" { target mips*-*-* } } */ -/* { dg-final { scan-assembler-times "__cyg_profile_func_enter" 1} } */ +/* { dg-final { scan-assembler-times "__cyg_profile_func_enter" 1 { target { ! { hppa*-*-hpux* } } } } } */ +/* { dg-final { scan-assembler-times "__cyg_profile_func_enter,%r" 1 { target hppa*-*-hpux* } } } */ #define NOINSTR __attribute__((no_instrument_function)) diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash119.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash119.C new file mode 100644 index 000000000..95d80a8ff --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash119.C @@ -0,0 +1,8 @@ +// PR c++/59115 + +template<typename T, float, int, typename U> void foo(T, U) {} // { dg-error "valid type" } + +void bar() +{ + foo(0, 0); // { dg-error "matching" } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash97.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash97.C index 3d177f4e5..7d2161f54 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/template/crash97.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash97.C @@ -2,7 +2,7 @@ template<typename> struct A {}; -template<typename> struct A<int> // { dg-error "not used|template\\-parameter" } +template<typename> struct A<int> // { dg-error "not deducible|template\\-parameter" } { template<int> void foo(); }; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/crash98.C b/gcc-4.9/gcc/testsuite/g++.dg/template/crash98.C index a79ab02f6..9d7d2ece1 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/template/crash98.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/template/crash98.C @@ -2,7 +2,7 @@ template < typename > struct A; -template < typename > struct A < int > // { dg-error "not used|template\\-parameter|declaration" } +template < typename > struct A < int > // { dg-error "not deducible|template\\-parameter|declaration" } { int i; int f (); diff --git a/gcc-4.9/gcc/testsuite/g++.dg/template/partial5.C b/gcc-4.9/gcc/testsuite/g++.dg/template/partial5.C index aa32e3b8a..979e4c62b 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/template/partial5.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/template/partial5.C @@ -4,7 +4,7 @@ template<typename T> struct X { }; template<typename T> -struct X<typename T::foo> { }; // { dg-error "not used|T" } +struct X<typename T::foo> { }; // { dg-error "not deducible|T" } template<int N> struct X<int[N]> {}; // okay @@ -14,7 +14,7 @@ template<typename T, typename T::foo V> struct Y { }; template<typename T, typename U, U v> -struct Y<T, v> { }; // { dg-error "not used|U" } +struct Y<T, v> { }; // { dg-error "not deducible|U" } template<typename T, T V> diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60315.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60315.C new file mode 100644 index 000000000..05575c463 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60315.C @@ -0,0 +1,19 @@ +// PR ipa/60315 +// { dg-do compile } +// { dg-options "-std=c++11" } + +struct Base { + virtual int f() = 0; +}; + +struct Derived : public Base { + virtual int f() final override { + return 42; + } +}; + +extern Base* b; + +int main() { + return (static_cast<Derived*>(b)->*(&Derived::f))(); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60609.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60609.C new file mode 100644 index 000000000..9ddec0b60 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60609.C @@ -0,0 +1,252 @@ +/* { dg-do assemble } */ + +class exception +{ +}; +class bad_alloc:exception +{ +}; +class logic_error:exception +{ +}; +class domain_error:logic_error +{ +}; +class invalid_argument:logic_error +{ +}; +class length_error:logic_error +{ +}; +class overflow_error:exception +{ +}; +typedef int mpz_t[]; +template < class > class __gmp_expr; +template <> class __gmp_expr < mpz_t > +{ + ~__gmp_expr (); +}; + +class PIP_Solution_Node; +class internal_exception +{ + ~internal_exception (); +}; +class not_an_integer:internal_exception +{ +}; +class not_a_variable:internal_exception +{ +}; +class not_an_optimization_mode:internal_exception +{ +}; +class not_a_bounded_integer_type_width:internal_exception +{ +}; +class not_a_bounded_integer_type_representation:internal_exception +{ +}; +class not_a_bounded_integer_type_overflow:internal_exception +{ +}; +class not_a_complexity_class:internal_exception +{ +}; +class not_a_control_parameter_name:internal_exception +{ +}; +class not_a_control_parameter_value:internal_exception +{ +}; +class not_a_pip_problem_control_parameter_name:internal_exception +{ +}; +class not_a_pip_problem_control_parameter_value:internal_exception +{ +}; +class not_a_relation:internal_exception +{ +}; +class ppl_handle_mismatch:internal_exception +{ +}; +class timeout_exception +{ + ~timeout_exception (); +}; +class deterministic_timeout_exception:timeout_exception +{ +}; +void __assert_fail (const char *, const char *, int, int *) +__attribute__ ((__noreturn__)); +void PL_get_pointer (void *); +int Prolog_is_address (); +inline int +Prolog_get_address (void **p1) +{ + Prolog_is_address ()? static_cast < + void >(0) : __assert_fail ("Prolog_is_address", "./swi_cfli.hh", 0, 0); + PL_get_pointer (p1); + return 0; +} + +class non_linear:internal_exception +{ +}; +class not_unsigned_integer:internal_exception +{ +}; +class not_universe_or_empty:internal_exception +{ +}; +class not_a_nil_terminated_list:internal_exception +{ +}; +class PPL_integer_out_of_range +{ + __gmp_expr < mpz_t > n; +}; +void handle_exception (); +template < typename T > T * term_to_handle (int, const char *) +{ + if (Prolog_is_address ()) + { + void *p; + Prolog_get_address (&p); + return static_cast < T * >(0); + } + throw; +} + +void +ppl_new_MIP_Problem_from_MIP_Problem () +try +{ + term_to_handle < int >(0, "ppl_new_MIP_Problem_from_MIP_Problem/2"); +} + +catch (exception &) +{ +} + +int +ppl_PIP_Tree_Node_parametric_values () +{ + try + { + PIP_Solution_Node *a = term_to_handle < PIP_Solution_Node > (0, 0); + (void)a; + return 1; + } + catch (internal_exception &) + { + } + catch (not_unsigned_integer &) + { + handle_exception (); + } + catch (non_linear &) + { + handle_exception (); + } + catch (not_a_variable &) + { + handle_exception (); + } + catch (not_an_integer &) + { + handle_exception (); + } + catch (ppl_handle_mismatch &) + { + handle_exception (); + } + catch (not_an_optimization_mode &) + { + handle_exception (); + } + catch (not_a_complexity_class &) + { + handle_exception (); + } + catch (not_a_bounded_integer_type_width &) + { + handle_exception (); + } + catch (not_a_bounded_integer_type_representation &) + { + handle_exception (); + } + catch (not_a_bounded_integer_type_overflow &) + { + handle_exception (); + } + catch (not_a_control_parameter_name &) + { + handle_exception (); + } + catch (not_a_control_parameter_value &) + { + handle_exception (); + } + catch (not_a_pip_problem_control_parameter_name &) + { + handle_exception (); + } + catch (not_a_pip_problem_control_parameter_value &) + { + handle_exception (); + } + catch (not_universe_or_empty &) + { + handle_exception (); + } + catch (not_a_relation &) + { + handle_exception (); + } + catch (not_a_nil_terminated_list &) + { + handle_exception (); + } + catch (PPL_integer_out_of_range &) + { + handle_exception (); + } + catch (int &) + { + } catch (timeout_exception &) + { + handle_exception (); + } catch (deterministic_timeout_exception &) + { + handle_exception (); + } catch (overflow_error &) + { + handle_exception (); + } catch (domain_error &) + { + handle_exception (); + } catch (length_error &) + { + handle_exception (); + } catch (invalid_argument &) + { + handle_exception (); + } catch (logic_error &) + { + handle_exception (); + } catch (bad_alloc &) + { + handle_exception (); + } catch (exception &) + { + handle_exception (); + } catch ( ...) + { + handle_exception (); + } + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60648.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60648.C new file mode 100644 index 000000000..48cf0afb5 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60648.C @@ -0,0 +1,70 @@ +// PR target/60648 +// { dg-do compile } +// { dg-additional-options "-fPIC" { target fpic } } + +enum component +{ + Ex, + Ez, + Hy, + Permeability +}; +enum derived_component +{}; +enum direction +{ + X, + Y, + Z, + R, + P, + NO_DIRECTION +}; +derived_component a; +component *b; +component c; +direction d; +inline direction fn1 (component p1) +{ + switch (p1) + { + case 0: + return Y; + case 1: + return Z; + case Permeability: + return NO_DIRECTION; + } + return X; +} + +inline component fn2 (direction p1) +{ + switch (p1) + { + case 0: + case 1: + return component (); + case Z: + case R: + return component (1); + case P: + return component (3); + } +} + +void fn3 () +{ + direction e; + switch (0) + case 0: + switch (a) + { + case 0: + c = Ex; + b[1] = Hy; + } + e = fn1 (b[1]); + b[1] = fn2 (e); + d = fn1 (c); +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60659.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60659.C new file mode 100644 index 000000000..f0158a522 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60659.C @@ -0,0 +1,58 @@ +// { dg-do compile } +template <typename _InputIterator> void __distance (_InputIterator); +template <typename _InputIterator> +void distance (_InputIterator, _InputIterator p2) +{ + __distance (p2); +} + +namespace boost +{ +template <class Iterator> struct A +{ + typedef typename Iterator::difference_type type; +}; +template <class T> typename T::const_iterator end (T &); +template <class T> typename T::const_iterator begin (T &); +template <class T> struct D : A<typename T::const_iterator> +{ +}; +template <class T> typename D<T>::type distance (const T &p1) +{ + distance (boost::begin (p1), boost::end (p1)); + return 0; +} +template <class IteratorT> class B +{ +public: + typedef B type; + typedef IteratorT const_iterator; +}; +} + +typedef int storage_t[]; +struct F; +template <template <typename> class> struct G +{ + G (const G &p1) { p1.m_fn1 ().m_fn1 (0); } + const F &m_fn1 () const + { + const void *a; + a = &data_m; + return *static_cast<const F *>(a); + } + storage_t *data_m; +}; + +struct F +{ + virtual F *m_fn1 (void *) const; +}; +template <typename> struct H; +struct C : G<H> +{ + typedef int difference_type; +}; +boost::B<C> AllTransVideos (); +int b = boost::distance (AllTransVideos ()); + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60746.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60746.C new file mode 100644 index 000000000..7ce6ebe6b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60746.C @@ -0,0 +1,23 @@ +// { dg-do compile } + +class One +{ +public: + virtual unsigned long getSize () const; +}; + +class Two +{ + virtual int run (); +}; + +int +Two::run () +{ + One list_arry[5][2]; + int orig = 0; + if (list_arry[3][orig].getSize () > 0 + || list_arry[4][orig].getSize () > 0) + { + } +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60750.C b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60750.C new file mode 100644 index 000000000..a344bd764 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/torture/pr60750.C @@ -0,0 +1,21 @@ +// { dg-do run } +// { dg-options "-std=c++11" } + +#include <string> +#include <stdexcept> + +const std::string err_prefix = "Problem: "; +void thrower (std::string msg) +{ + throw std::runtime_error(err_prefix + std::move(msg)); +} + +int main(int argc, char **argv) +{ + try { + std::string base = "hello"; + thrower(std::move(base)); + } catch (const std::runtime_error &e) { + } + return 0; +} diff --git a/gcc-4.9/gcc/testsuite/g++.dg/vect/pr60729.cc b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr60729.cc new file mode 100644 index 000000000..fd472c50a --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/vect/pr60729.cc @@ -0,0 +1,10 @@ +// { dg-do compile } +// { dg-additional-options "-ftrapv" } + +void doSomething(int dim, double *Y, double *A) +{ + for (int k=0; k<dim; k++) + Y[k] += __builtin_fabs (A[k]); +} + +// { dg-final { cleanup-tree-dump "vect" } } diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C index d40de3d7c..9f2e4bea4 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-2.C @@ -6,18 +6,18 @@ // destructor, in which case it would be possible but unsafe to delete // an instance of a derived class through a pointer to the base class. -struct A // { dg-bogus "non-virtual destructor" } +struct A { protected: - ~A(); + ~A(); // inaccessible - no warning public: virtual void f() = 0; }; -struct B // { dg-bogus "non-virtual destructor" } +struct B { private: - ~B(); + ~B(); // inaccessible - no warning public: virtual void f() = 0; }; @@ -52,3 +52,25 @@ private: public: virtual void f() = 0; }; + +struct H {}; + +struct I1 : H +{}; +struct I2 : private H +{}; + +struct J1 : H +{ virtual ~J1 ();}; +struct J2 : private H +{ virtual ~J2 ();}; + +struct K // { dg-warning "accessible non-virtual destructor" } +{ + virtual void k (); +}; + +struct L1 : K // { dg-warning "accessible non-virtual destructor" } +{virtual ~L1 ();}; +struct L2 : private K +{virtual ~L2 ();}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-3.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-3.C new file mode 100644 index 000000000..e83134b06 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-3.C @@ -0,0 +1,75 @@ +// { dg-do compile } +// { dg-options "-Weffc++" } + +// Warn when a class has virtual functions and accessible non-virtual +// destructor, in which case it would be possible but unsafe to delete +// an instance of a derived class through a pointer to the base class. + +struct A +{ +protected: + ~A(); // inaccessible - no warning +public: + virtual void f() = 0; +}; + +struct B +{ +private: + ~B(); // inaccessible - no warning +public: + virtual void f() = 0; +}; + +struct C // { dg-warning "non-virtual destructor" } +{ + virtual void f() = 0; +}; + +struct D // { dg-warning "non-virtual destructor" } +{ + ~D(); + virtual void f() = 0; +}; + +struct E; + +struct F // { dg-warning "non-virtual destructor" } +{ +protected: + friend class E; + ~F(); +public: + virtual void f() = 0; +}; + +struct G // { dg-warning "non-virtual destructor" } +{ +private: + friend class E; + ~G(); +public: + virtual void f() = 0; +}; + +struct H {}; + +struct I1 : H +{}; +struct I2 : private H +{}; + +struct J1 : H // { dg-warning "accessible non-virtual destructor" } +{ virtual ~J1 ();}; +struct J2 : private H +{ virtual ~J2 ();}; + +struct K // { dg-warning "accessible non-virtual destructor" } +{ + virtual void k (); +}; + +struct L1 : K // { dg-warning "accessible non-virtual destructor" } +{virtual ~L1 ();}; +struct L2 : private K +{virtual ~L2 ();}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-4.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-4.C new file mode 100644 index 000000000..dd6d9d768 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor-4.C @@ -0,0 +1,75 @@ +// { dg-do compile } +// { dg-options "-Weffc++ -Wno-non-virtual-dtor" } + +// Warn when a class has virtual functions and accessible non-virtual +// destructor, in which case it would be possible but unsafe to delete +// an instance of a derived class through a pointer to the base class. + +struct A +{ +protected: + ~A(); +public: + virtual void f() = 0; +}; + +struct B +{ +private: + ~B(); +public: + virtual void f() = 0; +}; + +struct C +{ + virtual void f() = 0; +}; + +struct D +{ + ~D(); + virtual void f() = 0; +}; + +struct E; + +struct F +{ +protected: + friend class E; + ~F(); +public: + virtual void f() = 0; +}; + +struct G +{ +private: + friend class E; + ~G(); +public: + virtual void f() = 0; +}; + +struct H {}; + +struct I1 : H +{}; +struct I2 : private H +{}; + +struct J1 : H +{ virtual ~J1 ();}; +struct J2 : private H +{ virtual ~J2 ();}; + +struct K +{ + virtual void k (); +}; + +struct L1 : K +{virtual ~L1 ();}; +struct L2 : private K +{virtual ~L2 ();}; diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor.C index b04fdcbe6..f03cff5b3 100644 --- a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor.C +++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wnvdtor.C @@ -8,3 +8,4 @@ extern "Java" virtual void bar( void); }; } + diff --git a/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-local-addr-2.C b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-local-addr-2.C new file mode 100644 index 000000000..c483601e6 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/warn/Wreturn-local-addr-2.C @@ -0,0 +1,11 @@ +// PR c++/44859 + +struct Base2 { int m_foo; }; +struct Derived2 : public Base2 {}; + +const Base2& f8() { return Derived2(); } // { dg-warning "reference to temporary" } + +struct foo { }; +struct bar { foo base; }; + +const foo& f9() { return bar().base; } // { dg-warning "reference to temporary" } |