modfile: update toolchain syntax

Final revisions for Go 1.21: lock down the toolchain syntax to use
'toolchain default' instead of 'toolchain local', to avoid confusion
with 'GOTOOLCHAIN=local'; 'toolchain local' does not always mean
the same thing.

Also remove the prefix-go1.2.3 toolchain name form, leaving only
go1.2.3-suffix. There is no need to have two different forms, and it's
confusing.

For golang/go#57001.

Change-Id: I16623c796c620e98178deed899e28a00e85fcc21
Reviewed-on: https://go-review.googlesource.com/c/mod/+/500755
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Michael Matloob <matloob@golang.org>
diff --git a/modfile/read_test.go b/modfile/read_test.go
index 7017ee1..efc75e1 100644
--- a/modfile/read_test.go
+++ b/modfile/read_test.go
@@ -459,8 +459,8 @@
 		{desc: "tool", input: "module m\ntoolchain go1.2\n", ok: true},
 		{desc: "tool1", input: "module m\ntoolchain go1.2.3\n", ok: true},
 		{desc: "tool2", input: "module m\ntoolchain go1.2rc1\n", ok: true},
-		{desc: "tool3", input: "module m\ntoolchain gccgo-go1.2rc1\n", ok: true},
-		{desc: "tool4", input: "module m\ntoolchain local\n", ok: true},
+		{desc: "tool3", input: "module m\ntoolchain go1.2rc1-gccgo\n", ok: true},
+		{desc: "tool4", input: "module m\ntoolchain default\n", ok: true},
 		{desc: "tool5", input: "module m\ntoolchain inconceivable!\n", ok: false, laxOK: true},
 	}
 	t.Run("Strict", func(t *testing.T) {
diff --git a/modfile/rule.go b/modfile/rule.go
index 39f03f2..b4dd799 100644
--- a/modfile/rule.go
+++ b/modfile/rule.go
@@ -306,9 +306,9 @@
 var GoVersionRE = lazyregexp.New(`^([1-9][0-9]*)\.(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*))?([a-z]+[0-9]+)?$`)
 var laxGoVersionRE = lazyregexp.New(`^v?(([1-9][0-9]*)\.(0|[1-9][0-9]*))([^0-9].*)$`)
 
-// Toolchains must be named beginning with `go1` or containing `-go1` as a substring,
-// like "go1.20.3" or "gccgo-go1.20.3". As a special case, "local" is also permitted.
-var ToolchainRE = lazyregexp.New(`^local$|(^|-)go1`)
+// Toolchains must be named beginning with `go1`,
+// like "go1.20.3" or "go1.20.3-gccgo". As a special case, "default" is also permitted.
+var ToolchainRE = lazyregexp.New(`^default$|^go1($|\.)`)
 
 func (f *File) add(errs *ErrorList, block *LineBlock, line *Line, verb string, args []string, fix VersionFixer, strict bool) {
 	// If strict is false, this module is a dependency.
diff --git a/modfile/testdata/goline.golden b/modfile/testdata/goline.golden
index 1f07989..20b9f9c 100644
--- a/modfile/testdata/goline.golden
+++ b/modfile/testdata/goline.golden
@@ -1,3 +1,3 @@
 go 1.2.3
 
-toolchain local
+toolchain default
diff --git a/modfile/testdata/goline.in b/modfile/testdata/goline.in
index 498c1b8..fdc2c73 100644
--- a/modfile/testdata/goline.in
+++ b/modfile/testdata/goline.in
@@ -1,2 +1,2 @@
 go 1.2.3
-toolchain local
+toolchain default
diff --git a/modfile/testdata/work/goline.golden b/modfile/testdata/work/goline.golden
index 1f07989..20b9f9c 100644
--- a/modfile/testdata/work/goline.golden
+++ b/modfile/testdata/work/goline.golden
@@ -1,3 +1,3 @@
 go 1.2.3
 
-toolchain local
+toolchain default
diff --git a/modfile/testdata/work/goline.in b/modfile/testdata/work/goline.in
index 498c1b8..fdc2c73 100644
--- a/modfile/testdata/work/goline.in
+++ b/modfile/testdata/work/goline.in
@@ -1,2 +1,2 @@
 go 1.2.3
-toolchain local
+toolchain default