diff options
-rw-r--r-- | gdb/cp-namespace.c | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/impl-this.exp | 45 | ||||
-rw-r--r-- | gdb/valops.c | 4 |
3 files changed, 37 insertions, 17 deletions
diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c index 837eafc..1d7759a 100644 --- a/gdb/cp-namespace.c +++ b/gdb/cp-namespace.c @@ -780,12 +780,13 @@ cp_find_type_baseclass_by_name (struct type *parent_type, const char *name) for (i = 0; i < TYPE_N_BASECLASSES (parent_type); ++i) { struct type *type = check_typedef (TYPE_BASECLASS (parent_type, i)); - const char *base_name = TYPE_BASECLASS_NAME (parent_type, i); + const char *tdef_name = TYPE_BASECLASS_NAME (parent_type, i); + const char *base_name = type->name (); if (base_name == NULL) continue; - if (streq (base_name, name)) + if (streq (tdef_name, name) || streq (base_name, name)) return type; type = cp_find_type_baseclass_by_name (type, name); diff --git a/gdb/testsuite/gdb.cp/impl-this.exp b/gdb/testsuite/gdb.cp/impl-this.exp index 2910bf7..4a11fb2 100644 --- a/gdb/testsuite/gdb.cp/impl-this.exp +++ b/gdb/testsuite/gdb.cp/impl-this.exp @@ -26,6 +26,8 @@ if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++}]} { return -1 } +set gcc_used [test_compiler_info gcc-*-*] + # First test expressions when there is no context. with_test_prefix "before run" { gdb_test "print i" "No symbol \"i\" in current context." @@ -63,15 +65,23 @@ with_test_prefix "at D::f (valid expressions)" { gdb_test "print D::i" "= 4" gdb_test "print D::B<int>::i" "= 2" gdb_test "print B<int>::i" "= 2" - gdb_test "print D::Bint::i" \ - "No type \"Bint\" within class or namespace \"D\"." + + if {$gcc_used} { + setup_xfail *-*-* gcc/60833 + } + gdb_test "print D::Bint::i" "= 2" + gdb_test "print Bint::i" "= 2" gdb_test "print D::C::i" "= 3" gdb_test "print C::i" "= 3" gdb_test "print D::B<int>::A<int>::i" "= 1" gdb_test "print B<int>::A<int>::i" "= 1" - gdb_test "print D::Bint::A<int>::i" \ - "No type \"Bint\" within class or namespace \"D\"." + + if {$gcc_used} { + setup_xfail *-*-* gcc/60833 + } + gdb_test "print D::Bint::A<int>::i" "= 1" + gdb_test "print Bint::A<int>::i" "= 1" gdb_test "print A<int>::i" "= 1" gdb_test "print D::C::A<int>::i" "= 1" @@ -88,11 +98,16 @@ with_test_prefix "at D::f (valid expressions)" { with_test_prefix "at D::f (invalid expressions)" { gdb_test "print D::B<int>::c" "There is no field named c" gdb_test "print D::B<int>::A<int>::c" "There is no field named c" - gdb_test "print D::Bint::c" \ - "No type \"Bint\" within class or namespace \"D\"." - gdb_test "print D::Bint::A<int>::c" \ - "No type \"Bint\" within class or namespace \"D\"." + if {$gcc_used} { + setup_xfail *-*-* gcc/60833 + } + gdb_test "print D::Bint::c" "There is no field named c" + if {$gcc_used} { + setup_xfail *-*-* gcc/60833 + } + gdb_test "print D::Bint::A<int>::c" "There is no field named c" + gdb_test "print D::C::A<int>::c" "There is no field named c" gdb_test "print B<int>::c" "There is no field named c" gdb_test "print B<int>::A<int>::c" "There is no field named c" @@ -101,10 +116,16 @@ with_test_prefix "at D::f (invalid expressions)" { gdb_test "print C::A<int>::c" "There is no field named c" gdb_test "print D::B<int>::x" "There is no field named x" gdb_test "print D::B<int>::A<int>::x" "There is no field named x" - gdb_test "print D::Bint::x" \ - "No type \"Bint\" within class or namespace \"D\"." - gdb_test "print D::Bint::A<int>::x" \ - "No type \"Bint\" within class or namespace \"D\"." + + if {$gcc_used} { + setup_xfail *-*-* gcc/60833 + } + gdb_test "print D::Bint::x" "There is no field named x" + if {$gcc_used} { + setup_xfail *-*-* gcc/60833 + } + gdb_test "print D::Bint::A<int>::x" "There is no field named x" + gdb_test "print B<int>::x" "There is no field named x" gdb_test "print B<int>::A<int>::x" "There is no field named x" gdb_test "print Bint::x" "There is no field named x" diff --git a/gdb/valops.c b/gdb/valops.c index 0a215d6..de8a688 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -2066,9 +2066,7 @@ struct_field_searcher::search (struct value *arg1, LONGEST offset, name is not yet filled in. */ int found_baseclass = (m_looking_for_baseclass && TYPE_BASECLASS_NAME (type, i) != NULL - && (strcmp_iw (m_name, - TYPE_BASECLASS_NAME (type, - i)) == 0)); + && (strcmp_iw (m_name, basetype->name ()) == 0)); LONGEST boffset = value_embedded_offset (arg1) + offset; if (BASETYPE_VIA_VIRTUAL (type, i)) |