[02/11] gdb/testsuite: enable running gdb.cp/classes.exp with clang
Commit Message
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 a clang bug has
been filed.
---
gdb/testsuite/gdb.cp/classes.exp | 33 +++++++++++++++++++++++++++++++-
1 file changed, 32 insertions(+), 1 deletion(-)
Comments
Bruno Larsen via Gdb-patches <gdb-patches@sourceware.org> writes:
> 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 a clang bug has
> been filed.
I think it would be useful to include the bug number and URL in the
commit message. I know you included this info in the comments below,
which I think is also a good thing, but having it here too would be
useful.
> ---
> gdb/testsuite/gdb.cp/classes.exp | 33 +++++++++++++++++++++++++++++++-
> 1 file changed, 32 insertions(+), 1 deletion(-)
>
> diff --git a/gdb/testsuite/gdb.cp/classes.exp b/gdb/testsuite/gdb.cp/classes.exp
> index 7b8b315ac1f..3f3e587803c 100644
> --- a/gdb/testsuite/gdb.cp/classes.exp
> +++ b/gdb/testsuite/gdb.cp/classes.exp
> @@ -24,14 +24,20 @@ load_lib "cp-support.exp"
>
> standard_testfile .cc
>
> -if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++}]} {
> +if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++ additional_flags=-Wno-non-c-typedef-for-linkage}]} {
My comments for the previous patch apply here too.
> return -1
> }
>
> +
> # Test ptype of class objects.
Unexpected extra blank line added here.
>
> proc test_ptype_class_objects {} {
>
> + if {[test_compiler_info {clang*}]} {
You should pass the correct language through to test_compiler_info, like
this:
if {[test_compiler_info {clang*} c++]} {
otherwise you are checking the C compiler by default. When I tested
this patch I only changed the C++ compiler to clang, I left the C
compiler as GCC, and the tests showed as FAIL.
Thanks,
Andrew
> + set clang_used true
> + } else {
> + set clang_used false
> + }
> # Simple type.
>
> cp_test_ptype_class \
> @@ -319,6 +325,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 +351,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 +362,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 +374,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 +386,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" {
> --
> 2.37.3
@@ -24,14 +24,20 @@ load_lib "cp-support.exp"
standard_testfile .cc
-if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++}]} {
+if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++ additional_flags=-Wno-non-c-typedef-for-linkage}]} {
return -1
}
+
# Test ptype of class objects.
proc test_ptype_class_objects {} {
+ if {[test_compiler_info {clang*}]} {
+ set clang_used true
+ } else {
+ set clang_used false
+ }
# Simple type.
cp_test_ptype_class \
@@ -319,6 +325,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 +351,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 +362,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 +374,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 +386,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" {