From patchwork Thu Feb 20 12:40:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom de Vries X-Patchwork-Id: 38254 Received: (qmail 100455 invoked by alias); 20 Feb 2020 12:40:30 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 100425 invoked by uid 89); 20 Feb 2020 12:40:30 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, SPF_PASS autolearn=ham version=3.3.1 spammy=shadows, Breakpoint X-HELO: mx2.suse.de Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 20 Feb 2020 12:40:28 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 17C56B16D for ; Thu, 20 Feb 2020 12:40:26 +0000 (UTC) Date: Thu, 20 Feb 2020 13:40:24 +0100 From: Tom de Vries To: gdb-patches@sourceware.org Subject: [PATCH][gdb/testsuite] Fix hello.go xpass Message-ID: <20200220124023.GA26685@delia> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.10.1 (2018-07-13) X-IsSubscribed: yes Hi, 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 - using 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 it's 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. OK for trunk? Thanks, - Tom [gdb/testsuite] Fix hello.go xpass 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. --- gdb/testsuite/gdb.go/global-local-var-shadow.exp | 58 ++++++++++++++++++++++++ gdb/testsuite/gdb.go/global-local-var-shadow.go | 11 +++++ gdb/testsuite/gdb.go/hello.exp | 7 --- gdb/testsuite/gdb.go/hello.go | 5 +- 4 files changed, 70 insertions(+), 11 deletions(-) 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 0000000000..f7fd4e1007 --- /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 0000000000..73f39446dd --- /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 e2ed54a93a..69f3a8c322 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 17b1d4ac1f..67114dde71 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) }