gcc/cp/ChangeLog: * call.c (build_conditional_expr_1): Handle location wrappers. (build_new_op_1): Likewise. * class.c (mark_or_check_attr_tags): Likewise. * constexpr.c (cxx_eval_constant_expression): Likewise. * cvt.c (ocp_convert): Likewise. * decl.c (reshape_init_r): Likewise. (cp_complete_array_type): Likewise. * expr.c (mark_discarded_use): Likewise. * lambda.c (build_capture_proxy): Likewise. * name-lookup.c (handle_namespace_attrs): Likewise. * parser.c (cp_parser_postfix_expression): Likewise when checking for calls to memset and for component lookups. (cp_parser_unary_expression): Likewise for immediate folding of negated constants. (cp_parser_template_argument): Likewise. (cp_parser_omp_for_incr): Likewise. (cp_parser_omp_for_loop_init): Likewise. (cp_parser_omp_declare_reduction_exprs): Likewise. (cp_parser_cilk_simd_linear): Likewise. * pt.c (convert_nontype_argument_function): Likewise. (convert_nontype_argument): Likewise. * semantics.c (finish_asm_stmt): Likewise. (perform_koenig_lookup): Likewise. (handle_omp_array_sections_1): Likewise. (handle_omp_array_sections): Likewise. (omp_reduction_lookup): Likewise. (finish_omp_for): Likewise. * tree.c (cp_stabilize_reference): Likewise. (builtin_valid_in_constant_expr_p): Likewise. (is_overloaded_fn): Likewise. (get_fns): Likewise. (check_abi_tag_args): Likewise. * typeck.c (cxx_sizeof_expr): Likewise. (cp_build_binary_op): Likewise. (cp_build_modify_expr): Likewise. (maybe_warn_about_returning_address_of_local): Likewise. * typeck2.c (cxx_incomplete_type_diagnostic): Likewise. (digest_init_r): Likewise. --- gcc/cp/call.c | 7 ++++++ gcc/cp/class.c | 1 + gcc/cp/constexpr.c | 1 + gcc/cp/cvt.c | 1 + gcc/cp/decl.c | 4 ++++ gcc/cp/expr.c | 2 ++ gcc/cp/lambda.c | 3 +++ gcc/cp/name-lookup.c | 1 + gcc/cp/parser.c | 65 +++++++++++++++++++++++++++++++++------------------- gcc/cp/pt.c | 10 +++++++- gcc/cp/semantics.c | 44 ++++++++++++++++++++++------------- gcc/cp/tree.c | 8 +++++++ gcc/cp/typeck.c | 25 +++++++++++++++++--- gcc/cp/typeck2.c | 4 ++++ 14 files changed, 133 insertions(+), 43 deletions(-)
diff --git a/gcc/cp/call.c b/gcc/cp/call.c index c1b662f..82302b5 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -4816,6 +4816,9 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3, orig_arg2 = arg2; orig_arg3 = arg3; + STRIP_ANY_LOCATION_WRAPPER (arg2); + STRIP_ANY_LOCATION_WRAPPER (arg3); + if (VECTOR_INTEGER_TYPE_P (TREE_TYPE (arg1))) { tree arg1_type = TREE_TYPE (arg1); @@ -5588,6 +5591,10 @@ build_new_op_1 (location_t loc, enum tree_code code, int flags, tree arg1, || error_operand_p (arg3)) return error_mark_node; + STRIP_ANY_LOCATION_WRAPPER_SAFE (arg1); + STRIP_ANY_LOCATION_WRAPPER_SAFE (arg2); + STRIP_ANY_LOCATION_WRAPPER_SAFE (arg3); + bool ismodop = code == MODIFY_EXPR; if (ismodop) { diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 586a32c..781594c 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -1377,6 +1377,7 @@ mark_or_check_attr_tags (tree attr, tree *tp, abi_tag_data *p, bool val) list = TREE_CHAIN (list)) { tree tag = TREE_VALUE (list); + STRIP_ANY_LOCATION_WRAPPER (tag); tree id = get_identifier (TREE_STRING_POINTER (tag)); if (tp) check_tag (tag, id, tp, p); diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index d6b6843..3122743 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -3943,6 +3943,7 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, tree *jump_target) { constexpr_ctx new_ctx; + STRIP_ANY_LOCATION_WRAPPER (t); tree r = t; if (jump_target && *jump_target) diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index b3a6f69..fdc2b8d 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -766,6 +766,7 @@ ocp_convert (tree type, tree expr, int convtype, int flags, the original value is within the range of the enumeration values. Otherwise, the resulting enumeration value is unspecified. */ + STRIP_ANY_LOCATION_WRAPPER (e); if ((complain & tf_warning) && TREE_CODE (e) == INTEGER_CST && ENUM_UNDERLYING_TYPE (type) diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 7e16f7b..9afce0a 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5809,6 +5809,8 @@ reshape_init_r (tree type, reshape_iter *d, bool first_initializer_p, if (error_operand_p (init)) return error_mark_node; + STRIP_ANY_LOCATION_WRAPPER (init); + if (first_initializer_p && !CP_AGGREGATE_TYPE_P (type) && has_designator_problem (d, complain)) return error_mark_node; @@ -8115,6 +8117,8 @@ cp_complete_array_type (tree *ptype, tree initial_value, bool do_default) int failure; tree type, elt_type; + STRIP_ANY_LOCATION_WRAPPER_SAFE (initial_value); + /* Don't get confused by a CONSTRUCTOR for some other type. */ if (initial_value && TREE_CODE (initial_value) == CONSTRUCTOR && !BRACE_ENCLOSED_INITIALIZER_P (initial_value) diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c index 81b9a5b..07630fc 100644 --- a/gcc/cp/expr.c +++ b/gcc/cp/expr.c @@ -220,6 +220,8 @@ mark_discarded_use (tree expr) if (expr == NULL_TREE) return expr; + STRIP_ANY_LOCATION_WRAPPER (expr); + switch (TREE_CODE (expr)) { case COND_EXPR: diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c index 4480c67..c403a25 100644 --- a/gcc/cp/lambda.c +++ b/gcc/cp/lambda.c @@ -428,6 +428,8 @@ build_capture_proxy (tree member, tree init) TREE_USED (var) = 1; DECL_CONTEXT (var) = fn; + STRIP_ANY_LOCATION_WRAPPER (init); + if (DECL_NORMAL_CAPTURE_P (member)) { if (DECL_VLA_CAPTURE_P (member)) @@ -444,6 +446,7 @@ build_capture_proxy (tree member, tree init) init = TREE_OPERAND (init, 0); STRIP_NOPS (init); } + STRIP_ANY_LOCATION_WRAPPER (init); gcc_assert (VAR_P (init) || TREE_CODE (init) == PARM_DECL); while (is_normal_capture_proxy (init)) init = DECL_CAPTURED_VARIABLE (init); diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index b4976d8..6d5fdcf 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -5026,6 +5026,7 @@ handle_namespace_attrs (tree ns, tree attributes) rather than the namespace as a whole, so we don't touch the NAMESPACE_DECL at all. */ tree x = args ? TREE_VALUE (args) : NULL_TREE; + STRIP_ANY_LOCATION_WRAPPER_SAFE (x); if (x == NULL_TREE || TREE_CODE (x) != STRING_CST || TREE_CHAIN (args)) { warning (OPT_Wattributes, diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 8834542..090fb03 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -7168,9 +7168,12 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, } } - if (TREE_CODE (postfix_expression) == FUNCTION_DECL - && DECL_BUILT_IN_CLASS (postfix_expression) == BUILT_IN_NORMAL - && DECL_FUNCTION_CODE (postfix_expression) == BUILT_IN_MEMSET + tree postfix_expr_noloc = postfix_expression; + STRIP_ANY_LOCATION_WRAPPER (postfix_expr_noloc); + + if (TREE_CODE (postfix_expr_noloc) == FUNCTION_DECL + && DECL_BUILT_IN_CLASS (postfix_expr_noloc) == BUILT_IN_NORMAL + && DECL_FUNCTION_CODE (postfix_expr_noloc) == BUILT_IN_MEMSET && vec_safe_length (args) == 3) { tree arg0 = (*args)[0]; @@ -7184,10 +7187,10 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, warn_for_memset (input_location, arg0, arg2, literal_mask); } - if (TREE_CODE (postfix_expression) == COMPONENT_REF) + if (TREE_CODE (postfix_expr_noloc) == COMPONENT_REF) { - tree instance = TREE_OPERAND (postfix_expression, 0); - tree fn = TREE_OPERAND (postfix_expression, 1); + tree instance = TREE_OPERAND (postfix_expr_noloc, 0); + tree fn = TREE_OPERAND (postfix_expr_noloc, 1); if (processing_template_decl && (type_dependent_object_expression_p (instance) @@ -7221,9 +7224,9 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, /*koenig_p=*/false, complain); } - else if (TREE_CODE (postfix_expression) == OFFSET_REF - || TREE_CODE (postfix_expression) == MEMBER_REF - || TREE_CODE (postfix_expression) == DOTSTAR_EXPR) + else if (TREE_CODE (postfix_expr_noloc) == OFFSET_REF + || TREE_CODE (postfix_expr_noloc) == MEMBER_REF + || TREE_CODE (postfix_expr_noloc) == DOTSTAR_EXPR) postfix_expression = (build_offset_ref_call_from_tree (postfix_expression, &args, complain)); @@ -8335,18 +8338,22 @@ cp_parser_unary_expression (cp_parser *parser, cp_id_kind * pidk, case NEGATE_EXPR: /* Immediately fold negation of a constant, unless the constant is 0 (since -0 == 0) or it would overflow. */ - if (unary_operator == NEGATE_EXPR && op_ttype == CPP_NUMBER - && CONSTANT_CLASS_P (cast_expression) - && !integer_zerop (cast_expression) - && !TREE_OVERFLOW (cast_expression)) + if (unary_operator == NEGATE_EXPR && op_ttype == CPP_NUMBER) { - tree folded = fold_build1 (unary_operator, - TREE_TYPE (cast_expression), - cast_expression); - if (CONSTANT_CLASS_P (folded) && !TREE_OVERFLOW (folded)) + cast_expression.strip_any_location_wrapper (); + if (CONSTANT_CLASS_P (cast_expression) + && !integer_zerop (cast_expression) + && !TREE_OVERFLOW (cast_expression)) { - expression = cp_expr (folded, loc); - break; + tree folded = fold_build1 (unary_operator, + TREE_TYPE (cast_expression), + cast_expression); + if (CONSTANT_CLASS_P (folded) && !TREE_OVERFLOW (folded)) + { + expression = cp_expr (folded, loc); + expression.maybe_add_location_wrapper (); + break; + } } } /* Fall through. */ @@ -16415,6 +16422,7 @@ cp_parser_template_argument (cp_parser* parser) /*cast_p=*/false, /*template_arg_p=*/true, &idk); + STRIP_ANY_LOCATION_WRAPPER (argument); if (TREE_CODE (argument) != TEMPLATE_PARM_INDEX || !cp_parser_next_token_ends_template_argument_p (parser)) cp_parser_simulate_error (parser); @@ -16444,6 +16452,7 @@ cp_parser_template_argument (cp_parser* parser) /*cast_p=*/false, /*template_arg_p=*/true, &idk); + STRIP_ANY_LOCATION_WRAPPER (argument); if (cp_parser_error_occurred (parser) || !cp_parser_next_token_ends_template_argument_p (parser)) cp_parser_abort_tentative_parse (parser); @@ -34686,6 +34695,7 @@ cp_parser_omp_for_incr (cp_parser *parser, tree decl) ? PREINCREMENT_EXPR : PREDECREMENT_EXPR); cp_lexer_consume_token (parser->lexer); lhs = cp_parser_simple_cast_expression (parser); + STRIP_ANY_LOCATION_WRAPPER (lhs); if (lhs != decl && (!processing_template_decl || !cp_tree_equal (lhs, decl))) return error_mark_node; @@ -34693,6 +34703,7 @@ cp_parser_omp_for_incr (cp_parser *parser, tree decl) } lhs = cp_parser_primary_expression (parser, false, false, false, &idk); + STRIP_ANY_LOCATION_WRAPPER (lhs); if (lhs != decl && (!processing_template_decl || !cp_tree_equal (lhs, decl))) return error_mark_node; @@ -34720,6 +34731,8 @@ cp_parser_omp_for_incr (cp_parser *parser, tree decl) lhs = cp_parser_binary_expression (parser, false, false, PREC_ADDITIVE_EXPRESSION, NULL); token = cp_lexer_peek_token (parser->lexer); + + STRIP_ANY_LOCATION_WRAPPER (lhs); decl_first = (lhs == decl || (processing_template_decl && cp_tree_equal (lhs, decl))); if (decl_first) @@ -34754,6 +34767,7 @@ cp_parser_omp_for_incr (cp_parser *parser, tree decl) if (!decl_first) { + STRIP_ANY_LOCATION_WRAPPER (rhs); if ((rhs != decl && (!processing_template_decl || !cp_tree_equal (rhs, decl))) || op == MINUS_EXPR) @@ -34943,6 +34957,7 @@ cp_parser_omp_for_loop_init (cp_parser *parser, cp_parser_parse_tentatively (parser); decl = cp_parser_primary_expression (parser, false, false, false, &idk); + STRIP_ANY_LOCATION_WRAPPER_SAFE (decl); cp_token *last_tok = cp_lexer_peek_token (parser->lexer); if (!cp_parser_error_occurred (parser) && decl @@ -37563,10 +37578,13 @@ cp_parser_omp_declare_reduction_exprs (tree fndecl, cp_parser *parser) unsigned int i; tree arg; FOR_EACH_VEC_SAFE_ELT (args, i, arg) - if (arg == omp_priv - || (TREE_CODE (arg) == ADDR_EXPR - && TREE_OPERAND (arg, 0) == omp_priv)) - break; + { + STRIP_ANY_LOCATION_WRAPPER (arg); + if (arg == omp_priv + || (TREE_CODE (arg) == ADDR_EXPR + && TREE_OPERAND (arg, 0) == omp_priv)) + break; + } cp_parser_abort_tentative_parse (parser); if (arg == NULL_TREE) error ("one of the initializer call arguments should be %<omp_priv%>" @@ -39165,6 +39183,7 @@ cp_parser_cilk_simd_linear (cp_parser *parser, tree clauses) e = cp_parser_assignment_expression (parser); e = maybe_constant_value (e); + STRIP_ANY_LOCATION_WRAPPER (e); if (e == error_mark_node) { diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 562b927..71fce74 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -6063,6 +6063,7 @@ convert_nontype_argument_function (tree type, tree expr, -- the address of an object or function with external [C++11: or internal] linkage. */ + STRIP_ANY_LOCATION_WRAPPER (fn_no_ptr); if (TREE_CODE (fn_no_ptr) != FUNCTION_DECL) { if (complain & tf_error) @@ -6410,6 +6411,7 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) { tree expr_type; location_t loc = EXPR_LOC_OR_LOC (expr, input_location); + STRIP_ANY_LOCATION_WRAPPER (expr); tree orig_expr = expr; /* Detect immediately string literals as invalid non-type argument. @@ -6475,6 +6477,7 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) to a null value, but otherwise still need to be of a specific form. */ if (cxx_dialect >= cxx11) { + STRIP_ANY_LOCATION_WRAPPER (expr); if (TREE_CODE (expr) == PTRMEM_CST) /* A PTRMEM_CST is already constant, and a valid template argument for a parameter of pointer to member type, we just want @@ -6506,6 +6509,8 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) else expr = mark_rvalue_use (expr); + STRIP_ANY_LOCATION_WRAPPER (expr); + /* HACK: Due to double coercion, we can get a NOP_EXPR<REFERENCE_TYPE>(ADDR_EXPR<POINTER_TYPE> (arg)) here, which is the tree that we built on the first call (see @@ -6559,6 +6564,7 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) /* Notice that there are constant expressions like '4 % 0' which do not fold into integer constants. */ + STRIP_ANY_LOCATION_WRAPPER (expr); if (TREE_CODE (expr) != INTEGER_CST && !value_dependent_expression_p (expr)) { @@ -6592,6 +6598,7 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) conversion (_conv.array_) are applied. */ else if (TYPE_PTROBV_P (type)) { + STRIP_ANY_LOCATION_WRAPPER (expr); tree decayed = expr; /* Look through any NOP_EXPRs around an ADDR_EXPR, whether they come from @@ -6630,6 +6637,7 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) /* Null pointer values are OK in C++11. */; else if (TREE_CODE (expr) != ADDR_EXPR) { + STRIP_ANY_LOCATION_WRAPPER (expr); if (VAR_P (expr)) { if (complain & tf_error) @@ -6653,7 +6661,7 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) else { tree decl = TREE_OPERAND (expr, 0); - + STRIP_ANY_LOCATION_WRAPPER (decl); if (!VAR_P (decl)) { if (complain & tf_error) diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index f292d17..2f37dc8 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1489,6 +1489,8 @@ finish_asm_stmt (int volatile_p, tree string, tree output_operands, otherwise we'll get an error. Gross, but ... */ STRIP_NOPS (operand); + STRIP_ANY_LOCATION_WRAPPER (operand); + operand = mark_lvalue_use (operand); if (!lvalue_or_else (operand, lv_asm, tf_warning_or_error)) @@ -2249,6 +2251,8 @@ perform_koenig_lookup (cp_expr fn, vec<tree, va_gc> *args, bool template_id = false; location_t loc = fn.get_location (); + fn.strip_any_location_wrapper (); + if (TREE_CODE (fn) == TEMPLATE_ID_EXPR) { /* Use a separate flag to handle null args. */ @@ -4603,7 +4607,9 @@ handle_omp_array_sections_1 (tree c, tree t, vec<tree> &types, type = TREE_TYPE (ret); low_bound = TREE_PURPOSE (t); + STRIP_ANY_LOCATION_WRAPPER_SAFE (low_bound); length = TREE_VALUE (t); + STRIP_ANY_LOCATION_WRAPPER_SAFE (length); if ((low_bound && type_dependent_expression_p (low_bound)) || (length && type_dependent_expression_p (length))) return NULL_TREE; @@ -4894,11 +4900,13 @@ handle_omp_array_sections (tree c, enum c_omp_region_type ort) tree length = TREE_VALUE (t); i--; + STRIP_ANY_LOCATION_WRAPPER_SAFE (low_bound); if (low_bound && TREE_CODE (low_bound) == INTEGER_CST && TYPE_PRECISION (TREE_TYPE (low_bound)) > TYPE_PRECISION (sizetype)) low_bound = fold_convert (sizetype, low_bound); + STRIP_ANY_LOCATION_WRAPPER_SAFE (length); if (length && TREE_CODE (length) == INTEGER_CST && TYPE_PRECISION (TREE_TYPE (length)) @@ -5204,6 +5212,7 @@ omp_reduction_lookup (location_t loc, tree id, tree type, tree *baselinkp, type), false, false); tree fns = id; + STRIP_ANY_LOCATION_WRAPPER (fns); id = NULL_TREE; if (fns && is_overloaded_fn (fns)) { @@ -8062,22 +8071,25 @@ finish_omp_for (location_t locus, enum tree_code code, tree declv, if (decl == NULL) { if (init != NULL) - switch (TREE_CODE (init)) - { - case MODIFY_EXPR: - decl = TREE_OPERAND (init, 0); - init = TREE_OPERAND (init, 1); - break; - case MODOP_EXPR: - if (TREE_CODE (TREE_OPERAND (init, 1)) == NOP_EXPR) - { - decl = TREE_OPERAND (init, 0); - init = TREE_OPERAND (init, 2); - } - break; - default: - break; - } + { + STRIP_ANY_LOCATION_WRAPPER (init); + switch (TREE_CODE (init)) + { + case MODIFY_EXPR: + decl = TREE_OPERAND (init, 0); + init = TREE_OPERAND (init, 1); + break; + case MODOP_EXPR: + if (TREE_CODE (TREE_OPERAND (init, 1)) == NOP_EXPR) + { + decl = TREE_OPERAND (init, 0); + init = TREE_OPERAND (init, 2); + } + break; + default: + break; + } + } if (decl == NULL) { diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index fd4641c..3bb8b8f 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -333,6 +333,8 @@ bitfield_p (const_tree ref) tree cp_stabilize_reference (tree ref) { + STRIP_ANY_LOCATION_WRAPPER (ref); + switch (TREE_CODE (ref)) { case NON_DEPENDENT_EXPR: @@ -377,6 +379,8 @@ cp_stabilize_reference (tree ref) bool builtin_valid_in_constant_expr_p (const_tree decl) { + STRIP_ANY_LOCATION_WRAPPER (decl); + if (!(TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL)) /* Not a built-in. */ @@ -2425,6 +2429,8 @@ lookup_keep (tree lookup, bool keep) int is_overloaded_fn (tree x) { + STRIP_ANY_LOCATION_WRAPPER (x); + /* A baselink is also considered an overloaded function. */ if (TREE_CODE (x) == OFFSET_REF || TREE_CODE (x) == COMPONENT_REF) @@ -2472,6 +2478,7 @@ really_overloaded_fn (tree x) tree get_fns (tree from) { + STRIP_ANY_LOCATION_WRAPPER (from); /* A baselink is also considered an overloaded function. */ if (TREE_CODE (from) == OFFSET_REF || TREE_CODE (from) == COMPONENT_REF) @@ -4467,6 +4474,7 @@ check_abi_tag_args (tree args, tree name) for (tree arg = args; arg; arg = TREE_CHAIN (arg)) { tree elt = TREE_VALUE (arg); + STRIP_ANY_LOCATION_WRAPPER (elt); if (TREE_CODE (elt) != STRING_CST || (!same_type_ignoring_top_level_qualifiers_p (strip_array_types (TREE_TYPE (elt)), diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index a5e4745..027bafb 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -1614,6 +1614,8 @@ cxx_sizeof_nowarn (tree type) static tree cxx_sizeof_expr (tree e, tsubst_flags_t complain) { + STRIP_ANY_LOCATION_WRAPPER (e); + if (e == error_mark_node) return error_mark_node; @@ -4202,6 +4204,9 @@ cp_build_binary_op (location_t location, /* True if both operands have arithmetic type. */ bool arithmetic_types_p; + STRIP_ANY_LOCATION_WRAPPER (orig_op0); + STRIP_ANY_LOCATION_WRAPPER (orig_op1); + /* Apply default conversions. */ op0 = orig_op0; op1 = orig_op1; @@ -4394,6 +4399,7 @@ cp_build_binary_op (location_t location, tree type0 = TREE_OPERAND (op0, 0); tree type1 = TREE_OPERAND (op1, 0); tree first_arg = type0; + STRIP_ANY_LOCATION_WRAPPER (first_arg); if (!TYPE_P (type0)) type0 = TREE_TYPE (type0); if (!TYPE_P (type1)) @@ -7751,6 +7757,9 @@ cp_build_modify_expr (location_t loc, tree lhs, enum tree_code modifycode, { lhs = mark_lvalue_use_nonread (lhs); + STRIP_ANY_LOCATION_WRAPPER (lhs); + STRIP_ANY_LOCATION_WRAPPER (rhs); + tree result = NULL_TREE; tree newrhs = rhs; tree lhstype = TREE_TYPE (lhs); @@ -8888,10 +8897,16 @@ maybe_warn_about_returning_address_of_local (tree retval) for (;;) { if (TREE_CODE (whats_returned) == COMPOUND_EXPR) - whats_returned = TREE_OPERAND (whats_returned, 1); + { + whats_returned = TREE_OPERAND (whats_returned, 1); + STRIP_ANY_LOCATION_WRAPPER (whats_returned); + } else if (CONVERT_EXPR_P (whats_returned) || TREE_CODE (whats_returned) == NON_LVALUE_EXPR) - whats_returned = TREE_OPERAND (whats_returned, 0); + { + whats_returned = TREE_OPERAND (whats_returned, 0); + STRIP_ANY_LOCATION_WRAPPER (whats_returned); + } else break; } @@ -8899,10 +8914,14 @@ maybe_warn_about_returning_address_of_local (tree retval) if (TREE_CODE (whats_returned) != ADDR_EXPR) return false; whats_returned = TREE_OPERAND (whats_returned, 0); + STRIP_ANY_LOCATION_WRAPPER (whats_returned); while (TREE_CODE (whats_returned) == COMPONENT_REF || TREE_CODE (whats_returned) == ARRAY_REF) - whats_returned = TREE_OPERAND (whats_returned, 0); + { + whats_returned = TREE_OPERAND (whats_returned, 0); + STRIP_ANY_LOCATION_WRAPPER (whats_returned); + } if (TREE_CODE (valtype) == REFERENCE_TYPE) { diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index e135b0d..77f6f3e 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -464,6 +464,8 @@ cxx_incomplete_type_diagnostic (location_t loc, const_tree value, if (TREE_CODE (type) == ERROR_MARK) return; + STRIP_ANY_LOCATION_WRAPPER_SAFE (value); + if (value != 0 && (VAR_P (value) || TREE_CODE (value) == PARM_DECL || TREE_CODE (value) == FIELD_DECL)) @@ -1023,6 +1025,8 @@ digest_init_r (tree type, tree init, bool nested, int flags, location_t loc = EXPR_LOC_OR_LOC (init, input_location); + STRIP_ANY_LOCATION_WRAPPER (init); + /* Initialization of an array of chars from a string constant. The initializer can be optionally enclosed in braces, but reshape_init has already removed them if they were present. */ -- 1.8.5.3