Re: [PATCH,v2] Make language setting tests more robust

Simon Marchi
2017-02-02T01:33:21Z

On 2017-02-01 15:21, Luis Machado wrote:
> New in v2:
>
> - Remove gdb.objc/objc.exp, since it was empty after the removal of
> set_lang_objc.
> - Deleted stale comments from .exp files.
> - set_language now has a couple of fixed arguments (language and
> message) and
> is simplified.
>
> This patch robustifies the setting of the language in gdb. Right now
> most of
> the tests assume "set language" is a silent command and use
> gdb_test_no_output
> for testing, but it may output a warning stating the language the user
> wants
> to select does not match the frame's language. When this happens we
> have a
> failure. This is also the case with "show language", where it outputs
> the
> language currently-selected but may also output said warning.
>
> One case of the warning being displayed happens when one has debug
> information
> for glibc, which may cause GDB to identify the frame as having an "asm"
> language. Therefore setting it to something else will get GDB's
> attention.
>
> This patch addresses the problem by creating a function in lib/gdb.exp
> to
> set the language. That function will also handle potential warnings and
> check
> to make sure the language was properly selected.
>
> Also, i noticed most of the languages have their own
> set_lang_<language> proc,
> and they are all the same. Therefore i've removed those and switched
> to using
> only the new set_language proc.
>
> I tried to confirm why set_lang_<language> was replicated, but my
> conclusion
> was that it was just the way the code worked and people just
> copy/pasted from
> an existing language .exp file.
>
> Overall i see no regressions with Ubuntu 16.04 x86-64, though the
> number of
> tests changed slightly due to the way set_language works. No
> additional
> failures nonetheless.
>
> 2017-02-01 Luis Machado <lgustavo@codesourcery.com>
>
> * gdb.arch/i386-stap-eval-lang-ada.exp: Use new set_language proc.
> * gdb.base/callfuncs.exp: Likewise.
> * gdb.compile/compile-ifunc.exp: Likewise.
> * gdb.cp/classes.exp: Likewise.
> * gdb.cp/cmpd-minsyms.exp: Likewise.
> * gdb.cp/cplusfuncs.exp: Likewise.
> * gdb.cp/debug-expr.exp: Likewise.
> * gdb.cp/demangle.exp: Likewise.
> * gdb.cp/expand-psymtabs-cxx.exp: Likewise.
> * gdb.cp/inherit.exp: Likewise.
> * gdb.cp/overload-const.exp: Likewise.
> * gdb.cp/psymtab-parameter.exp: Likewise.
> * gdb.cp/ptype-flags.exp: Likewise.
> * gdb.cp/typedef-operator.exp: Likewise.
> * gdb.cp/var-tag.exp: Likewise.
> * gdb.cp/virtfunc.exp: Likewise.
> * gdb.dlang/circular.exp: Likewise.
> * gdb.dlang/debug-expr.exp: Likewise.
> * gdb.dlang/demangle.exp: Likewise.
> * gdb.dlang/expression.exp: Likewise.
> * gdb.dlang/primitive-types.exp: Likewise.
> * gdb.dlang/properties.exp: Likewise.
> * gdb.dwarf2/arr-stride.exp: Likewise.
> * gdb.dwarf2/arr-subrange.exp: Likewise.
> * gdb.dwarf2/data-loc.exp: Likewise.
> * gdb.dwarf2/dw2-cp-infcall-ref-static.exp: Likewise.
> * gdb.dwarf2/dw2-linkage-name-trust.exp: Likewise.
> * gdb.dwarf2/dynarr-ptr.exp: Likewise.
> * gdb.dwarf2/subrange.exp: Likewise.
> * gdb.fortran/exprs.exp: Likewise.
> * gdb.fortran/types.exp: Likewise.
> * gdb.go/basic-types.exp: Likewise.
> * gdb.go/print.exp: Likewise.
> * gdb.objc/print.exp: Likewise.
> * gdb.opencl/datatypes.exp: Likewise.
> * gdb.pascal/print.exp: Likewise.
> * gdb.pascal/types.exp: Likewise.
> * gdb.python/py-lookup-type.exp: Likewise.
> * gdb.rust/expr.exp: Likewise.
> * lib/d-support.exp (set_lang_d): Remove.
> * lib/fortran.exp (set_lang_fortran): Remove.
> * lib/gdb.exp (set_language): New proc.
> * lib/go.exp (set_lang_go): Remove.
> * lib/objc.exp: Remove file.
> * lib/pascal.exp (set_lang_pascal): Remove.
> * lib/rust-support.exp (set_lang_rust): Remove.
> ---
> gdb/testsuite/gdb.arch/i386-stap-eval-lang-ada.exp | 2 +-
> gdb/testsuite/gdb.base/callfuncs.exp | 2 +-
> gdb/testsuite/gdb.compile/compile-ifunc.exp | 2 +-
> gdb/testsuite/gdb.cp/classes.exp | 2 +-
> gdb/testsuite/gdb.cp/cmpd-minsyms.exp | 2 +-
> gdb/testsuite/gdb.cp/cplusfuncs.exp | 2 +-
> gdb/testsuite/gdb.cp/debug-expr.exp | 2 +-
> gdb/testsuite/gdb.cp/demangle.exp | 4 +-
> gdb/testsuite/gdb.cp/expand-psymtabs-cxx.exp | 2 +-
> gdb/testsuite/gdb.cp/inherit.exp | 2 +-
> gdb/testsuite/gdb.cp/overload-const.exp | 2 +-
> gdb/testsuite/gdb.cp/psymtab-parameter.exp | 2 +-
> gdb/testsuite/gdb.cp/ptype-flags.exp | 2 +-
> gdb/testsuite/gdb.cp/typedef-operator.exp | 2 +-
> gdb/testsuite/gdb.cp/var-tag.exp | 4 +-
> gdb/testsuite/gdb.cp/virtfunc.exp | 2 +-
> gdb/testsuite/gdb.dlang/circular.exp | 2 +-
> gdb/testsuite/gdb.dlang/debug-expr.exp | 2 +-
> gdb/testsuite/gdb.dlang/demangle.exp | 2 +-
> gdb/testsuite/gdb.dlang/expression.exp | 2 +-
> gdb/testsuite/gdb.dlang/primitive-types.exp | 2 +-
> gdb/testsuite/gdb.dlang/properties.exp | 2 +-
> gdb/testsuite/gdb.dwarf2/arr-stride.exp | 2 +-
> gdb/testsuite/gdb.dwarf2/arr-subrange.exp | 2 +-
> gdb/testsuite/gdb.dwarf2/data-loc.exp | 2 +-
> .../gdb.dwarf2/dw2-cp-infcall-ref-static.exp | 2 +-
> .../gdb.dwarf2/dw2-linkage-name-trust.exp | 2 +-
> gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp | 2 +-
> gdb/testsuite/gdb.dwarf2/subrange.exp | 2 +-
> gdb/testsuite/gdb.fortran/exprs.exp | 2 +-
> gdb/testsuite/gdb.fortran/types.exp | 2 +-
> gdb/testsuite/gdb.go/basic-types.exp | 2 +-
> gdb/testsuite/gdb.go/print.exp | 2 +-
> gdb/testsuite/gdb.objc/print.exp | 4 +-
> gdb/testsuite/gdb.opencl/datatypes.exp | 6 +--
> gdb/testsuite/gdb.pascal/print.exp | 2 +-
> gdb/testsuite/gdb.pascal/types.exp | 2 +-
> gdb/testsuite/gdb.python/py-lookup-type.exp | 2 +-
> gdb/testsuite/gdb.rust/expr.exp | 2 +-
> gdb/testsuite/lib/d-support.exp | 14 -------
> gdb/testsuite/lib/fortran.exp | 14 -------
> gdb/testsuite/lib/gdb.exp | 43
> ++++++++++++++++++++++
> gdb/testsuite/lib/go.exp | 14 -------
> gdb/testsuite/lib/objc.exp | 30
> ---------------
> gdb/testsuite/lib/pascal.exp | 14 -------
> gdb/testsuite/lib/rust-support.exp | 13 -------
> 46 files changed, 86 insertions(+), 144 deletions(-)
> delete mode 100644 gdb/testsuite/lib/objc.exp
>
> diff --git a/gdb/testsuite/gdb.arch/i386-stap-eval-lang-ada.exp
> b/gdb/testsuite/gdb.arch/i386-stap-eval-lang-ada.exp
> index 8449ffa..41530ea 100644
> --- a/gdb/testsuite/gdb.arch/i386-stap-eval-lang-ada.exp
> +++ b/gdb/testsuite/gdb.arch/i386-stap-eval-lang-ada.exp
> @@ -25,7 +25,7 @@ if { [prepare_for_testing "failed to prepare"
> $testfile $srcfile] } {
> return -1
> }
>
> -gdb_test_no_output "set language ada"
> +set_language "ada"
>
> if { ![runto "-pstap bar"] } {
> return -1
> diff --git a/gdb/testsuite/gdb.base/callfuncs.exp
> b/gdb/testsuite/gdb.base/callfuncs.exp
> index 3651963..ae30fae 100644
> --- a/gdb/testsuite/gdb.base/callfuncs.exp
> +++ b/gdb/testsuite/gdb.base/callfuncs.exp
> @@ -303,7 +303,7 @@ proc rerun_and_prepare {} {
> gdb_suppress_tests
> }
>
> - gdb_test_no_output "set language c"
> + set_language "c"
>
> get_debug_format
>
> diff --git a/gdb/testsuite/gdb.compile/compile-ifunc.exp
> b/gdb/testsuite/gdb.compile/compile-ifunc.exp
> index dc442ff..fc37720 100644
> --- a/gdb/testsuite/gdb.compile/compile-ifunc.exp
> +++ b/gdb/testsuite/gdb.compile/compile-ifunc.exp
> @@ -29,7 +29,7 @@ with_test_prefix "nodebug" {
> # GDB happened to see real asm code when it stopped at the entry
> point
> # when talking to a remote target, like gdbserver. This
> guarantees the
> # feature check below will work.
> - gdb_test_no_output "set language c" ""
> + set_language "c"
>
> if {[skip_compile_feature_tests]} {
> untested "compile command not supported (could not find libcc1
> shared library?)"
> diff --git a/gdb/testsuite/gdb.cp/classes.exp
> b/gdb/testsuite/gdb.cp/classes.exp
> index 256fa68..ef0e515 100644
> --- a/gdb/testsuite/gdb.cp/classes.exp
> +++ b/gdb/testsuite/gdb.cp/classes.exp
> @@ -551,7 +551,7 @@ proc do_tests {} {
> global nl
>
>
> - gdb_test_no_output "set language c++" ""
> + set_language "c++"
> gdb_test_no_output "set width 0" ""
>
> if ![runto_main ] then {
> diff --git a/gdb/testsuite/gdb.cp/cmpd-minsyms.exp
> b/gdb/testsuite/gdb.cp/cmpd-minsyms.exp
> index bff6967..9d5c559 100644
> --- a/gdb/testsuite/gdb.cp/cmpd-minsyms.exp
> +++ b/gdb/testsuite/gdb.cp/cmpd-minsyms.exp
> @@ -40,7 +40,7 @@ foreach sym $min_syms {
> }
>
>
> -gdb_test_no_output "set language c++"
> +set_language "c++"
>
> # A list of minimal symbol names to check.
> # Note that GDB<char>::even_harder<int>(char) is quoted and includes
> diff --git a/gdb/testsuite/gdb.cp/cplusfuncs.exp
> b/gdb/testsuite/gdb.cp/cplusfuncs.exp
> index 0b90500..28c5617 100644
> --- a/gdb/testsuite/gdb.cp/cplusfuncs.exp
> +++ b/gdb/testsuite/gdb.cp/cplusfuncs.exp
> @@ -584,7 +584,7 @@ proc do_tests {} {
>
> runto_main
>
> - gdb_test_no_output "set language c++"
> + set_language "c++"
> probe_demangler
> test_paddr_overloaded_functions
> test_paddr_operator_functions
> diff --git a/gdb/testsuite/gdb.cp/debug-expr.exp
> b/gdb/testsuite/gdb.cp/debug-expr.exp
> index b20de5b..a941e99 100644
> --- a/gdb/testsuite/gdb.cp/debug-expr.exp
> +++ b/gdb/testsuite/gdb.cp/debug-expr.exp
> @@ -18,7 +18,7 @@
> if { [skip_cplus_tests] } { continue }
>
> gdb_start
> -gdb_test_no_output "set language c++"
> +set_language "c++"
> gdb_test_no_output "set debug expression 1"
>
> # Test whether the expression debug machinery accepts the expression.
> diff --git a/gdb/testsuite/gdb.cp/demangle.exp
> b/gdb/testsuite/gdb.cp/demangle.exp
> index 0ecf95d..c4a9e6e 100644
> --- a/gdb/testsuite/gdb.cp/demangle.exp
> +++ b/gdb/testsuite/gdb.cp/demangle.exp
> @@ -1547,7 +1547,7 @@ proc do_tests {} {
> gdb_exit
> gdb_start
>
> - gdb_test_no_output "set language c++"
> + set_language "c++"
> gdb_test_no_output "set width 0"
>
> # Using catch_demangling_errors this way ensures that, if one of
> @@ -1559,7 +1559,7 @@ proc do_tests {} {
> catch_demangling_errors test_hp_style_demangling
>
> # Verify specifying demangle language.
> - gdb_test_no_output "set language unknown"
> + set_language "unknown"
> set_demangling_style "auto"
> gdb_test_exact "demangle -l c++ -- _ZSt4cout" "std::cout"
> gdb_test_exact "demangle -l c++ _ZSt4cout" "std::cout"
> diff --git a/gdb/testsuite/gdb.cp/expand-psymtabs-cxx.exp
> b/gdb/testsuite/gdb.cp/expand-psymtabs-cxx.exp
> index ad2111c..112b717 100644
> --- a/gdb/testsuite/gdb.cp/expand-psymtabs-cxx.exp
> +++ b/gdb/testsuite/gdb.cp/expand-psymtabs-cxx.exp
> @@ -26,7 +26,7 @@ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}"
> "${binfile}" object {debug c
>
> clean_restart ${executable}
>
> -gdb_test_no_output "set language c++"
> +set_language "c++"
>
> # FAIL was:
> # $1 = {<text variable, no debug info>} 0
> diff --git a/gdb/testsuite/gdb.cp/inherit.exp
> b/gdb/testsuite/gdb.cp/inherit.exp
> index d80caee..9caafc8 100644
> --- a/gdb/testsuite/gdb.cp/inherit.exp
> +++ b/gdb/testsuite/gdb.cp/inherit.exp
> @@ -682,7 +682,7 @@ proc do_tests { } {
> return
> }
>
> - gdb_test_no_output "set language c++"
> + set_language "c++"
> test_ptype_si
> test_ptype_mi
> test_ptype_vi
> diff --git a/gdb/testsuite/gdb.cp/overload-const.exp
> b/gdb/testsuite/gdb.cp/overload-const.exp
> index 0d7b0ae..feb4e96 100644
> --- a/gdb/testsuite/gdb.cp/overload-const.exp
> +++ b/gdb/testsuite/gdb.cp/overload-const.exp
> @@ -23,7 +23,7 @@ if {[prepare_for_testing "failed to prepare"
> $testfile $testfile.cc {c++ debug}]
> return -1
> }
>
> -gdb_test_no_output "set language c++"
> +set_language "c++"
>
> if [gdb_breakpoint "myclass::func"] {
> pass "setting breakpoint at myclass::func"
> diff --git a/gdb/testsuite/gdb.cp/psymtab-parameter.exp
> b/gdb/testsuite/gdb.cp/psymtab-parameter.exp
> index 3d78de9..0bddd80 100644
> --- a/gdb/testsuite/gdb.cp/psymtab-parameter.exp
> +++ b/gdb/testsuite/gdb.cp/psymtab-parameter.exp
> @@ -25,7 +25,7 @@ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}"
> "${binfile}.x" object {debug
> clean_restart $testfile.x
>
> # As `main' is not present GDB fails to find the proper inferior
> language.
> -gdb_test_no_output "set language c++"
> +set_language "c++"
>
> # The goal is to keep the CU (Compilation Unit) unexpanded. It would
> be rather
> # XFAIL than FAIL here. For example -readnow breaks it.
> diff --git a/gdb/testsuite/gdb.cp/ptype-flags.exp
> b/gdb/testsuite/gdb.cp/ptype-flags.exp
> index 24c4e31..e82f7d0 100644
> --- a/gdb/testsuite/gdb.cp/ptype-flags.exp
> +++ b/gdb/testsuite/gdb.cp/ptype-flags.exp
> @@ -30,7 +30,7 @@ if ![runto_main] then {
> return
> }
>
> -gdb_test_no_output "set language c++" ""
> +set_language "c++"
> gdb_test_no_output "set width 0" ""
>
> proc do_check {name {flags ""} {show_typedefs 1} {show_methods 1} {raw
> 0}} {
> diff --git a/gdb/testsuite/gdb.cp/typedef-operator.exp
> b/gdb/testsuite/gdb.cp/typedef-operator.exp
> index 5c5fda6..5180aac 100644
> --- a/gdb/testsuite/gdb.cp/typedef-operator.exp
> +++ b/gdb/testsuite/gdb.cp/typedef-operator.exp
> @@ -23,7 +23,7 @@ if {[prepare_for_testing "failed to prepare"
> $testfile $srcfile {c++ debug}]} {
> return -1
> }
>
> -gdb_test_no_output "set language c++"
> +set_language "c++"
>
> gdb_test "p *u" {You can't do that without a process to debug.} "test
> crash"
>
> diff --git a/gdb/testsuite/gdb.cp/var-tag.exp
> b/gdb/testsuite/gdb.cp/var-tag.exp
> index 5524468..b85055b 100644
> --- a/gdb/testsuite/gdb.cp/var-tag.exp
> +++ b/gdb/testsuite/gdb.cp/var-tag.exp
> @@ -37,7 +37,7 @@ proc do_global_tests {lang} {
> set ptypefmt "type = (class|enum|union|struct) %s
> $opt_underlying{.*}"
>
> with_test_prefix $lang {
> - gdb_test_no_output "set language $lang"
> + set_language "$lang"
> gdb_test "ptype C" "type = class C {.*}"
> gdb_test "print E" "= a"
> gdb_test "ptype E" "type = enum E $opt_underlying{.*}"
> @@ -102,7 +102,7 @@ with_test_prefix "in C::f" {
> # Another hard-to-guess-the-users-intent bug...
> # It would be really nice if we could query the user!
> with_test_prefix "global collision" {
> - gdb_test_no_output "set language c++"
> + set_language "c++"
> setup_kfail "c++/16463" "*-*-*"
> gdb_test "print global" "= 3"
>
> diff --git a/gdb/testsuite/gdb.cp/virtfunc.exp
> b/gdb/testsuite/gdb.cp/virtfunc.exp
> index 7b8f672..c0ae27d 100644
> --- a/gdb/testsuite/gdb.cp/virtfunc.exp
> +++ b/gdb/testsuite/gdb.cp/virtfunc.exp
> @@ -270,7 +270,7 @@ proc test_info_vtbl {} {
> }
>
> proc do_tests {} {
> - gdb_test_no_output "set language c++" ""
> + set_language "c++"
> gdb_test_no_output "set width 0" ""
>
> if ![runto_main] then {
> diff --git a/gdb/testsuite/gdb.dlang/circular.exp
> b/gdb/testsuite/gdb.dlang/circular.exp
> index 205cde2..09ac534 100644
> --- a/gdb/testsuite/gdb.dlang/circular.exp
> +++ b/gdb/testsuite/gdb.dlang/circular.exp
> @@ -139,7 +139,7 @@ if { [prepare_for_testing "failed to prepare"
> ${testfile} \
> return -1
> }
>
> -gdb_test_no_output "set language d"
> +set_language "d"
>
> if {![runto "circular1.found"]} {
> return -1
> diff --git a/gdb/testsuite/gdb.dlang/debug-expr.exp
> b/gdb/testsuite/gdb.dlang/debug-expr.exp
> index d62dcc6..bd58421 100644
> --- a/gdb/testsuite/gdb.dlang/debug-expr.exp
> +++ b/gdb/testsuite/gdb.dlang/debug-expr.exp
> @@ -18,7 +18,7 @@
> if { [skip_d_tests] } { return -1 }
>
> gdb_start
> -gdb_test_no_output "set language d"
> +set_language "d"
> gdb_test_no_output "set debug expression 1"
>
> # Test whether the expression debug machinery accepts the expression.
> diff --git a/gdb/testsuite/gdb.dlang/demangle.exp
> b/gdb/testsuite/gdb.dlang/demangle.exp
> index baf6d6f..77b7968 100644
> --- a/gdb/testsuite/gdb.dlang/demangle.exp
> +++ b/gdb/testsuite/gdb.dlang/demangle.exp
> @@ -200,7 +200,7 @@ proc test_d_demangling {} {
> gdb_exit
> gdb_start
>
> -if [set_lang_d] {
> +if [set_language "d"] {
> gdb_test_no_output "set width 0"
>
> test_d_demangling
> diff --git a/gdb/testsuite/gdb.dlang/expression.exp
> b/gdb/testsuite/gdb.dlang/expression.exp
> index 700f59b..9ec95a3 100644
> --- a/gdb/testsuite/gdb.dlang/expression.exp
> +++ b/gdb/testsuite/gdb.dlang/expression.exp
> @@ -128,7 +128,7 @@ proc test_d_expressions {} {
> gdb_exit
> gdb_start
>
> -if [set_lang_d] {
> +if [set_language "d"] {
> test_d_integer_literals
> test_d_float_literals
> test_d_expressions
> diff --git a/gdb/testsuite/gdb.dlang/primitive-types.exp
> b/gdb/testsuite/gdb.dlang/primitive-types.exp
> index eec10ef..241cd6a 100644
> --- a/gdb/testsuite/gdb.dlang/primitive-types.exp
> +++ b/gdb/testsuite/gdb.dlang/primitive-types.exp
> @@ -54,7 +54,7 @@ proc test_builtin_d_types_accepted {} {
> gdb_exit
> gdb_start
>
> -if [set_lang_d] {
> +if [set_language "d"] {
> test_builtin_d_types_accepted
> } else {
> warning "D type tests suppressed."
> diff --git a/gdb/testsuite/gdb.dlang/properties.exp
> b/gdb/testsuite/gdb.dlang/properties.exp
> index de95bd6..1ef8de3 100644
> --- a/gdb/testsuite/gdb.dlang/properties.exp
> +++ b/gdb/testsuite/gdb.dlang/properties.exp
> @@ -85,7 +85,7 @@ proc test_d_typeof {} {
> gdb_exit
> gdb_start
>
> -if [set_lang_d] {
> +if [set_language "d"] {
> test_d_sizeof
> test_d_typeof
> } else {
> diff --git a/gdb/testsuite/gdb.dwarf2/arr-stride.exp
> b/gdb/testsuite/gdb.dwarf2/arr-stride.exp
> index e628d26..201072c 100644
> --- a/gdb/testsuite/gdb.dwarf2/arr-stride.exp
> +++ b/gdb/testsuite/gdb.dwarf2/arr-stride.exp
> @@ -88,7 +88,7 @@ if { [prepare_for_testing "failed to prepare"
> ${testfile} \
> return -1
> }
>
> -gdb_test_no_output "set language ada"
> +set_language "ada"
>
> gdb_test "ptype pck.table" \
> "type = array \\(0 \\.\\. 4\\) of pck\\.item <packed: 6-bit
> elements>"
> diff --git a/gdb/testsuite/gdb.dwarf2/arr-subrange.exp
> b/gdb/testsuite/gdb.dwarf2/arr-subrange.exp
> index 1cfffda..8f74448 100644
> --- a/gdb/testsuite/gdb.dwarf2/arr-subrange.exp
> +++ b/gdb/testsuite/gdb.dwarf2/arr-subrange.exp
> @@ -82,7 +82,7 @@ if { [prepare_for_testing "failed to prepare"
> ${testfile} \
> return -1
> }
>
> -gdb_test_no_output "set language ada"
> +set_language "ada"
>
> gdb_test "ptype pck.table" \
> "type = array \\(enum_000 \\.\\. enum_128\\) of boolean"
> diff --git a/gdb/testsuite/gdb.dwarf2/data-loc.exp
> b/gdb/testsuite/gdb.dwarf2/data-loc.exp
> index 3e4c845..3ef93a8 100644
> --- a/gdb/testsuite/gdb.dwarf2/data-loc.exp
> +++ b/gdb/testsuite/gdb.dwarf2/data-loc.exp
> @@ -129,7 +129,7 @@ if ![runto_main] {
> return -1
> }
>
> -gdb_test_no_output "set language ada"
> +set_language "ada"
>
> # foo.three
>
> diff --git a/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.exp
> b/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.exp
> index d03d2ab..4fe0964 100644
> --- a/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.exp
> +++ b/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.exp
> @@ -37,7 +37,7 @@ if ![runto_main] then {
> }
>
> # main is not provided by DWARF.
> -gdb_test_no_output "set language c++"
> +set_language "c++"
>
> # There are no mangled names in DWARF to suggest the v3 ABI.
> gdb_test_no_output "set cp-abi gnu-v3"
> diff --git a/gdb/testsuite/gdb.dwarf2/dw2-linkage-name-trust.exp
> b/gdb/testsuite/gdb.dwarf2/dw2-linkage-name-trust.exp
> index 4275d5d..c339328 100644
> --- a/gdb/testsuite/gdb.dwarf2/dw2-linkage-name-trust.exp
> +++ b/gdb/testsuite/gdb.dwarf2/dw2-linkage-name-trust.exp
> @@ -39,7 +39,7 @@ if ![runto_main] then {
> }
>
> # main is not provided by DWARF.
> -gdb_test_no_output "set language c++"
> +set_language "c++"
>
> # There are no mangled names in DWARF to suggest the v3 ABI.
> gdb_test_no_output "set cp-abi gnu-v3"
> diff --git a/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
> b/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
> index f7eff69..7567d82 100644
> --- a/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
> +++ b/gdb/testsuite/gdb.dwarf2/dynarr-ptr.exp
> @@ -130,7 +130,7 @@ if ![runto_main] {
> return -1
> }
>
> -gdb_test_no_output "set language ada"
> +set_language "ada"
>
> # foo.three_ptr.all
>
> diff --git a/gdb/testsuite/gdb.dwarf2/subrange.exp
> b/gdb/testsuite/gdb.dwarf2/subrange.exp
> index 9c9df7d..3d00bf3 100644
> --- a/gdb/testsuite/gdb.dwarf2/subrange.exp
> +++ b/gdb/testsuite/gdb.dwarf2/subrange.exp
> @@ -65,7 +65,7 @@ if { [prepare_for_testing "failed to prepare"
> ${testfile} \
> return -1
> }
>
> -gdb_test_no_output "set language pascal"
> +set_language "pascal"
>
> gdb_test "ptype TByteArray" \
> "type = array \\\[0\\.\\.191\\\] of byte"
> diff --git a/gdb/testsuite/gdb.fortran/exprs.exp
> b/gdb/testsuite/gdb.fortran/exprs.exp
> index 1aa7f4c..b9e42ef 100644
> --- a/gdb/testsuite/gdb.fortran/exprs.exp
> +++ b/gdb/testsuite/gdb.fortran/exprs.exp
> @@ -249,7 +249,7 @@ gdb_reinitialize_dir $srcdir/$subdir
>
> gdb_test "set print sevenbit-strings" ""
>
> -if [set_lang_fortran] then {
> +if [set_language "fortran"] then {
> test_value_history
> test_convenience_variables
> test_integer_literals_accepted
> diff --git a/gdb/testsuite/gdb.fortran/types.exp
> b/gdb/testsuite/gdb.fortran/types.exp
> index 9549515..1c3d677 100644
> --- a/gdb/testsuite/gdb.fortran/types.exp
> +++ b/gdb/testsuite/gdb.fortran/types.exp
> @@ -80,7 +80,7 @@ gdb_reinitialize_dir $srcdir/$subdir
>
> gdb_test "set print sevenbit-strings" ""
>
> -if [set_lang_fortran] then {
> +if [set_language "fortran"] then {
> test_integer_literal_types_accepted
> test_integer_literal_types_rejected
> test_logical_literal_types_accepted
> diff --git a/gdb/testsuite/gdb.go/basic-types.exp
> b/gdb/testsuite/gdb.go/basic-types.exp
> index 453e5e2..85d5849 100644
> --- a/gdb/testsuite/gdb.go/basic-types.exp
> +++ b/gdb/testsuite/gdb.go/basic-types.exp
> @@ -106,7 +106,7 @@ gdb_exit
> gdb_start
> gdb_reinitialize_dir $srcdir/$subdir
>
> -if [set_lang_go] {
> +if [set_language "go"] {
> test_integer_literal_types_accepted
> test_logical_literal_types_accepted
> test_character_literal_types_accepted
> diff --git a/gdb/testsuite/gdb.go/print.exp
> b/gdb/testsuite/gdb.go/print.exp
> index c95dc09..01868f6 100644
> --- a/gdb/testsuite/gdb.go/print.exp
> +++ b/gdb/testsuite/gdb.go/print.exp
> @@ -62,7 +62,7 @@ gdb_exit
> gdb_start
> gdb_reinitialize_dir $srcdir/$subdir
>
> -if [set_lang_go] {
> +if [set_language "go"] {
> test_float_accepted
> test_float_rejected
> } else {
> diff --git a/gdb/testsuite/gdb.objc/print.exp
> b/gdb/testsuite/gdb.objc/print.exp
> index 9ea4764..17703bb 100644
> --- a/gdb/testsuite/gdb.objc/print.exp
> +++ b/gdb/testsuite/gdb.objc/print.exp
> @@ -21,8 +21,6 @@
> # Test printing of various values.
> # NOTE: The tests here intentionally do not require an objc compiler.
>
> -load_lib "objc.exp"
> -
> proc test_float_accepted {} {
> global gdb_prompt
>
> @@ -63,7 +61,7 @@ gdb_exit
> gdb_start
> gdb_reinitialize_dir $srcdir/$subdir
>
> -if [set_lang_objc] {
> +if [set_language "objective-c"] {
> test_float_accepted
> test_float_rejected
> } else {
> diff --git a/gdb/testsuite/gdb.opencl/datatypes.exp
> b/gdb/testsuite/gdb.opencl/datatypes.exp
> index 572e329..baf7be9 100644
> --- a/gdb/testsuite/gdb.opencl/datatypes.exp
> +++ b/gdb/testsuite/gdb.opencl/datatypes.exp
> @@ -36,7 +36,7 @@ gdb_exit
> gdb_start
>
> # Manually switch the language to opencl
> -gdb_test_no_output "set language opencl" "no prompt when setting the
> language to opencl"
> +set_language "opencl" "no prompt when setting the language to opencl"
>
> # Check OpenCL data types (GDB)
> gdb_test "whatis bool" "type = bool"
> @@ -194,8 +194,8 @@ gdb_test "whatis double16" "type = double16"
> gdb_test "p sizeof(double16)" " = 128"
>
> # Set the language back to the default: "auto; currently c"
> -gdb_test_no_output "set language c" "no prompt when setting the
> language to c"
> -gdb_test_no_output "set language auto" "no prompt when setting the
> language to auto"
> +set_language "c" "no prompt when setting the language to c"
> +set_language "auto" "no prompt when setting the language to auto"
>
> # Load the OpenCL app
> gdb_reinitialize_dir $srcdir/$subdir
> diff --git a/gdb/testsuite/gdb.pascal/print.exp
> b/gdb/testsuite/gdb.pascal/print.exp
> index 458630d..eadbe3a 100644
> --- a/gdb/testsuite/gdb.pascal/print.exp
> +++ b/gdb/testsuite/gdb.pascal/print.exp
> @@ -63,7 +63,7 @@ gdb_exit
> gdb_start
> gdb_reinitialize_dir $srcdir/$subdir
>
> -if [set_lang_pascal] {
> +if [set_language "pascal"] {
> test_float_accepted
> test_float_rejected
> } else {
> diff --git a/gdb/testsuite/gdb.pascal/types.exp
> b/gdb/testsuite/gdb.pascal/types.exp
> index 4a2374b..0e31673 100644
> --- a/gdb/testsuite/gdb.pascal/types.exp
> +++ b/gdb/testsuite/gdb.pascal/types.exp
> @@ -74,7 +74,7 @@ gdb_exit
> gdb_start
> gdb_reinitialize_dir $srcdir/$subdir
>
> -if [set_lang_pascal] then {
> +if [set_language "pascal"] then {
> test_integer_literal_types_accepted
> test_logical_literal_types_accepted
> test_character_literal_types_accepted
> diff --git a/gdb/testsuite/gdb.python/py-lookup-type.exp
> b/gdb/testsuite/gdb.python/py-lookup-type.exp
> index 2f98052..de24bbb 100644
> --- a/gdb/testsuite/gdb.python/py-lookup-type.exp
> +++ b/gdb/testsuite/gdb.python/py-lookup-type.exp
> @@ -31,7 +31,7 @@ gdb_reinitialize_dir $srcdir/$subdir
> if { [skip_python_tests] } { continue }
>
> proc test_lookup_type { lang type_name } {
> - gdb_test_no_output "set language ${lang}"
> + set_language "${lang}"
> gdb_test "python print(gdb.lookup_type('${type_name}').name)" \
> "${type_name}" \
> "lookup type ${type_name} using language ${lang}"
> diff --git a/gdb/testsuite/gdb.rust/expr.exp
> b/gdb/testsuite/gdb.rust/expr.exp
> index 415680b..4ed84c9 100644
> --- a/gdb/testsuite/gdb.rust/expr.exp
> +++ b/gdb/testsuite/gdb.rust/expr.exp
> @@ -23,7 +23,7 @@ gdb_start
>
> gdb_test_no_output "set var \$something = 27"
>
> -if {![set_lang_rust]} {
> +if {![set_language "rust"]} {
> warning "Rust expression tests suppressed."
> continue
> }
> diff --git a/gdb/testsuite/lib/d-support.exp
> b/gdb/testsuite/lib/d-support.exp
> index ed568d3..3e5b457 100644
> --- a/gdb/testsuite/lib/d-support.exp
> +++ b/gdb/testsuite/lib/d-support.exp
> @@ -13,20 +13,6 @@
> # You should have received a copy of the GNU General Public License
> # along with this program. If not, see
> <http://www.gnu.org/licenses/>.
>
> -# Auxiliary function to set the language to D.
> -# The result is 1 (true) for success, 0 (false) for failure.
> -
> -proc set_lang_d {} {
> - if [gdb_test_no_output "set language d"] {
> - return 0
> - }
> - if [gdb_test "show language" ".* source language is \"d\"." \
> - "set language to \"d\""] {
> - return 0
> - }
> - return 1
> -}
> -
> # D version of runto_main.
>
> proc d_runto_main { } {
> diff --git a/gdb/testsuite/lib/fortran.exp
> b/gdb/testsuite/lib/fortran.exp
> index 867e4fc..3e78315 100644
> --- a/gdb/testsuite/lib/fortran.exp
> +++ b/gdb/testsuite/lib/fortran.exp
> @@ -15,20 +15,6 @@
> # You should have received a copy of the GNU General Public License
> # along with this program. If not, see
> <http://www.gnu.org/licenses/>.
>
> -# Auxiliary function to set the language to fortran.
> -# The result is 1 (true) for success, 0 (false) for failure.
> -
> -proc set_lang_fortran {} {
> - if [gdb_test_no_output "set language fortran"] {
> - return 0
> - }
> - if [gdb_test "show language" ".* source language is \"fortran\"."
> \
> - "set language to \"fortran\""] {
> - return 0
> - }
> - return 1
> -}
> -
> proc fortran_int4 {} {
> if {[test_compiler_info {gcc-4-[012]-*}]} {
> return "int4"
> diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
> index 48bd7ee..ff076b9 100644
> --- a/gdb/testsuite/lib/gdb.exp
> +++ b/gdb/testsuite/lib/gdb.exp
> @@ -6018,6 +6018,49 @@ proc multi_line_input { args } {
> return [join $args "\n"]
> }
>
> +# Set the language and handle possible warnings output by GDB if
> +# we select a language that differs from the current frame's language.
> +#
> +# The first argument is the language to be set.
> +#
> +# The second argument is an optional message to be output by the test.
> If
> +# the message is empty, the command to set the language will be used
> instead.
> +
> +proc set_language { language { message "" } } {
> + global gdb_prompt
> +
> + set command "set language $language"
> + set lang_pattern [string_to_regexp $language]
> +
> + if { $message == "" } {
> + set message $command
> + }
> +
> + # Switch to the user-selected language.
> + gdb_test_multiple $command $message {
> + -re "Undefined item: \"$lang_pattern\"\.\[\r\n\]+$gdb_prompt" {
> + fail $message
> + return 0
> + }
> + -re "Warning: the current language does not match this
> frame.\[\r\n\]+$gdb_prompt $" {
> + }
> + -re "$gdb_prompt $" {}
> + }
> +
> + # Verify the language has been set correctly. GDB may output a
> warning
> + # stating the user-provided language doesn't match the frame's
> language.
> + # We ignore that warning for testing purposes.
> + if { $language != "auto" } {
> + if [gdb_test "show language" ".* source language is
> \"$lang_pattern\".*" $message] {
> + return 0
> + }
> + } else {
> + if [gdb_test "show language" "The current source language is \"auto;
> currently .*\"\." $message] {
> + return 0
> + }
> + }
> + return 1
> +}
>
> # Always load compatibility stuff.
> load_lib future.exp
> diff --git a/gdb/testsuite/lib/go.exp b/gdb/testsuite/lib/go.exp
> index c29b7c1..78a4e2c 100644
> --- a/gdb/testsuite/lib/go.exp
> +++ b/gdb/testsuite/lib/go.exp
> @@ -16,20 +16,6 @@
> # FIXME: Presumably skip_go_tests should be defined here,
> # but for consistency with other languages it currently lives in
> gdb.exp.
>
> -# Auxiliary function to set the language to Go.
> -# The result is 1 (true) for success, 0 (false) for failure.
> -
> -proc set_lang_go {} {
> - if [gdb_test_no_output "set language go"] {
> - return 0
> - }
> - if [gdb_test "show language" ".* source language is \"go\"." \
> - "set language to \"go\""] {
> - return 0
> - }
> - return 1
> -}
> -
> # Go version of runto_main.
>
> proc go_runto_main { } {
> diff --git a/gdb/testsuite/lib/objc.exp b/gdb/testsuite/lib/objc.exp
> deleted file mode 100644
> index 7189f03..0000000
> --- a/gdb/testsuite/lib/objc.exp
> +++ /dev/null
> @@ -1,30 +0,0 @@
> -# This test code is part of GDB, the GNU debugger.
> -
> -# Copyright 2010-2017 Free Software Foundation, Inc.
> -#
> -# This program is free software; you can redistribute it and/or modify
> -# it under the terms of the GNU General Public License as published by
> -# the Free Software Foundation; either version 3 of the License, or
> -# (at your option) any later version.
> -#
> -# This program is distributed in the hope that it will be useful,
> -# but WITHOUT ANY WARRANTY; without even the implied warranty of
> -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> -# GNU General Public License for more details.
> -#
> -# You should have received a copy of the GNU General Public License
> -# along with this program. If not, see
> <http://www.gnu.org/licenses/>.
> -
> -# Auxiliary function to set the language to fortran.
> -# The result is 1 (true) for success, 0 (false) for failure.
> -
> -proc set_lang_objc {} {
> - if [gdb_test_no_output "set language objective-c"] {
> - return 0
> - }
> - if [gdb_test "show language" ".* source language is
> \"objective-c\"." \
> - "set language to \"objective-c\""] {
> - return 0
> - }
> - return 1
> -}
> diff --git a/gdb/testsuite/lib/pascal.exp
> b/gdb/testsuite/lib/pascal.exp
> index a0562c3..f0eb36b 100644
> --- a/gdb/testsuite/lib/pascal.exp
> +++ b/gdb/testsuite/lib/pascal.exp
> @@ -167,17 +167,3 @@ proc gdb_compile_pascal {source destfile type
> options} {
> return "Pascal compilation failed."
> }
> }
> -
> -# Auxiliary function to set the language to pascal.
> -# The result is 1 (true) for success, 0 (false) for failure.
> -
> -proc set_lang_pascal {} {
> - if [gdb_test_no_output "set language pascal"] {
> - return 0
> - }
> - if [gdb_test "show language" ".* source language is \"pascal\"." \
> - "set language to \"pascal\""] {
> - return 0
> - }
> - return 1
> -}
> diff --git a/gdb/testsuite/lib/rust-support.exp
> b/gdb/testsuite/lib/rust-support.exp
> index 2a12cca..e6bda45 100644
> --- a/gdb/testsuite/lib/rust-support.exp
> +++ b/gdb/testsuite/lib/rust-support.exp
> @@ -13,19 +13,6 @@
> # You should have received a copy of the GNU General Public License
> # along with this program. If not, see
> <http://www.gnu.org/licenses/>.
>
> -# Auxiliary function to set the language to Rust.
> -# The result is 1 (true) for success, 0 (false) for failure.
> -proc set_lang_rust {} {
> - if [gdb_test_no_output "set language rust"] {
> - return 0
> - }
> - if [gdb_test "show language" ".* source language is \"rust\"." \
> - "set language to \"rust\""] {
> - return 0
> - }
> - return 1
> -}
> -
> proc gdb_compile_rust {sources dest options} {
> if {[llength $sources] > 1} {
> error "gdb rust setup can only compile one source file at a time"

LGTM.