gdb/testsuite: enable running gdb.cp/classes.exp with clang

When attempting to run the gdb.cp/classes.exp test using Clang++, the
test fails to prepare with -Wnon-c-typedef-for-linkage like the
previously fixed gdb.cp/class2.exp. Upon fixing this, the test shows 5
unexpected failures. One such failures is:

ptype/r class class_with_public_typedef
type = class class_with_public_typedef {
  private:
    int a;
  public:
    class_with_public_typedef::INT b;

  private:
    typedef int INT;
}
(gdb) FAIL: gdb.cp/classes.exp: ptype class class_with_public_typedef // wrong access specifier for typedef: private

While g++ provided the following output:

ptype/r class class_with_public_typedef
type = class class_with_public_typedef {
  private:
    int a;
  public:
    class_with_public_typedef::INT b;

    typedef int INT;
}
(gdb) PASS: gdb.cp/classes.exp: ptype class class_with_public_typedef

This error happens because Clang does not add DW_AT_accessibility to
typedefs inside classes, and without this information GDB defaults to
assuming the typedef is private.  Since there is nothing that GDB can do
about this, these tests have been set as xfails, and Clang bug 57608 has
been filed.

Bug: https://github.com/llvm/llvm-project/issues/57608
Approved-by: Tom Tromey <tom@tromey.com>
This commit is contained in:
Bruno Larsen 2022-09-07 15:48:08 +02:00
parent 9e9ffe8ee6
commit 729421925a

View File

@ -24,7 +24,16 @@ load_lib "cp-support.exp"
standard_testfile .cc
if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++}]} {
set flags [list debug c++]
set clang_used false
if { [test_compiler_info "clang-*" "c++"] } {
set clang_used true
if { [gcc_major_version "clang-*" "c++"] >= 11} {
lappend flags additional_flags=-Wno-non-c-typedef-for-linkage
}
}
if {[prepare_for_testing "failed to prepare" $testfile $srcfile $flags]} {
return -1
}
@ -319,6 +328,12 @@ proc test_ptype_class_objects {} {
# Classes with typedefs of different access.
# Clang does not add access information for typedefs in classes.
# More information on: https://github.com/llvm/llvm-project/issues/57608
if {$::clang_used} {
setup_xfail "clang 57608" *-*-*
}
cp_test_ptype_class \
"class class_with_typedefs" "" "class" "class_with_typedefs" \
{
@ -339,6 +354,10 @@ proc test_ptype_class_objects {} {
{ typedef private "typedef int private_int;" }
}
if {$::clang_used} {
setup_xfail "clang 57608" *-*-*
}
cp_test_ptype_class \
"class class_with_public_typedef" "" "class" \
"class_with_public_typedef" {
@ -346,6 +365,11 @@ proc test_ptype_class_objects {} {
{ field public "class_with_public_typedef::INT b;" }
{ typedef public "typedef int INT;" }
}
if {$::clang_used} {
setup_xfail "clang 57608" *-*-*
}
cp_test_ptype_class \
"class class_with_protected_typedef" "" "class" \
"class_with_protected_typedef" {
@ -353,6 +377,11 @@ proc test_ptype_class_objects {} {
{ field protected "class_with_protected_typedef::INT b;" }
{ typedef protected "typedef int INT;" }
}
if {$::clang_used} {
setup_xfail "clang 57608" *-*-*
}
cp_test_ptype_class \
"struct struct_with_protected_typedef" "" "struct" \
"struct_with_protected_typedef" {
@ -360,6 +389,11 @@ proc test_ptype_class_objects {} {
{ field protected "struct_with_protected_typedef::INT b;" }
{ typedef protected "typedef int INT;" }
}
if {$::clang_used} {
setup_xfail "clang 57608" *-*-*
}
cp_test_ptype_class \
"struct struct_with_private_typedef" "" "struct" \
"struct_with_private_typedef" {