From: Robert Griesemer Date: Thu, 19 Nov 2015 23:43:05 +0000 (-0800) Subject: cmd/compile: match markdcl and popdcl even in case of errors X-Git-Tag: go1.6beta1~347 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=7218b79f23186420b7ae5535bb5157923473e63e;p=gostls13.git 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 --- diff --git a/src/cmd/compile/internal/gc/parser.go b/src/cmd/compile/internal/gc/parser.go index d210386837..c34c271b5a 100644 --- a/src/cmd/compile/internal/gc/parser.go +++ b/src/cmd/compile/internal/gc/parser.go @@ -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 { diff --git a/test/switch2.go b/test/switch2.go new file mode 100644 index 0000000000..3582da8be6 --- /dev/null +++ b/test/switch2.go @@ -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 }" + } +}