...
1Test of "too new" diagnostics from the stdversion analyzer.
2
3This test references go1.21 and go1.22 symbols from std.
4
5It uses a txtar file due to golang/go#37054.
6
7See also gopls/internal/test/marker/testdata/diagnostics/stdversion.txt
8which runs the same test within the gopls analysis driver, to ensure
9coverage of per-file Go version support.
10
11-- go.work --
12go 1.21
13
14use .
15use sub
16use sub20
17use old
18
19-- go.mod --
20module example.com
21
22go 1.21
23
24-- a/a.go --
25package a
26
27import "go/types"
28
29func _() {
30 // old package-level type
31 var _ types.Info // ok: defined by go1.0
32
33 // new field of older type
34 _ = new(types.Info).FileVersions // want `types.FileVersions requires go1.22 or later \(module is go1.21\)`
35
36 // new method of older type
37 new(types.Info).PkgNameOf // want `types.PkgNameOf requires go1.22 or later \(module is go1.21\)`
38
39 // new package-level type
40 var a types.Alias // want `types.Alias requires go1.22 or later \(module is go1.21\)`
41
42 // new method of new type
43 a.Underlying() // no diagnostic
44}
45
46-- sub/go.mod --
47module example.com/sub
48
49go 1.21
50
51-- sub/sub.go --
52package sub
53
54import "go/types"
55
56func _() {
57 // old package-level type
58 var _ types.Info // ok: defined by go1.0
59
60 // new field of older type
61 _ = new(types.Info).FileVersions // want `types.FileVersions requires go1.22 or later \(module is go1.21\)`
62
63 // new method of older type
64 new(types.Info).PkgNameOf // want `types.PkgNameOf requires go1.22 or later \(module is go1.21\)`
65
66 // new package-level type
67 var a types.Alias // want `types.Alias requires go1.22 or later \(module is go1.21\)`
68
69 // new method of new type
70 a.Underlying() // no diagnostic
71}
72
73invalid syntax // exercise RunDespiteErrors
74
75-- sub/tagged.go --
76//go:build go1.22
77
78package sub
79
80import "go/types"
81
82func _() {
83 // old package-level type
84 var _ types.Info
85
86 // new field of older type
87 _ = new(types.Info).FileVersions
88
89 // new method of older type
90 new(types.Info).PkgNameOf
91
92 // new package-level type
93 var a types.Alias
94
95 // new method of new type
96 a.Underlying()
97}
98
99-- old/go.mod --
100module example.com/old
101
102go 1.5
103
104-- old/old.go --
105package old
106
107import "go/types"
108
109var _ types.Alias // no diagnostic: go.mod is too old for us to care
110
111-- sub/oldtagged.go --
112// The file Go version (1.16) overrides the go.mod Go version (1.21),
113// even when this means a downgrade (#67123).
114// (stdversion is silent for go.mod versions before 1.21:
115// before the forward compatibility regime, the meaning
116// of the go.mod version was not clearly defined.)
117
118//go:build go1.16
119
120package sub
121
122import "bytes"
123import "go/types"
124
125var _ = bytes.Clone // want `bytes.Clone requires go1.20 or later \(file is go1.16\)`
126var _ = types.Alias // want `types.Alias requires go1.22 or later \(file is go1.16\)`
127
128-- sub20/go.mod --
129module example.com/sub20
130
131go 1.20
132
133-- sub20/oldtagged.go --
134// Same test again, but with a go1.20 mod,
135// before the forward compatibility regime:
136// The file's build tag effects selection, but
137// not language semantics, so stdversion is silent.
138
139//go:build go1.16
140
141package sub
142
143import "bytes"
144import "go/types"
145
146var _ = bytes.Clone
147var _ = types.Alias
148
View as plain text