Go testsuite: handle +build lines correctly
authorIan Lance Taylor <iant@golang.org>
Fri, 18 Dec 2020 05:33:51 +0000 (21:33 -0800)
committerIan Lance Taylor <iant@golang.org>
Fri, 18 Dec 2020 05:35:25 +0000 (21:35 -0800)
Update the Go testsuite driver to handle +build lines as is done in
the upstream repo, and update some tests to the upstream repo copy
using +build lines with "gc" and "!gccgo" as appropriate.

* go.test/go-test.exp (go-set-goos): New procedure.
(go-gc-match): New procedure.
(go-gc-tests): Call go-set-goos.  Use go-gc-match to handle +build
lines.  Look for +build lines beyond first line of file.

18 files changed:
gcc/testsuite/go.test/go-test.exp
gcc/testsuite/go.test/test/fixedbugs/bug302.go
gcc/testsuite/go.test/test/fixedbugs/bug369.go
gcc/testsuite/go.test/test/fixedbugs/issue10607.go
gcc/testsuite/go.test/test/fixedbugs/issue11771.go
gcc/testsuite/go.test/test/fixedbugs/issue13268.go
gcc/testsuite/go.test/test/fixedbugs/issue14636.go
gcc/testsuite/go.test/test/fixedbugs/issue16037_run.go
gcc/testsuite/go.test/test/fixedbugs/issue19658.go
gcc/testsuite/go.test/test/fixedbugs/issue21317.go
gcc/testsuite/go.test/test/fixedbugs/issue21576.go
gcc/testsuite/go.test/test/fixedbugs/issue22660.go
gcc/testsuite/go.test/test/fixedbugs/issue33275_run.go
gcc/testsuite/go.test/test/fixedbugs/issue33555.go
gcc/testsuite/go.test/test/fixedbugs/issue36437.go
gcc/testsuite/go.test/test/fixedbugs/issue9355.go
gcc/testsuite/go.test/test/fixedbugs/issue9862_run.go
gcc/testsuite/go.test/test/run.go

index c1b27c0923624345906846c429bbd19d9311aab2..c7d5c724f9bc553e6d30529689e4de325e97f689 100644 (file)
@@ -255,6 +255,53 @@ proc go-set-goarch { } {
     setenv GOARCH $goarch
 }
 
