Commit 6e2446b6 by Jason Merrill Committed by Jason Merrill

PR debug/65821 - wrong location for main().

	* call.c (clear_location_r): New.
	(convert_default_arg): Use it.
	* tree.c (bot_manip): Remove builtin_LINE/FILE handling.

From-SVN: r259278
parent 05c602a1
2018-04-10 Jason Merrill <jason@redhat.com> 2018-04-10 Jason Merrill <jason@redhat.com>
PR debug/65821 - wrong location for main().
* call.c (clear_location_r): New.
(convert_default_arg): Use it.
* tree.c (bot_manip): Remove builtin_LINE/FILE handling.
PR c++/85285 - ICE with flexible array after substitution. PR c++/85285 - ICE with flexible array after substitution.
* pt.c (instantiate_class_template_1): Check for flexible array in * pt.c (instantiate_class_template_1): Check for flexible array in
union. union.
......
...@@ -7296,6 +7296,21 @@ cxx_type_promotes_to (tree type) ...@@ -7296,6 +7296,21 @@ cxx_type_promotes_to (tree type)
return promote; return promote;
} }
/* walk_tree callback to override EXPR_LOCATION in an expression tree. */
tree
clear_location_r (tree *tp, int *walk_subtrees, void */*data*/)
{
if (!EXPR_P (*tp))
{
*walk_subtrees = 0;
return NULL_TREE;
}
if (EXPR_HAS_LOCATION (*tp))
SET_EXPR_LOCATION (*tp, input_location);
return NULL_TREE;
}
/* ARG is a default argument expression being passed to a parameter of /* ARG is a default argument expression being passed to a parameter of
the indicated TYPE, which is a parameter to FN. PARMNUM is the the indicated TYPE, which is a parameter to FN. PARMNUM is the
zero-based argument number. Do any required conversions. Return zero-based argument number. Do any required conversions. Return
...@@ -7360,6 +7375,11 @@ convert_default_arg (tree type, tree arg, tree fn, int parmnum, ...@@ -7360,6 +7375,11 @@ convert_default_arg (tree type, tree arg, tree fn, int parmnum,
/* We must make a copy of ARG, in case subsequent processing /* We must make a copy of ARG, in case subsequent processing
alters any part of it. */ alters any part of it. */
arg = break_out_target_exprs (arg); arg = break_out_target_exprs (arg);
/* The use of a default argument has the location of the call, not where it
was originally written. */
cp_walk_tree_without_duplicates (&arg, clear_location_r, NULL);
arg = convert_for_initialization (0, type, arg, LOOKUP_IMPLICIT, arg = convert_for_initialization (0, type, arg, LOOKUP_IMPLICIT,
ICR_DEFAULT_ARGUMENT, fn, parmnum, ICR_DEFAULT_ARGUMENT, fn, parmnum,
complain); complain);
......
...@@ -2992,22 +2992,7 @@ bot_manip (tree* tp, int* walk_subtrees, void* data) ...@@ -2992,22 +2992,7 @@ bot_manip (tree* tp, int* walk_subtrees, void* data)
/* Make a copy of this node. */ /* Make a copy of this node. */
t = copy_tree_r (tp, walk_subtrees, NULL); t = copy_tree_r (tp, walk_subtrees, NULL);
if (TREE_CODE (*tp) == CALL_EXPR) if (TREE_CODE (*tp) == CALL_EXPR)
{
set_flags_from_callee (*tp); set_flags_from_callee (*tp);
/* builtin_LINE and builtin_FILE get the location where the default
argument is expanded, not where the call was written. */
tree callee = get_callee_fndecl (*tp);
if (callee && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL)
switch (DECL_FUNCTION_CODE (callee))
{
case BUILT_IN_FILE:
case BUILT_IN_LINE:
SET_EXPR_LOCATION (*tp, input_location);
default:
break;
}
}
return t; return t;
} }
......
// PR c++/65821
// { dg-options "-gdwarf-2 -dA" }
int b = 12;
inline void foo(const int &x = (b+3))
{
b = x;
}
int main()
{
foo(); // { dg-final { scan-assembler-not "default-arg1.C:6" } }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment