Although C++ reference types, denoted by DW_TAG_reference_type in
DWARFv2+ debug info, are unchangeable, we output names of reference type
with DW_TAG_const_type, because internally we mark such variables as
TREE_READONLY.  That's an internal implementation detail that shouldn't
leak to debug information.  This patch fixes this.

The testcase is slightly changed from the one attached to the bug
report, so that it runs in C++98 mode too.

Regstrapped on x86_64-linux-gnu and i686-linux-gnu.  Ok to install?

for  gcc/ChangeLog

        PR debug/55641
        * dwarf2out.c (decl_quals): Don't map TREE_READONLY to
        TYPE_QUAL_CONST in reference-typed decls.

for  gcc/testsuite/ChangeLog

        PR debug/55641
        * g++.dg/debug/dwarf2/ref-1.C: New.
---
 gcc/dwarf2out.c                           |    4 ++++
 gcc/testsuite/g++.dg/debug/dwarf2/ref-1.C |   19 +++++++++++++++++++
 2 files changed, 23 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/ref-1.C

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 8d6eeed..103095f 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -11135,6 +11135,10 @@ static int
 decl_quals (const_tree decl)
 {
   return ((TREE_READONLY (decl)
+          /* The C++ front-end correctly marks reference-typed
+             variables as readonly, but from a language (and debug
+             info) standpoint they are not const-qualified.  */
+          && TREE_CODE (TREE_TYPE (decl)) != REFERENCE_TYPE
           ? TYPE_QUAL_CONST : TYPE_UNQUALIFIED)
          | (TREE_THIS_VOLATILE (decl)
             ? TYPE_QUAL_VOLATILE : TYPE_UNQUALIFIED));
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/ref-1.C 
b/gcc/testsuite/g++.dg/debug/dwarf2/ref-1.C
new file mode 100644
index 0000000..75e9fca
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/ref-1.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { dg-options "-O -g -dA -gno-strict-dwarf" }
+// { dg-final { scan-assembler-not "DW_TAG_const_type" { xfail { 
powerpc-ibm-aix* } } } }
+
+int x;
+int &y = x;
+
+typedef int &z_t;
+z_t z = x;
+
+void f(int &p) {}
+
+struct foo {
+  int &bar;
+  typedef int &bart;
+  bart fool;
+};
+
+void f3(struct foo &p) {}

-- 
Alexandre Oliva, freedom fighter    http://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/   FSF Latin America board member
Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer

Reply via email to