]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/compile: match markdcl and popdcl even in case of errors
authorRobert Griesemer <gri@golang.org>
Thu, 19 Nov 2015 23:43:05 +0000 (15:43 -0800)
committerRobert Griesemer <gri@golang.org>
Fri, 20 Nov 2015 19:56:11 +0000 (19:56 +0000)
Change-Id: I22a8a233bc157fa09cd0283fcd4bc14d90faed70
Reviewed-on: https://go-review.googlesource.com/17066
Reviewed-by: Chris Manghane <cmang@golang.org>
src/cmd/compile/internal/gc/parser.go
test/switch2.go [new file with mode: 0644]

index d21038683774bd878a5c55fe6e15659c2f7f7749..c34c271b5af71d61e00e2d47de604fe2ac782885 100644 (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 {
diff --git a/test/switch2.go b/test/switch2.go
new file mode 100644 (file)
index 0000000..3582da8
--- /dev/null
@@ -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 }"
+       }
+}