aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2016-08-12 07:11:36 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2016-08-12 07:11:36 +0000
commit71e1a6a4c799e27be77f593c82b1575e094ea548 (patch)
tree4cbe33f6735cc7602988194ca2515c67d921361d
parent8aaf799b005461231d75f0889e3c78bd9b35eed9 (diff)
downloadgcc-71e1a6a4c799e27be77f593c82b1575e094ea548.zip
gcc-71e1a6a4c799e27be77f593c82b1575e094ea548.tar.gz
gcc-71e1a6a4c799e27be77f593c82b1575e094ea548.tar.bz2
[PR55641] drop spurious const_type from reference_type variables
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. 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. From-SVN: r239402
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/dwarf2out.c4
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/ref-1.C19
4 files changed, 30 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cdc5f29..59e4fcf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
2016-08-12 Alexandre Oliva <aoliva@redhat.com>
+ PR debug/55641
+ * dwarf2out.c (decl_quals): Don't map TREE_READONLY to
+ TYPE_QUAL_CONST in reference-typed decls.
+
PR debug/49366
* dwarf2out.c (loc_list_from_tree_1): Expand some CONSTRUCTORs
in DW_OP_pieces, just enough to handle pointers to member
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index c658220..06dbadb 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -11126,6 +11126,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/ChangeLog b/gcc/testsuite/ChangeLog
index 54939b8..1726157 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2016-08-12 Alexandre Oliva <aoliva@redhat.com>
+ PR debug/55641
+ * g++.dg/debug/dwarf2/ref-1.C: New.
+
PR debug/49366
* g++.dg/debug/dwarf2/template-params-12.H: New.
* g++.dg/debug/dwarf2/template-params-12f.C: New.
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) {}