[gdb/testsuite] Fix hello.go xpass

Message ID 20200220124023.GA26685@delia
State New, archived
Headers

Commit Message

Tom de Vries Feb. 20, 2020, 12:40 p.m. UTC
  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  <tdevries@suse.de>

	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(-)
  

Comments

Tom Tromey Feb. 20, 2020, 4:39 p.m. UTC | #1
>>>>> "Tom" == Tom de Vries <tdevries@suse.de> writes:

Tom> 2020-02-20  Tom de Vries  <tdevries@suse.de>

Tom> 	PR go/17018
Tom> 	* gdb.go/hello.exp: Copy ...
Tom> 	* gdb.go/global-local-var-shadow.exp: ... here.  New file.  Expect
Tom> 	print of st to print value of global definition. Add xfail for GCC
Tom> 	PR93844.
Tom> 	* gdb.go/hello.exp: Remove printing of st before definition.
Tom> 	* gdb.go/hello.go: Copy ...
Tom> 	* gdb.go/global-local-var-shadow.go: ... here. New test.  Rename myst
Tom> 	to st.
Tom> 	* gdb.go/hello.go: Remove myst.  Remove comment about shadowing.

Ok.  Thank you.

Tom
  

Patch

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 <http://www.gnu.org/licenses/>.
+
+# 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)
 }