On 11/17/2015 01:15 PM, Jason Merrill wrote:
A couple of bootstrap issues on some targets:
68346: My earlier change to avoid folding the arguments to
warn_tautological_cmp wasn't quite right, either. This patch folds
within the function, at the place where we are interested in a constant
value.
I also noticed that we weren't leaving any indication of the cast in the
trees, which also would have avoided the warning. With delayed folding
there really should be one, so I added it. Which caused a crash in the
LITERAL_ZERO_P code. Which is obsolete now, so I've removed it. Which
required my code to immediately fold negation of a constant to avoid
folding -0 into 0; while I was looking at that I also limited it to
folding only when the numeric literal immediately follows the -.
Tested x86_64-pc-linux-gnu, applying to trunk.
commit e7b8c5439a004bfb41bc67af1175b3b2f6abaa03
Author: Jason Merrill
Date: Tue Nov 17 12:56:37 2015 -0500
PR bootstrap/68346
* typeck.c (build_static_cast_1): Force a NOP when converting to
the same type.
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index b7395cf..5f7d4bb 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -6668,7 +6668,13 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p,
If T is a reference type, the result is an lvalue; otherwise,
the result is an rvalue. */
if (TREE_CODE (type) != REFERENCE_TYPE)
- result = rvalue (result);
+ {
+ result = rvalue (result);
+
+ if (result == expr && SCALAR_TYPE_P (type))
+ /* Leave some record of the cast. */
+ result = build_nop (type, expr);
+ }
return result;
}
commit f5ac737442dacc96f28ba4f508628ee356ecd046
Author: Jason Merrill
Date: Tue Nov 17 13:08:45 2015 -0500
LITERAL_ZERO_P obsoleted by delayed folding.
* cp-tree.h (LITERAL_ZERO_P): Remove.
* parser.c (cp_parser_postfix_expression, literal_zeros)
(cp_parser_parenthesized_expression_list): Don't mess with it.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 84437b4..160bf1e 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -4517,10 +4517,6 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter)
#define SIZEOF_EXPR_TYPE_P(NODE) \
TREE_LANG_FLAG_0 (SIZEOF_EXPR_CHECK (NODE))
-/* True if INTEGER_CST is a zero literal seen in function argument list. */
-#define LITERAL_ZERO_P(NODE) \
- (INTEGER_CST_CHECK (NODE)->base.nothrow_flag)
-
/* An enumeration of the kind of tags that C++ accepts. */
enum tag_types {
none_type = 0, /* Not a tag type. */
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index c5f9530..0e1116b 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -1976,7 +1976,7 @@ static tree cp_parser_postfix_open_square_expression
static tree cp_parser_postfix_dot_deref_expression
(cp_parser *, enum cpp_ttype, tree, bool, cp_id_kind *, location_t);
static vec *cp_parser_parenthesized_expression_list
- (cp_parser *, int, bool, bool, bool *, bool = false);
+ (cp_parser *, int, bool, bool, bool *);
/* Values for the second parameter of cp_parser_parenthesized_expression_list. */
enum { non_attr = 0, normal_attr = 1, id_attr = 2 };
static void cp_parser_pseudo_destructor_name
@@ -6502,8 +6502,7 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
args = (cp_parser_parenthesized_expression_list
(parser, non_attr,
/*cast_p=*/false, /*allow_expansion_p=*/true,
- /*non_constant_p=*/NULL,
- /*want_literal_zero_p=*/warn_memset_transposed_args));
+ /*non_constant_p=*/NULL));
if (is_builtin_constant_p)
{
parser->integral_constant_expression_p
@@ -6577,22 +6576,14 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
&& DECL_BUILT_IN_CLASS (postfix_expression) == BUILT_IN_NORMAL
&& DECL_FUNCTION_CODE (postfix_expression) == BUILT_IN_MEMSET
&& vec_safe_length (args) == 3
+ && TREE_CODE ((*args)[2]) == INTEGER_CST
&& integer_zerop ((*args)[2])
- && LITERAL_ZERO_P ((*args)[2])
- && !(integer_zerop ((*args)[1])
- && LITERAL_ZERO_P ((*args)[1])))
+ && !(TREE_CODE ((*args)[1]) == INTEGER_CST
+ && integer_zerop ((*args)[1])))
warning (OPT_Wmemset_transposed_args,
"% used with constant zero length "
"parameter; this could be due to transposed "
"parameters");
-
- /* Replace LITERAL_ZERO_P INTEGER_CSTs with normal ones
- to avoid leaking those into folder and middle-end. */
- unsigned int i;
- tree arg;
- FOR_EACH_VEC_SAFE_ELT (args, i, arg)
- if (TREE_CODE (arg) == INTEGER_CST && LITERAL_ZERO_P (arg))
- (*args)[i] = build_int_cst (TREE_TYPE (arg), 0);
}
if (TREE_CODE (postfix_expression) == COMPONENT_REF)
@@ -7085,10 +7076,6 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser,
return postfix_expression;
}
-/* Cache of LITERAL_ZERO_P constants. */
-
-static GTY(()) tree literal_zeros[it