| # https://golang.org/issue/36876: As of Go 1.17, vendor/modules.txt should |
| # indicate the language version used by each dependency. |
| |
| [short] skip |
| |
| |
| # Control case: without a vendor directory, need117 builds and bad114 doesn't. |
| |
| go build example.net/need117 |
| ! go build example.net/bad114 |
| stderr '^bad114[/\\]bad114.go:15:2: duplicate method Y$' |
| |
| |
| # With a vendor/modules.txt lacking language versions, the world is topsy-turvy, |
| # because we have to guess a uniform version for everything. |
| # |
| # We always guess Go 1.16, because that was the last version for which |
| # 'go mod vendor' failed to record dependency versions, and it has most of |
| # the language features added since modules were introduced in Go 1.11. |
| # |
| # Even so, modules that declare 'go 1.17' and use 1.17 features spuriously fail |
| # to build, and modules that declare an older version and use features from a |
| # newer one spuriously build (instead of failing as they ought to). |
| |
| go mod vendor |
| |
| ! grep 1.17 vendor/modules.txt |
| ! go build example.net/need117 |
| stderr '^vendor[/\\]example\.net[/\\]need117[/\\]need117.go:5:1[89]: .*conversion of slices to array pointers only supported as of -lang=go1\.17' |
| |
| ! grep 1.13 vendor/modules.txt |
| go build example.net/bad114 |
| |
| |
| # Upgrading the main module to 1.17 adds version annotations. |
| # Then everything is once again consistent with the non-vendored world. |
| |
| go mod edit -go=1.17 |
| go mod vendor |
| |
| grep '^## explicit; go 1.17$' vendor/modules.txt |
| go build example.net/need117 |
| |
| grep '^## explicit; go 1.13$' vendor/modules.txt |
| ! go build example.net/bad114 |
| stderr '^vendor[/\\]example\.net[/\\]bad114[/\\]bad114.go:15:2: duplicate method Y$' |
| |
| -- go.mod -- |
| module example.net/m |
| |
| go 1.16 |
| |
| require ( |
| example.net/bad114 v0.1.0 |
| example.net/need117 v0.1.0 |
| ) |
| |
| replace ( |
| example.net/bad114 v0.1.0 => ./bad114 |
| example.net/need117 v0.1.0 => ./need117 |
| ) |
| -- m.go -- |
| package m |
| |
| import _ "example.net/bad114" |
| import _ "example.net/need117" |
| |
| -- bad114/go.mod -- |
| // Module bad114 requires Go 1.14 or higher, but declares Go 1.13. |
| module example.net/bad114 |
| |
| go 1.13 |
| -- bad114/bad114.go -- |
| package bad114 |
| |
| type XY interface { |
| X() |
| Y() |
| } |
| |
| type YZ interface { |
| Y() |
| Z() |
| } |
| |
| type XYZ interface { |
| XY |
| YZ |
| } |
| |
| -- need117/go.mod -- |
| // Module need117 requires Go 1.17 or higher. |
| module example.net/need117 |
| |
| go 1.17 |
| -- need117/need117.go -- |
| package need117 |
| |
| func init() { |
| s := make([]byte, 4) |
| _ = (*[4]byte)(s) |
| } |