[review v3] testsuite, cp: increase the coverage of testing pass-by-ref arguments

Luis Machado luis.machado@linaro.org
Tue Jan 14 13:31:00 GMT 2020


On 1/14/20 9:52 AM, Aktemur, Tankut Baris wrote:
> On Monday, January 13, 2020 9:21 PM, Aktemur, Tankut Baris wrote:
>>
>> On Monday, January 13, 2020 8:38 PM, Luis Machado wrote:
>>>
>>> On 1/13/20 4:35 PM, Aktemur, Tankut Baris wrote:
>>>> On Monday, January 13, 2020 7:21 PM, Luis Machado wrote:
>>>>>
>>>>> Hi,
>>>>>
>>>>> I noticed these new tests fail (in large numbers) for GCC 5.4.x. Is it
>>>>> expected? If so, it may be worth making this test conditional on newer
>>>>> GCC versions.
>>>>>
>>>>
>>>> Yes, this is expected. Older GCC versions did not emit certain DWARF attributes
>>>> (DW_AT_deleted, DW_AT_defaulted).  This prevents GDB from making the right
>>>> pass-by-reference decision.  I'll submit a patch for this.
>>>
>>> Thanks for clarifying this.
>>>
>>> I can submit that patch if you like. I have a box running an older GCC,
>>> so i noticed that and thought i'd check.
>>>
>>> Luis
>>
>> Yes, sure.
>>
>> Thank you.
>>
>> -Baris
> 
> I've investigated GCC and Clang for this.  GCC started emitting DW_AT_deleted and
> DW_AT_defaulted with version 7.  Clang does not emit these attributes; however, it
> has been emitting DW_AT_calling_convention starting with version 7.  This
> attribute helps the debugger make the right decision in some cases.
> 
> Based on this, I think the test cases have to be filtered in a somewhat
> fine-granular manner.  Therefore I thought I could save you from the burden of
> having to go through the code-generating test definition.  Below is a patch proposal.
> 
> -Baris

Thanks! I've checked this on my box with an older GCC and i see the 
XFAIL's now. So it looks good to me.

Small nit below...


> 
> 
> 
>  From 86017121c8f1c7d0f0020c7a8da22dba64dad3fd Mon Sep 17 00:00:00 2001
> From: Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
> Date: Tue, 14 Jan 2020 13:36:09 +0100
> Subject: [PATCH] testsuite, cp: add pass-by-ref test expected failures for
>   certain compilers
> 
> There exist expected failures in the pass-by-ref.exp and
> pass-by-ref-2.exp tests based on the GCC and Clang version.
> 
> * GCC version <= 6 and Clang do not emit DW_AT_deleted and
>    DW_AT_defaulted.
> 
> * Clang version >= 7 emits DW_AT_calling_convention, which helps the
>    debugger make the right calling convention decision in some cases
>    despite lacking the 'defaulted' and 'deleted' attributes.
> 
> Mark the related tests as XFAIL based on the compiler version.
> 
> Tested on X86_64 using GCC 5.5.0, 6.5.0, 7.4.0, 8.3.0, 9.2.1;
> and Clang 5.0.1, 6.0.0, 7.0.0, 8.0.0, 9.0.1, 10.0.0.
> 
> gdb/testsuite/ChangeLog:
> 2020-01-14  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
> 
> 	* gdb.cp/pass-by-ref.exp: Mark some tests as XFAIL based on the
> 	GCC/Clang version.
> 	* gdb.cp/pass-by-ref-2.exp: Ditto.
> 
> Change-Id: I1d8440aa438049f7c4da7f4f76f201c48550f1e4
> 
> ---
>   gdb/testsuite/gdb.cp/pass-by-ref-2.exp |  6 ++++++
>   gdb/testsuite/gdb.cp/pass-by-ref.exp   | 26 ++++++++++++++++++++++++++
>   2 files changed, 32 insertions(+)
> 
> diff --git a/gdb/testsuite/gdb.cp/pass-by-ref-2.exp b/gdb/testsuite/gdb.cp/pass-by-ref-2.exp
> index a83ce8d5d7d..e7b04771eb2 100644
> --- a/gdb/testsuite/gdb.cp/pass-by-ref-2.exp
> +++ b/gdb/testsuite/gdb.cp/pass-by-ref-2.exp
> @@ -42,6 +42,10 @@ if {![runto_main]} {
>       return -1
>   }
>   
> +# GCC version <= 6 and Clang do not emit DW_AT_defaulted and DW_AT_deleted
> +set is_gcc_6_or_older [test_compiler_info {gcc-[0-6]-*}]
> +set is_clang [test_compiler_info {clang-*}]
> +
>   set bp_location [gdb_get_line_number "stop here"]
>   gdb_breakpoint $bp_location
>   gdb_continue_to_breakpoint "end of main" ".*return .*;"

