]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
inliner: Copy DECL_BY_REFERENCE in copy_decl_to_var [PR93888]
authorJakub Jelinek <jakub@redhat.com>
Wed, 4 Mar 2020 11:59:04 +0000 (12:59 +0100)
committerJakub Jelinek <jakub@redhat.com>
Tue, 17 Mar 2020 17:03:16 +0000 (18:03 +0100)
In the following testcase we emit wrong debug info for the karg
parameter in the DW_TAG_inlined_subroutine into main.
The problem is that the karg PARM_DECL is DECL_BY_REFERENCE and thus
in the IL has const K & type, but in the source just const K.
When the function is inlined, we create a VAR_DECL for it, but don't
set DECL_BY_REFERENCE, so when emitting DW_AT_location, we treat it like
a const K & typed variable, but it has DW_AT_abstract_origin which has
just the const K type and thus the debugger thinks the variable has
const K type.

Fixed by copying the DECL_BY_REFERENCE flag.  Not doing it in
copy_decl_for_dup_finish, because copy_decl_no_change already copies
that flag through copy_node and in copy_result_decl_to_var it is
undesirable, as we handle DECL_BY_REFERENCE in that case instead
by changing the type.

2020-03-04  Jakub Jelinek  <jakub@redhat.com>

PR debug/93888
* tree-inline.c (copy_decl_to_var): Copy DECL_BY_REFERENCE flag.

* g++.dg/guality/pr93888.C: New test.

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/guality/pr93888.C [new file with mode: 0644]
gcc/tree-inline.c

index 3e93b3ae62b9974601eb0f1cda224086456957ef..4b81a55064af040c0398c83ba740b3702a676e05 100644 (file)
@@ -3,6 +3,9 @@
        Backported from mainline
        2020-03-04  Jakub Jelinek  <jakub@redhat.com>
 
+       PR debug/93888
+       * tree-inline.c (copy_decl_to_var): Copy DECL_BY_REFERENCE flag.
+
        PR tree-optimization/94001
        * tree-tailcall.c (process_assignment): Before comparing op1 to
        *ass_var, verify *ass_var is non-NULL.
index bbc3bef437f358afb7b133bdbfe3aa4233dc068e..edce0bec2bb6922011f191d1ab7c6859d64abcbd 100644 (file)
@@ -3,6 +3,9 @@
        Backported from mainline
        2020-03-04  Jakub Jelinek  <jakub@redhat.com>
 
+       PR debug/93888
+       * g++.dg/guality/pr93888.C: New test.
+
        PR tree-optimization/94001
        * gcc.dg/pr94001.c: New test.
 
diff --git a/gcc/testsuite/g++.dg/guality/pr93888.C b/gcc/testsuite/g++.dg/guality/pr93888.C
new file mode 100644 (file)
index 0000000..d54a4dc
--- /dev/null
@@ -0,0 +1,24 @@
+// PR debug/93888
+// { dg-do run }
+// { dg-options "-g -fvar-tracking -fno-inline" }
+// { dg-skip-if "" { *-*-* }  { "*" } { "-O0" } }
+
+struct K
+{
+  K () {}
+  K (K const &rhs) { k[0] = 'C'; }
+  char k[8] = {'B','B','B','B','B','B','B','B'};
+};
+
+__attribute__((always_inline)) inline bool
+foo (const K karg)
+{
+  return karg.k[0] != 'C';     // { dg-final { gdb-test 16 "karg.k[0]" "'C'" } }
+}                              // { dg-final { gdb-test 16 "karg.k[1]" "'B'" } }
+
+int
+main ()
+{
+  K x;
+  return foo (x);
+}
index d115fcb1a5b0dc239478c925f6e5fdf3ba76b817..7ba2ebf3695153d32f64b2717b0d302e573b7188 100644 (file)
@@ -5698,6 +5698,7 @@ copy_decl_to_var (tree decl, copy_body_data *id)
   TREE_READONLY (copy) = TREE_READONLY (decl);
   TREE_THIS_VOLATILE (copy) = TREE_THIS_VOLATILE (decl);
   DECL_GIMPLE_REG_P (copy) = DECL_GIMPLE_REG_P (decl);
+  DECL_BY_REFERENCE (copy) = DECL_BY_REFERENCE (decl);
 
   return copy_decl_for_dup_finish (id, decl, copy);
 }