]> Cypherpunks.ru repositories - gostls13.git/commitdiff
gc: handle invalid name in type switch
authorRuss Cox <rsc@golang.org>
Tue, 1 Feb 2011 19:00:36 +0000 (14:00 -0500)
committerRuss Cox <rsc@golang.org>
Tue, 1 Feb 2011 19:00:36 +0000 (14:00 -0500)
Fixes #1453.

R=ken2
CC=golang-dev
https://golang.org/cl/4125043

src/cmd/gc/go.y
test/syntax/typesw.go [new file with mode: 0644]

index b711d360d2d8813f19ed601d4e17834fa9f11405..994840ee831609e1889b08cd84c34bd4164cad4f 100644 (file)
@@ -422,11 +422,18 @@ simple_stmt:
 |      expr_list LCOLAS expr_list
        {
                if($3->n->op == OTYPESW) {
+                       Node *n;
+                       
+                       n = N;
                        if($3->next != nil)
                                yyerror("expr.(type) must be alone in list");
-                       else if($1->next != nil)
+                       if($1->next != nil)
                                yyerror("argument count mismatch: %d = %d", count($1), 1);
-                       $$ = nod(OTYPESW, $1->n, $3->n->right);
+                       else if($1->n->op != ONAME && $1->n->op != OTYPE && $1->n->op != ONONAME)
+                               yyerror("invalid variable name %#N in type switch", $1->n);
+                       else
+                               n = $1->n;
+                       $$ = nod(OTYPESW, n, $3->n->right);
                        break;
                }
                $$ = colas($1, $3);
diff --git a/test/syntax/typesw.go b/test/syntax/typesw.go
new file mode 100644 (file)
index 0000000..47f683c
--- /dev/null
@@ -0,0 +1,13 @@
+// errchk $G -e $D/$F.go
+
+// Copyright 2011 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.
+
+package main
+
+func main() {
+       switch main() := interface{}(nil).(type) {      // ERROR "invalid variable name"
+       default:
+       }
+}