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 <sivachan...@google.com> 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 } }