On 06/03/2012 05:27 AM, Jason Merrill wrote:
On 06/02/2012 12:40 PM, Paolo Carlini wrote:
That said, the tricks we are playing with the global input_location
vs the loc we are passing around still confuse me quite a lot.
Actually any *assignment* to input_location makes me a bit more
nervous than I was already ;) Do you have any idea whether just
passing down to build_x_modify_expr a different value for loc instead
of assigning to input_location would also work for you? Maybe
together with more throughly forwarding the loc from
build_x_modify_expr itself to the build_min* functions (ie the
project I mentioned above)??
We already pass to build_x_modify_expr the location that he is
assigning to input_location. I would guess that the issue in this
case is with the "in_system_header" macro, which uses input_location.
I think the input_location hack here is OK until we improve our use of
explicit locations to make it unnecessary.
Good.
In any case, as far as I can see, the assignment Dodji is adding just
before calling build_x_modify_expr doesn't change anything for "my"
issue, which actually has to do with build_x_binary_op: if I apply to
below, thus passing an actual loc to build_min_non_dep_loc, there is a
diagnostic regression for the locations of
libstdc++-v3/testsuite/20_util/bind_ref_neg.cc. If you see something
obviously wrong somewhere, just let me know...
Paolo.
///////////////////
Index: typeck.c
===================================================================
--- typeck.c (revision 188155)
+++ typeck.c (working copy)
@@ -2696,9 +2696,8 @@ finish_class_member_access_expr (tree object, tree
BASELINK_QUALIFIED_P (member) = 1;
orig_name = member;
}
- return build_min_non_dep (COMPONENT_REF, expr,
- orig_object, orig_name,
- NULL_TREE);
+ return build_min_non_dep_loc (UNKNOWN_LOCATION, COMPONENT_REF, expr,
+ orig_object, orig_name, NULL_TREE);
}
return expr;
@@ -2763,7 +2762,7 @@ build_x_indirect_ref (location_t loc, tree expr, r
rval = cp_build_indirect_ref (expr, errorstring, complain);
if (processing_template_decl && rval != error_mark_node)
- return build_min_non_dep (INDIRECT_REF, rval, orig_expr);
+ return build_min_non_dep_loc (loc, INDIRECT_REF, rval, orig_expr);
else
return rval;
}
@@ -3631,7 +3630,7 @@ build_x_binary_op (location_t loc, enum tree_code
warn_about_parentheses (code, arg1_code, orig_arg1, arg2_code, orig_arg2);
if (processing_template_decl && expr != error_mark_node)
- return build_min_non_dep (code, expr, orig_arg1, orig_arg2);
+ return build_min_non_dep_loc (loc, code, expr, orig_arg1, orig_arg2);
return expr;
}
@@ -3660,8 +3659,8 @@ build_x_array_ref (location_t loc, tree arg1, tree
NULL_TREE, /*overload=*/NULL, complain);
if (processing_template_decl && expr != error_mark_node)
- return build_min_non_dep (ARRAY_REF, expr, orig_arg1, orig_arg2,
- NULL_TREE, NULL_TREE);
+ return build_min_non_dep_loc (loc, ARRAY_REF, expr, orig_arg1, orig_arg2,
+ NULL_TREE, NULL_TREE);
return expr;
}
@@ -4764,7 +4763,7 @@ build_x_unary_op (location_t loc, enum tree_code c
}
if (processing_template_decl && exp != error_mark_node)
- exp = build_min_non_dep (code, exp, orig_expr,
+ exp = build_min_non_dep_loc (loc, code, exp, orig_expr,
/*For {PRE,POST}{INC,DEC}REMENT_EXPR*/NULL_TREE);
if (TREE_CODE (exp) == ADDR_EXPR)
PTRMEM_OK_P (exp) = ptrmem;
@@ -5624,8 +5623,8 @@ build_x_conditional_expr (location_t loc, tree ife
expr = build_conditional_expr (ifexp, op1, op2, complain);
if (processing_template_decl && expr != error_mark_node)
{
- tree min = build_min_non_dep (COND_EXPR, expr,
- orig_ifexp, orig_op1, orig_op2);
+ tree min = build_min_non_dep_loc (loc, COND_EXPR, expr,
+ orig_ifexp, orig_op1, orig_op2);
/* In C++11, remember that the result is an lvalue or xvalue.
In C++98, lvalue_kind can just assume lvalue in a template. */
if (cxx_dialect >= cxx0x
@@ -5742,7 +5741,8 @@ build_x_compound_expr (location_t loc, tree op1, t
result = cp_build_compound_expr (op1, op2, complain);
if (processing_template_decl && result != error_mark_node)
- return build_min_non_dep (COMPOUND_EXPR, result, orig_op1, orig_op2);
+ return build_min_non_dep_loc (loc, COMPOUND_EXPR, result,
+ orig_op1, orig_op2);
return result;
}
Index: tree.c
===================================================================
--- tree.c (revision 188155)
+++ tree.c (working copy)
@@ -2086,7 +2086,7 @@ build_min (enum tree_code code, tree tt, ...)
built. */
tree
-build_min_non_dep (enum tree_code code, tree non_dep, ...)
+build_min_non_dep_loc (location_t loc, enum tree_code code, tree non_dep, ...)
{
tree t;
int length;
@@ -2101,6 +2101,7 @@ tree
non_dep = TREE_OPERAND (non_dep, 0);
t = make_node (code);
+ SET_EXPR_LOCATION (t, loc);
length = TREE_CODE_LENGTH (code);
TREE_TYPE (t) = TREE_TYPE (non_dep);
TREE_SIDE_EFFECTS (t) = TREE_SIDE_EFFECTS (non_dep);
Index: decl2.c
===================================================================
--- decl2.c (revision 188155)
+++ decl2.c (working copy)
@@ -407,8 +407,8 @@ grok_array_decl (location_t loc, tree array_expr,
expr = build_array_ref (input_location, array_expr, index_exp);
}
if (processing_template_decl && expr != error_mark_node)
- return build_min_non_dep (ARRAY_REF, expr, orig_array_expr, orig_index_exp,
- NULL_TREE, NULL_TREE);
+ return build_min_non_dep_loc (loc, ARRAY_REF, expr, orig_array_expr,
+ orig_index_exp, NULL_TREE, NULL_TREE);
return expr;
}
Index: cp-tree.h
===================================================================
--- cp-tree.h (revision 188155)
+++ cp-tree.h (working copy)
@@ -5697,7 +5697,8 @@ extern bool builtin_valid_in_constant_expr_p (c
extern tree build_min (enum tree_code, tree, ...);
extern tree build_min_nt_loc (location_t, enum tree_code,
...);
-extern tree build_min_non_dep (enum tree_code, tree, ...);
+extern tree build_min_non_dep_loc (location_t, enum tree_code,
+ tree, ...);
extern tree build_min_non_dep_call_vec (tree, tree, VEC(tree,gc) *);
extern tree build_cplus_new (tree, tree, tsubst_flags_t);
extern tree build_aggr_init_expr (tree, tree, tsubst_flags_t);