diff options
Diffstat (limited to 'gcc/testsuite/g++.dg')
56 files changed, 1027 insertions, 49 deletions
diff --git a/gcc/testsuite/g++.dg/concepts/req6.C b/gcc/testsuite/g++.dg/concepts/req6.C index 670fd542f6f..50fa3b4dadd 100644 --- a/gcc/testsuite/g++.dg/concepts/req6.C +++ b/gcc/testsuite/g++.dg/concepts/req6.C @@ -4,7 +4,7 @@ struct X { }; int operator==(X, X) { return 0; } template<typename T> - concept bool C1() { return X(); } + concept bool C1() { return X(); } // { dg-error "bool" } template<C1 T> void h(T) { } // OK until used. diff --git a/gcc/testsuite/g++.dg/cpp/string-3.C b/gcc/testsuite/g++.dg/cpp/string-3.C new file mode 100644 index 00000000000..ed9c42ce557 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp/string-3.C @@ -0,0 +1,9 @@ +// PR c++/82506 +// { dg-do preprocess { target c++11 } } + +#define STRINGIZE(A) #A + +BEGIN STRINGIZE(R"( +)") END + +// { dg-final { scan-file string-3.i "BEGIN \"R\\\\\"\\(\\\\n\\)\\\\\"\"\n END" } } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-61323.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-61323.C new file mode 100644 index 00000000000..f194bb8be82 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-61323.C @@ -0,0 +1,26 @@ +// PR c++/61323 +// { dg-do compile { target c++11 } } + +char* table1[10]; +template<unsigned size, char*(&table)[size]> void test1() { } +void tester1() { test1<10,table1>(); } + +static char* table2[10]; +template<unsigned size, char*(&table)[size]> void test2() { } +void tester2() { test2<10,table2>(); } + +const char* table3[10]; +template<unsigned size, const char*(&table)[size]> void test3() { } +void tester3() { test3<10,table3>(); } + +const char* const table4[10] = {}; +template<unsigned size, const char*const (&table)[size]> void test4() { } +void tester4() { test4<10,table4>(); } + +const char* volatile table5[10] = {}; +template<unsigned size, const char* volatile (&table)[size]> void test5() { } +void tester5() { test5<10,table5>(); } + +const char* const table6[10] = {}; +template<unsigned size, const char*const (&table)[size]> void test6() { } +void tester6() { test6<10,table6>(); } diff --git a/gcc/testsuite/g++.dg/cpp0x/error1.C b/gcc/testsuite/g++.dg/cpp0x/error1.C index 33557f2f80b..115d800bb35 100644 --- a/gcc/testsuite/g++.dg/cpp0x/error1.C +++ b/gcc/testsuite/g++.dg/cpp0x/error1.C @@ -1,10 +1,17 @@ // PR c++/34395 // { dg-do compile { target c++11 } } -template<int... N> void foo (int... x[N]) // { dg-message "int \\\[N\\\]\\.\\.\\. x" } +void f(...); +template<int... N> void foo (int... x[N]) // { dg-message "declared here" } { struct A { - A () { x; } // { dg-error "use of parameter from containing function" } + A () { f(x...); } // { dg-error "use of parameter from containing function" } }; } + +int main() +{ + int ar[4]; + foo<4>(ar); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr67625.C b/gcc/testsuite/g++.dg/cpp0x/pr67625.C new file mode 100644 index 00000000000..bcff5af5831 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr67625.C @@ -0,0 +1,12 @@ +// PR c++/67625 +// { dg-do compile { target c++11 } } + +constexpr unsigned short +bswap16 (unsigned short x) +{ + return __builtin_bswap16 (x); +} +constexpr int a = bswap16 (1); +enum { b = a }; +enum { c = __builtin_bswap16 (1) }; +enum { d = bswap16 (1) }; diff --git a/gcc/testsuite/g++.dg/cpp0x/pr70338.C b/gcc/testsuite/g++.dg/cpp0x/pr70338.C new file mode 100644 index 00000000000..156cb917080 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr70338.C @@ -0,0 +1,17 @@ +// PR c++/70338 +// { dg-do compile { target c++11 } } +// { dg-options "-g" } + +template<typename T> +void +foo (int x) +{ + T a[x]; + auto b = [&]() { for (auto &c: a) c = 0.; }; +} + +int +main () +{ + foo<double> (3); +} diff --git a/gcc/testsuite/g++.dg/cpp0x/pr70887.C b/gcc/testsuite/g++.dg/cpp0x/pr70887.C new file mode 100644 index 00000000000..f5b31b22900 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr70887.C @@ -0,0 +1,31 @@ +// PR middle-end/70887 +// { dg-do compile { target { { i?86-*-* x86_64-*-* } && c++11 } } } +// { dg-options "-O2 -msse2" } + +#include <x86intrin.h> + +enum R { S }; +template <R> struct C { static constexpr int value = 10; }; +template <typename R, template <R> class T, R... r> +struct A { + template <int, R...> struct B; + template <int N, R M, R... O> + struct B<N, M, O...> { + static constexpr int d = T<M>::value; + static __m128i generate() + { + __attribute__((__vector_size__(16))) long long + a = generate(), + b = _mm_bslli_si128 (a, 1), + c = _mm_bsrli_si128 (_mm_set1_epi32(d), 12); + return _mm_or_si128 (b, c); + } + }; + A () { B<0, r...>::generate(); } +}; + +int +main () { + using RI = A<R, C, S>; + RI ri; +} diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-extern-c.C b/gcc/testsuite/g++.dg/cpp0x/udlit-extern-c.C new file mode 100644 index 00000000000..d47a49c3fa8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/udlit-extern-c.C @@ -0,0 +1,7 @@ +// { dg-do compile { target c++11 } } + +extern "C" { // { dg-message "1: 'extern .C.' linkage started here" } + +constexpr double operator"" _deg ( double degrees ); // { dg-error "literal operator with C linkage" } + +} diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn40.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn40.C new file mode 100644 index 00000000000..e7f1bd44064 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/auto-fn40.C @@ -0,0 +1,37 @@ +// PR c++/78006 +// { dg-do compile { target c++14 } } + +template<typename T> T&& declval() noexcept; + +template<typename... _Tp> + struct common_type; + +template<typename _Tp> + struct common_type<_Tp> + { typedef _Tp type; }; + +template<typename _Tp, typename _Up> + struct common_type<_Tp, _Up> + { typedef decltype(true ? declval<_Tp>() : declval<_Up>()) type; }; + +template<typename _Tp, typename _Up, typename... _Vp> + struct common_type<_Tp, _Up, _Vp...> + { + typedef typename + common_type<typename common_type<_Tp, _Up>::type, _Vp...>::type type; + }; + +template<typename... _Tp> + using common_type_t = typename common_type<_Tp...>::type; + +template <typename... TFs> +auto x(TFs&&... fs) +{ + using rt = common_type_t<decltype(fs(0))...>; + return [](auto) -> rt { }; +} + +int main() +{ + x([](int){})(0); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn41.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn41.C new file mode 100644 index 00000000000..25a879da118 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/auto-fn41.C @@ -0,0 +1,23 @@ +// PR c++/80873 +// { dg-do compile { target c++14 } } + +struct S {}; + +auto overloaded(S &); + +template <typename T> +int overloaded(T &) { + return 0; +} + +template <typename T> +auto returns_lambda(T ¶m) { + return [&] { + overloaded(param); // { dg-error "before deduction" } + }; +} + +int main() { + S s; + returns_lambda(s); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn42.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn42.C new file mode 100644 index 00000000000..0f2b68efa42 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/auto-fn42.C @@ -0,0 +1,21 @@ +// PR c++/80873 +// { dg-do compile { target c++14 } } + +struct Buffer {}; + +auto parse(Buffer b); +template <typename T> void parse(T target); + +template <typename T> +auto field(T target) { + return [&] { + parse(target); + }; +} + +template <typename T> +void parse(T target) {} + +auto parse(Buffer b) { + field(0); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C b/gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C index 833fab7c50b..727e74e2e10 100644 --- a/gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C +++ b/gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C @@ -26,5 +26,5 @@ main() } // { dg-error "exponent has no digits" "exponent has no digits" { target *-*-* } 21 } -// { dg-error "expected ';' before" "expected ';' before" { target *-*-* } 14 } -// { dg-error "expected ';' before" "expected ';' before" { target *-*-* } 25 } +// { dg-error "expected ';' before" "expected ';' before" { target *-*-* } 13 } +// { dg-error "expected ';' before" "expected ';' before" { target *-*-* } 24 } diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-69078-1.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-69078-1.C new file mode 100644 index 00000000000..dc045c72065 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-69078-1.C @@ -0,0 +1,28 @@ +// PR c++/69078 +// { dg-do run { target c++14 } } +// { dg-options "-Wall" } + +#include <cassert> + +struct Class { + Class(void (*_param)()) : data(_param) {} + void (*data)(); +}; + +void funUser(void (*test)(int)) { + test(60); +} + +void user(Class& c, int i) { + (void)i; + assert (c.data); +} + +void probe() {} + +int main() { + static Class instance = { probe }; + funUser([](auto... p) { + user(instance, p...); + }); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-69078-2.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-69078-2.C new file mode 100644 index 00000000000..318e0967250 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-69078-2.C @@ -0,0 +1,21 @@ +// PR c++/69078 +// { dg-do run { target c++14 } } + +#include <cassert> + +template<typename F> +void run( F &&f ) { + f(nullptr); +} + +struct V { + int i; +}; + +int main() { + static V const s={2}; + assert (s.i == 2); + run([](auto){ + assert (s.i == 2); + }); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep2.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep2.C new file mode 100644 index 00000000000..91e3804cb0b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-dep2.C @@ -0,0 +1,18 @@ +// { dg-do compile { target c++14 } } + +struct A { void operator()(int) const {} }; + +template <class T> +void f() +{ + constexpr A a {}; + + [=](auto b) { + a(b); + }(42); +} + +int main() +{ + f<int>(); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice5.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice5.C index 473e412cb9d..88b7d1a05a1 100644 --- a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice5.C +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice5.C @@ -12,7 +12,7 @@ using Void = void; template<typename F,typename A> auto -bar(F f, A a) -> decltype( ( f(a) , 0 ) ) // { dg-error "no match" } +bar(F f, A a) -> decltype( ( f(a) , 0 ) ) // { dg-message "" } { return {}; } diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice6.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice6.C new file mode 100644 index 00000000000..6851afc860e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice6.C @@ -0,0 +1,13 @@ +// PR c++/81032 +// { dg-do compile { target c++14 } } + +template<typename T> constexpr void foo(T t) +{ + constexpr int i = t; // { dg-error "constant" } + [=](auto){ return i; }(0); +} + +void bar() +{ + foo(0); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice7.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice7.C new file mode 100644 index 00000000000..fa0fe1ddaf9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice7.C @@ -0,0 +1,15 @@ +// PR c++/81299 +// { dg-do compile { target c++14 } } +// { dg-options "-Wall" } + +struct function_t { + template <typename ...Xs> + void operator()(Xs&& ...) const { } +}; +constexpr function_t function{}; + +int main() { + constexpr auto fun = ::function; + auto call = [=](auto ...x) { fun(x...); }; + call(); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice8.C b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice8.C new file mode 100644 index 00000000000..a39ce44115d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/lambda-generic-ice8.C @@ -0,0 +1,16 @@ +// PR c++/82230 +// { dg-do compile { target c++14 } } + +template <class> + struct c + { + template <class> + void f() + { + [](auto) { auto x = [] {}; }(0); + } +}; +int main() +{ + c<int>{}.f<int>(); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/pr65202.C b/gcc/testsuite/g++.dg/cpp1y/pr65202.C index 602b264b302..7ce4895a134 100644 --- a/gcc/testsuite/g++.dg/cpp1y/pr65202.C +++ b/gcc/testsuite/g++.dg/cpp1y/pr65202.C @@ -22,5 +22,5 @@ struct bar; int main() { foo<ns::bar> f; - adl::swap(f, f) -} // { dg-error "" } + adl::swap(f, f) // { dg-error "expected ';'" } +} // { dg-error "expected '.'" "expected end of namespace" } diff --git a/gcc/testsuite/g++.dg/cpp1y/pr71875.C b/gcc/testsuite/g++.dg/cpp1y/pr71875.C new file mode 100644 index 00000000000..4d317966cea --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/pr71875.C @@ -0,0 +1,24 @@ +// PR c++/71875 +// { dg-do link { target c++14 } } + +template <typename T> +constexpr bool IsMatrix = false; + +template<typename TElem> +class Matrix {}; + +template <typename TElem> +constexpr bool IsMatrix<Matrix<TElem>> = true; + +template<typename TNestVec> +class RowVecExpMatrix; + +template <typename TNestVec> +constexpr bool IsMatrix<RowVecExpMatrix<TNestVec>> = true; + +int +main () +{ + static_assert (IsMatrix<RowVecExpMatrix<Matrix<int>>>, "Matrix check error"); + static_assert (IsMatrix<Matrix<int>>, "Input type is not a matrix"); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/pr77786.C b/gcc/testsuite/g++.dg/cpp1y/pr77786.C new file mode 100644 index 00000000000..e242228335c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/pr77786.C @@ -0,0 +1,21 @@ +// PR c++/77786 +// { dg-do compile { target c++14 } } + +#include <vector> + +template<int N> +void +foo (std::vector<int> a) +{ + auto const a_size = a.size(); + auto bar = [&](auto y) -> void { int a_size_2 = a_size; }; + double x = 0.0; + bar (x); +} + +int +main () +{ + std::vector<int> a(1); + foo<1>(a); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/pr78523.C b/gcc/testsuite/g++.dg/cpp1y/pr78523.C new file mode 100644 index 00000000000..31e0cc886fa --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/pr78523.C @@ -0,0 +1,12 @@ +// PR c++/78523 +// { dg-do compile { target c++14 } } + +int bar (); + +void +foo () +{ + const int t = bar (); + auto f = [=] (auto x) { return t; }; + f (0); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/pr80194.C b/gcc/testsuite/g++.dg/cpp1y/pr80194.C new file mode 100644 index 00000000000..2a892c3cf37 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/pr80194.C @@ -0,0 +1,17 @@ +// PR c++/80194 +// { dg-do compile { target c++14 } } + +int fn1 (); + +template <class Fn> +void +fn2 (Fn &&fn) +{ + fn (42); +} + +void fn2 () +{ + auto const x = fn1 (); + fn2 ([&](auto) { x; }); +} diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction44.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction44.C new file mode 100644 index 00000000000..15711971f51 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction44.C @@ -0,0 +1,5 @@ +// PR c++/80412 +// { dg-options -std=c++17 } + +template <typename> struct A; +template <typename> struct B : A < B { , // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/cpp1z/noexcept-type18.C b/gcc/testsuite/g++.dg/cpp1z/noexcept-type18.C new file mode 100644 index 00000000000..e01fd0a2030 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/noexcept-type18.C @@ -0,0 +1,15 @@ +// { dg-options "-std=c++17" } + +template<typename T> +struct S; + +template<bool IsNoexcept> +struct S<void(*)() noexcept(IsNoexcept)> { + S() {} +}; + +void f() {} + +int main() { + S<decltype(&f)> {}; +} diff --git a/gcc/testsuite/g++.dg/cpp1z/pr81016.C b/gcc/testsuite/g++.dg/cpp1z/pr81016.C new file mode 100644 index 00000000000..4826fbfb775 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/pr81016.C @@ -0,0 +1,4 @@ +// { dg-options "-std=c++17" } + +template <typename a, a> struct b; +template <typename c> struct b<bool, c::d>; // { dg-error "template parameter" } diff --git a/gcc/testsuite/g++.dg/diagnostic/unclosed-extern-c.C b/gcc/testsuite/g++.dg/diagnostic/unclosed-extern-c.C index fda3532266d..44f538e33ec 100644 --- a/gcc/testsuite/g++.dg/diagnostic/unclosed-extern-c.C +++ b/gcc/testsuite/g++.dg/diagnostic/unclosed-extern-c.C @@ -1,3 +1,12 @@ -extern "C" { /* { dg-message "12: to match this '.'" } */ +extern "C" { // { dg-line open_extern_c } + + int foo (void); + +/* Missing close-brace for the extern "C" here. */ + +template <typename T> // { dg-error "template with C linkage" } +void bar (void); +// { dg-message "1: 'extern .C.' linkage started here" "" { target *-*-* } open_extern_c } void test (void); /* { dg-error "17: expected '.' at end of input" } */ +// { message "12: to match this '.'" "" { target *-*-* } open_extern_c } diff --git a/gcc/testsuite/g++.dg/ext/attr-ifunc-1.C b/gcc/testsuite/g++.dg/ext/attr-ifunc-1.C index 2c7bba12959..4a29e8bb4d6 100644 --- a/gcc/testsuite/g++.dg/ext/attr-ifunc-1.C +++ b/gcc/testsuite/g++.dg/ext/attr-ifunc-1.C @@ -4,26 +4,33 @@ struct Klass { + int a[4]; + int implementation (); int magic (); - typedef int (Klass::*MemFuncPtr)(); + /* An ifunc resolver must return a pointer to an ordinary (non-member) + function. To make it possible to use ifunc with member functions, + the resolver must convert a member function pointer to an ordinary + function pointer (slicing off the high word). */ + typedef int Func (Klass*); - static MemFuncPtr resolver (); + static Func* resolver (); }; -Klass::MemFuncPtr p = &Klass::implementation; - -int Klass::implementation (void) +int Klass::implementation () { __builtin_printf ("'ere I am JH\n"); - return 1234; + return a[0] + a[1] + a[2] + a[3]; } - -Klass::MemFuncPtr Klass::resolver (void) +Klass::Func* Klass::resolver (void) { - return &Klass::implementation; + /* GCC guarantees this conversion to be safe and the resulting pointer + usable to call the member function using ordinary (i.e., non-member) + function call syntax. */ + + return reinterpret_cast<Func*>(&Klass::implementation); } int f (void) __attribute__ ((ifunc ("foo"))); @@ -32,11 +39,16 @@ typedef int (F)(void); extern "C" F* foo () { return 0; } -int Klass::magic (void) __attribute__ ((ifunc ("_ZN5Klass8resolverEv"))); +int Klass::magic () __attribute__ ((ifunc ("_ZN5Klass8resolverEv"))); int main () { Klass obj; - return !(obj.magic () == 1234); + obj.a[0] = 1; + obj.a[1] = 2; + obj.a[2] = 3; + obj.a[3] = 4; + + return !(obj.magic () == 10); } diff --git a/gcc/testsuite/g++.dg/ext/attr-ifunc-2.C b/gcc/testsuite/g++.dg/ext/attr-ifunc-2.C index 1fc940bb7dd..e5be3d29aba 100644 --- a/gcc/testsuite/g++.dg/ext/attr-ifunc-2.C +++ b/gcc/testsuite/g++.dg/ext/attr-ifunc-2.C @@ -9,9 +9,9 @@ struct Klass int implementation (); int magic (); - typedef int (Klass::*MemFuncPtr)(); + typedef int Func (Klass*); - static MemFuncPtr resolver (); + static Func* resolver (); }; int Klass::implementation (void) @@ -20,9 +20,13 @@ int Klass::implementation (void) return 0; } -Klass::MemFuncPtr Klass::resolver (void) +Klass::Func* Klass::resolver (void) { - return &Klass::implementation; + /* GCC guarantees this conversion to be safe and the resulting pointer + usable to call the member function using ordinary (i.e., non-member) + function call syntax. */ + + return reinterpret_cast<Func*>(&Klass::implementation); } int Klass::magic (void) __attribute__ ((ifunc ("_ZN5Klass8resolverEv"))); diff --git a/gcc/testsuite/g++.dg/ext/attr-ifunc-3.C b/gcc/testsuite/g++.dg/ext/attr-ifunc-3.C index 04206a126e8..6d494244331 100644 --- a/gcc/testsuite/g++.dg/ext/attr-ifunc-3.C +++ b/gcc/testsuite/g++.dg/ext/attr-ifunc-3.C @@ -6,23 +6,29 @@ struct Klass { + int a[4]; + int implementation (); int magic (); - typedef int (Klass::*MemFuncPtr)(); + typedef int Func (Klass*); - static MemFuncPtr resolver (); + static Func* resolver (); }; int Klass::implementation (void) { printf ("'ere I am JH\n"); - return 0; + return a[0] + a[1] + a[2] + a[3]; } -Klass::MemFuncPtr Klass::resolver (void) +Klass::Func* Klass::resolver () { - return &Klass::implementation; + /* GCC guarantees this conversion to be safe and the resulting pointer + usable to call the member function using ordinary (i.e., non-member) + function call syntax. */ + + return reinterpret_cast<Func*>(&Klass::implementation); } int Klass::magic (void) __attribute__ ((ifunc ("_ZN5Klass8resolverEv"))); @@ -36,5 +42,10 @@ int main () { Klass obj; - return Foo (obj, &Klass::magic) != 0; + obj.a[0] = 1; + obj.a[1] = 2; + obj.a[2] = 3; + obj.a[3] = 4; + + return Foo (obj, &Klass::magic) != 10; } diff --git a/gcc/testsuite/g++.dg/ext/attr-ifunc-4.C b/gcc/testsuite/g++.dg/ext/attr-ifunc-4.C index 3127193147e..f71dc3b9ba9 100644 --- a/gcc/testsuite/g++.dg/ext/attr-ifunc-4.C +++ b/gcc/testsuite/g++.dg/ext/attr-ifunc-4.C @@ -14,9 +14,9 @@ struct Klassier : Klass int implementation (); int magic (); - typedef int (Klassier::*MemFuncPtr)(); + typedef int Func (Klass*); - static MemFuncPtr resolver (); + static Func* resolver (); }; int Klassier::implementation (void) @@ -25,9 +25,13 @@ int Klassier::implementation (void) return 0; } -Klassier::MemFuncPtr Klassier::resolver (void) +Klassier::Func* Klassier::resolver () { - return &Klassier::implementation; + /* GCC guarantees this conversion to be safe and the resulting pointer + usable to call the member function using ordinary (i.e., non-member) + function call syntax. */ + + return reinterpret_cast<Func*>(&Klassier::implementation); } int Klassier::magic (void) __attribute__ ((ifunc ("_ZN8Klassier8resolverEv"))); diff --git a/gcc/testsuite/g++.dg/ext/attr-ifunc-5.C b/gcc/testsuite/g++.dg/ext/attr-ifunc-5.C index 05855dd20c0..fd8bcff79b7 100644 --- a/gcc/testsuite/g++.dg/ext/attr-ifunc-5.C +++ b/gcc/testsuite/g++.dg/ext/attr-ifunc-5.C @@ -1,15 +1,21 @@ // PR c/81854 - weak alias of an incompatible symbol accepted // { dg-do compile } // { dg-require-ifunc "" } */ +// { dg-options "-Wextra -Wno-pmf-conversions" } struct Klass { int implementation (); - const char* magic (); + int good_magic (); + int iffy_magic (); + const char* bad_magic (); + typedef int (Func)(Klass*); typedef int (Klass::*MemFuncPtr)(); - static MemFuncPtr resolver (); + static Func* good_resolver (); + static void* iffy_resolver (); + static MemFuncPtr bad_resolver (); }; int Klass::implementation (void) @@ -17,13 +23,42 @@ int Klass::implementation (void) return 0; } -const char* __attribute__ ((ifunc ("_ZN5Klass8resolverEv"))) - Klass::magic (); // { dg-warning "alias between functions of incompatible types" } +// Verify no warning for the expected/compatible declaration. +int __attribute__ ((ifunc ("_ZN5Klass13good_resolverEv"))) +Klass::good_magic (); + +Klass::Func* +Klass::good_resolver (void) +{ + MemFuncPtr mfp = &Klass::implementation; + + return reinterpret_cast<Func*>(mfp); +} + + +// Verify a warning for the unsafe declaration. + +int __attribute__ ((ifunc ("_ZN5Klass13iffy_resolverEv"))) +Klass::iffy_magic (); // { dg-message "resolver indirect function declared here" } + +void* +Klass::iffy_resolver (void) // { dg-warning ".ifunc. resolver for .int Klass::iffy_magic\\(\\). should return .int \\(\\*\\)\\(Klass\\*\\)." } +{ + MemFuncPtr mfp = &Klass::implementation; + + return reinterpret_cast<void*>(mfp); +} + + +// Verify an error for an incompatible declaration. + +const char* __attribute__ ((ifunc ("_ZN5Klass12bad_resolverEv"))) +Klass::bad_magic (); // { dg-message "resolver indirect function declared here" } Klass::MemFuncPtr -Klass::resolver (void) // { dg-message "aliased declaration here" } +Klass::bad_resolver (void) // { dg-error ".ifunc. resolver for .const char\\* Klass::bad_magic\\(\\). must return .const char\\* \\(\\*\\)\\(Klass\\*\\)." } { return &Klass::implementation; } diff --git a/gcc/testsuite/g++.dg/gomp/pr77578.C b/gcc/testsuite/g++.dg/gomp/pr77578.C new file mode 100644 index 00000000000..d92fddf970b --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr77578.C @@ -0,0 +1,31 @@ +// PR c++/77578 +// { dg-do compile } + +template <typename T> +class A +{ +}; + +template <typename T> +struct B +{ +}; + +template <typename T> +struct B <A <T> > +{ + typedef A <T> C; + typedef typename C::D D; + + template <typename U> + static void + foo (const D x, const D y) + { + U u; + { + #pragma omp parallel for + for (u.bar().y() = x.y(); u.bar().y() <= y.y(); u.bar().y()++) // { dg-error "expected" } + ; + } + } +}; diff --git a/gcc/testsuite/g++.dg/lookup/extern-c-hidden.C b/gcc/testsuite/g++.dg/lookup/extern-c-hidden.C index a03dea02376..80593dba735 100644 --- a/gcc/testsuite/g++.dg/lookup/extern-c-hidden.C +++ b/gcc/testsuite/g++.dg/lookup/extern-c-hidden.C @@ -1,11 +1,11 @@ // Make sure unhidding an extern-c still checks it is compatible -extern "C" float fabsf (float); // { dg-error "conflicts with previous declaration" } +extern "C" float fabsf (float); // { dg-message "previous declaration" } namespace Bob { extern "C" float fabsf (float, float); // { dg-error "C language" } - extern "C" double fabs (double, double); // { dg-error "conflicts with previous declaration" } + extern "C" double fabs (double, double); // { dg-message "previous declaration" } } extern "C" double fabs (double); // { dg-error "C language" } diff --git a/gcc/testsuite/g++.dg/lookup/extern-c-redecl.C b/gcc/testsuite/g++.dg/lookup/extern-c-redecl.C index 3e901cc7759..fd49868ee4e 100644 --- a/gcc/testsuite/g++.dg/lookup/extern-c-redecl.C +++ b/gcc/testsuite/g++.dg/lookup/extern-c-redecl.C @@ -3,7 +3,7 @@ // { dg-do compile } namespace A { - extern "C" void foo_func () throw(); // { dg-error "conflicts" } + extern "C" void foo_func () throw(); // { dg-message "previous" } } // next line should trigger an error because // it conflicts with previous declaration of foo_func (), due to diff --git a/gcc/testsuite/g++.dg/lookup/extern-c-redecl6.C b/gcc/testsuite/g++.dg/lookup/extern-c-redecl6.C new file mode 100644 index 00000000000..b4537d64a26 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/extern-c-redecl6.C @@ -0,0 +1,25 @@ +extern "C" { + int i; // { dg-message "previous" } + float f; // { dg-message "previous" } + void fn (); // { dg-message "previous" } + int ai1[1]; // { dg-message "previous" } + extern int ai[]; + + namespace OK + { + int i; + float f; + void fn (); + extern int ai1[]; + int ai[2]; + } + + namespace BAD + { + long i; // { dg-error "C language linkage" } + double f; // { dg-error "C language linkage" } + int fn (); // { dg-error "C language linkage" } + int ai1[2]; // { dg-error "C language linkage" } + } +} + diff --git a/gcc/testsuite/g++.dg/lto/pr82414_0.C b/gcc/testsuite/g++.dg/lto/pr82414_0.C new file mode 100644 index 00000000000..29753718b54 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr82414_0.C @@ -0,0 +1,13 @@ +// PR c++/82414 +// { dg-lto-do link } +// { dg-lto-options { { -flto -g } } } + +typedef __attribute__ ((__aligned__ (16))) struct S { __extension__ unsigned long long Part[2]; } T; // bogus warning "violates one definition rule" + +int +main () +{ + T tf; + asm volatile ("" : : "g" (__alignof__(tf)), "g" (__alignof__ (struct S)), "g" (__alignof__ (T))); + return 0; +} diff --git a/gcc/testsuite/g++.dg/missing-symbol-2.C b/gcc/testsuite/g++.dg/missing-symbol-2.C new file mode 100644 index 00000000000..4a119f8e9ad --- /dev/null +++ b/gcc/testsuite/g++.dg/missing-symbol-2.C @@ -0,0 +1,58 @@ +/* { dg-options "-fdiagnostics-show-caret" } */ + +extern int foo (void); + +void missing_open_paren (void) +{ + if foo ()) /* { dg-error "expected '\\(' before 'foo'" } */ + { + } + /* { dg-begin-multiline-output "" } + if foo ()) + ^~~ + ( + { dg-end-multiline-output "" } */ +} + + +void missing_close_square (void) +{ + const char test [42; /* { dg-error "22: expected ']' before ';' token" } */ + /* { dg-begin-multiline-output "" } + const char test [42; + ^ + ] + { dg-end-multiline-output "" } */ +} + +int missing_semicolon (void) +{ + return 42 /* { dg-error "expected ';'" } */ +} +/* { dg-begin-multiline-output "" } + return 42 + ^ + ; + } + ~ + { dg-end-multiline-output "" } */ + + +int missing_colon_in_switch (int val) +{ + switch (val) + { + case 42 /* { dg-error "expected ':' before 'return'" } */ + return 42; + /* { dg-begin-multiline-output "" } + case 42 + ^ + : + return 42; + ~~~~~~ + { dg-end-multiline-output "" } */ + + default: + return val; + } +} diff --git a/gcc/testsuite/g++.dg/opt/pr70100.C b/gcc/testsuite/g++.dg/opt/pr70100.C new file mode 100644 index 00000000000..3f612cba3fb --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr70100.C @@ -0,0 +1,21 @@ +// PR middle-end/70100 +// { dg-do compile { target c++11 } } +// { dg-options "-O0" } + +void +bar (int) +{ +} + +template <typename ... Args> +void +foo (Args && ... args) +{ + [&] { [&] { bar(args...); }; }; +} + +int +main () +{ + foo (2); +} diff --git a/gcc/testsuite/g++.dg/opt/pr82159-2.C b/gcc/testsuite/g++.dg/opt/pr82159-2.C new file mode 100644 index 00000000000..f153c29ddac --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr82159-2.C @@ -0,0 +1,65 @@ +// PR c++/82159 +// { dg-do compile } +// { dg-options "" } + +template <typename T> struct D { T e; }; +struct F : D<int[0]> { + F(const F &); +}; +struct G : F { + template <class T> G operator-(T); +}; +template <class T> struct I { + typedef typename T::template J<I> ak; +}; +template <class T> struct K { typename I<T>::ak an; }; +struct H { + G l; +}; +struct C { + ~C(); +}; +template <class T> struct M : T { + template <typename U, typename V> M(U, V); + H h; + virtual void foo() { T::bar(&h); } +}; +template <int, typename> class A; +template <class> struct B { + typedef int BT; + struct BC {}; + template <class T> struct BD { + G g; + BD(BT, T n) : g(n.l - 0) {} + }; + B(BT, BC); +}; +template <typename> struct O; +template <int T, typename U> +struct O<B<A<T, U> > > : public B<A<T, U> >::BC {}; +struct L : B<A<2, double> > { + struct P : C { + void bar(H *x) { + BT a; + BD<H>(a, *x); + } + }; + template <typename U, typename V> L(U x, V n) : B(x, n) {} + int ll; + virtual int baz() { M<P>(this, ll); } +}; +template <typename> class Q { + O<B<A<2, double> > > q; + virtual L baz() { L(0, q); } +}; +template <template <class> class T> struct R { + R() { T<int>(); } +}; +struct S { + template <class> class J : R<Q> {}; +}; +void foo() { K<S> c; } + +int main() { + return 0; +} diff --git a/gcc/testsuite/g++.dg/other/do1.C b/gcc/testsuite/g++.dg/other/do1.C index b3a9daf9056..db65e7de301 100644 --- a/gcc/testsuite/g++.dg/other/do1.C +++ b/gcc/testsuite/g++.dg/other/do1.C @@ -7,7 +7,7 @@ void init () { - do { } while (0) - obj = 0; // { dg-error "expected|not declared" } + do { } while (0) // { dg-error "expected ';'" } + obj = 0; // { dg-error "not declared" } } diff --git a/gcc/testsuite/g++.dg/other/pr53574.C b/gcc/testsuite/g++.dg/other/pr53574.C new file mode 100644 index 00000000000..cc899a552c8 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr53574.C @@ -0,0 +1,48 @@ +// PR c++/53574 +// { dg-do compile { target c++11 } } +// { dg-options "-fstack-usage" } + +template <typename> struct A { typedef int type; }; +struct B { + typedef __SIZE_TYPE__ H; +}; +template <typename> class allocator : B {}; +template <typename _Alloc> struct C { + template <typename T> + static typename T::H foo(T *); + typedef decltype(foo((_Alloc *)0)) H; + template <typename U> + static typename A<H>::type bar(U) { return typename A<H>::type (); } + static int baz(_Alloc p1) { bar(p1); return 0; } +}; +template <typename _Alloc> struct I : C<_Alloc> {}; +template <typename, typename> struct J { + typedef I<allocator<int>> K; + K k; +}; +struct D : J<int, allocator<int>> { + void fn(int, int) { + K m; + I<K>::baz(m); + } +}; +template <class Ch, class = int, class = int> struct F { + F(); + F(const Ch *); + F test(); + D d; +}; +int l; +struct G { + G(F<char>); +}; +char n; +template <class Ch, class Tr, class Alloc> F<Ch, Tr, Alloc>::F(const Ch *) { + test(); +} +template <class Ch, class Tr, class Alloc> +F<Ch, Tr, Alloc> F<Ch, Tr, Alloc>::test() { + d.fn(l, 0); + return F<Ch, Tr, Alloc> (); +} +G fn1() { return G(&n); } diff --git a/gcc/testsuite/g++.dg/other/pr68252.C b/gcc/testsuite/g++.dg/other/pr68252.C new file mode 100644 index 00000000000..5460d819780 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr68252.C @@ -0,0 +1,5 @@ +// PR c++/68252 + +struct Test { + static const int foo = (1 << sizeof (int)) * -3; +}; diff --git a/gcc/testsuite/g++.dg/parse/error11.C b/gcc/testsuite/g++.dg/parse/error11.C index d118c19deb8..1a49d6edb12 100644 --- a/gcc/testsuite/g++.dg/parse/error11.C +++ b/gcc/testsuite/g++.dg/parse/error11.C @@ -52,7 +52,7 @@ void func(void) Foo[:B> k1; // { dg-bogus "cannot begin|alternate spelling" "smart error should not be triggered here" } // { dg-error "6:missing template arguments before" "template" { target *-*-* } 51 } // { dg-error "9:expected primary-expression before ':' token" "primary" { target *-*-* } 51 } -// { dg-error "9:expected '\]' before ':' token" "backslash" { target *-*-* } 51 } +// { dg-error "8:expected '\]' before ':' token" "backslash" { target *-*-* } 51 } // { dg-error "6:missing template arguments before" "template" { target *-*-* } 52 } // { dg-error "7:expected primary-expression before ':' token" "primary" { target *-*-* } 52 } // { dg-error "7:expected '\]' before ':' token" "backslash" { target *-*-* } 52 } diff --git a/gcc/testsuite/g++.dg/parse/pragma2.C b/gcc/testsuite/g++.dg/parse/pragma2.C index 3dc5fc17788..c5616ff74f5 100644 --- a/gcc/testsuite/g++.dg/parse/pragma2.C +++ b/gcc/testsuite/g++.dg/parse/pragma2.C @@ -4,5 +4,5 @@ // does not. int f(int x, #pragma interface // { dg-error "not allowed here" } - // { dg-bogus "expected identifier" "" { xfail *-*-* } .-1 } - int y); + // The parser gets confused and issues an error on the next line. + int y); // { dg-bogus "" "" { xfail *-*-* } } diff --git a/gcc/testsuite/g++.dg/template/bitfield4.C b/gcc/testsuite/g++.dg/template/bitfield4.C new file mode 100644 index 00000000000..4927b7ab144 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/bitfield4.C @@ -0,0 +1,6 @@ +// PR c++/82357 + +template <typename> struct A { + A() { x |= 0; } + int x : 8; +}; diff --git a/gcc/testsuite/g++.dg/template/cast4.C b/gcc/testsuite/g++.dg/template/cast4.C new file mode 100644 index 00000000000..2f46c7189eb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/cast4.C @@ -0,0 +1,4 @@ +template <class T> void f() +{ + static_cast<int&>(42); // { dg-error "static_cast" } +} diff --git a/gcc/testsuite/g++.dg/template/crash108.C b/gcc/testsuite/g++.dg/template/crash108.C index 221d80ee5f1..9bcabc6009b 100644 --- a/gcc/testsuite/g++.dg/template/crash108.C +++ b/gcc/testsuite/g++.dg/template/crash108.C @@ -1,5 +1,5 @@ // PR c++/50861 -template<class T> struct A {A(int b=k(0));}; // { dg-error "parameter|arguments" } +template<class T> struct A {A(int b=k(0));}; // { dg-error "parameter|argument" } void f(int k){A<int> a;} // // { dg-message "declared" } // { dg-message "note" "note" { target *-*-* } 3 } diff --git a/gcc/testsuite/g++.dg/template/crash128.C b/gcc/testsuite/g++.dg/template/crash128.C new file mode 100644 index 00000000000..2682e3dc3ce --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash128.C @@ -0,0 +1,19 @@ +// PR c++/54090 + +template <int n> +struct X { + + template <int N, bool = (n >= N), typename T = void> struct Y; + + template <int N, typename T> + struct Y<N, true, T> {}; + + static const int M = n / 2; + + template <typename T> + struct Y<X::M, true, T> {}; +}; + +void foo() { + X<10>::Y<10/2> y; +} diff --git a/gcc/testsuite/g++.dg/template/error11.C b/gcc/testsuite/g++.dg/template/error11.C index 3a469fd1a8c..16402988a87 100644 --- a/gcc/testsuite/g++.dg/template/error11.C +++ b/gcc/testsuite/g++.dg/template/error11.C @@ -1,4 +1,4 @@ // PR c++/12132 inline template <int> void foo () {} // { dg-error "<" } -void abort (); // { dg-error ";" } +void abort (); // { dg-error ";" "" { target *-*-* } .-1 } diff --git a/gcc/testsuite/g++.dg/template/extern-c.C b/gcc/testsuite/g++.dg/template/extern-c.C new file mode 100644 index 00000000000..c0dd7cb66d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/extern-c.C @@ -0,0 +1,66 @@ +template <typename T> void specializable (T); + +/* Invalid template: within "extern C". */ + +extern "C" { // { dg-message "1: 'extern .C.' linkage started here" } + +template <typename T> // { dg-error "template with C linkage" } +void within_extern_c_braces (void); + +} + +/* Valid template: not within "extern C". */ + +template <typename T> +void not_within_extern_c (void); + + +/* Invalid specialization: within "extern C". */ + +extern "C" { // { dg-message "1: 'extern .C.' linkage started here" } + +template <> // { dg-error "template specialization with C linkage" } +void specializable (int); + +} + + +/* Valid specialization: not within "extern C". */ +template <> +void specializable (char); + + +/* Example of extern C without braces. */ + +extern "C" template <typename T> // { dg-line open_extern_c_no_braces } +void within_extern_c_no_braces (void); +// { dg-error "12: template with C linkage" "" { target *-*-* } open_extern_c_no_braces } +// { dg-message "1: 'extern .C.' linkage started here" "" { target *-*-* } open_extern_c_no_braces } + + +/* Nested extern "C" specifications. + We should report within the innermost extern "C" that's still open. */ + +extern "C" { + extern "C" { // { dg-line middle_open_extern_c } + extern "C" { + } + + template <typename T> // { dg-error "template with C linkage" } + void within_nested_extern_c (void); + // { dg-message "3: 'extern .C.' linkage started here" "" { target *-*-* } middle_open_extern_c } + + extern "C++" { + /* Valid template: within extern "C++". */ + template <typename T> + void within_nested_extern_cpp (void); + + extern "C" { // { dg-line last_open_extern_c } + /* Invalid template: within "extern C". */ + template <typename T> // { dg-error "template with C linkage" } + void within_extern_c_within_extern_cpp (void); + // { dg-message "7: 'extern .C.' linkage started here" "" { target *-*-* } last_open_extern_c } + } + } + } +} diff --git a/gcc/testsuite/g++.dg/ubsan/pr82353-2-aux.cc b/gcc/testsuite/g++.dg/ubsan/pr82353-2-aux.cc new file mode 100644 index 00000000000..75d466b39bb --- /dev/null +++ b/gcc/testsuite/g++.dg/ubsan/pr82353-2-aux.cc @@ -0,0 +1,32 @@ +// PR sanitizer/82353 + +#include "pr82353-2.h" + +B a; +E b; +B C::c0; +unsigned D::d0; + +void +foo () +{ + a.b1 = p.f2.e2.b1 = 5; +} + +void +bar () +{ + int c = p.f2.e4.d1.a0 - -~p.f4 * 89; + q.c0.b0 = i > g * a.b0 * h - k % a.b1; + if ((~(m * j) && -~p.f4 * 90284000534361) % ~m * j) + b.e2.b0 << l << f; + o = -~p.f4 * 89; + int d = p.f4; + if (b.e2.b0) + b.e2.b1 = c; + bool e = ~-~p.f4; + a.b1 % e; + if (k / p.f2.e2.b1) + b.e4.d0 = g * a.b0 * h; + n = j; +} diff --git a/gcc/testsuite/g++.dg/ubsan/pr82353-2.C b/gcc/testsuite/g++.dg/ubsan/pr82353-2.C new file mode 100644 index 00000000000..31a35ac3a02 --- /dev/null +++ b/gcc/testsuite/g++.dg/ubsan/pr82353-2.C @@ -0,0 +1,20 @@ +// PR sanitizer/82353 +// { dg-do run } +// { dg-options "-fsanitize=undefined -fno-sanitize-recover=undefined -std=c++11 -O2 -w" } +// { dg-additional-sources "pr82353-2-aux.cc" } + +#include "pr82353-2.h" + +unsigned long f, g; +bool h, k, j, i; +unsigned char l, m; +short n; +unsigned o; +F p; + +int +main () +{ + foo (); + bar (); +} diff --git a/gcc/testsuite/g++.dg/ubsan/pr82353-2.h b/gcc/testsuite/g++.dg/ubsan/pr82353-2.h new file mode 100644 index 00000000000..4693d2299f2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ubsan/pr82353-2.h @@ -0,0 +1,31 @@ +extern unsigned long f, g; +extern bool h, i, j, k; +extern unsigned char l, m; +extern short n; +extern unsigned o; +struct B { + short b0 : 27; + long b1 : 10; +}; +struct A { + int a0 : 5; +}; +struct C { + static B c0; +}; +struct D { + static unsigned d0; + A d1; +}; +struct E { + B e2; + D e4; +}; +struct F { + E f2; + short f4; +}; +extern F p; +extern C q; +void foo (); +void bar (); diff --git a/gcc/testsuite/g++.dg/ubsan/pr82353.C b/gcc/testsuite/g++.dg/ubsan/pr82353.C new file mode 100644 index 00000000000..a967cefa9cb --- /dev/null +++ b/gcc/testsuite/g++.dg/ubsan/pr82353.C @@ -0,0 +1,60 @@ +/* { dg-do compile { target { { i?86-*-* x86_64-*-* } && lp64 } } } */ +/* { dg-options "-O2 -std=c++11 -fsanitize=undefined -fno-sanitize-recover=undefined -w -fdump-rtl-reload" } */ + +extern unsigned long tf_2_var_1, tf_2_var_21; +extern bool tf_2_var_2, tf_2_var_24, tf_2_var_6, tf_2_var_5; +extern unsigned char tf_2_var_16, tf_2_var_31; +extern short tf_2_var_69; +extern unsigned tf_2_var_233; +struct tf_2_struct_1 { + short member_1_0 : 27; + long member_1_1 : 10; +}; +struct a { + int member_2_0 : 5; +}; +struct tf_2_struct_3 { + static tf_2_struct_1 member_3_0; +}; +struct tf_2_struct_4 { + static unsigned member_4_0; + a member_4_1; +}; +struct tf_2_struct_5 { + tf_2_struct_1 member_5_2; + tf_2_struct_4 member_5_4; +}; +struct tf_2_struct_6 { + tf_2_struct_5 member_6_2; + short member_6_4; +} extern tf_2_struct_obj_2; +extern tf_2_struct_3 tf_2_struct_obj_8; +tf_2_struct_1 a; +tf_2_struct_5 b; +tf_2_struct_1 tf_2_struct_3::member_3_0; +unsigned tf_2_struct_4::member_4_0; +void tf_2_init() { + a.member_1_1 = tf_2_struct_obj_2.member_6_2.member_5_2.member_1_1 = 5; +} +void tf_2_foo() { + int c = tf_2_struct_obj_2.member_6_2.member_5_4.member_4_1.member_2_0 - + -~tf_2_struct_obj_2.member_6_4 * char(90284000534361); + tf_2_struct_obj_8.member_3_0.member_1_0 = + tf_2_var_24 > + tf_2_var_21 * a.member_1_0 * tf_2_var_2 - tf_2_var_5 % a.member_1_1; + if ((~(tf_2_var_31 * tf_2_var_6) && + -~tf_2_struct_obj_2.member_6_4 * 90284000534361) % + ~tf_2_var_31 * tf_2_var_6) + b.member_5_2.member_1_0 << tf_2_var_16 << tf_2_var_1; + tf_2_var_233 = -~tf_2_struct_obj_2.member_6_4 * char(90284000534361); + int d(tf_2_struct_obj_2.member_6_4); + if (b.member_5_2.member_1_0) + b.member_5_2.member_1_1 = c; + bool e(~-~tf_2_struct_obj_2.member_6_4); + a.member_1_1 % e; + if (tf_2_var_5 / tf_2_struct_obj_2.member_6_2.member_5_2.member_1_1) + b.member_5_4.member_4_0 = tf_2_var_21 * a.member_1_0 * tf_2_var_2; + tf_2_var_69 = tf_2_var_6; +} + +/* { dg-final { scan-rtl-dump-not "Inserting rematerialization insn" "reload" } } */ |