Hi,
The attached patch fixes what seems to me as a bug in emitting a
DW_TAG_imported_declaration corresponding to 'using' statements in a
class.
Consider the following:
class A
{
public:
int a;
int method (int i);
};
int
A::method (int i)
{
return i + a;
}
class B : public A
{
public:
using A::method;
int method (const B &b);
};
int
B::method (const B &b)
{
return b.a + a;
}
Before the patch, the die corresponding to the 'using' statement in
class B was getting emitted as a child of the die corresponding to
class A.
ChangeLog:
2014-03-12 Siva Chandra Reddy <[email protected]>
cp/
* class.c (handle_using_decl): Pass the correct scope to
cp_emit_debug_info_for_using.
testsuite/
* g++.dg/debug/dwarf2/imported-decl-2.C: New testcase.
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index b46391b..6ad82d7 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -1299,7 +1299,7 @@ handle_using_decl (tree using_decl, tree t)
old_value = NULL_TREE;
}
- cp_emit_debug_info_for_using (decl, USING_DECL_SCOPE (using_decl));
+ cp_emit_debug_info_for_using (decl, t);
if (is_overloaded_fn (decl))
flist = decl;
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-2.C
b/gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-2.C
new file mode 100644
index 0000000..70200ec
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-2.C
@@ -0,0 +1,32 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -O0 -fno-merge-debug-strings" }
+
+class AAAA
+{
+ public:
+ int method (void);
+ int a;
+};
+
+int
+AAAA::method (void)
+{
+ return a;
+}
+
+class BBBB : public AAAA
+{
+ public:
+ using AAAA::method;
+
+ int method (int b);
+};
+
+int
+BBBB::method (int b)
+{
+ return a + b;
+}
+
+// { dg-final { scan-assembler-not "ascii \"BBBB\\\\0\".*ascii
\"AAAA\\\\0\".*DW_TAG_imported_declaration" } }
+// { dg-final { scan-assembler-times "ascii \"AAAA\\\\0\".*ascii
\"BBBB\\\\0\".*DW_TAG_imported_declaration" 1 } }