From fd4116f49cdf081949633ba8f474d7b160860701 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20L=C3=B3pez-Ib=C3=A1=C3=B1ez?= Date: Tue, 10 Apr 2012 16:33:47 +0000 Subject: [PATCH] c-common.c (warn_if_unused_value): Move definition to here. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2012-04-10 Manuel López-Ibáñez * c-family/c-common.c (warn_if_unused_value): Move definition to here. * tree.h (warn_if_unused_value): Move declaration from here. * c-family/c-common.h (warn_if_unused_value): Move declaration to here. * cp/cvt.c (convert_to_void): Update comment. * stmt.c (warn_if_unused_value): Move definition from here. From-SVN: r186287 --- gcc/ChangeLog | 5 +++ gcc/c-family/ChangeLog | 5 +++ gcc/c-family/c-common.c | 96 +++++++++++++++++++++++++++++++++++++++++ gcc/c-family/c-common.h | 1 + gcc/cp/ChangeLog | 4 ++ gcc/cp/cvt.c | 2 +- gcc/stmt.c | 96 ----------------------------------------- gcc/tree.h | 1 - 8 files changed, 112 insertions(+), 98 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dfb564c85c8..cc84f50f3db 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-04-10 Manuel López-Ibáñez + + * tree.h (warn_if_unused_value): Move declaration from here. + * stmt.c (warn_if_unused_value): Move definition from here. + 2010-04-10 Michael Matz * tree-vectorizer.h (_loop_vec_info.strided_stores): Rename to diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 6c4ac8b1edb..558c6a736e9 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2012-04-10 Manuel López-Ibáñez + + * c-common.c (warn_if_unused_value): Move definition to here. + * c-common.h (warn_if_unused_value): Move declaration to here. + 2012-03-23 William Bader * c-lex.c (c_lex_with_flags): Avoid declarations after stmts. diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index fc83b04c8a1..a9e7ec1d14d 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -1649,6 +1649,102 @@ warn_logical_operator (location_t location, enum tree_code code, tree type, } +/* Warn if EXP contains any computations whose results are not used. + Return true if a warning is printed; false otherwise. LOCUS is the + (potential) location of the expression. */ + +bool +warn_if_unused_value (const_tree exp, location_t locus) +{ + restart: + if (TREE_USED (exp) || TREE_NO_WARNING (exp)) + return false; + + /* Don't warn about void constructs. This includes casting to void, + void function calls, and statement expressions with a final cast + to void. */ + if (VOID_TYPE_P (TREE_TYPE (exp))) + return false; + + if (EXPR_HAS_LOCATION (exp)) + locus = EXPR_LOCATION (exp); + + switch (TREE_CODE (exp)) + { + case PREINCREMENT_EXPR: + case POSTINCREMENT_EXPR: + case PREDECREMENT_EXPR: + case POSTDECREMENT_EXPR: + case MODIFY_EXPR: + case INIT_EXPR: + case TARGET_EXPR: + case CALL_EXPR: + case TRY_CATCH_EXPR: + case WITH_CLEANUP_EXPR: + case EXIT_EXPR: + case VA_ARG_EXPR: + return false; + + case BIND_EXPR: + /* For a binding, warn if no side effect within it. */ + exp = BIND_EXPR_BODY (exp); + goto restart; + + case SAVE_EXPR: + case NON_LVALUE_EXPR: + exp = TREE_OPERAND (exp, 0); + goto restart; + + case TRUTH_ORIF_EXPR: + case TRUTH_ANDIF_EXPR: + /* In && or ||, warn if 2nd operand has no side effect. */ + exp = TREE_OPERAND (exp, 1); + goto restart; + + case COMPOUND_EXPR: + if (warn_if_unused_value (TREE_OPERAND (exp, 0), locus)) + return true; + /* Let people do `(foo (), 0)' without a warning. */ + if (TREE_CONSTANT (TREE_OPERAND (exp, 1))) + return false; + exp = TREE_OPERAND (exp, 1); + goto restart; + + case COND_EXPR: + /* If this is an expression with side effects, don't warn; this + case commonly appears in macro expansions. */ + if (TREE_SIDE_EFFECTS (exp)) + return false; + goto warn; + + case INDIRECT_REF: + /* Don't warn about automatic dereferencing of references, since + the user cannot control it. */ + if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == REFERENCE_TYPE) + { + exp = TREE_OPERAND (exp, 0); + goto restart; + } + /* Fall through. */ + + default: + /* Referencing a volatile value is a side effect, so don't warn. */ + if ((DECL_P (exp) || REFERENCE_CLASS_P (exp)) + && TREE_THIS_VOLATILE (exp)) + return false; + + /* If this is an expression which has no operands, there is no value + to be unused. There are no such language-independent codes, + but front ends may define such. */ + if (EXPRESSION_CLASS_P (exp) && TREE_OPERAND_LENGTH (exp) == 0) + return false; + + warn: + return warning_at (locus, OPT_Wunused_value, "value computed is not used"); + } +} + + /* Print a warning about casts that might indicate violation of strict aliasing rules if -Wstrict-aliasing is used and strict aliasing mode is in effect. OTYPE is the original diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index 8552f0c92e9..cab7b439661 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -772,6 +772,7 @@ extern bool strict_aliasing_warning (tree, tree, tree); extern void warnings_for_convert_and_check (tree, tree, tree); extern tree convert_and_check (tree, tree); extern void overflow_warning (location_t, tree); +extern bool warn_if_unused_value (const_tree, location_t); extern void warn_logical_operator (location_t, enum tree_code, tree, enum tree_code, tree, enum tree_code, tree); extern void check_main_parameter_types (tree decl); diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 78c43691d45..3397470777a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2012-04-10 Manuel López-Ibáñez + + * cvt.c (convert_to_void): Update comment. + 2012-04-05 Jason Merrill PR c++/52596 diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index c411a47f0a8..5694abede45 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -1108,7 +1108,7 @@ convert_to_void (tree expr, impl_conv_void implicit, tsubst_flags_t complain) - an expression with TREE_NO_WARNING set. (For an example of such expressions, see build_over_call in call.c.) - automatic dereferencing of references, since the user cannot - control it. (See also warn_if_unused_value() in stmt.c.) */ + control it. (See also warn_if_unused_value() in c-common.c.) */ if (warn_unused_value && implicit != ICV_CAST && (complain & tf_warning) diff --git a/gcc/stmt.c b/gcc/stmt.c index 93d643a7bf0..0589bfd1bb8 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -1472,102 +1472,6 @@ expand_expr_stmt (tree exp) free_temp_slots (); } -/* Warn if EXP contains any computations whose results are not used. - Return 1 if a warning is printed; 0 otherwise. LOCUS is the - (potential) location of the expression. */ - -int -warn_if_unused_value (const_tree exp, location_t locus) -{ - restart: - if (TREE_USED (exp) || TREE_NO_WARNING (exp)) - return 0; - - /* Don't warn about void constructs. This includes casting to void, - void function calls, and statement expressions with a final cast - to void. */ - if (VOID_TYPE_P (TREE_TYPE (exp))) - return 0; - - if (EXPR_HAS_LOCATION (exp)) - locus = EXPR_LOCATION (exp); - - switch (TREE_CODE (exp)) - { - case PREINCREMENT_EXPR: - case POSTINCREMENT_EXPR: - case PREDECREMENT_EXPR: - case POSTDECREMENT_EXPR: - case MODIFY_EXPR: - case INIT_EXPR: - case TARGET_EXPR: - case CALL_EXPR: - case TRY_CATCH_EXPR: - case WITH_CLEANUP_EXPR: - case EXIT_EXPR: - case VA_ARG_EXPR: - return 0; - - case BIND_EXPR: - /* For a binding, warn if no side effect within it. */ - exp = BIND_EXPR_BODY (exp); - goto restart; - - case SAVE_EXPR: - case NON_LVALUE_EXPR: - exp = TREE_OPERAND (exp, 0); - goto restart; - - case TRUTH_ORIF_EXPR: - case TRUTH_ANDIF_EXPR: - /* In && or ||, warn if 2nd operand has no side effect. */ - exp = TREE_OPERAND (exp, 1); - goto restart; - - case COMPOUND_EXPR: - if (warn_if_unused_value (TREE_OPERAND (exp, 0), locus)) - return 1; - /* Let people do `(foo (), 0)' without a warning. */ - if (TREE_CONSTANT (TREE_OPERAND (exp, 1))) - return 0; - exp = TREE_OPERAND (exp, 1); - goto restart; - - case COND_EXPR: - /* If this is an expression with side effects, don't warn; this - case commonly appears in macro expansions. */ - if (TREE_SIDE_EFFECTS (exp)) - return 0; - goto warn; - - case INDIRECT_REF: - /* Don't warn about automatic dereferencing of references, since - the user cannot control it. */ - if (TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == REFERENCE_TYPE) - { - exp = TREE_OPERAND (exp, 0); - goto restart; - } - /* Fall through. */ - - default: - /* Referencing a volatile value is a side effect, so don't warn. */ - if ((DECL_P (exp) || REFERENCE_CLASS_P (exp)) - && TREE_THIS_VOLATILE (exp)) - return 0; - - /* If this is an expression which has no operands, there is no value - to be unused. There are no such language-independent codes, - but front ends may define such. */ - if (EXPRESSION_CLASS_P (exp) && TREE_OPERAND_LENGTH (exp) == 0) - return 0; - - warn: - warning_at (locus, OPT_Wunused_value, "value computed is not used"); - return 1; - } -} - /* Generate RTL to return from the current function, with no value. (That is, we do not do anything about returning any value.) */ diff --git a/gcc/tree.h b/gcc/tree.h index da6be998054..c3fbde99b56 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -5211,7 +5211,6 @@ extern tree unshare_expr (tree); /* In stmt.c */ extern void expand_expr_stmt (tree); -extern int warn_if_unused_value (const_tree, location_t); extern void expand_label (tree); extern void expand_goto (tree);