]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/gc: fix internal compiler error on invalid declaration
authorDidier Spezia <didier.06@gmail.com>
Sun, 4 Oct 2015 20:33:02 +0000 (20:33 +0000)
committerRuss Cox <rsc@golang.org>
Mon, 7 Dec 2015 20:21:21 +0000 (20:21 +0000)
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>
src/cmd/compile/internal/gc/parser.go
test/fixedbugs/issue11610.go [new file with mode: 0644]

index 3da648a15180fdb921ea04a44ecdb22d5cf62ed1..16e0802e3e38c63b8a413697d43bfa6cf36ab9cd 100644 (file)
@@ -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
 }
diff --git a/test/fixedbugs/issue11610.go b/test/fixedbugs/issue11610.go
new file mode 100644 (file)
index 0000000..a326249
--- /dev/null
@@ -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() {
+}