golang.org/x/tools@v0.21.1-0.20240520172518-788d39e776b1/go/analysis/passes/stdversion/testdata/test.txtar (about) 1 Test of "too new" diagnostics from the stdversion analyzer. 2 3 This test references go1.21 and go1.22 symbols from std. 4 5 It uses a txtar file due to golang/go#37054. 6 7 See also gopls/internal/test/marker/testdata/diagnostics/stdversion.txt 8 which runs the same test within the gopls analysis driver, to ensure 9 coverage of per-file Go version support. 10 11 -- go.work -- 12 go 1.21 13 14 use . 15 use sub 16 use sub20 17 use old 18 19 -- go.mod -- 20 module example.com 21 22 go 1.21 23 24 -- a/a.go -- 25 package a 26 27 import "go/types" 28 29 func _() { 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 -- 47 module example.com/sub 48 49 go 1.21 50 51 -- sub/sub.go -- 52 package sub 53 54 import "go/types" 55 56 func _() { 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 73 invalid syntax // exercise RunDespiteErrors 74 75 -- sub/tagged.go -- 76 //go:build go1.22 77 78 package sub 79 80 import "go/types" 81 82 func _() { 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 -- 100 module example.com/old 101 102 go 1.5 103 104 -- old/old.go -- 105 package old 106 107 import "go/types" 108 109 var _ 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 120 package sub 121 122 import "bytes" 123 import "go/types" 124 125 var _ = bytes.Clone // want `bytes.Clone requires go1.20 or later \(file is go1.16\)` 126 var _ = types.Alias // want `types.Alias requires go1.22 or later \(file is go1.16\)` 127 128 -- sub20/go.mod -- 129 module example.com/sub20 130 131 go 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 141 package sub 142 143 import "bytes" 144 import "go/types" 145 146 var _ = bytes.Clone 147 var _ = types.Alias 148