From 6e2446b6df8e0838e824b14d81fc161bd87f2351 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 10 Apr 2018 10:24:00 -0400 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/call.c | 20 ++++++++++++++++++++ gcc/cp/tree.c | 17 +---------------- gcc/testsuite/g++.dg/debug/dwarf2/default-arg1.C | 14 ++++++++++++++ 4 files changed, 40 insertions(+), 16 deletions(-) create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/default-arg1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4359250..42c3771 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2018-04-10 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. + PR c++/85285 - ICE with flexible array after substitution. * pt.c (instantiate_class_template_1): Check for flexible array in union. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index f978ea7..94226d6 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -7296,6 +7296,21 @@ cxx_type_promotes_to (tree type) 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 the indicated TYPE, which is a parameter to FN. PARMNUM is the zero-based argument number. Do any required conversions. Return @@ -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 alters any part of it. */ 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, ICR_DEFAULT_ARGUMENT, fn, parmnum, complain); diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index d0835cf..18e7793 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -2992,22 +2992,7 @@ bot_manip (tree* tp, int* walk_subtrees, void* data) /* Make a copy of this node. */ t = copy_tree_r (tp, walk_subtrees, NULL); if (TREE_CODE (*tp) == CALL_EXPR) - { - 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; - } - } + set_flags_from_callee (*tp); return t; } diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/default-arg1.C b/gcc/testsuite/g++.dg/debug/dwarf2/default-arg1.C new file mode 100644 index 0000000..d8edffe --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/default-arg1.C @@ -0,0 +1,14 @@ +// 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" } } +} -- 2.7.4