+# This be kept in sync with libgo/configure.ac.
+proc go-set-goos { } {
+    global target_triplet
+
+    switch -glob $target_triplet {
+       "*-*-darwin*" {
+           set goos "darwin"
+       }
+       "*-*-freebsd*" {
+           set goos "freebsd"
+       }
+       "*-*-irix6*" {
+           set goos "irix"
+       }
+       "*-*-linux*" {
+           set goos "linux"
+       }
+       "*-*-netbsd*" {
+           set goos "netbsd"
+       }
+       "*-*-openbsd*" {
+           set goos "openbsd"
+       }
+       "*-*-dragonfly*" {
+           set goos "dragonfly"
+       }
+       "*-*-rtems*" {
+           set goos "rtems"
+       }
+       "*-*-solaris2*" {
+           set goos "solaris"
+       }
+       "*-*-aix*" {
+           set goos "aix"
+       }
+       "*-*-gnu*" {
+           set goos "hurd"
+       }
+       default {
+           perror "$target_triplet: unhandled GOOS"
+           return
+       }
+    }
+    verbose -log "Setting GOOS=$goos" 1
+    setenv GOOS $goos
+}
+
 # Take a list of files and return a lists of lists, where each list is
 # the set of files in the same package.
 proc go-find-packages { test name files } {
@@ -291,6 +338,27 @@ proc go-find-packages { test name files } {
     return $packages
 }
 
+proc go-gc-match { name } {
+    verbose -log "go-gc-match $name"
+    set idx [string first "," $name]
+    if { $idx >= 0 } {
+       set left [string range $name 0 [expr $idx - 1]]
+       set right [string range $name [expr $idx + 1] end]
+       return [expr [go-gc-match $left] && [go-gc-match $right]]
+    }
+    if { [string index $name 0] == "!" && [string index $name 1] == "!" } {
+       return 0
+    }
+    if { [string index $name 0] == "!" } {
+       return [expr ! [go-gc-match [string range $name 1 end]]]
+    }
+    if { $name == [getenv GOARCH] || $name == [getenv GOOS] || $name == "gccgo" } {
+       return 1
+    }
+
+    return 0
+}
+
 proc go-gc-tests { } {
     global srcdir subdir
     global runtests
@@ -311,8 +379,9 @@ proc go-gc-tests { } {
     set options ""
     lappend options "additional_flags=$DEFAULT_GOCFLAGS"
 
-    # Set GOARCH for tests that need it.
+    # Set GOARCH and GOOS for tests that need it.
     go-set-goarch
+    go-set-goos
 
     # Running all the torture options takes too long and, since the
     # frontend ignores the standard options, it doesn't significantly
@@ -432,73 +501,61 @@ proc go-gc-tests { } {
 
        set lines_ok 1
 
+       set test_line ""
        while 1 {
-           if { [gets $fd test_line] < 0 } {
-               close $fd
-               clone_output "$test: could not read first line"
+           if { [gets $fd file_line] < 0 } {
+               if [eof $fd] {
+                   break
+               }
+               clone_output "$test: read failed"
                unresolved $name
                set lines_ok 0
                break
            }
 
-           if { [ string match "*nacl*exit 0*" $test_line ] \
-                    || [ string match "*exit 0*nacl*" $test_line ] \
-                    || [ string match "*Android*exit 0*" $test_line ] \
-                    || [ string match "*exit 0*Android*" $test_line ] \
-                    || [ string match "*\"\$GOOS\" == windows*" $test_line ] } {
+           if { [ string match "*nacl*exit 0*" $file_line ] \
+                    || [ string match "*exit 0*nacl*" $file_line ] \
+                    || [ string match "*Android*exit 0*" $file_line ] \
+                    || [ string match "*exit 0*Android*" $file_line ] \
+                    || [ string match "*\"\$GOOS\" == windows*" $file_line ] } {
                continue
            }
 
-           if { [ string match "// +build *" $test_line ] } {
-               set matches_pos 0
-               set matches_neg 0
-               if { [ regexp -line "\[         \][getenv GOARCH]\(\[   \]\|\$\)" $test_line ] } {
-                   set matches_pos 1
-               } elseif { [ regexp -line "\[   \]\![getenv GOARCH]\(\[         \]\|\$\)" $test_line ] } {
-                   set matches_neg 1
-               } elseif { [ regexp -line "\[   \]linux\(\[     \]\|\$\)" $test_line ] } {
-                   set matches_pos 1
-               } elseif { [ regexp -line "\[   \]\!linux\(\[   \]\|\$\)" $test_line ] } {
-                   set matches_neg 1
-               } elseif { [ regexp -line "\[   \]\!windows\(\[         \]\|\$\)" $test_line ] } {
-                   set matches_pos 1
-               } elseif { [ regexp -line "\[   \]windows\(\[   \]\|\$\)" $test_line ] } {
-                   set matches_neg 1
+           if ![string match "// *" $file_line] {
+               if { $file_line != "" } {
+                   break
                }
-               if { $matches_pos == 1 && $matches_neg == 0 } {
+               continue
+           }
+
+           if { [ string match "// +build *" $file_line ] } {
+               set words [split $file_line]
+               set matches 0
+               for { set idx 2 } { $idx < [llength $words] } { incr idx } {
+                   if { [go-gc-match [lindex $words $idx]] } {
+                       set matches 1
+                       break
+                   }
+               }
+               if { $matches == 1 } {
                    continue
                }
-               close $fd
                unsupported $name
                set lines_ok 0
+               break
            }
 
-           break
-       }
-
-       if { $lines_ok == 0 } {
-           continue
+           if { $test_line == "" } {
+               set test_line $file_line
+           }
        }
 
-       set lineno 1
-       set test_line1 $test_line
+       close $fd
 
-       while { [eval "string match \"//*&&\" \${test_line$lineno}"] } {
-           set lineno [expr $lineno + 1]
-           if { [eval "gets \$fd test_line$lineno"] < 0 } {
-               close $fd
-               clone_output "$test: could not read line $lineno"
-               unresolved $name
-               set lines_ok 0
-               break
-           }
-       }
        if { $lines_ok == 0 } {
            continue
        }
 
-       close $fd
-
        # runtest_file_p is already run above, and the code below can run
        # runtest_file_p again, make sure everything for this test is
        # performed if the above runtest_file_p decided this runtest
index 87f9d4ef70ccc1ddc0cc6f3a528fc161294d9402..a2ab661277a38ff40b45c1c73232d25502f91bb5 100644 (file)
@@ -1,4 +1,4 @@
-// +build !nacl,!js
+// +build !nacl,!js,gc
 // run
 
 // Copyright 2010 The Go Authors. All rights reserved.
index 9316f7aad0b1df71d896b56ad0e02d6c37d3c108..83f638d04632af0dafaff07c4c6324fad14c79b7 100644 (file)
@@ -1,4 +1,4 @@
-// +build !nacl,!js,!windows
+// +build !nacl,!js,!windows,gc
 // run
 
 // Copyright 2011 The Go Authors. All rights reserved.
index 6f4717d8202ff1dee40ee30862e8045364e32157..448a37dcac24d6ec6c5a0b21ab554224805b614a 100644 (file)
@@ -1,4 +1,4 @@
-// +build linux,!ppc64,!riscv64
+// +build linux,!ppc64,!riscv64,gc
 // run
 
 // Copyright 2015 The Go Authors. All rights reserved.
index 99d7060d44e4b45f41940bc869492ca0a4e49737..c95dd6ba3965849ac2432eaa1494a67d209dc972 100644 (file)
@@ -1,4 +1,4 @@
-// +build !nacl,!js
+// +build !nacl,!js,gc
 // run
 
 // Copyright 2015 The Go Authors. All rights reserved.
index fcb69c90682f9338a4392610707148909ae790e1..53a82d5074ab97af601fee7bcb70ba84d60ff67a 100644 (file)
@@ -1,3 +1,4 @@
+// +build gc
 // run
 
 // Copyright 2015 The Go Authors. All rights reserved.
index 6797046e02b66d478cd7da9374762a5663b0576f..06fd193dae0ba1d8c60085f7511b618887248646 100644 (file)
@@ -1,4 +1,4 @@
-// +build !nacl,!js,!android
+// +build !nacl,!js,!android,gc
 // run
 
 // Copyright 2016 The Go Authors. All rights reserved.
index d05e3f7f3143cf2ec005ecff2b8fac20c6e44d91..68104a9000795d835154d476a840c5dc95429220 100644 (file)
@@ -1,4 +1,4 @@
-// +build !nacl,!js,!android
+// +build !nacl,!js,!android,!gccgo
 // run
 
 // Copyright 2016 The Go Authors. All rights reserved.
index b2539629df0c45ad3a349db4068726b6c1e55b1b..bab409c6c03cc86d64ae51ef3bb51a09d77f2d6a 100644 (file)
@@ -1,4 +1,4 @@
-// +build !nacl,!js
+// +build !nacl,!js,!gccgo
 // run
 
 // Copyright 2017 The Go Authors. All rights reserved.
index f4ec422371349079eda33dbd999fc9b493bdd7ce..32b660c1639169262c16826024369d3e04d0a088 100644 (file)
@@ -1,3 +1,4 @@
+// +build !js,gc
 // run
 
 // Copyright 2017 The Go Authors. All rights reserved.
@@ -16,15 +17,10 @@ import (
        "log"
        "os"
        "os/exec"
-       "runtime"
        "strings"
 )
 
 func main() {
-       if runtime.Compiler != "gc" || runtime.GOOS == "js" {
-               return
-       }
-
        f, err := ioutil.TempFile("", "issue21317.go")
        if err != nil {
                log.Fatal(err)
index ae6161ccf52d3926a8030607f231e3b7511900fb..3f9b1ba008af4cfee4cd502d844925101ec04764 100644 (file)
@@ -1,6 +1,6 @@
 // run
 
-// +build !nacl,!js
+// +build !nacl,!js,!gccgo
 
 // Copyright 2019 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
index 44ba42ac968cca00dc93b8476e8954ae063399c1..9ce9c4d732e6d4b6cffb4f85e53ed3a005cdcea3 100644 (file)
@@ -1,3 +1,4 @@
+// +build !js,gc
 // run
 
 // Copyright 2017 The Go Authors. All rights reserved.
@@ -14,15 +15,10 @@ import (
        "os"
        "os/exec"
        "path/filepath"
-       "runtime"
        "strings"
 )
 
 func main() {
-       if runtime.GOOS == "js" {
-               return // no file system available on builders
-       }
-
        f, err := ioutil.TempFile("", "issue22660.go")
        if err != nil {
                log.Fatal(err)
index f3e2e14f392eb7177dacdced583902b99b545e5f..ed03dccf4c8086bb8253ae1e4f029d9fd7dc57b6 100644 (file)
@@ -1,4 +1,4 @@
-// +build !nacl,!js
+// +build !nacl,!js,!gccgo
 // run
 
 // Copyright 2019 The Go Authors. All rights reserved.
index 7debd2049cd956468b9022951e1074e37abd439b..c1fcd2a79b387a8b23020bc42c2cf666471bee6d 100644 (file)
@@ -1,4 +1,4 @@
-// +build !nacl,!js
+// +build !nacl,!js,!gccgo
 // run
 
 // Copyright 2019 The Go Authors. All rights reserved.
index f96544beff810846c657725a8b19194c505a3edb..c7a11d27a8934985d1bc975d7a60f4e96d793746 100644 (file)
@@ -1,6 +1,6 @@
 // run
 
-// +build !nacl,!js
+// +build !nacl,!js,gc
 
 // Copyright 2020 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
index ab3369d415df19165c8d5be13084e66bb17192d2..319a2a90df9ba26c8725fe179abe6e349262afb8 100644 (file)
@@ -1,3 +1,4 @@
+// +build !js,gc
 // run
 
 // Copyright 2014 The Go Authors. All rights reserved.
@@ -13,14 +14,9 @@ import (
        "os/exec"
        "path/filepath"
        "regexp"
-       "runtime"
 )
 
 func main() {
-       if runtime.Compiler != "gc" || runtime.GOOS == "js" {
-               return
-       }
-
        err := os.Chdir(filepath.Join("fixedbugs", "issue9355.dir"))
        check(err)
 
index 299e8095450d8a97f0e27898c876ba8f1c6a1123..c956c7f7bd50f3aa0445ea1f5f994421dfc28b24 100644 (file)
@@ -1,4 +1,4 @@
-// +build !nacl,!js
+// +build !nacl,!js,gc
 // run
 
 // Copyright 2015 The Go Authors. All rights reserved.
index 4abf32d25c8b6755d9d36e942d40579ac111dcc8..db3e9f6c2fc18040fc63b81c27375b90c53031d1 100644 (file)
@@ -438,7 +438,7 @@ func (ctxt *context) match(name string) bool {
                }
        }
 
-       if name == ctxt.GOOS || name == ctxt.GOARCH {
+       if name == ctxt.GOOS || name == ctxt.GOARCH || name == "gc" {
                return true
        }