aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-04-10 10:24:00 -0400
committerJason Merrill <jason@gcc.gnu.org>2018-04-10 10:24:00 -0400
commit6e2446b6df8e0838e824b14d81fc161bd87f2351 (patch)
treea818b1dcf483ed1a8e9abfad5e1f2cf895f4d2a0
parent05c602a135224b1fbc573fc54e3c925196503187 (diff)
downloadgcc-6e2446b6df8e0838e824b14d81fc161bd87f2351.zip
gcc-6e2446b6df8e0838e824b14d81fc161bd87f2351.tar.gz
gcc-6e2446b6df8e0838e824b14d81fc161bd87f2351.tar.bz2
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
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/call.c20
-rw-r--r--gcc/cp/tree.c17
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/default-arg1.C14
4 files changed, 40 insertions, 16 deletions
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 <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.
* 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" } }
+}