diff options
author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-02-23 22:36:54 +0000 |
---|---|---|
committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-02-23 22:36:54 +0000 |
commit | 88a3ea34080ad3087a8191fbf479543153175d59 (patch) | |
tree | 34eaec34d3588e09f9a77abba776266f124dc823 /gcc/testsuite/g++.dg | |
parent | 25e15aaed275cdfef34b3ee6eb3cb4b43a48d44f (diff) | |
parent | e65055a558093bd4fc0b1b0024b7814cc187b8e8 (diff) | |
download | gccgo.tar.gz |
Merge from trunk revision 257954.gccgo
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gccgo@257955 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite/g++.dg')
47 files changed, 877 insertions, 5 deletions
diff --git a/gcc/testsuite/g++.dg/concepts/pr84330.C b/gcc/testsuite/g++.dg/concepts/pr84330.C new file mode 100644 index 00000000000..975ee8941db --- /dev/null +++ b/gcc/testsuite/g++.dg/concepts/pr84330.C @@ -0,0 +1,12 @@ +// PR c++/84330 +// { dg-options "-fconcepts" } + +struct A +{ + template<typename T> requires sizeof(T) >> 0 void foo(T); // { dg-error "predicate constraint" } + + void bar() + { + foo(0); // { dg-error "no matching" } + } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/auto49.C b/gcc/testsuite/g++.dg/cpp0x/auto49.C new file mode 100644 index 00000000000..25b09dfdec1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto49.C @@ -0,0 +1,12 @@ +// PR c++/84350 +// { dg-do compile { target c++11 } } + +template<typename... T> void foo(T... t) +{ + new auto(t...); // { dg-error "invalid use" } +} + +void bar() +{ + foo(); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/auto50.C b/gcc/testsuite/g++.dg/cpp0x/auto50.C new file mode 100644 index 00000000000..814892d2afa --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto50.C @@ -0,0 +1,7 @@ +// PR c++/84348 +// { dg-do compile { target c++11 } } + +template<typename> struct A +{ + friend auto foo; // { dg-error "cannot be declared friend" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-84449.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-84449.C new file mode 100644 index 00000000000..f187c425272 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-84449.C @@ -0,0 +1,14 @@ +// PR c++/84449 +// { dg-do compile { target c++11 } } + +struct A +{ + constexpr A (int) {} + ~A () = delete; +}; + +struct B +{ + A a; + constexpr B () : a (0) {} // { dg-error "use of deleted function" } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor21.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor21.C new file mode 100644 index 00000000000..4bf57b9e897 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor21.C @@ -0,0 +1,15 @@ +// PR c++/83835 +// { dg-do compile { target c++11 } } + +struct Z +{ + void const * p_; + constexpr Z( void const * p ): p_( p ) {} + ~Z(); +}; + +struct Y +{ + Z z_; + constexpr Y() noexcept: z_( this ) {} +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/dc9.C b/gcc/testsuite/g++.dg/cpp0x/dc9.C new file mode 100644 index 00000000000..b87f5ce618d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/dc9.C @@ -0,0 +1,30 @@ +// PR c++/70468 +// { dg-do compile { target c++11 } } +// { dg-additional-options -w } + +struct S {}; + +template < typename = S > +class A +{ +public: + A () : f0 (), f1 () {} // { dg-error "" } + +private: + typedef A<> f0; + int f1; +}; + +template < typename = S, typename = S > +class B +{ +}; + +template < typename T1, typename T2 > +B < T1, T2 > &operator<< (B < T1, T2 >&, const int) +{ + A<> (); +} + +template +B < S, S > &operator<< (B < S, S >&, const int); diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist98.C b/gcc/testsuite/g++.dg/cpp0x/initlist98.C new file mode 100644 index 00000000000..4f2fcd20219 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist98.C @@ -0,0 +1,17 @@ +// PR c++/83227 +// { dg-do compile { target c++11 } } + +#include <initializer_list> + +template <typename d> struct f { + f(std::initializer_list<d>) {} +}; + +struct h {}; +struct i : h { + i(); +}; +void foo(f<h>); +int main() { + foo({i{}}); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice26.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice26.C new file mode 100644 index 00000000000..7544b270256 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice26.C @@ -0,0 +1,5 @@ +// PR c++/84455 +// { dg-do compile { target c++11 } } +// { dg-options "--param ggc-min-heapsize=0" } + +#include "lambda-ice14.C" diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice27.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice27.C new file mode 100644 index 00000000000..04c44a3b57f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice27.C @@ -0,0 +1,8 @@ +// PR c++/84446 +// { dg-do compile { target c++11 } } + +template<int> void foo() +{ + int i, + i = [] { virtual }(); // { dg-error "redeclaration|expected" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla1.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla1.C new file mode 100644 index 00000000000..91498c4589a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-vla1.C @@ -0,0 +1,9 @@ +// PR c++/84429 +// { dg-do compile { target c++11 } } +// { dg-options "" } + +void foo(int i) +{ + char x[i]; + [&]{ [&]{ return x; }; }; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept32.C b/gcc/testsuite/g++.dg/cpp0x/noexcept32.C new file mode 100644 index 00000000000..9a435049599 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/noexcept32.C @@ -0,0 +1,14 @@ +// PR c++/84045 +// { dg-do compile { target c++11 } } + +template <typename T> struct K { + static const bool d = true; +}; +template <typename T, typename> struct B { + typedef K<T> D; + void foo () noexcept (D::d); +}; +template <typename T> struct P { + P () noexcept (K<T>::d); +}; +P<int> p; diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-empty1.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-empty1.C new file mode 100644 index 00000000000..66d94e53824 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-empty1.C @@ -0,0 +1,18 @@ +// PR c++/82764 +// { dg-do compile { target c++11 } } + +struct Empty {}; +struct Empty2 : Empty {}; + +struct A : Empty2 +{ + int x {1}; + int y {2}; +}; + +struct B +{ + A a {}; +}; + +B b; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr77655.C b/gcc/testsuite/g++.dg/cpp0x/pr77655.C new file mode 100644 index 00000000000..ab2e942cbb8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr77655.C @@ -0,0 +1,13 @@ +// PR c++/77655 +// { dg-do compile { target c++11 } } + +template <class F> void g(F); +template <class... A> +auto h(A &&... a) -> decltype(g(0, g<decltype(a)>(a)...)) { // { dg-error "no matching" } + h([] {}); // { dg-error "no matching" } +} + +int main() { + h(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic172.C b/gcc/testsuite/g++.dg/cpp0x/variadic172.C new file mode 100644 index 00000000000..d25d3029a9d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic172.C @@ -0,0 +1,20 @@ +// PR c++/84454 +// { dg-do compile { target c++11 } } + +template<class F, class... A> +void +g(F&&, A&&...) +{} + +template<class... A> +auto +h(A&&... a) -> decltype(g(0, g<decltype(a)>(a)...)) +{ + g(a...); // { dg-error "no match" } +} + +int +main() +{ + h(); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-84192.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-84192.C new file mode 100644 index 00000000000..ad9458d238f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-84192.C @@ -0,0 +1,41 @@ +// PR c++/84192 +// { dg-do compile { target c++14 } } +// { dg-options "" } + +bool +f1 () +{ + return ({ return true; }) && false; // { dg-error "could not convert" } +} + +void +f2 () +{ + for (;;) + constexpr bool b = ({ break; false; }) && false; // { dg-error "statement is not a constant expression" } +} + +constexpr bool +f3 (int n) +{ + bool b = false; + for (int i = 0; i < n; i++) + b = ({ break; }); // { dg-error "void value not ignored as it ought to be" } + return b; +} + +constexpr bool b = f3 (4); + +bool +f4 () +{ + constexpr bool b = ({ return true; }) && false; // { dg-error "could not convert" } + return false; +} + +constexpr bool +f5 (int x) +{ + constexpr bool b = ({ switch (x) case 0: true; }) && false; // { dg-error "could not convert" } + return false; +} diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic14.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic14.C new file mode 100644 index 00000000000..76567966293 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic14.C @@ -0,0 +1,17 @@ +// PR c++/84368 +// { dg-do compile { target c++14 } } + +template < typename ... T > +void sink(T ...){} + +template < typename ... T > +void foo(T ... v){ + [](auto ... v){ + auto bar = [](auto, auto){ return 0; }; + sink(bar(v, T{}) ...); + }(v ...); +} + +int main(){ + foo(0); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/pr84496.C b/gcc/testsuite/g++.dg/cpp1y/pr84496.C new file mode 100644 index 00000000000..028d00235cd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/pr84496.C @@ -0,0 +1,44 @@ +// PR c++/84496 +// { dg-do compile { target c++14 } } + +template <typename T, T n> struct C { static constexpr T D = n; }; +struct E : C<bool, false> {}; +template <typename> struct F : C<bool, false> {}; +template <typename T> T foo (); +template <typename> struct H { typedef int G; }; +template <typename> class I; +struct L; +template <typename, typename> struct J; +template <bool, bool, typename...> struct K; +struct R { + template <typename M, typename... N> + static J<decltype (foo<M> () (foo<N>...)), L> o; +}; +template <typename P, typename... Q> struct K<false, false, P, Q...> : R { + typedef decltype (o<P, Q...>) G; +}; +template <typename P, typename... Q> +struct D : K<E::D, F<typename H<P>::G>::D, P, Q...> {}; +template <typename P, typename... Q> struct I<P (Q...)> : D<P, Q...> {}; +template <typename> class function; +template <typename S, typename... Q> struct function<S (Q...)> { + template <typename T, typename = typename I<T (Q...)>::G> struct C; + template <typename, typename> using U = int; + template <typename P, typename = U<int, void>, typename = U<C<P>, void>> + function (P); +}; +template <typename S, typename... Q> +template <typename P, typename, typename> +function<S (Q...)>::function (P) +{ +} +void bar (function<void (int)>); + +void +baz () +{ + auto a = [] { + static int counter; + bar ([] (auto) { counter++; }); + }; +} diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction47.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction47.C new file mode 100644 index 00000000000..3e47f58e698 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction47.C @@ -0,0 +1,7 @@ +// PR c++/84376 + +template<int> struct A {}; + +template<typename T> T foo() { return T(); } + +template<> A foo<A>(); // { dg-error "A" } diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction48.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction48.C new file mode 100644 index 00000000000..1cfdc44a993 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction48.C @@ -0,0 +1,5 @@ +// PR c++/82468 +// { dg-options -std=c++17 } + +template <template <class> class TT> +TT(double) -> TT<int>; // { dg-error "template template" } diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-if14.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-if14.C new file mode 100644 index 00000000000..f6cc39a0c2f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-if14.C @@ -0,0 +1,14 @@ +// PR c++/84421 +// { dg-options -std=c++17 } + +struct A{ + constexpr operator bool() const { return true; } +}; + +int main(){ + auto f = [](auto v){ + if constexpr(v){} + }; + A a; + f(a); +} diff --git a/gcc/testsuite/g++.dg/cpp1z/decomp-lambda1.C b/gcc/testsuite/g++.dg/cpp1z/decomp-lambda1.C new file mode 100644 index 00000000000..fbab0259643 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/decomp-lambda1.C @@ -0,0 +1,10 @@ +// PR c++/84420 +// { dg-additional-options -std=c++17 } + +int main(){ + int a[1]{}; + [&a]{ + auto [v] = a; + (void)v; + }(); +} diff --git a/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C b/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C index b2f046b5c91..2ab1b4e3e86 100644 --- a/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C +++ b/gcc/testsuite/g++.dg/cpp1z/feat-cxx1z.C @@ -358,8 +358,8 @@ #ifndef __cpp_deduction_guides # error "__cpp_deduction_guides" -#elif __cpp_deduction_guides != 201606 -# error "__cpp_deduction_guides != 201606" +#elif __cpp_deduction_guides != 201611 +# error "__cpp_deduction_guides != 201611" #endif #ifndef __cpp_if_constexpr diff --git a/gcc/testsuite/g++.dg/cpp1z/launder7.C b/gcc/testsuite/g++.dg/cpp1z/launder7.C new file mode 100644 index 00000000000..e418329f931 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/launder7.C @@ -0,0 +1,10 @@ +// PR c++/84445 +// { dg-do compile } + +struct A { virtual void foo (); }; + +void +bar (A *p) +{ + __builtin_launder (p)->foo (); +} diff --git a/gcc/testsuite/g++.dg/cpp1z/launder8.C b/gcc/testsuite/g++.dg/cpp1z/launder8.C new file mode 100644 index 00000000000..f57e91b60cd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/launder8.C @@ -0,0 +1,11 @@ +// PR c++/84444 +// { dg-do compile } +// { dg-options "-O2" } + +struct A {}; + +__UINTPTR_TYPE__ +foo (A *p) +{ + return (__UINTPTR_TYPE__) __builtin_launder (p); +} diff --git a/gcc/testsuite/g++.dg/ext/attrib55.C b/gcc/testsuite/g++.dg/ext/attrib55.C new file mode 100644 index 00000000000..dc0cdc48b7a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib55.C @@ -0,0 +1,99 @@ +// PR c++/84314 +// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } } +// { dg-additional-options "-w -std=c++11" } + +template <typename a, a b> struct c { static constexpr a d = b; }; +template <bool b> using e = c<bool, b>; +template <bool, typename, typename> struct conditional; +template <typename...> struct f; +template <typename g, typename h> +struct f<g, h> : conditional<g::d, g, h>::i {}; +template <typename...> struct j; +template <typename g, typename h> struct j<g, h> : conditional<1, h, g>::i {}; +template <typename g, typename h, typename k, typename... l> +struct j<g, h, k, l...> : conditional<1, j<h, k>, g>::i {}; +struct aa : e<!bool()> {}; +template <typename, typename> struct m : c<bool, false> {}; +template <typename, typename n> struct o { + template <typename> static c<bool, true> p(int); + typedef decltype(p<n>(0)) i; +}; +template <typename, typename> struct ab : o<int, int>::i {}; +template <typename> struct s { typedef int ad; }; +template <bool, typename = void> struct q; +template <typename a> struct q<true, a> { typedef a i; }; +template <bool, typename ae, typename> struct conditional { typedef ae i; }; +template <typename ae, typename r> struct conditional<false, ae, r> { + typedef r i; +}; +struct B { + B(int); +}; +template <unsigned, typename...> struct af; +template <unsigned ag, typename t, typename... ah> +struct af<ag, t, ah...> : af<1, ah...>, B { + typedef af<1, ah...> ai; + ai al(af); + template <typename... am> af(af<ag, am...> p1) : ai(al(p1)), B(0) {} +}; +template <unsigned ag, typename t> struct af<ag, t> {}; +template <int, typename... ao> struct ap { + template <typename... am> static constexpr bool ar() { + return j<ab<am, ao>...>::d; + } +}; +template <typename... ao> class as : public af<0, ao...> { + typedef af<0, ao...> ai; + +public: + template <typename...> using au = ap<m<int, int>::d, ao...>; + template <typename... am, + typename q<au<>::template ar<am...>(), bool>::i = true> + as(as<am...> an) : ai(an) {} +}; +template <typename... ao> as<typename s<ao>::ad...> ax(ao...); +namespace ay { +class az {}; +} +using ay::az; +namespace ay { +template <typename ba> struct C { typedef ba bc; }; +} +template <typename> class bd; +template <typename bi, typename n> using bj = f<m<bi, n>, ab<bi, n>>; +template <typename bf, typename... bh> class bd<bf(bh...)> { + struct F : bj<int, bf> {}; + template <typename bl, typename> using bm = typename q<bl::d>::i; + +public: + template <typename bg, typename = bm<aa, void>, typename = bm<F, void>> + bd(bg); + using bn = bf; + bn bo; +}; +template <typename bf, typename... bh> +template <typename bg, typename, typename> +bd<bf(bh...)>::bd(bg) { + bo; +} +typedef long long(__attribute__((fastcall)) bq)(int *); +struct v : ay::C<as<bq, bq, int>> { + bc bt() { return ax(nullptr, nullptr, az()); } +}; +class w { +public: + int *cc(); +}; +class x : w { + void ce(); +}; +namespace u { +class cf { +public: + static cf cg(int, int *, int, az, bd<long long(int *)>); +}; +} +void x::ce() { + auto bu = 0; + u::cf::cg(bu, cc(), 1, {}, 0); +} diff --git a/gcc/testsuite/g++.dg/ext/attrib56.C b/gcc/testsuite/g++.dg/ext/attrib56.C new file mode 100644 index 00000000000..9736d979acd --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib56.C @@ -0,0 +1,6 @@ +// PR c++/84314 +// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } } + +struct a { + void b(long() __attribute__((fastcall))) {} +}; diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr22.C b/gcc/testsuite/g++.dg/ext/stmtexpr22.C new file mode 100644 index 00000000000..f46523a5875 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr22.C @@ -0,0 +1,13 @@ +// PR c++/81853 +// { dg-do compile { target c++11 } } +// { dg-options "" } + +namespace N { + enum { i }; +} + +int g () +{ + constexpr int j = ({ using namespace N; i; }); + return j; +} diff --git a/gcc/testsuite/g++.dg/ext/vector34.C b/gcc/testsuite/g++.dg/ext/vector34.C new file mode 100644 index 00000000000..5cca53070b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vector34.C @@ -0,0 +1,8 @@ +// PR c++/84424 +// { dg-do compile { target c++11 } } +// { dg-options "" } + +typedef int vec __attribute__ ((vector_size (2 * sizeof (int)))); + +constexpr vec u = { 1, 2 }; +constexpr vec v = __builtin_shuffle (v, u); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/gomp/pr84430.C b/gcc/testsuite/g++.dg/gomp/pr84430.C new file mode 100644 index 00000000000..cf9275acaa0 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr84430.C @@ -0,0 +1,12 @@ +// PR c++/84430 +// { dg-do compile { target c++11 } } + +void +foo () +{ + auto a = [] { + #pragma omp simd + for (int i = 0; i < 10; ++i) + ; + }; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr84448.C b/gcc/testsuite/g++.dg/gomp/pr84448.C new file mode 100644 index 00000000000..3fad4741d38 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr84448.C @@ -0,0 +1,17 @@ +// PR c++/84448 +// { dg-do compile } + +struct A +{ + operator int () const; + A& operator += (int); + A& operator ++ (); +}; + +void +foo (A a, A b) +{ + #pragma omp for + for (A i = a; i <=; ++i) // { dg-error "expected primary-expression before" } + ; // { dg-error "invalid controlling predicate" "" { target *-*-* } .-1 } +} diff --git a/gcc/testsuite/g++.dg/lookup/pr84375.C b/gcc/testsuite/g++.dg/lookup/pr84375.C new file mode 100644 index 00000000000..24cdcb2c407 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/pr84375.C @@ -0,0 +1,9 @@ +// PR c++/84375 ICE after error + +void foo() +{ + struct A + { + friend void A(); // { dg-error "local class without prior local" } + }; +} diff --git a/gcc/testsuite/g++.dg/opt/pr84272.C b/gcc/testsuite/g++.dg/opt/pr84272.C new file mode 100644 index 00000000000..ad4b8a29cd7 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr84272.C @@ -0,0 +1,23 @@ +// PR target/84272 +// { dg-do compile } +// { dg-options "-O2" } +// { dg-additional-options "-march=armv8-a -mtune=cortex-a57" { target aarch64-*-* } } + +struct A +{ + float b, c; + A (); + A (float, float, float); + float operator * (A) + { + float d = b * b + c * c; + return d; + } +}; + +void +foo () +{ + A g[1]; + A h (0, 0, h * g[2]); +} diff --git a/gcc/testsuite/g++.dg/parse/error59.C b/gcc/testsuite/g++.dg/parse/error59.C new file mode 100644 index 00000000000..2c44e210366 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error59.C @@ -0,0 +1,6 @@ +// PR c++/84493 + +void foo() +{ + (struct {}x){}; // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/parse/friend12.C b/gcc/testsuite/g++.dg/parse/friend12.C index 84d6e25e766..d4e0ceea9ac 100644 --- a/gcc/testsuite/g++.dg/parse/friend12.C +++ b/gcc/testsuite/g++.dg/parse/friend12.C @@ -3,5 +3,4 @@ struct A { friend int i = 0; // { dg-error "cannot be declared friend" } -// { dg-error "non-static data member" "" { target { ! c++11 } } .-1 } }; diff --git a/gcc/testsuite/g++.dg/pr84279.C b/gcc/testsuite/g++.dg/pr84279.C new file mode 100644 index 00000000000..a88d3fb8470 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr84279.C @@ -0,0 +1,35 @@ +/* { dg-do compile { target { powerpc*-*-* } } } */ +/* { dg-skip-if "" { powerpc*-*-darwin* } } */ +/* { dg-require-effective-target powerpc_p8vector_ok } */ +/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */ +/* { dg-options "-O3 -mcpu=power8 -g -fPIC -fvisibility=hidden -fstack-protector-strong" } */ + +template <typename, typename T> struct E { T e; }; +struct J { + unsigned k, l; + J (unsigned x, unsigned y) : k(x), l(y) {} +}; +typedef struct A { + J n, p; + A (); + A (J x, J y) : n(x), p(y) {} +} *S; +S t; +struct B { + struct C { + S q, r; + int u, v; + bool m1 (S, A &); + J m2 () const; + J m3 () const; + A m4 () const; + }; + typedef E<unsigned, S> D; + void m5 (D *); + void m6 (unsigned, A); +}; +bool B::C::m1 (S, A &x) { bool o; x = m4 (); return o; } +J B::C::m2 () const { unsigned g (u == 0); unsigned h (v); return J (g, h); } +J B::C::m3 () const { unsigned g (q != t); unsigned h (r != t); return J (g, h); } +A B::C::m4 () const { return A (m2 (), m3 ()); } +void B::m5 (D *c) { unsigned x; C ar; A am; if (ar.m1 (c->e, am)) m6 (x, am); } diff --git a/gcc/testsuite/g++.dg/template/instantiate5.C b/gcc/testsuite/g++.dg/template/instantiate5.C index 896313d14d5..d64092eb1a8 100644 --- a/gcc/testsuite/g++.dg/template/instantiate5.C +++ b/gcc/testsuite/g++.dg/template/instantiate5.C @@ -18,7 +18,12 @@ struct B template <typename T> struct C { - virtual void bar() const { T::foo(); } // { dg-error "no matching function" } + virtual void bar() const // { dg-message "required" } + { + T::foo(); // { dg-error "no matching function" } + } }; -C<B> c; // { dg-message "required" } +C<B> c; + +int k; diff --git a/gcc/testsuite/g++.dg/template/nontype-fn1.C b/gcc/testsuite/g++.dg/template/nontype-fn1.C new file mode 100644 index 00000000000..12d29a91a54 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nontype-fn1.C @@ -0,0 +1,11 @@ +// PR c++/82664 + +template < typename > struct target_disambiguator; +template < typename R, typename A1 > struct target_disambiguator< R(A1) > { + typedef A1 type; + template < R (&)() > struct layout; +}; + +int main() { + typedef target_disambiguator< void (int) > ::type target_type ; +} diff --git a/gcc/testsuite/g++.dg/template/overload15.C b/gcc/testsuite/g++.dg/template/overload15.C new file mode 100644 index 00000000000..ea0e548843d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/overload15.C @@ -0,0 +1,16 @@ +// PR c++79064 - Cannot overload member function templates on type of literal +// { dg-do compile } + +template <unsigned N> +void f (char (*)[0u - 1 > N ? 1 : 7]); + +template <unsigned N> +void f (char (*)[0u - 1ll > N ? 1 : 7]); + +void f () +{ + char x[1], y[7]; + + f<0>(&x); + f<0>(&y); +} diff --git a/gcc/testsuite/g++.dg/template/sizeof16.C b/gcc/testsuite/g++.dg/template/sizeof16.C new file mode 100644 index 00000000000..084bb2185c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof16.C @@ -0,0 +1,7 @@ +// PR c++/84333 +// { dg-options -Wno-pedantic } + +template<typename> int foo() +{ + return sizeof(int) > 1 ? : 1; +} diff --git a/gcc/testsuite/g++.dg/template/sizeof17.C b/gcc/testsuite/g++.dg/template/sizeof17.C new file mode 100644 index 00000000000..2d5892d2c8b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sizeof17.C @@ -0,0 +1,7 @@ +// PR c++/84333 +// { dg-options -Wno-pedantic } + +template<typename T> int foo() +{ + return sizeof(T) > 1 ? : 1; +} diff --git a/gcc/testsuite/g++.dg/torture/pr84190.C b/gcc/testsuite/g++.dg/torture/pr84190.C new file mode 100644 index 00000000000..a7bab944365 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr84190.C @@ -0,0 +1,20 @@ +// { dg-do compile } +// For slim LTO there's no optimized dump +// { dg-skip-if "" { *-*-* } { "-flto" } { "" } } +// { dg-additional-options "-fdump-tree-optimized" } + +typedef double T; +static int equalfn (volatile T* x, volatile T* y); +T gx, gy; +int main () +{ + T x = gx, y = gy; + return equalfn (&x, &y); +} +static int equalfn (volatile T* x, volatile T* y) +{ + return (*x == *y); +} + +// There should be exactly two volatile accesses (ignoring clobbers). +// { dg-final { scan-tree-dump-times " ={v} \[^\{\]" 2 "optimized" } } diff --git a/gcc/testsuite/g++.dg/torture/pr84502.C b/gcc/testsuite/g++.dg/torture/pr84502.C new file mode 100644 index 00000000000..befde4e1f0c --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr84502.C @@ -0,0 +1,20 @@ +// PR target/84502 +// { dg-do run } + +template<typename T> +struct A { }; +using X = A<int>; + +void +foo (X, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8) +{ + if (a1 != 0 || a2 != 1 || a3 != 2 || a4 != 3 + || a5 != 4 || a6 != 5 || a7 != 6 || a8 != 7) + __builtin_abort (); +} + +int +main () +{ + foo (X{}, 0, 1, 2, 3, 4, 5, 6, 7); +} diff --git a/gcc/testsuite/g++.dg/tree-ssa/volatile1.C b/gcc/testsuite/g++.dg/tree-ssa/volatile1.C new file mode 100644 index 00000000000..00f04a07d84 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/volatile1.C @@ -0,0 +1,28 @@ +// PR c++/84151 +// { dg-additional-options "-fdump-tree-gimple" } +// { dg-final { scan-tree-dump-not {\*this} "gimple" } } + +struct A { + static int& bar(int& a) { + return a; + } + static int i; + + int foo() volatile { + int v = c; + return i + bar(v); + } + + int c; +}; + +int A::i = 0; + +A a; + +int main() { + a.c = 2; + a.foo(); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/warn/Wimplicit-fallthrough-3.C b/gcc/testsuite/g++.dg/warn/Wimplicit-fallthrough-3.C new file mode 100644 index 00000000000..2f06817d9ee --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wimplicit-fallthrough-3.C @@ -0,0 +1,31 @@ +// Verify that there are no spurious warnings in nested switch statements due +// to the unnecessary break in the inner switch block. +// { dg-do compile } +// { dg-options "-Wimplicit-fallthrough" } */ + +int +foo (int c1, int c2, int c3) +{ + switch (c2) + { + case 0: + switch (c3) // { dg-bogus "may fall through" } + { + case 0: + if (c1) + return 1; + else + return 2; + break; + + default: + return 3; + } + + case 1: + return 4; + default: + return 5; + break; + } +} diff --git a/gcc/testsuite/g++.dg/warn/Wstringop-truncation-1.C b/gcc/testsuite/g++.dg/warn/Wstringop-truncation-1.C new file mode 100644 index 00000000000..a502b78b711 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wstringop-truncation-1.C @@ -0,0 +1,126 @@ +/* PR/tree-optimization/84480 - bogus -Wstringop-truncation despite + assignment with an inlined string literal + { dg-do compile } + { dg-options "-O2 -Wstringop-truncation" } */ + +#include <string.h> + +template <size_t N> +class GoodString +{ +public: + GoodString (const char *s, size_t slen = N) + { + if (slen > N) + slen = N; + + strncpy (str, s, slen); + + str[slen] = '\0'; + } + +private: + char str[N + 1]; +}; + +void sink (void*); + +void good_nowarn_size_m2 () +{ + GoodString<3> str ("12"); + sink (&str); +} + +void good_nowarn_size_m1 () +{ + GoodString<3> str ("123"); // { dg-bogus "\\\[-Wstringop-truncation]" } + sink (&str); +} + +void good_nowarn_size_m1_var (const char* s) +{ + GoodString<3> str (s); // { dg-bogus "\\\[-Wstringop-truncation]" } + sink (&str); +} + +void call_good_nowarn_size_m1_var () +{ + good_nowarn_size_m1_var ("456"); +} + + +template <size_t N> +class BadString1 +{ +public: + BadString1 (const char *s, size_t slen = N) + { + if (slen > N) + slen = N; + + strncpy (str, s, slen); + } + +private: + char str[N + 1]; +}; + +void bad1_nowarn_size_m2 () +{ + BadString1<3> str ("12"); + sink (&str); +} + + +template <size_t N> +class BadString2 +{ +public: + BadString2 (const char *s, size_t slen = N) + { + if (slen > N) + slen = N; + + strncpy (str, s, slen); // { dg-warning "\\\[-Wstringop-truncation]" } + } + +private: + char str[N + 1]; +}; + +void bad2_warn_size_m1 () +{ + BadString2<3> str ("123"); + sink (&str); +} + +// { dg-message "inlined from .void bad2_warn_size_m1." "" { target *-*-* } 0 } + +template <size_t N> +class BadString3 +{ +public: + BadString3 (const char *s, size_t slen = N) + { + if (slen > N) + slen = N; + + strncpy (str, s, slen); // { dg-warning "\\\[-Wstringop-truncation]" } + } + +private: + char str[N + 1]; +}; + +void bad3_warn_size_m1_var (const char *s) +{ + BadString3<3> str (s); + sink (&str); +} + +void call_bad3_warn_size_m1_var () +{ + bad3_warn_size_m1_var ("456"); +} + +// { dg-message "inlined from .void call_bad3_warn_size_m1_var." "" { target *-*-* } 0 } diff --git a/gcc/testsuite/g++.dg/warn/Wunused-var-30.C b/gcc/testsuite/g++.dg/warn/Wunused-var-30.C new file mode 100644 index 00000000000..e95e120e656 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wunused-var-30.C @@ -0,0 +1,11 @@ +// PR c++/84488 +// { dg-do compile } +// { dg-options "-Wunused-but-set-variable" } + +int +foo () +{ + enum E { A, B, C, D }; + double r = 1.0; // { dg-bogus "set but not used" } + return static_cast<E>(r); +} diff --git a/gcc/testsuite/g++.dg/warn/effc4.C b/gcc/testsuite/g++.dg/warn/effc4.C new file mode 100644 index 00000000000..2ce79280104 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/effc4.C @@ -0,0 +1,10 @@ +// PR c++/84364 +// { dg-do compile } +// { dg-options "-Weffc++" } + +template <typename T> +struct A { + A &operator=(A<T>& f) { + return *this; // { dg-bogus "should return a reference to" } + } +}; |