From 3aa668f00f8dbaf3a3ea99b3f79f57d992d8454f Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Mon, 6 Nov 2017 16:43:17 -0500 Subject: [PATCH 14/25] {v3 of [05/14], approved} C++: handle locations wrappers when calling warn_for_memset Blurb from v2: This is a revised fix for e.g. Wmemset-transposed-args1.c, replacing "[PATCH 05/14] tree.c: strip location wrappers from integer_zerop etc" and "[PATCH 10/14] warn_for_memset: handle location wrappers" This version of the patch simply calls fold_for_warn on each of the arguments before calling warn_for_memset. This ensures that warn_for_memset detects integer zero. It also adds a literal_integer_zerop to deal with location wrapper nodes when building "literal_mask" for the call, since this must be called *before* the fold_for_warn calls. gcc/c-family/ChangeLog: * c-warn.c (warn_for_memset): Call fold_for_warn on the arguments. gcc/cp/ChangeLog: * parser.c (literal_integer_zerop): New function. (cp_parser_postfix_expression): When calling warn_for_memset, replace integer_zerop calls with literal_integer_zerop, eliminating the double logical negation cast to bool. Eliminate the special-casing for CONST_DECL in favor of the fold_for_warn within warn_for_memset. --- gcc/c-family/c-warn.c | 3 +++ gcc/cp/parser.c | 16 ++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/gcc/c-family/c-warn.c b/gcc/c-family/c-warn.c index 6045d6e..baaf37e 100644 --- a/gcc/c-family/c-warn.c +++ b/gcc/c-family/c-warn.c @@ -1865,6 +1865,9 @@ void warn_for_memset (location_t loc, tree arg0, tree arg2, int literal_zero_mask) { + arg0 = fold_for_warn (arg0); + arg2 = fold_for_warn (arg2); + if (warn_memset_transposed_args && integer_zerop (arg2) && (literal_zero_mask & (1 << 2)) != 0 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 359572c..069467d 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -6621,6 +6621,16 @@ cp_parser_compound_literal_p (cp_parser *parser) return compound_literal_p; } +/* Return true if EXPR is the integer constant zero or a complex constant + of zero, without any folding, but ignoring location wrappers. */ + +static bool +literal_integer_zerop (const_tree expr) +{ + STRIP_ANY_LOCATION_WRAPPER (expr); + return integer_zerop (expr); +} + /* Parse a postfix-expression. postfix-expression: @@ -7167,10 +7177,8 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, tree arg0 = (*args)[0]; tree arg1 = (*args)[1]; tree arg2 = (*args)[2]; - int literal_mask = ((!!integer_zerop (arg1) << 1) - | (!!integer_zerop (arg2) << 2)); - if (TREE_CODE (arg2) == CONST_DECL) - arg2 = DECL_INITIAL (arg2); + int literal_mask = ((literal_integer_zerop (arg1) << 1) + | (literal_integer_zerop (arg2) << 2)); warn_for_memset (input_location, arg0, arg2, literal_mask); } -- 1.8.5.3