]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/gc: better error message for parenthesized go/defer exprs
authorRobert Griesemer <gri@golang.org>
Wed, 18 Nov 2015 19:24:48 +0000 (11:24 -0800)
committerRobert Griesemer <gri@golang.org>
Wed, 18 Nov 2015 22:26:07 +0000 (22:26 +0000)
Change-Id: Ie24d56422ae2196198a6c306716fa867c1442d6e
Reviewed-on: https://go-review.googlesource.com/17043
Reviewed-by: Chris Manghane <cmang@golang.org>
src/cmd/compile/internal/gc/parser.go
test/fixedbugs/issue4468.go

index a3ecf92c08f29e9a064a4b6d0ed9706580ad8948..f2f84eed4cc516455e3019f5569bb204e94bbd31 100644 (file)
@@ -1391,13 +1391,18 @@ func (p *parser) pseudocall() *Node {
                defer p.trace("pseudocall")()
        }
 
-       // The expression in go/defer must not be parenthesized;
-       // don't drop ()'s so we can report an error.
-       x := p.pexpr(true /* keep_parens */)
-       if x.Op != OCALL {
-               Yyerror("argument to go/defer must be function call")
+       x := p.pexpr(true) // keep_parens so we can report error below
+       switch x.Op {
+       case OCALL:
+               return x
+       case OPAREN:
+               Yyerror("expression in go/defer must not be parenthesized")
+               // already progressed, no need to advance
+       default:
+               Yyerror("expression in go/defer must be function call")
+               // already progressed, no need to advance
        }
-       return x
+       return nil
 }
 
 // go.y:pexpr (partial)
index ef0b46bcf6829ba8c8aa517a5b57c134473b5510..f8821052af5c9fe6c77478dd3a0fbe12f856e394 100644 (file)
@@ -19,8 +19,12 @@ type S struct {
 }
 
 func F() {
-       go (F())        // ERROR "must be function call"
-       defer (F())     // ERROR "must be function call"
+       go F            // ERROR "must be function call"
+       defer F         // ERROR "must be function call"
+       go (F)          // ERROR "must be function call|must not be parenthesized"
+       defer (F)       // ERROR "must be function call|must not be parenthesized"
+       go (F())        // ERROR "must be function call|must not be parenthesized"
+       defer (F())     // ERROR "must be function call|must not be parenthesized"
        var s S
        (&s.t).F()
        go (&s.t).F()