mirror of
https://github.com/golang/go
synced 2024-11-26 10:58:16 -07: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:
parent
de2bc5722d
commit
7218b79f23
@ -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
24
test/switch2.go
Normal 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 }"
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user