diff options
Diffstat (limited to 'gcc')
36 files changed, 136 insertions, 28 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 35f06c5..d631cb6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,7 +1,14 @@ +2017-11-21 Jakub Jelinek <jakub@redhat.com> + + PR c++/83045 + * tree-cfg.c (pass_warn_function_return::execute): Formatting fix. + Also warn if seen __builtin_unreachable () call with BUILTINS_LOCATION. + Use LOCATION_LOCUS when comparing against UNKNOWN_LOCATION. + 2017-11-21 Martin Liska <mliska@suse.cz> - * tree-inline.c (expand_call_inline): - Remove not needed xstrdup_for_dump. + * tree-inline.c (expand_call_inline): Remove not needed + xstrdup_for_dump. 2017-11-21 James Cowgill <James.Cowgill@imgtec.com> Jakub Jelinek <jakub@redhat.com> diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 030435b..eb333c1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,41 @@ +2017-11-21 Jakub Jelinek <jakub@redhat.com> + + PR c++/83045 + * c-c++-common/pr61405.c (fn0, fn1): Add return stmts. + * c-c++-common/Wlogical-op-2.c (fn): Likewise. + * g++.dg/debug/pr53466.C: Add -Wno-return-type to dg-options. + * g++.dg/opt/combine.C: Likewise. + * g++.dg/ubsan/return-3.C: Likewise. + * g++.dg/pr59445.C: Likewise. + * g++.dg/pr49847.C: Likewise. + * g++.dg/ipa/pr61800.C: Likewise. + * g++.dg/ipa/pr63470.C: Likewise. + * g++.dg/ipa/pr68672-1.C: Likewise. + * g++.dg/pr58438.C: Likewise. + * g++.dg/torture/pr59265.C: Likewise. + * g++.dg/tree-ssa/ssa-dse-2.C: Likewise. + * g++.old-deja/g++.eh/catch13.C: Likewise. + * g++.old-deja/g++.eh/crash1.C: Likewise. + * g++.dg/tm/pr60004.C: Expect -Wreturn-type warning. + * g++.dg/torture/pr55740.C: Likewise. + * g++.dg/torture/pr43257.C: Likewise. + * g++.dg/torture/pr64280.C: Likewise. + * g++.dg/torture/pr54684.C: Likewise. + * g++.dg/torture/pr56694.C: Likewise. + * g++.dg/torture/pr68470.C: Likewise. + * g++.dg/torture/pr60648.C: Likewise. + * g++.dg/torture/pr71281.C: Likewise. + * g++.dg/torture/pr52772.C: Add -Wno-return-type dg-additional-options. + * g++.dg/torture/pr64669.C: Likewise. + * g++.dg/torture/pr58369.C: Likewise. + * g++.dg/torture/pr33627.C: Likewise. + * g++.dg/torture/predcom-1.C: Add + #pragma GCC diagnostic ignored "-Wreturn-type". + * g++.dg/lto/20090221_0.C: Likewise. + * g++.dg/lto/20091026-1_1.C: Likewise. + * g++.dg/lto/pr54625-1_1.C: Likewise. + * g++.dg/warn/pr83045.C: New test. + 2017-11-21 Uros Bizjak <ubizjak@gmail.com> * gcc.target/i386/movbe-1.c: Update scan string for movbe diff --git a/gcc/testsuite/c-c++-common/Wlogical-op-2.c b/gcc/testsuite/c-c++-common/Wlogical-op-2.c index 6360ef9..5d8a3fc 100644 --- a/gcc/testsuite/c-c++-common/Wlogical-op-2.c +++ b/gcc/testsuite/c-c++-common/Wlogical-op-2.c @@ -9,4 +9,5 @@ fn (int a, int b) return a; if ((a + 1) || (a + 1)) /* { dg-warning "logical .or. of equal expressions" } */ return b; + return -1; } diff --git a/gcc/testsuite/c-c++-common/pr61405.c b/gcc/testsuite/c-c++-common/pr61405.c index 9c05a84..f186926 100644 --- a/gcc/testsuite/c-c++-common/pr61405.c +++ b/gcc/testsuite/c-c++-common/pr61405.c @@ -16,6 +16,7 @@ fn0 (struct S *s) case B: return 2; } + return 3; } int @@ -28,4 +29,5 @@ fn1 (TS *s) case B: return 2; } + return 3; } diff --git a/gcc/testsuite/g++.dg/debug/pr53466.C b/gcc/testsuite/g++.dg/debug/pr53466.C index ecd88bc..0ab90d4 100644 --- a/gcc/testsuite/g++.dg/debug/pr53466.C +++ b/gcc/testsuite/g++.dg/debug/pr53466.C @@ -1,5 +1,5 @@ // { dg-do compile } -// { dg-options "-foptimize-sibling-calls -fcompare-debug" } +// { dg-options "-foptimize-sibling-calls -fcompare-debug -Wno-return-type" } typedef union gimple_statement_d *gimple; typedef gimple gimple_seq_node; diff --git a/gcc/testsuite/g++.dg/ipa/pr61800.C b/gcc/testsuite/g++.dg/ipa/pr61800.C index 3bc796f..e5336f2 100644 --- a/gcc/testsuite/g++.dg/ipa/pr61800.C +++ b/gcc/testsuite/g++.dg/ipa/pr61800.C @@ -1,7 +1,7 @@ /* PR ipa/61800 */ /* { dg-do compile } */ /* { dg-require-visibility "" } */ -/* { dg-options "-O2" } */ +/* { dg-options "-O2 -Wno-return-type" } */ #pragma GCC visibility push(hidden) class A diff --git a/gcc/testsuite/g++.dg/ipa/pr63470.C b/gcc/testsuite/g++.dg/ipa/pr63470.C index ffef0a2..f2dc111 100644 --- a/gcc/testsuite/g++.dg/ipa/pr63470.C +++ b/gcc/testsuite/g++.dg/ipa/pr63470.C @@ -1,6 +1,6 @@ /* PR ipa/63470.C */ /* { dg-do compile } */ -/* { dg-options "-O2 -finline-functions" } */ +/* { dg-options "-O2 -finline-functions -Wno-return-type" } */ class A { diff --git a/gcc/testsuite/g++.dg/ipa/pr68672-1.C b/gcc/testsuite/g++.dg/ipa/pr68672-1.C index fddabe1..4e30d66 100644 --- a/gcc/testsuite/g++.dg/ipa/pr68672-1.C +++ b/gcc/testsuite/g++.dg/ipa/pr68672-1.C @@ -1,6 +1,6 @@ // PR ipa/68672 // { dg-do compile } -// { dg-options "-O -finline-small-functions -fpartial-inlining --param=partial-inlining-entry-probability=100" } +// { dg-options "-O -finline-small-functions -fpartial-inlining --param=partial-inlining-entry-probability=100 -Wno-return-type" } void f2 (void *); void *a; diff --git a/gcc/testsuite/g++.dg/lto/20090221_0.C b/gcc/testsuite/g++.dg/lto/20090221_0.C index 5bf0319..ccbe453 100644 --- a/gcc/testsuite/g++.dg/lto/20090221_0.C +++ b/gcc/testsuite/g++.dg/lto/20090221_0.C @@ -25,6 +25,7 @@ struct Baz Baz(Bar &a):a(a) { } }; +#pragma GCC diagnostic ignored "-Wreturn-type" struct Zonk { Baz baz; diff --git a/gcc/testsuite/g++.dg/lto/20091026-1_1.C b/gcc/testsuite/g++.dg/lto/20091026-1_1.C index 2881610..35ca218 100644 --- a/gcc/testsuite/g++.dg/lto/20091026-1_1.C +++ b/gcc/testsuite/g++.dg/lto/20091026-1_1.C @@ -1,4 +1,6 @@ #include "20091026-1_a.h" + +#pragma GCC diagnostic ignored "-Wreturn-type" extern cHead networks; class cNetworkType; inline cNetworkType *findNetwork(const char *s) diff --git a/gcc/testsuite/g++.dg/lto/pr54625-1_1.C b/gcc/testsuite/g++.dg/lto/pr54625-1_1.C index 2d0d5bf..3d5f05e 100644 --- a/gcc/testsuite/g++.dg/lto/pr54625-1_1.C +++ b/gcc/testsuite/g++.dg/lto/pr54625-1_1.C @@ -1,5 +1,6 @@ extern "C" double sin (double); typedef double UnaryFunType (double); +#pragma GCC diagnostic ignored "-Wreturn-type" class A { public: diff --git a/gcc/testsuite/g++.dg/opt/combine.C b/gcc/testsuite/g++.dg/opt/combine.C index a1325a0..08aa990 100644 --- a/gcc/testsuite/g++.dg/opt/combine.C +++ b/gcc/testsuite/g++.dg/opt/combine.C @@ -1,5 +1,5 @@ // { dg-do assemble { target fpic } } -// { dg-options "-O2 -fweb -fPIC -fvisibility=hidden" } +// { dg-options "-O2 -fweb -fPIC -fvisibility=hidden -Wno-return-type" } // { dg-require-visibility "" } class QBasicAtomicInt diff --git a/gcc/testsuite/g++.dg/pr49847.C b/gcc/testsuite/g++.dg/pr49847.C index b047713..42bd5a1 100644 --- a/gcc/testsuite/g++.dg/pr49847.C +++ b/gcc/testsuite/g++.dg/pr49847.C @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O -fnon-call-exceptions" } */ +/* { dg-options "-O -fnon-call-exceptions -Wno-return-type" } */ int f (float g) { try { return g >= 0; } diff --git a/gcc/testsuite/g++.dg/pr58438.C b/gcc/testsuite/g++.dg/pr58438.C index 4c62cb2..820f070 100644 --- a/gcc/testsuite/g++.dg/pr58438.C +++ b/gcc/testsuite/g++.dg/pr58438.C @@ -1,5 +1,5 @@ /* { dg-do compile { target i?86-*-* x86_64-*-* } } */ -/* { dg-options "-march=amdfam10 -O3 -fprofile-generate" } */ +/* { dg-options "-march=amdfam10 -O3 -fprofile-generate -Wno-return-type" } */ enum gimple_code {}; struct A { gimple_code code; diff --git a/gcc/testsuite/g++.dg/pr59445.C b/gcc/testsuite/g++.dg/pr59445.C index 99d6df2..660e4aa 100644 --- a/gcc/testsuite/g++.dg/pr59445.C +++ b/gcc/testsuite/g++.dg/pr59445.C @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2" } */ +/* { dg-options "-O2 -Wno-return-type" } */ template <typename _Iterator> struct A; template <typename _Tp> struct A<_Tp *> { diff --git a/gcc/testsuite/g++.dg/tm/pr60004.C b/gcc/testsuite/g++.dg/tm/pr60004.C index b8c2c0e..9034336 100644 --- a/gcc/testsuite/g++.dg/tm/pr60004.C +++ b/gcc/testsuite/g++.dg/tm/pr60004.C @@ -7,4 +7,4 @@ int f() { if (a == 5) return 1; } -} +} // { dg-warning "control reaches end of non-void function" } diff --git a/gcc/testsuite/g++.dg/torture/pr33627.C b/gcc/testsuite/g++.dg/torture/pr33627.C index 9265bd9..c174536 100644 --- a/gcc/testsuite/g++.dg/torture/pr33627.C +++ b/gcc/testsuite/g++.dg/torture/pr33627.C @@ -1,4 +1,5 @@ /* { dg-do compile } */ +/* { dg-additional-options "-Wno-return-type" } */ typedef unsigned int UT_uint32; typedef UT_uint32 PT_DocPosition; diff --git a/gcc/testsuite/g++.dg/torture/pr43257.C b/gcc/testsuite/g++.dg/torture/pr43257.C index a3e7557..fab5f09 100644 --- a/gcc/testsuite/g++.dg/torture/pr43257.C +++ b/gcc/testsuite/g++.dg/torture/pr43257.C @@ -7,7 +7,7 @@ static void *func (int n) { void *p; if (p == 0) throw ::A (); -} +} // { dg-warning "control reaches end of non-void function" } static void *func (int n, B const &) { diff --git a/gcc/testsuite/g++.dg/torture/pr52772.C b/gcc/testsuite/g++.dg/torture/pr52772.C index 0109f13..bc5d3a1 100644 --- a/gcc/testsuite/g++.dg/torture/pr52772.C +++ b/gcc/testsuite/g++.dg/torture/pr52772.C @@ -1,4 +1,5 @@ // { dg-do compile } +// { dg-additional-options "-Wno-return-type" } typedef __SIZE_TYPE__ size_t; diff --git a/gcc/testsuite/g++.dg/torture/pr54684.C b/gcc/testsuite/g++.dg/torture/pr54684.C index 4934011..d13dd8f 100644 --- a/gcc/testsuite/g++.dg/torture/pr54684.C +++ b/gcc/testsuite/g++.dg/torture/pr54684.C @@ -60,4 +60,4 @@ bool visit_ref_for_mod_analysis (gimple stmt __attribute__ ((__unused__)), ((void)(__builtin_expect(!(index >= 0), 0) ? __builtin_unreachable(), 0 : 0)); ipa_set_param_used (info, index, true); } -} +} // { dg-warning "control reaches end of non-void function" } diff --git a/gcc/testsuite/g++.dg/torture/pr55740.C b/gcc/testsuite/g++.dg/torture/pr55740.C index cdd8425..9597c28 100644 --- a/gcc/testsuite/g++.dg/torture/pr55740.C +++ b/gcc/testsuite/g++.dg/torture/pr55740.C @@ -16,4 +16,4 @@ bool IsValidPath( char const * filename ) if ( *run ) ++run; } -} +} // { dg-warning "control reaches end of non-void function" } diff --git a/gcc/testsuite/g++.dg/torture/pr56694.C b/gcc/testsuite/g++.dg/torture/pr56694.C index d3de051..774bac4 100644 --- a/gcc/testsuite/g++.dg/torture/pr56694.C +++ b/gcc/testsuite/g++.dg/torture/pr56694.C @@ -20,7 +20,7 @@ inline GVector& GVector::operator+= (const GVector& v) if (m_num != v.m_num) throw GException::vector_mismatch(m_num, v.m_num); for (int i = 0; i < m_num; ++i) m_data[i] += v.m_data[i]; -}; +}; // { dg-warning "control reaches end of non-void function" } void eval(GVector* m_gradient, GVector* vect_cpy_grad, int n) { #pragma omp sections diff --git a/gcc/testsuite/g++.dg/torture/pr58369.C b/gcc/testsuite/g++.dg/torture/pr58369.C index 9284e2c..7ae06ad 100644 --- a/gcc/testsuite/g++.dg/torture/pr58369.C +++ b/gcc/testsuite/g++.dg/torture/pr58369.C @@ -1,4 +1,5 @@ // { dg-do compile } +// { dg-additional-options "-Wno-return-type" } // Reduced from boost-1.54 int pow(int, int); diff --git a/gcc/testsuite/g++.dg/torture/pr59265.C b/gcc/testsuite/g++.dg/torture/pr59265.C index 880c454..d48efe5 100644 --- a/gcc/testsuite/g++.dg/torture/pr59265.C +++ b/gcc/testsuite/g++.dg/torture/pr59265.C @@ -1,5 +1,5 @@ // { dg-do compile } -// { dg-options "-fprofile-use -std=gnu++11" } +// { dg-options "-fprofile-use -std=gnu++11 -Wno-return-type" } class A { int m_fn1() const; diff --git a/gcc/testsuite/g++.dg/torture/pr60648.C b/gcc/testsuite/g++.dg/torture/pr60648.C index 48cf0af..5e391e7 100644 --- a/gcc/testsuite/g++.dg/torture/pr60648.C +++ b/gcc/testsuite/g++.dg/torture/pr60648.C @@ -51,7 +51,7 @@ inline component fn2 (direction p1) case P: return component (3); } -} +} // { dg-warning "control reaches end of non-void function" } void fn3 () { diff --git a/gcc/testsuite/g++.dg/torture/pr64280.C b/gcc/testsuite/g++.dg/torture/pr64280.C index e756e02..5c569e8 100644 --- a/gcc/testsuite/g++.dg/torture/pr64280.C +++ b/gcc/testsuite/g++.dg/torture/pr64280.C @@ -39,4 +39,4 @@ F::m_fn2 () else D (); A b; -} +} // { dg-warning "control reaches end of non-void function" } diff --git a/gcc/testsuite/g++.dg/torture/pr64669.C b/gcc/testsuite/g++.dg/torture/pr64669.C index a4e7d3a..c43b3ad 100644 --- a/gcc/testsuite/g++.dg/torture/pr64669.C +++ b/gcc/testsuite/g++.dg/torture/pr64669.C @@ -1,3 +1,5 @@ +// { dg-additional-options "-Wno-return-type" } + typedef unsigned int source_location; typedef source_location location_t; extern void error_at (location_t, const char *, ...) diff --git a/gcc/testsuite/g++.dg/torture/pr68470.C b/gcc/testsuite/g++.dg/torture/pr68470.C index 5dd558d..ea5701a 100644 --- a/gcc/testsuite/g++.dg/torture/pr68470.C +++ b/gcc/testsuite/g++.dg/torture/pr68470.C @@ -11,7 +11,7 @@ struct D { C *m_fn2() { if (a) __builtin_abort(); - } + } // { dg-warning "control reaches end of non-void function" } }; D getd(); diff --git a/gcc/testsuite/g++.dg/torture/pr71281.C b/gcc/testsuite/g++.dg/torture/pr71281.C index 7d429a9..7c68b56 100644 --- a/gcc/testsuite/g++.dg/torture/pr71281.C +++ b/gcc/testsuite/g++.dg/torture/pr71281.C @@ -47,7 +47,7 @@ public: reference m_fn3(unsigned){ if (m_fn2()) fn1(); - } + } // { dg-warning "control reaches end of non-void function" } }; H<H<H<unsigned>>> c; diff --git a/gcc/testsuite/g++.dg/torture/predcom-1.C b/gcc/testsuite/g++.dg/torture/predcom-1.C index 9e9a4b3..ff68fd0 100644 --- a/gcc/testsuite/g++.dg/torture/predcom-1.C +++ b/gcc/testsuite/g++.dg/torture/predcom-1.C @@ -1,6 +1,8 @@ /* Test for ICE in predictive commoning with empty loop header block on arm-none-linux-*. */ +#pragma GCC diagnostic ignored "-Wreturn-type" + struct Foo { double *ptr; diff --git a/gcc/testsuite/g++.dg/tree-ssa/ssa-dse-2.C b/gcc/testsuite/g++.dg/tree-ssa/ssa-dse-2.C index 913df22..ca7e18f 100644 --- a/gcc/testsuite/g++.dg/tree-ssa/ssa-dse-2.C +++ b/gcc/testsuite/g++.dg/tree-ssa/ssa-dse-2.C @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-dse2-details" } */ +/* { dg-options "-O2 -fdump-tree-dse2-details -Wno-return-type" } */ typedef __SIZE_TYPE__ size_t; extern "C" diff --git a/gcc/testsuite/g++.dg/ubsan/return-3.C b/gcc/testsuite/g++.dg/ubsan/return-3.C index 95f345d..ee90e59 100644 --- a/gcc/testsuite/g++.dg/ubsan/return-3.C +++ b/gcc/testsuite/g++.dg/ubsan/return-3.C @@ -1,5 +1,5 @@ // { dg-do compile } -// { dg-options "-fsanitize=return" } +// { dg-options "-fsanitize=return -Wno-return-type" } struct S { S (); ~S (); }; diff --git a/gcc/testsuite/g++.dg/warn/pr83045.C b/gcc/testsuite/g++.dg/warn/pr83045.C new file mode 100644 index 0000000..3709d36 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr83045.C @@ -0,0 +1,19 @@ +// PR c++/83045 +// { dg-do compile } +// { dg-options "-Wreturn-type -O2" } + +void foo (void); + +int +bar (int a) +{ + if (a != 0) + foo (); +} /* { dg-warning "no return statement in function returning non-void" } */ + +int +baz (int a) +{ + if (a != 0) + __builtin_abort (); +} /* { dg-warning "control reaches end of non-void function" } */ diff --git a/gcc/testsuite/g++.old-deja/g++.eh/catch13.C b/gcc/testsuite/g++.old-deja/g++.eh/catch13.C index 2e0fdc8..90c533e 100644 --- a/gcc/testsuite/g++.old-deja/g++.eh/catch13.C +++ b/gcc/testsuite/g++.old-deja/g++.eh/catch13.C @@ -1,5 +1,5 @@ // { dg-do assemble } -// { dg-options "-O2" } +// { dg-options "-O2 -Wno-return-type" } // Copyright (C) 2001 Free Software Foundation, Inc. // Contributed by Jakub Jelinek 2 May 2001 <jakub@redhat.com> diff --git a/gcc/testsuite/g++.old-deja/g++.eh/crash1.C b/gcc/testsuite/g++.old-deja/g++.eh/crash1.C index a4440c7..e4c8370 100644 --- a/gcc/testsuite/g++.old-deja/g++.eh/crash1.C +++ b/gcc/testsuite/g++.old-deja/g++.eh/crash1.C @@ -1,5 +1,5 @@ // { dg-do assemble } -// { dg-options "-O1 -fno-inline-functions" } +// { dg-options "-O1 -fno-inline-functions -Wno-return-type" } struct A { diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 491ac05..bdcb04f 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -9049,7 +9049,8 @@ pass_warn_function_return::execute (function *fun) if ((gimple_code (last) == GIMPLE_RETURN || gimple_call_builtin_p (last, BUILT_IN_RETURN)) && location == UNKNOWN_LOCATION - && (location = gimple_location (last)) != UNKNOWN_LOCATION + && ((location = LOCATION_LOCUS (gimple_location (last))) + != UNKNOWN_LOCATION) && !optimize) break; /* When optimizing, replace return stmts in noreturn functions @@ -9075,7 +9076,6 @@ pass_warn_function_return::execute (function *fun) without returning a value. */ else if (warn_return_type > 0 && !TREE_NO_WARNING (fun->decl) - && EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (fun)->preds) > 0 && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fun->decl)))) { FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (fun)->preds) @@ -9087,13 +9087,43 @@ pass_warn_function_return::execute (function *fun) && !gimple_no_warning_p (last)) { location = gimple_location (last); - if (location == UNKNOWN_LOCATION) + if (LOCATION_LOCUS (location) == UNKNOWN_LOCATION) location = fun->function_end_locus; - warning_at (location, OPT_Wreturn_type, "control reaches end of non-void function"); + warning_at (location, OPT_Wreturn_type, + "control reaches end of non-void function"); TREE_NO_WARNING (fun->decl) = 1; break; } } + /* The C++ FE turns fallthrough from the end of non-void function + into __builtin_unreachable () call with BUILTINS_LOCATION. + Recognize those too. */ + basic_block bb; + if (!TREE_NO_WARNING (fun->decl)) + FOR_EACH_BB_FN (bb, fun) + if (EDGE_COUNT (bb->succs) == 0) + { + gimple *last = last_stmt (bb); + if (last + && (LOCATION_LOCUS (gimple_location (last)) + == BUILTINS_LOCATION) + && gimple_call_builtin_p (last, BUILT_IN_UNREACHABLE)) + { + gimple_stmt_iterator gsi = gsi_for_stmt (last); + gsi_prev_nondebug (&gsi); + gimple *prev = gsi_stmt (gsi); + if (prev == NULL) + location = UNKNOWN_LOCATION; + else + location = gimple_location (prev); + if (LOCATION_LOCUS (location) == UNKNOWN_LOCATION) + location = fun->function_end_locus; + warning_at (location, OPT_Wreturn_type, + "control reaches end of non-void function"); + TREE_NO_WARNING (fun->decl) = 1; + break; + } + } } return 0; } |