]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: require 'go 1.16' go.mod line for //go:embed
authorRuss Cox <rsc@golang.org>
Fri, 8 Jan 2021 22:02:41 +0000 (17:02 -0500)
committerRuss Cox <rsc@golang.org>
Tue, 19 Jan 2021 20:07:52 +0000 (20:07 +0000)
This will produce better errors when earlier versions of
Go compile code using //go:embed. (The import will cause
a compilation error but then the go command will add to
the output that the Go toolchain in use looks too old
and maybe that's the problem.)

This CL also adds a test for disallowing embed of a var inside a func.
It's a bit too difficult to rebase down into that CL.

The build system configuration check is delayed in order to
make it possible to use errorcheck for these tests.

Change-Id: I12ece4ff2d8d53380b63f54866e8f3497657d54c
Reviewed-on: https://go-review.googlesource.com/c/go/+/282718
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Jay Conrod <jayconrod@google.com>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
src/cmd/compile/internal/gc/embed.go
src/go/types/stdlib_test.go
test/embedfunc.go [new file with mode: 0644]
test/embedvers.go [new file with mode: 0644]

index 13077809603e0e00947d74abd9f1006766c8f107..f45796cc1d80679e040adce10fd1332989204309 100644 (file)
@@ -67,10 +67,6 @@ func varEmbed(p *noder, names []*Node, typ *Node, exprs []*Node, embeds []Pragma
                p.yyerrorpos(pos, "invalid go:embed: missing import \"embed\"")
                return
        }
-       if embedCfg.Patterns == nil {
-               p.yyerrorpos(pos, "invalid go:embed: build system did not supply embed configuration")
-               return
-       }
        if len(names) > 1 {
                p.yyerrorpos(pos, "go:embed cannot apply to multiple vars")
                return
@@ -186,6 +182,18 @@ func dumpembeds() {
 // initEmbed emits the init data for a //go:embed variable,
 // which is either a string, a []byte, or an embed.FS.
 func initEmbed(v *Node) {
+       commentPos := v.Name.Param.EmbedList()[0].Pos
+       if !langSupported(1, 16, localpkg) {
+               lno := lineno
+               lineno = commentPos
+               yyerrorv("go1.16", "go:embed")
+               lineno = lno
+               return
+       }
+       if embedCfg.Patterns == nil {
+               yyerrorl(commentPos, "invalid go:embed: build system did not supply embed configuration")
+               return
+       }
        kind := embedKind(v.Type)
        if kind == embedUnknown {
                yyerrorl(v.Pos, "go:embed cannot apply to var of type %v", v.Type)
index 23f8f9a18de8fc7a265c81af72f4ee1507cb538b..5ca44936eaf46f92f7b4ee5dab9bcf8693b4f1cc 100644 (file)
@@ -155,6 +155,8 @@ func TestStdTest(t *testing.T) {
        testTestDir(t, filepath.Join(runtime.GOROOT(), "test"),
                "cmplxdivide.go", // also needs file cmplxdivide1.go - ignore
                "directive.go",   // tests compiler rejection of bad directive placement - ignore
+               "embedfunc.go",   // tests //go:embed
+               "embedvers.go",   // tests //go:embed
        )
 }
 
diff --git a/test/embedfunc.go b/test/embedfunc.go
new file mode 100644 (file)
index 0000000..14e0f82
--- /dev/null
@@ -0,0 +1,15 @@
+// errorcheck
+
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+import _ "embed"
+
+func f() {
+       //go:embed x.txt // ERROR "go:embed cannot apply to var inside func"
+       var x string
+       _ = x
+}
diff --git a/test/embedvers.go b/test/embedvers.go
new file mode 100644 (file)
index 0000000..71f0f22
--- /dev/null
@@ -0,0 +1,12 @@
+// errorcheck -lang=go1.15
+
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+import _ "embed"
+
+//go:embed x.txt // ERROR "go:embed requires go1.16 or later"
+var x string