[dev.typeparams] cmd/compile/internal/types2: don't crash if import path is missing

In package syntax:
- fix parser appendGroup to not add nil entries
- non-string paths are syntax errors per the spec; report in parser
- document ImportDecl.Path invariants

In package types2:
- guard against absent paths

In package gc:
- guard against absent paths

Fixes #43190.

Change-Id: Ic6a06f6a96b7f519feaa1ceaf4376fc5ab0f0129
Reviewed-on: https://go-review.googlesource.com/c/go/+/278114
Trust: Robert Griesemer <gri@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
This commit is contained in:
Robert Griesemer 2020-12-14 17:23:00 -08:00
parent 14e4267c34
commit 6b18081d01
5 changed files with 34 additions and 15 deletions

View file

@ -463,7 +463,7 @@ func (p *noder) decls(decls []syntax.Decl) (l []ir.Node) {
}
func (p *noder) importDecl(imp *syntax.ImportDecl) {
if imp.Path.Bad {
if imp.Path == nil || imp.Path.Bad {
return // avoid follow-on errors if there was a syntax error
}

View file

@ -56,7 +56,7 @@ type (
Group *Group // nil means not part of a group
Pragma Pragma
LocalPkgName *Name // including "."; nil means no rename present
Path *BasicLit
Path *BasicLit // Path.Bad || Path.Kind == StringLit; nil means no path
decl
}

View file

@ -499,21 +499,16 @@ func (p *parser) appendGroup(list []Decl, f func(*Group) Decl) []Decl {
p.clearPragma()
p.next() // must consume "(" after calling clearPragma!
p.list(_Semi, _Rparen, func() bool {
list = append(list, f(g))
if x := f(g); x != nil {
list = append(list, x)
}
return false
})
} else {
list = append(list, f(nil))
}
if debug {
for _, d := range list {
if d == nil {
panic("nil list entry")
if x := f(nil); x != nil {
list = append(list, x)
}
}
}
return list
}
@ -540,8 +535,13 @@ func (p *parser) importDecl(group *Group) Decl {
if d.Path == nil {
p.syntaxError("missing import path")
p.advance(_Semi, _Rparen)
return nil
return d
}
if !d.Path.Bad && d.Path.Kind != StringLit {
p.syntaxError("import path must be a string")
d.Path.Bad = true
}
// d.Path.Bad || d.Path.Kind == StringLit
return d
}

View file

@ -0,0 +1,19 @@
// Copyright 2020 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 ; // ERROR missing import path
import
var /* ERROR missing import path */ _ int
import .; // ERROR missing import path
import ()
import (.) // ERROR missing import path
import (
"fmt"
.
) // ERROR missing import path
var _ = fmt.Println // avoid imported but not used error

View file

@ -236,7 +236,7 @@ func (check *Checker) collectObjects() {
switch s := decl.(type) {
case *syntax.ImportDecl:
// import package
if s.Path.Bad {
if s.Path == nil || s.Path.Bad {
continue // error reported during parsing
}
path, err := validatedImportPath(s.Path.Value)