mirror of
https://github.com/golang/go
synced 2024-11-11 21:40:21 -07:00
cmd/compile/internal/gc: fix internal compiler error on invalid declaration
Following an empty import, a declaration involving a ? symbol generates an internal compiler error when the name of the symbol (in newname function). package a import"" var? go.go:2: import path is empty go.go:3: internal compiler error: newname nil Make sure dclname is not called when the symbol is nil. The error message is now: go.go:2: import path is empty go.go:3: invalid declaration go.go:4: syntax error: unexpected EOF This CL was initially meant to be applied to the old parser, and has been updated to apply to the new parser. Fixes #11610 Change-Id: I75e07622fb3af1d104e3a38c89d9e128e3b94522 Reviewed-on: https://go-review.googlesource.com/15268 Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
parent
715f63778d
commit
70da2d0a2a
@ -1738,6 +1738,18 @@ func (p *parser) new_name(sym *Sym) *Node {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *parser) dcl_name(sym *Sym) *Node {
|
||||
if trace && Debug['x'] != 0 {
|
||||
defer p.trace("dcl_name")()
|
||||
}
|
||||
|
||||
if sym == nil {
|
||||
yyerrorl(int(prevlineno), "invalid declaration")
|
||||
return nil
|
||||
}
|
||||
return dclname(sym)
|
||||
}
|
||||
|
||||
func (p *parser) onew_name() *Node {
|
||||
if trace && Debug['x'] != 0 {
|
||||
defer p.trace("onew_name")()
|
||||
@ -2736,9 +2748,9 @@ func (p *parser) dcl_name_list() *NodeList {
|
||||
defer p.trace("dcl_name_list")()
|
||||
}
|
||||
|
||||
l := list1(dclname(p.sym()))
|
||||
l := list1(p.dcl_name(p.sym()))
|
||||
for p.got(',') {
|
||||
l = list(l, dclname(p.sym()))
|
||||
l = list(l, p.dcl_name(p.sym()))
|
||||
}
|
||||
return l
|
||||
}
|
||||
|
17
test/fixedbugs/issue11610.go
Normal file
17
test/fixedbugs/issue11610.go
Normal file
@ -0,0 +1,17 @@
|
||||
// errorcheck
|
||||
|
||||
// Copyright 2015 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.
|
||||
|
||||
// Test an internal compiler error on ? symbol in declaration
|
||||
// following an empty import.
|
||||
|
||||
package a
|
||||
import"" // ERROR "import path is empty"
|
||||
var? // ERROR "invalid declaration"
|
||||
|
||||
var x int // ERROR "unexpected var"
|
||||
|
||||
func main() {
|
||||
}
|
Loading…
Reference in New Issue
Block a user