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
This commit is contained in:
parent
8fccb0a6b6
commit
826eccc6fd
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -25,6 +25,7 @@ struct Baz
|
||||
Baz(Bar &a):a(a) { }
|
||||
};
|
||||
|
||||
#pragma GCC diagnostic ignored "-Wreturn-type"
|
||||
struct Zonk
|
||||
{
|
||||
Baz baz;
|
||||
|
@ -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)
|
||||
|
@ -1,5 +1,6 @@
|
||||
extern "C" double sin (double);
|
||||
typedef double UnaryFunType (double);
|
||||
#pragma GCC diagnostic ignored "-Wreturn-type"
|
||||
class A
|
||||
{
|
||||
public:
|
||||
|
@ -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
|
||||
|
@ -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; }
|
||||
|
@ -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;
|
||||
|
@ -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 *> {
|
||||
|
@ -7,4 +7,4 @@ int f() {
|
||||
if (a == 5)
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
} // { dg-warning "control reaches end of non-void function" }
|
||||
|
@ -1,4 +1,5 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-additional-options "-Wno-return-type" } */
|
||||
|
||||
typedef unsigned int UT_uint32;
|
||||
typedef UT_uint32 PT_DocPosition;
|
||||
|
@ -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 &)
|
||||
{
|
||||
|
@ -1,4 +1,5 @@
|
||||
// { dg-do compile }
|
||||
// { dg-additional-options "-Wno-return-type" }
|
||||
|
||||
typedef __SIZE_TYPE__ size_t;
|
||||
|
||||
|
@ -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" }
|
||||
|
@ -16,4 +16,4 @@ bool IsValidPath( char const * filename )
|
||||
if ( *run )
|
||||
++run;
|
||||
}
|
||||
}
|
||||
} // { dg-warning "control reaches end of non-void function" }
|
||||
|
@ -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
|
||||
|
@ -1,4 +1,5 @@
|
||||
// { dg-do compile }
|
||||
// { dg-additional-options "-Wno-return-type" }
|
||||
// Reduced from boost-1.54
|
||||
|
||||
int pow(int, int);
|
||||
|
@ -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;
|
||||
|
@ -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 ()
|
||||
{
|
||||
|
@ -39,4 +39,4 @@ F::m_fn2 ()
|
||||
else
|
||||
D ();
|
||||
A b;
|
||||
}
|
||||
} // { dg-warning "control reaches end of non-void function" }
|
||||
|
@ -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 *, ...)
|
||||
|
@ -11,7 +11,7 @@ struct D {
|
||||
C *m_fn2() {
|
||||
if (a)
|
||||
__builtin_abort();
|
||||
}
|
||||
} // { dg-warning "control reaches end of non-void function" }
|
||||
};
|
||||
D getd();
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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"
|
||||
|
@ -1,5 +1,5 @@
|
||||
// { dg-do compile }
|
||||
// { dg-options "-fsanitize=return" }
|
||||
// { dg-options "-fsanitize=return -Wno-return-type" }
|
||||
|
||||
struct S { S (); ~S (); };
|
||||
|
||||
|
19
gcc/testsuite/g++.dg/warn/pr83045.C
Normal file
19
gcc/testsuite/g++.dg/warn/pr83045.C
Normal file
@ -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" } */
|
@ -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>
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
// { dg-do assemble }
|
||||
// { dg-options "-O1 -fno-inline-functions" }
|
||||
// { dg-options "-O1 -fno-inline-functions -Wno-return-type" }
|
||||
|
||||
struct A
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user