From patchwork Sun Nov 10 10:26:13 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Carlini X-Patchwork-Id: 290037 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id AE9432C00C8 for ; Sun, 10 Nov 2013 21:26:38 +1100 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:cc:subject:content-type; q=dns; s=default; b=QI7VEpBUcvLdgAsmp8ZEStcvMFVhjSBW/bTyVE3rHM1 /ouGBWj3GDRn7jCE1SKUpy6Ea0KXDR51rO6uLiTirOw+dLMxY/j4uBcAWYsEg9tQ e42yRdL0CXlLG510Hj3zAnakX7CCYMTur3XE7sAUmFAT/rxXKxpveWKSqSP5D+yo = DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:cc:subject:content-type; s=default; bh=312wKD339gPXWKsCmKTq0EgT5mw=; b=V5WM41DvSs3dRLilF hE2B8wVbGmq4vwEfqbt7bgEnPH+9G1C2HkHSdh+aXQS2acJyP/XQLdj1jRiS85pb 4ijjvHE+0Ox87tV6001Vs+Sa3BXaDp3lkWLtP+t56H0bNpvXoolzfy+tCIQMVUh1 x57356315b4AW+cyzLUq4IMRT0= Received: (qmail 27812 invoked by alias); 10 Nov 2013 10:26:28 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 27803 invoked by uid 89); 10 Nov 2013 10:26:27 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL, BAYES_50, RDNS_NONE, SPF_PASS, UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=no version=3.3.2 X-HELO: aserp1040.oracle.com Received: from Unknown (HELO aserp1040.oracle.com) (141.146.126.69) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Sun, 10 Nov 2013 10:26:26 +0000 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id rAAAQHTR026926 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sun, 10 Nov 2013 10:26:18 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id rAAAQGjg020156 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sun, 10 Nov 2013 10:26:17 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id rAAAQGl8024435; Sun, 10 Nov 2013 10:26:16 GMT Received: from poldo4.casa (/79.52.240.174) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sun, 10 Nov 2013 02:26:15 -0800 Message-ID: <527F5F45.5050806@oracle.com> Date: Sun, 10 Nov 2013 11:26:13 +0100 From: Paolo Carlini User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "gcc-patches@gcc.gnu.org" CC: Jason Merrill Subject: [C++ Patch] Fixes for duplicate warnings regressions [1/2] X-IsSubscribed: yes Hi, this is the issue with -Waddress caused by the fix for c++/56930. I'm handling it as already described, that is by adding a bool parameter to c_common_truthvalue_conversion. Tested x86_64-linux. Thanks! Paolo. ////////////////////// /c-family 2013-11-11 Paolo Carlini * c-common.c (c_common_truthvalue_conversion): Add bool parameter. * c-common.h (c_common_truthvalue_conversion): Adjust declaration. /cp 2013-11-11 Paolo Carlini * typeck.c (cp_truthvalue_conversion): Add tsubst_flags_t parameter. * cp-tree.h (cp_truthvalue_conversion): Adjust declaration. * cvt.c (cp_convert_and_check): The second time call cp_convert with tf_none to avoid duplicate -Waddress warnings. (ocp_convert): Adjust. * init.c (expand_cleanup_for_base): Likewise. * rtti.c (build_dynamic_cast_1): Likewise. /c 2013-11-11 Paolo Carlini * c-typeck.c (c_objc_common_truthvalue_conversion): Update c_common_truthvalue_conversion call. /objc 2013-11-11 Paolo Carlini * objc-next-runtime-abi-01.c (next_sjlj_build_enter_and_setjmp): Update c_common_truthvalue_conversion call. (next_sjlj_build_catch_list): Likewise. (next_sjlj_build_try_catch_finally): Likewise. * objc-act.c (objc_finish_foreach_loop): Likewise. (objc_finish_foreach_loop): Likewise. Index: c/c-typeck.c =================================================================== --- c/c-typeck.c (revision 204620) +++ c/c-typeck.c (working copy) @@ -11001,7 +11001,7 @@ c_objc_common_truthvalue_conversion (location_t lo else /* ??? Should we also give an error for vectors rather than leaving those to give errors later? */ - expr = c_common_truthvalue_conversion (location, expr); + expr = c_common_truthvalue_conversion (location, expr, /*complain=*/true); if (TREE_CODE (expr) == INTEGER_CST && int_operands && !int_const) { Index: c-family/c-common.c =================================================================== --- c-family/c-common.c (revision 204620) +++ c-family/c-common.c (working copy) @@ -4495,7 +4495,8 @@ decl_with_nonnull_addr_p (const_tree expr) The resulting type should always be `truthvalue_type_node'. */ tree -c_common_truthvalue_conversion (location_t location, tree expr) +c_common_truthvalue_conversion (location_t location, tree expr, + bool complain) { switch (TREE_CODE (expr)) { @@ -4518,9 +4519,11 @@ tree return expr; expr = build2 (TREE_CODE (expr), truthvalue_type_node, c_common_truthvalue_conversion (location, - TREE_OPERAND (expr, 0)), + TREE_OPERAND (expr, 0), + complain), c_common_truthvalue_conversion (location, - TREE_OPERAND (expr, 1))); + TREE_OPERAND (expr, 1), + complain)); goto ret; case TRUTH_NOT_EXPR: @@ -4528,7 +4531,8 @@ tree return expr; expr = build1 (TREE_CODE (expr), truthvalue_type_node, c_common_truthvalue_conversion (location, - TREE_OPERAND (expr, 0))); + TREE_OPERAND (expr, 0), + complain)); goto ret; case ERROR_MARK: @@ -4558,11 +4562,12 @@ tree tree inner = TREE_OPERAND (expr, 0); if (decl_with_nonnull_addr_p (inner)) { - /* Common Ada/Pascal programmer's mistake. */ - warning_at (location, - OPT_Waddress, - "the address of %qD will always evaluate as %", - inner); + if (complain) + /* Common Ada/Pascal programmer's mistake. */ + warning_at (location, + OPT_Waddress, + "the address of %qD will always evaluate as %", + inner); return truthvalue_true_node; } break; @@ -4573,9 +4578,11 @@ tree (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)) ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR), c_common_truthvalue_conversion (location, - TREE_OPERAND (expr, 0)), + TREE_OPERAND (expr, 0), + complain), c_common_truthvalue_conversion (location, - TREE_OPERAND (expr, 1)), + TREE_OPERAND (expr, 1), + complain), 0); goto ret; @@ -4584,7 +4591,8 @@ tree case FLOAT_EXPR: case EXCESS_PRECISION_EXPR: /* These don't change whether an object is nonzero or zero. */ - return c_common_truthvalue_conversion (location, TREE_OPERAND (expr, 0)); + return c_common_truthvalue_conversion (location, TREE_OPERAND (expr, 0), + complain); case LROTATE_EXPR: case RROTATE_EXPR: @@ -4595,12 +4603,13 @@ tree expr = build2 (COMPOUND_EXPR, truthvalue_type_node, TREE_OPERAND (expr, 1), c_common_truthvalue_conversion - (location, TREE_OPERAND (expr, 0))); + (location, TREE_OPERAND (expr, 0), complain)); goto ret; } else return c_common_truthvalue_conversion (location, - TREE_OPERAND (expr, 0)); + TREE_OPERAND (expr, 0), + complain); case COND_EXPR: /* Distribute the conversion into the arms of a COND_EXPR. */ @@ -4610,9 +4619,9 @@ tree tree op2 = TREE_OPERAND (expr, 2); /* In C++ one of the arms might have void type if it is throw. */ if (!VOID_TYPE_P (TREE_TYPE (op1))) - op1 = c_common_truthvalue_conversion (location, op1); + op1 = c_common_truthvalue_conversion (location, op1, complain); if (!VOID_TYPE_P (TREE_TYPE (op2))) - op2 = c_common_truthvalue_conversion (location, op2); + op2 = c_common_truthvalue_conversion (location, op2, complain); expr = fold_build3_loc (location, COND_EXPR, truthvalue_type_node, TREE_OPERAND (expr, 0), op1, op2); goto ret; @@ -4623,9 +4632,11 @@ tree expr = build3 (COND_EXPR, truthvalue_type_node, TREE_OPERAND (expr, 0), c_common_truthvalue_conversion (location, - TREE_OPERAND (expr, 1)), + TREE_OPERAND (expr, 1), + complain), c_common_truthvalue_conversion (location, - TREE_OPERAND (expr, 2))); + TREE_OPERAND (expr, 2), + complain)); goto ret; } @@ -4647,7 +4658,8 @@ tree /* If this isn't narrowing the argument, we can ignore it. */ if (TYPE_PRECISION (totype) >= TYPE_PRECISION (fromtype)) return c_common_truthvalue_conversion (location, - TREE_OPERAND (expr, 0)); + TREE_OPERAND (expr, 0), + complain); } break; @@ -4655,8 +4667,10 @@ tree if (!TREE_NO_WARNING (expr) && warn_parentheses) { - warning (OPT_Wparentheses, - "suggest parentheses around assignment used as truth value"); + if (complain) + warning (OPT_Wparentheses, + "suggest parentheses around assignment used as " + "truth value"); TREE_NO_WARNING (expr) = 1; } break; @@ -4674,10 +4688,12 @@ tree ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR), c_common_truthvalue_conversion (location, - build_unary_op (location, REALPART_EXPR, t, 0)), + build_unary_op (location, REALPART_EXPR, t, 0), + complain), c_common_truthvalue_conversion (location, - build_unary_op (location, IMAGPART_EXPR, t, 0)), + build_unary_op (location, IMAGPART_EXPR, t, 0), + complain), 0)); goto ret; } Index: c-family/c-common.h =================================================================== --- c-family/c-common.h (revision 204620) +++ c-family/c-common.h (working copy) @@ -747,7 +747,7 @@ extern tree c_fully_fold (tree, bool, bool *); extern tree decl_constant_value_for_optimization (tree); extern tree c_wrap_maybe_const (tree, bool); extern tree c_save_expr (tree); -extern tree c_common_truthvalue_conversion (location_t, tree); +extern tree c_common_truthvalue_conversion (location_t, tree, bool); extern void c_apply_type_quals_to_decl (int, tree); extern tree c_sizeof_or_alignof_type (location_t, tree, bool, int); extern tree c_alignof_expr (location_t, tree); Index: cp/cp-tree.h =================================================================== --- cp/cp-tree.h (revision 204620) +++ cp/cp-tree.h (working copy) @@ -5966,7 +5966,7 @@ extern void cxx_print_error_function (diagnostic_ /* in typeck.c */ extern bool cxx_mark_addressable (tree); extern int string_conv_p (const_tree, const_tree, int); -extern tree cp_truthvalue_conversion (tree); +extern tree cp_truthvalue_conversion (tree, tsubst_flags_t); extern tree condition_conversion (tree); extern tree require_complete_type (tree); extern tree require_complete_type_sfinae (tree, tsubst_flags_t); Index: cp/cvt.c =================================================================== --- cp/cvt.c (revision 204620) +++ cp/cvt.c (working copy) @@ -629,7 +629,8 @@ cp_convert_and_check (tree type, tree expr, tsubst { tree folded = maybe_constant_value (expr); tree stripped = folded; - tree folded_result = cp_convert (type, folded, complain); + tree folded_result + = folded != expr ? cp_convert (type, folded, tf_none) : result; /* maybe_constant_value wraps an INTEGER_CST with TREE_OVERFLOW in a NOP_EXPR so that it isn't TREE_CONSTANT anymore. */ @@ -782,7 +783,7 @@ ocp_convert (tree type, tree expr, int convtype, i to the underlying type first. */ if (SCOPED_ENUM_P (intype) && (convtype & CONV_STATIC)) e = build_nop (ENUM_UNDERLYING_TYPE (intype), e); - return cp_truthvalue_conversion (e); + return cp_truthvalue_conversion (e, complain); } converted = fold_if_not_in_template (convert_to_integer (type, e)); Index: cp/init.c =================================================================== --- cp/init.c (revision 204620) +++ cp/init.c (working copy) @@ -1205,9 +1205,10 @@ expand_cleanup_for_base (tree binfo, tree flag) if (flag) expr = fold_build3_loc (input_location, - COND_EXPR, void_type_node, - c_common_truthvalue_conversion (input_location, flag), - expr, integer_zero_node); + COND_EXPR, void_type_node, + c_common_truthvalue_conversion + (input_location, flag, /*complain=*/true), + expr, integer_zero_node); finish_eh_cleanup (expr); } Index: cp/rtti.c =================================================================== --- cp/rtti.c (revision 204620) +++ cp/rtti.c (working copy) @@ -752,7 +752,7 @@ build_dynamic_cast_1 (tree type, tree expr, tsubst tree neq; result = save_expr (result); - neq = cp_truthvalue_conversion (result); + neq = cp_truthvalue_conversion (result, complain); return cp_convert (type, build3 (COND_EXPR, TREE_TYPE (result), neq, result, bad), complain); Index: cp/typeck.c =================================================================== --- cp/typeck.c (revision 204620) +++ cp/typeck.c (working copy) @@ -5153,7 +5153,7 @@ build_x_unary_op (location_t loc, enum tree_code c -1. */ tree -cp_truthvalue_conversion (tree expr) +cp_truthvalue_conversion (tree expr, tsubst_flags_t complain) { tree type = TREE_TYPE (expr); if (TYPE_PTRDATAMEM_P (type)) @@ -5165,12 +5165,14 @@ tree 'if (p)' or a 'while (!p)', where p is a pointer. */ tree ret; ++c_inhibit_evaluation_warnings; - ret = c_common_truthvalue_conversion (input_location, expr); + ret = c_common_truthvalue_conversion (input_location, expr, + complain & tf_warning); --c_inhibit_evaluation_warnings; return ret; } else - return c_common_truthvalue_conversion (input_location, expr); + return c_common_truthvalue_conversion (input_location, expr, + complain & tf_warning); } /* Just like cp_truthvalue_conversion, but we want a CLEANUP_POINT_EXPR. */ Index: objc/objc-act.c =================================================================== --- objc/objc-act.c (revision 204620) +++ objc/objc-act.c (working copy) @@ -9832,7 +9832,7 @@ objc_finish_foreach_loop (location_t location, tre build_binary_op (location, EQ_EXPR, objc_foreach_batchsize_decl, - build_int_cst (long_unsigned_type_node, 0), 1)), + build_int_cst (long_unsigned_type_node, 0), 1), /*complain=*/true), false, NULL), /* Then block (we fill it in later). */ NULL_TREE, @@ -9910,7 +9910,7 @@ objc_finish_foreach_loop (location_t location, tre build_indirect_ref (location, objc_build_component_ref (objc_foreach_enum_state_decl, get_identifier ("mutationsPtr")), - RO_UNARY_STAR), 1)), + RO_UNARY_STAR), 1), /*complain=*/true), false, NULL), /* Then block. */ build_function_call (input_location, @@ -9958,7 +9958,8 @@ objc_finish_foreach_loop (location_t location, tre build_binary_op (location, LT_EXPR, objc_foreach_index_decl, - objc_foreach_batchsize_decl, 1)), + objc_foreach_batchsize_decl, 1), + /*complain=*/true), false, NULL), /* Then block. */ build1 (GOTO_EXPR, void_type_node, next_object_label_decl), @@ -10008,7 +10009,8 @@ objc_finish_foreach_loop (location_t location, tre build_binary_op (location, NE_EXPR, objc_foreach_batchsize_decl, - build_int_cst (long_unsigned_type_node, 0), 1)), + build_int_cst (long_unsigned_type_node, 0), 1), + /*complain=*/true), false, NULL), /* Then block. */ build1 (GOTO_EXPR, void_type_node, next_batch_label_decl), Index: objc/objc-next-runtime-abi-01.c =================================================================== --- objc/objc-next-runtime-abi-01.c (revision 204620) +++ objc/objc-next-runtime-abi-01.c (working copy) @@ -2563,7 +2563,8 @@ next_sjlj_build_enter_and_setjmp (struct objc_try_ objc_setjmp_decl, t); cond = build2 (COMPOUND_EXPR, TREE_TYPE (sj), enter, sj); - cond = c_common_truthvalue_conversion (input_location, cond); + cond = c_common_truthvalue_conversion (input_location, cond, + /*complain=*/true); return build3 (COND_EXPR, void_type_node, cond, NULL, NULL); } @@ -2633,7 +2634,8 @@ next_sjlj_build_catch_list (struct objc_try_contex args = tree_cons (NULL, t, args); t = build_function_call (input_location, objc_exception_match_decl, args); - cond = c_common_truthvalue_conversion (input_location, t); + cond = c_common_truthvalue_conversion (input_location, t, + /*complain=*/true); } t = build3 (COND_EXPR, void_type_node, cond, body, NULL); SET_EXPR_LOCATION (t, EXPR_LOCATION (stmt)); @@ -2757,7 +2759,7 @@ next_sjlj_build_try_catch_finally (struct objc_try t = next_sjlj_build_try_exit (ctcp); t = build_stmt (input_location, COND_EXPR, c_common_truthvalue_conversion - (input_location, rethrow_decl), + (input_location, rethrow_decl, /*complain=*/true), NULL, t); SET_EXPR_LOCATION (t, cur_try_context->finally_locus); append_to_statement_list (t, &TREE_OPERAND (try_fin, 1)); @@ -2770,7 +2772,8 @@ next_sjlj_build_try_catch_finally (struct objc_try objc_exception_throw_decl, t); t = build_stmt (input_location, COND_EXPR, c_common_truthvalue_conversion (input_location, - rethrow_decl), + rethrow_decl, + /*complain=*/true), t, NULL); SET_EXPR_LOCATION (t, cur_try_context->end_finally_locus); append_to_statement_list (t, &TREE_OPERAND (try_fin, 1));