diff options
-rw-r--r-- | gcc/cp/cp-gimplify.cc | 6 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/Wimplicit-fallthrough-39.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wreturn-6.C | 16 |
3 files changed, 24 insertions, 2 deletions
diff --git a/gcc/cp/cp-gimplify.cc b/gcc/cp/cp-gimplify.cc index b995b4f..4fecd56 100644 --- a/gcc/cp/cp-gimplify.cc +++ b/gcc/cp/cp-gimplify.cc @@ -190,6 +190,12 @@ genericize_if_stmt (tree *stmt_p) } else if (IF_STMT_CONSTEXPR_P (stmt)) stmt = integer_nonzerop (cond) ? then_ : else_; + /* ??? This optimization doesn't seem to belong here, but removing it + causes -Wreturn-type regressions (e.g. 107310). */ + else if (integer_nonzerop (cond) && !TREE_SIDE_EFFECTS (else_)) + stmt = then_; + else if (integer_zerop (cond) && !TREE_SIDE_EFFECTS (then_)) + stmt = else_; else stmt = build3 (COND_EXPR, void_type_node, cond, then_, else_); protected_set_expr_location_if_unset (stmt, locus); diff --git a/gcc/testsuite/c-c++-common/Wimplicit-fallthrough-39.c b/gcc/testsuite/c-c++-common/Wimplicit-fallthrough-39.c index da4aef3..d06bc0d 100644 --- a/gcc/testsuite/c-c++-common/Wimplicit-fallthrough-39.c +++ b/gcc/testsuite/c-c++-common/Wimplicit-fallthrough-39.c @@ -37,8 +37,8 @@ fn2 (int n) switch (n) { case 0: - if (1) /* { dg-warning "statement may fall through" "" { target c++ } } */ - n++; /* { dg-warning "statement may fall through" "" { target c } } */ + if (1) + n++; /* { dg-warning "statement may fall through" } */ case 1: /* { dg-message "here" } */ return -1; } diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-6.C b/gcc/testsuite/g++.dg/warn/Wreturn-6.C new file mode 100644 index 0000000..85fef0e --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wreturn-6.C @@ -0,0 +1,16 @@ +// PR c++/107310 + +struct f +{ + ~f(); +}; + +int foo(int t) { + f g; + switch (t) { + case 1: + return 1; + } + if (true) + throw 1; +} // { dg-bogus "control reaches end" } |