aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2017-11-21 18:40:34 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2017-11-21 18:40:34 +0100
commit826eccc6fd8bebfafa3ac02d9755bb2e59f465b7 (patch)
tree39a19feeb4e8a2c41e98c603252802db36730aeb /gcc
parent8fccb0a6b606aacc1bcb3e02b400c5d6455196cc (diff)
downloadgcc-826eccc6fd8bebfafa3ac02d9755bb2e59f465b7.zip
gcc-826eccc6fd8bebfafa3ac02d9755bb2e59f465b7.tar.gz
gcc-826eccc6fd8bebfafa3ac02d9755bb2e59f465b7.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/testsuite/ChangeLog38
-rw-r--r--gcc/testsuite/c-c++-common/Wlogical-op-2.c1
-rw-r--r--gcc/testsuite/c-c++-common/pr61405.c2
-rw-r--r--gcc/testsuite/g++.dg/debug/pr53466.C2
-rw-r--r--gcc/testsuite/g++.dg/ipa/pr61800.C2
-rw-r--r--gcc/testsuite/g++.dg/ipa/pr63470.C2
-rw-r--r--gcc/testsuite/g++.dg/ipa/pr68672-1.C2
-rw-r--r--gcc/testsuite/g++.dg/lto/20090221_0.C1
-rw-r--r--gcc/testsuite/g++.dg/lto/20091026-1_1.C2
-rw-r--r--gcc/testsuite/g++.dg/lto/pr54625-1_1.C1
-rw-r--r--gcc/testsuite/g++.dg/opt/combine.C2
-rw-r--r--gcc/testsuite/g++.dg/pr49847.C2
-rw-r--r--gcc/testsuite/g++.dg/pr58438.C2
-rw-r--r--gcc/testsuite/g++.dg/pr59445.C2
-rw-r--r--gcc/testsuite/g++.dg/tm/pr60004.C2
-rw-r--r--gcc/testsuite/g++.dg/torture/pr33627.C1
-rw-r--r--gcc/testsuite/g++.dg/torture/pr43257.C2
-rw-r--r--gcc/testsuite/g++.dg/torture/pr52772.C1
-rw-r--r--gcc/testsuite/g++.dg/torture/pr54684.C2
-rw-r--r--gcc/testsuite/g++.dg/torture/pr55740.C2
-rw-r--r--gcc/testsuite/g++.dg/torture/pr56694.C2
-rw-r--r--gcc/testsuite/g++.dg/torture/pr58369.C1
-rw-r--r--gcc/testsuite/g++.dg/torture/pr59265.C2
-rw-r--r--gcc/testsuite/g++.dg/torture/pr60648.C2
-rw-r--r--gcc/testsuite/g++.dg/torture/pr64280.C2
-rw-r--r--gcc/testsuite/g++.dg/torture/pr64669.C2
-rw-r--r--gcc/testsuite/g++.dg/torture/pr68470.C2
-rw-r--r--gcc/testsuite/g++.dg/torture/pr71281.C2
-rw-r--r--gcc/testsuite/g++.dg/torture/predcom-1.C2
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/ssa-dse-2.C2
-rw-r--r--gcc/testsuite/g++.dg/ubsan/return-3.C2
-rw-r--r--gcc/testsuite/g++.dg/warn/pr83045.C19
-rw-r--r--gcc/testsuite/g++.old-deja/g++.eh/catch13.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.eh/crash1.C2
-rw-r--r--gcc/tree-cfg.c38
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;
}