]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/syntax: make valid type parameter list in presence of errors
authorRobert Griesemer <gri@golang.org>
Thu, 26 Aug 2021 21:52:32 +0000 (14:52 -0700)
committerRobert Griesemer <gri@golang.org>
Fri, 27 Aug 2021 05:13:44 +0000 (05:13 +0000)
Make sure the parser fills in names and types for type parameter
lists, even in the case of errors.

While at it, adjust some of the test functions to accept generic
code and report all syntax errors.

Added offending source as test for types2.

Fixes #47996.

Change-Id: I449bcf5e2cb80fa2a24cdd3945f484bfca218a06
Reviewed-on: https://go-review.googlesource.com/c/go/+/345476
Trust: Robert Griesemer <gri@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/syntax/dumper_test.go
src/cmd/compile/internal/syntax/parser.go
src/cmd/compile/internal/syntax/printer_test.go
src/cmd/compile/internal/types2/testdata/fixedbugs/issue47996.go2 [new file with mode: 0644]

index 22680dce786c52214dce93b05b579cecc8f89b51..033283a3528784ce6dde2cfc13ebf7a57b08d9e5 100644 (file)
@@ -13,11 +13,7 @@ func TestDump(t *testing.T) {
                t.Skip("skipping test in short mode")
        }
 
-       // provide a no-op error handler so parsing doesn't stop after first error
-       ast, err := ParseFile(*src_, func(error) {}, nil, CheckBranches)
-       if err != nil {
-               t.Error(err)
-       }
+       ast, _ := ParseFile(*src_, func(err error) { t.Error(err) }, nil, CheckBranches|AllowGenerics)
 
        if ast != nil {
                Fdump(testOut(), ast)
index fd97279f9d7d4e767f51e3e3afd92cd4671b47ea..3d1ca9d6d472a1b74c0c0b868039a7e7c5e0c57a 100644 (file)
@@ -1924,7 +1924,7 @@ func (p *parser) paramList(name *Name, close token, requireNames bool) (list []*
        }
 
        // distribute parameter types (len(list) > 0)
-       if named == 0 {
+       if named == 0 && !requireNames {
                // all unnamed => found names are named types
                for _, par := range list {
                        if typ := par.Name; typ != nil {
@@ -1932,9 +1932,6 @@ func (p *parser) paramList(name *Name, close token, requireNames bool) (list []*
                                par.Name = nil
                        }
                }
-               if requireNames {
-                       p.syntaxErrorAt(list[0].Type.Pos(), "type parameters must be named")
-               }
        } else if named != len(list) {
                // some named => all must have names and types
                var pos Pos // left-most error position (or unknown)
index ec4b1de573f6bec08883996037bccf320cb210ad..638e6d4a9dc24cbc5f658599e19cc7900513aa36 100644 (file)
@@ -18,11 +18,7 @@ func TestPrint(t *testing.T) {
                t.Skip("skipping test in short mode")
        }
 
-       // provide a no-op error handler so parsing doesn't stop after first error
-       ast, err := ParseFile(*src_, func(error) {}, nil, 0)
-       if err != nil {
-               t.Error(err)
-       }
+       ast, _ := ParseFile(*src_, func(err error) { t.Error(err) }, nil, AllowGenerics)
 
        if ast != nil {
                Fprint(testOut(), ast, LineForm)
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue47996.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue47996.go2
new file mode 100644 (file)
index 0000000..56e9094
--- /dev/null
@@ -0,0 +1,8 @@
+// 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
+
+// don't crash
+func T /* ERROR missing */ [P /* ERROR named */ ] m /* ERROR m */ () /* ERROR \) */ { /* ERROR { */ } /* ERROR } */