// Copyright 2021 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. // This file contains test cases for typeset-only constraint elements. // TODO(gri) gofmt once/if gofmt supports this notation. package p type ( _[_ t] t _[_ ~t] t _[_ t|t] t _[_ ~t|t] t _[_ t|~t] t _[_ ~t|~t] t _[_ t, _, _ t|t] t _[_ t, _, _ ~t|t] t _[_ t, _, _ t|~t] t _[_ t, _, _ ~t|~t] t _[_ t.t] t _[_ ~t.t] t _[_ t.t|t.t] t _[_ ~t.t|t.t] t _[_ t.t|~t.t] t _[_ ~t.t|~t.t] t _[_ t, _, _ t.t|t.t] t _[_ t, _, _ ~t.t|t.t] t _[_ t, _, _ t.t|~t.t] t _[_ t, _, _ ~t.t|~t.t] t _[_ struct{}] t _[_ ~struct{}] t _[_ struct{}|t] t _[_ ~struct{}|t] t _[_ struct{}|~t] t _[_ ~struct{}|~t] t _[_ t|struct{}] t _[_ ~t|struct{}] t _[_ t|~struct{}] t _[_ ~t|~struct{}] t ) // Single-expression type parameter lists and those that don't start // with a (type parameter) name are considered array sizes. // The term must be a valid expression (it could be a type - and then // a type-checker will complain - but we don't allow ~ in the expr). // TODO(rfindley): Improve error recover here. In these cases go/parser error // recovery is worse than cmd/compile/internal/syntax, and unnecessary type // declarations had to be inserted to force synchronization. type _[t] t type _[~ /* ERROR "expected operand" */ t] t type /* ERROR "expected ']'" */ Sync int // placeholder to synchronize the parser type _[t|t] t type _[~ /* ERROR "expected operand" */ t|t] t type /* ERROR "expected ']'" */ Sync int // placeholder to synchronize the parser type _[t| ~ /* ERROR "expected operand" */ t] t type /* ERROR "expected ']'" */ Sync int // placeholder to synchronize the parser type _[~ /* ERROR "expected operand" */ t|~t] t type /* ERROR "expected ']'" */ Sync int // placeholder to synchronize the parser type _[_ t, t /* ERROR "type parameters must be named" */ ] t type _[_ ~t, t /* ERROR "type parameters must be named" */ ] t type _[_ t, ~ /* ERROR "type parameters must be named" */ t] t type _[_ ~t, ~ /* ERROR "type parameters must be named" */ t] t type _[_ t|t, t /* ERROR "type parameters must be named" */ |t] t type _[_ ~t|t, t /* ERROR "type parameters must be named" */ |t] t type _[_ t|t, ~ /* ERROR "type parameters must be named" */ t|t] t type _[_ ~t|t, ~ /* ERROR "type parameters must be named" */ t|t] t