[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
This commit is contained in:
Alexandre Oliva 2016-08-12 07:11:36 +00:00 committed by Alexandre Oliva
parent 8aaf799b00
commit 71e1a6a4c7
4 changed files with 30 additions and 0 deletions

View File

@ -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

View File

@ -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));

View File

@ -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.

View File

@ -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) {}