]> Cypherpunks repositories - gostls13.git/commit
go/parser: parser to accept ~x as unary expression
authorRobert Griesemer <gri@golang.org>
Tue, 3 May 2022 17:49:56 +0000 (10:49 -0700)
committerRobert Griesemer <gri@golang.org>
Wed, 4 May 2022 04:21:29 +0000 (04:21 +0000)
commit7cf32686667fe2de869ddab3ede647e34be9209e
treea4809a50b7cb7214a7c09c7af6c3511a26b19235
parent4f898840d1e81955231e42a0c5aee29065568196
go/parser: parser to accept ~x as unary expression

This is a port of CL 402255 from the syntax package to go/parser
with adjustments because of the different AST structure.

Accept ~x as ordinary unary expression in the parser but recognize
such expressions as invalid in the type checker.

This change opens the door to recognizing complex type constraint
literals such as `*E|~int` in `[P *E|~int]` and parse them correctly
instead of reporting a parse error because `P*E|~int` syntactically
looks like an incorrect array length expression (binary expression
where the RHS of | is an invalid unary expression ~int).

As a result, the parser is more forgiving with expressions but the
type checker will reject invalid uses as before.

We could pass extra information into the binary/unary expression
parse functions to prevent the use of ~ in invalid situations but
it doesn't seem worth the trouble. In fact it may be advantageous
to allow a more liberal expression syntax especially in the presence
of errors (better parser synchronization after an error).

Preparation for fixing #52559.

Change-Id: I48562cf40ccf5f14c20fcd92c40a0303b2d8b2b8
Reviewed-on: https://go-review.googlesource.com/c/go/+/403696
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: David Chase <drchase@google.com>
src/go/parser/parser.go
src/go/parser/testdata/typeset.go2
src/go/types/expr.go
src/go/types/testdata/check/expr0.go
src/go/types/testdata/fixedbugs/issue49482.go