[02/11] gdb/testsuite: enable running gdb.cp/classes.exp with clang

Message ID 20221004170747.154307-3-blarsen@redhat.com
State Committed
Headers
Series Cleanup gdb.cp tests when running with clang |

Commit Message

Bruno Larsen Oct. 4, 2022, 5:07 p.m. UTC
  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

Andrew Burgess Oct. 26, 2022, 12:19 p.m. UTC | #1
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
  

Patch

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}]} {
     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" {