From: Jakub Jelinek Date: Tue, 21 Nov 2017 17:40:34 +0000 (+0100) Subject: re PR c++/83045 (-Wreturn-type regression in C++) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=826eccc6fd8bebfafa3ac02d9755bb2e59f465b7;p=gcc.git re PR c++/83045 (-Wreturn-type regression in C++) 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. * 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. From-SVN: r255018 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 35f06c5d3b9..d631cb694d1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,7 +1,14 @@ +2017-11-21 Jakub Jelinek + + 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 - * 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 Jakub Jelinek diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 030435bad3f..eb333c1251a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,41 @@ +2017-11-21 Jakub Jelinek + + 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 * 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 6360ef98090..5d8a3fcd91d 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 9c05a84764a..f186926617f 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 ecd88bcd187..0ab90d478d4 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 3bc796f9903..e5336f2f120 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 ffef0a284de..f2dc111c6b9 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 fddabe17a43..4e30d66baae 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 5bf031906c7..ccbe4533e28 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 28816100e29..35ca21859ba 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 2d0d5bfbadf..3d5f05e361d 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 a1325a0dca9..08aa9900b18 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 b047713c309..42bd5a18159 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 4c62cb26ce8..820f0700806 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 99d6df25195..660e4aa2e35 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 struct A; template struct A<_Tp *> { diff --git a/gcc/testsuite/g++.dg/tm/pr60004.C b/gcc/testsuite/g++.dg/tm/pr60004.C index b8c2c0e032b..9034336da30 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 9265bd95f05..c17453641d6 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 a3e75574adb..fab5f09c31a 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 0109f137676..bc5d3a1ddf5 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 4934011e45f..d13dd8f6f74 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 cdd84254399..9597c28f965 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 d3de0510169..774bac4c615 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 9284e2ca768..7ae06ad56fe 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 880c454da10..d48efe59395 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 48cf0afb52b..5e391e72e35 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 e756e02eca1..5c569e864b4 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 a4e7d3a8a28..c43b3add18e 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 5dd558d15d2..ea5701aa151 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 7d429a95b1b..7c68b56015a 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>> c; diff --git a/gcc/testsuite/g++.dg/torture/predcom-1.C b/gcc/testsuite/g++.dg/torture/predcom-1.C index 9e9a4b38cfa..ff68fd0e9af 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 913df222374..ca7e18f66a9 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 95f345deb32..ee90e59ab2b 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 00000000000..3709d363f1b --- /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 2e0fdc8e7b5..90c533e5e4a 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 diff --git a/gcc/testsuite/g++.old-deja/g++.eh/crash1.C b/gcc/testsuite/g++.old-deja/g++.eh/crash1.C index a4440c7bd95..e4c83700c98 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 491ac059c59..bdcb04f8c4a 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; }