PR debug/65821 - wrong location for main().
authorJason Merrill <jason@redhat.com>
Tue, 10 Apr 2018 14:24:00 +0000 (10:24 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 10 Apr 2018 14:24:00 +0000 (10:24 -0400)
* 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
gcc/cp/call.c
gcc/cp/tree.c
gcc/testsuite/g++.dg/debug/dwarf2/default-arg1.C [new file with mode: 0644]

index 43592502c6fc4081ac3611c54d49e5d0680564df..42c3771b98da03080cf3d61ea37c13cb3ff88613 100644 (file)
@@ -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.
index f978ea73f3d70cc60d6f75f6777ebe3bbb6716ee..94226d6ea7194369cee9f65c9b68156ec817bc27 100644 (file)
@@ -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);
index d0835cfaa2901f0ffb64f41b9754e6564faeac64..18e7793b86924bf27acb9a47bd9310d507f161fc 100644 (file)
@@ -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 (file)
index 0000000..d8edffe
--- /dev/null
@@ -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" } }
+}