It seems to be a mixed bag, but i see more examples of having a period 
after the sentence than not having it. Multiple cases of this on the patch.

> @@ -65,6 +69,7 @@ set sig "\"Inlined\:\:Inlined\\(.*Inlined const\&\\)\""
>   gdb_test "print cbvInlined (inlined)" \
>       "expression cannot be evaluated .* \\(maybe inlined\\?\\)"
>   
> +if {$is_gcc_6_or_older || $is_clang} {setup_xfail "*-*-*"}
>   gdb_test "print cbvDtorDel (*dtorDel)" \
>       ".* cannot be evaluated .* 'DtorDel' is not destructible" \
>       "type not destructible"
> @@ -94,6 +99,7 @@ gdb_test "print cbvTwoMCtor (twoMctor)" \
>       ".* cannot be evaluated .* 'TwoMCtor' is not copy constructible" \
>       "copy ctor is implicitly deleted"
>   
> +if {$is_gcc_6_or_older || $is_clang} {setup_xfail "*-*-*"}
>   gdb_test "print cbvTwoMCtorAndCCtor (twoMctorAndCctor)" "12" \
>       "call cbvTwoMCtorAndCCtor"
>   gdb_test "print twoMctorAndCctor.x" "2" \
> diff --git a/gdb/testsuite/gdb.cp/pass-by-ref.exp b/gdb/testsuite/gdb.cp/pass-by-ref.exp
> index f500710fd43..aff9f9a3c1e 100644
> --- a/gdb/testsuite/gdb.cp/pass-by-ref.exp
> +++ b/gdb/testsuite/gdb.cp/pass-by-ref.exp
> @@ -369,6 +369,12 @@ proc test_for_class { prefix states cbvfun data_field length} {
>       global ADDED
>       global TRACE
>   
> +    # GCC version <= 6 and Clang do not emit DW_AT_defaulted and DW_AT_deleted
> +    set is_gcc_6_or_older [test_compiler_info {gcc-[0-6]-*}]
> +    set is_clang [test_compiler_info {clang-*}]
> +    # But Clang version >= 7 emits DW_AT_calling_convention for types
> +    set is_clang_6_or_older [test_compiler_info {clang-[0-6]-*}]
> +
>       with_test_prefix $name {
>   	if {[is_copy_constructible $states]} {
>   	    set expected [expr {$ORIGINAL + $ADDED}]
> @@ -378,6 +384,19 @@ proc test_for_class { prefix states cbvfun data_field length} {
>   	    if {$dtor == "explicit"} {
>   		gdb_test "print tracer = 0" " = 0" "reset the tracer"
>   	    }
> +
> +	    if {$cctor == "defaultedIn" || $dtor == "defaultedIn"} {
> +		if {$is_gcc_6_or_older || $is_clang_6_or_older} {
> +		    setup_xfail "*-*-*"
> +		} elseif {$is_clang} {
> +		    # If this is a pass-by-value case, Clang >= 7's
> +		    # DW_AT_calling_convention leads to the right decision.
> +		    # Otherwise, it is expected to fail.
> +		    if {"defaultedOut" in $states || "explicit" in $states} {
> +			setup_xfail "*-*-*"
> +		    }
> +		}
> +	    }
>   	    gdb_test "print ${cbvfun}<$name> (${name}_var)" " = $expected" \
>   		"call '$cbvfun'"
>   	    gdb_test "print ${name}_var.${data_field}\[0\]" " = $ORIGINAL" \
> @@ -389,10 +408,17 @@ proc test_for_class { prefix states cbvfun data_field length} {
>   		    "cbv argument should not change (item $last_index)"
>   	    }
>   	    if {$dtor == "explicit"} {
> +		if {$cctor == "defaultedIn"
> +		    && ($is_gcc_6_or_older || $is_clang)} {
> +		    setup_xfail "*-*-*"
> +		}
>   		gdb_test "print tracer" " = $TRACE" \
>   		    "destructor should be called"
>   	    }
>   	} else {
> +	    if {$cctor == "deleted" && ($is_gcc_6_or_older || $is_clang)} {
> +		setup_xfail "*-*-*"
> +	    }
>   	    gdb_test "print ${cbvfun}<$name> (${name}_var)" \
>   		".* cannot be evaluated .* '${name}' is not copy constructible" \
>   		"calling '$cbvfun' should be refused"
> 



More information about the Gdb-patches mailing list