From: Tom de Vries Date: Thu, 20 Feb 2020 16:46:17 +0000 (+0100) Subject: [gdb/testsuite] Fix hello.go xpass X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a9c798035de33ccc3bc3e494449bbe931e900372;p=binutils-gdb.git [gdb/testsuite] Fix hello.go xpass With gdb.go/hello.go, we run into an xpass: ... Thread 1 "hello" hit Breakpoint 1, main.main () at hello.go:7^M 7 func main () {^M (gdb) print st^M $1 = 0x0 ""^M (gdb) XPASS: gdb.go/hello.exp: starting string check ... The xfail is setup as follows: ... \# This used to print "", i.e., the local "st" initialized as "". setup_xfail "*-*-*" gdb_test "print st" \ ".* = $hex \"\"" \ "starting string check" ... It's not clear what gccgo/gc PR this xfail refers to. It's also not clear why the empty string is both: - listed as reason for xfail, and - used in the pass pattern. Furthermore, there's a comment in the hello.go testcase: ... st := "Hello, world!" // this intentionally shadows the global "st" ... while there's no global st variable present, only a variable myst: ... var myst = "Shall we?" ... Fix this by splitting up the test-case in two test-cases, hello.{go,exp} and global-local-var-shadow.{go,exp}. In hello.exp we no longer attempt to print st before its declaration. In hello.go we remove the myst variable as well the comment related to shadowing. In global-local-var-shadow.go, we rename myst to st, such that the comment related to shadowing is correct. In global-local-var-shadow.exp we attempt to print the value of st before the local definition, which should print the value of the global definition, and xfail this with reference to GCC PR93844. Tested on x86_64-linux, with gccgo 10. gdb/testsuite/ChangeLog: 2020-02-20 Tom de Vries PR go/17018 * gdb.go/hello.exp: Copy ... * gdb.go/global-local-var-shadow.exp: ... here. New file. Expect print of st to print value of global definition. Add xfail for GCC PR93844. * gdb.go/hello.exp: Remove printing of st before definition. * gdb.go/hello.go: Copy ... * gdb.go/global-local-var-shadow.go: ... here. New test. Rename myst to st. * gdb.go/hello.go: Remove myst. Remove comment about shadowing. --- diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index cf7b3b14f25..5553782e0a5 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,16 @@ +2020-02-20 Tom de Vries + + PR go/17018 + * gdb.go/hello.exp: Copy ... + * gdb.go/global-local-var-shadow.exp: ... here. New file. Expect + print of st to print value of global definition. Add xfail for GCC + PR93844. + * gdb.go/hello.exp: Remove printing of st before definition. + * gdb.go/hello.go: Copy ... + * gdb.go/global-local-var-shadow.go: ... here. New test. Rename myst + to st. + * gdb.go/hello.go: Remove myst. Remove comment about shadowing. + 2020-02-20 Tom de Vries * lib/gdb.exp (support_go_compile): New gdb_caching_proc. diff --git a/gdb/testsuite/gdb.go/global-local-var-shadow.exp b/gdb/testsuite/gdb.go/global-local-var-shadow.exp new file mode 100644 index 00000000000..f7fd4e10075 --- /dev/null +++ b/gdb/testsuite/gdb.go/global-local-var-shadow.exp @@ -0,0 +1,58 @@ +# This testcase is part of GDB, the GNU debugger. + +# Copyright 2012-2020 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 . + +# Basic tests. + +load_lib "go.exp" + +if { [skip_go_tests] } { continue } +if { [support_go_compile] == 0 } { continue } + +standard_testfile .go + +if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} {debug go}] } { + return -1 +} + +set bp_location1 [gdb_get_line_number "set breakpoint 1 here"] + +if { [go_runto_main] < 0 } { + untested "could not run to main" + return -1 +} + +gdb_test_multiple "print st" "print global var st" { + -re -wrap " = $hex \"We shall\"" { + pass $gdb_test_name + } + -re -wrap " = $hex .*" { + # GCC PR 93844 (Same problem with google go compiler go1.11.13). + # Due to the PR, gdb prints an uninitialized value, which can manifest + # as '$3 = 0x0 ""', but also as printing a wild pointer. + xfail $gdb_test_name + } +} + +if { [gdb_breakpoint ${srcfile}:${bp_location1}] } { + pass "setting breakpoint 1" +} + +gdb_test "cont" "Breakpoint .*:${bp_location1}.*" "going to first breakpoint" + +gdb_test "print st" \ + ".* = $hex \"Hello, world!\"" \ + "string after assignment check" diff --git a/gdb/testsuite/gdb.go/global-local-var-shadow.go b/gdb/testsuite/gdb.go/global-local-var-shadow.go new file mode 100644 index 00000000000..73f39446ddf --- /dev/null +++ b/gdb/testsuite/gdb.go/global-local-var-shadow.go @@ -0,0 +1,11 @@ +package main + +import "fmt" + +var st = "We shall" + +func main () { + fmt.Println ("Before assignment") + st := "Hello, world!" // this intentionally shadows the global "st" + fmt.Println (st) // set breakpoint 1 here +} diff --git a/gdb/testsuite/gdb.go/hello.exp b/gdb/testsuite/gdb.go/hello.exp index e2ed54a93a2..69f3a8c322e 100644 --- a/gdb/testsuite/gdb.go/hello.exp +++ b/gdb/testsuite/gdb.go/hello.exp @@ -35,13 +35,6 @@ if { [go_runto_main] < 0 } { return -1 } -# This used to print "", i.e., the local "st" initialized as "". -setup_xfail "*-*-*" - -gdb_test "print st" \ - ".* = $hex \"\"" \ - "starting string check" - if { [gdb_breakpoint ${srcfile}:${bp_location1}] } { pass "setting breakpoint 1" } diff --git a/gdb/testsuite/gdb.go/hello.go b/gdb/testsuite/gdb.go/hello.go index 17b1d4ac1fd..67114dde714 100644 --- a/gdb/testsuite/gdb.go/hello.go +++ b/gdb/testsuite/gdb.go/hello.go @@ -2,11 +2,8 @@ package main import "fmt" -var myst = "Shall we?" - func main () { fmt.Println ("Before assignment") - st := "Hello, world!" // this intentionally shadows the global "st" + st := "Hello, world!" fmt.Println (st) // set breakpoint 1 here - fmt.Println (myst) }