diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2016-08-12 07:11:36 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2016-08-12 07:11:36 +0000 |
commit | 71e1a6a4c799e27be77f593c82b1575e094ea548 (patch) | |
tree | 4cbe33f6735cc7602988194ca2515c67d921361d | |
parent | 8aaf799b005461231d75f0889e3c78bd9b35eed9 (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/debug/dwarf2/ref-1.C | 19 |
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) {} |