1
0
mirror of https://github.com/golang/go synced 2024-07-05 09:50:19 +00:00

cmd/compile: match markdcl and popdcl even in case of errors

Change-Id: I22a8a233bc157fa09cd0283fcd4bc14d90faed70
Reviewed-on: https://go-review.googlesource.com/17066
Reviewed-by: Chris Manghane <cmang@golang.org>
This commit is contained in:
Robert Griesemer 2015-11-19 15:43:05 -08:00
parent de2bc5722d
commit 7218b79f23
2 changed files with 37 additions and 9 deletions

View File

@ -772,7 +772,7 @@ func (p *parser) case_(tswitch *Node) *Node {
// will be converted to OCASE
// right will point to next case
// done in casebody()
markdcl()
markdcl() // matching popdcl in caseblock
stmt := Nod(OXCASE, nil, nil)
stmt.List = cases
if tswitch != nil {
@ -798,7 +798,7 @@ func (p *parser) case_(tswitch *Node) *Node {
// will be converted to OCASE
// right will point to next case
// done in casebody()
markdcl()
markdcl() // matching popdcl in caseblock
stmt := Nod(OXCASE, nil, nil)
var n *Node
if cases.Next == nil {
@ -821,7 +821,7 @@ func (p *parser) case_(tswitch *Node) *Node {
// will be converted to OCASE
// right will point to next case
// done in casebody()
markdcl()
markdcl() // matching popdcl in caseblock
stmt := Nod(OXCASE, nil, nil)
stmt.List = list1(colas(cases, list1(rhs), int32(p.op)))
@ -829,16 +829,18 @@ func (p *parser) case_(tswitch *Node) *Node {
return stmt
default:
markdcl() // for matching popdcl in caseblock
stmt := Nod(OXCASE, nil, nil) // don't return nil
p.syntax_error("expecting := or = or : or comma")
p.advance(LCASE, LDEFAULT, '}')
return nil
return stmt
}
case LDEFAULT:
// LDEFAULT ':'
p.next()
markdcl()
markdcl() // matching popdcl in caseblock
stmt := Nod(OXCASE, nil, nil)
if tswitch != nil {
if n := tswitch.Left; n != nil {
@ -856,9 +858,11 @@ func (p *parser) case_(tswitch *Node) *Node {
return stmt
default:
markdcl() // matching popdcl in caseblock
stmt := Nod(OXCASE, nil, nil) // don't return nil
p.syntax_error("expecting case or default or }")
p.advance(LCASE, LDEFAULT, '}')
return nil
return stmt
}
}
@ -900,7 +904,7 @@ func (p *parser) caseblock(tswitch *Node) *Node {
defer p.trace("caseblock")()
}
stmt := p.case_(tswitch)
stmt := p.case_(tswitch) // does markdcl
// If the last token read by the lexer was consumed
// as part of the case, clear it (parser has cleared yychar).
@ -1110,7 +1114,7 @@ func (p *parser) if_stmt() *Node {
stmt.Nbody = p.loop_body("if clause")
l := p.elseif_list_else()
l := p.elseif_list_else() // does markdcl
n := stmt
popdcl()
@ -1132,7 +1136,7 @@ func (p *parser) elseif() *NodeList {
}
// LELSE LIF already consumed
markdcl()
markdcl() // matching popdcl in if_stmt
stmt := p.if_header()
if stmt.Left == nil {

24
test/switch2.go Normal file
View File

@ -0,0 +1,24 @@
// 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.
// Check various syntax errors with switches.
package main
func _() {
switch {
case 0; // ERROR "expecting := or = or : or comma"
}
switch {
case 0; // ERROR "expecting := or = or : or comma"
default:
}
switch {
if x: // ERROR "expecting case or default or }"
}
}