go.tools/go/types: address and slice operations are not addressable

LGTM=gri
R=gri
CC=golang-codereviews
https://golang.org/cl/89380044
This commit is contained in:
Peter Collingbourne 2014-04-21 11:38:43 -07:00 committed by Robert Griesemer
parent 998b73a2e9
commit feafa74756
3 changed files with 8 additions and 7 deletions

View File

@ -84,14 +84,12 @@ func (check *checker) unary(x *operand, op token.Token) {
case token.AND: case token.AND:
// spec: "As an exception to the addressability // spec: "As an exception to the addressability
// requirement x may also be a composite literal." // requirement x may also be a composite literal."
if _, ok := unparen(x.expr).(*ast.CompositeLit); ok { if _, ok := unparen(x.expr).(*ast.CompositeLit); !ok && x.mode != variable {
x.mode = variable
}
if x.mode != variable {
check.invalidOp(x.pos(), "cannot take address of %s", x) check.invalidOp(x.pos(), "cannot take address of %s", x)
x.mode = invalid x.mode = invalid
return return
} }
x.mode = value
x.typ = &Pointer{base: x.typ} x.typ = &Pointer{base: x.typ}
return return
@ -1228,7 +1226,6 @@ func (check *checker) exprInternal(x *operand, e ast.Expr, hint Type) exprKind {
} }
// spec: "For untyped string operands the result // spec: "For untyped string operands the result
// is a non-constant value of type string." // is a non-constant value of type string."
x.mode = value
if typ.kind == UntypedString { if typ.kind == UntypedString {
x.typ = Typ[String] x.typ = Typ[String]
} }
@ -1247,13 +1244,11 @@ func (check *checker) exprInternal(x *operand, e ast.Expr, hint Type) exprKind {
if typ, _ := typ.base.Underlying().(*Array); typ != nil { if typ, _ := typ.base.Underlying().(*Array); typ != nil {
valid = true valid = true
length = typ.len length = typ.len
x.mode = variable
x.typ = &Slice{elem: typ.elem} x.typ = &Slice{elem: typ.elem}
} }
case *Slice: case *Slice:
valid = true valid = true
x.mode = variable
// x.typ doesn't change // x.typ doesn't change
} }
@ -1262,6 +1257,8 @@ func (check *checker) exprInternal(x *operand, e ast.Expr, hint Type) exprKind {
goto Error goto Error
} }
x.mode = value
// spec: "Only the first index may be omitted; it defaults to 0." // spec: "Only the first index may be omitted; it defaults to 0."
if slice3(e) && (e.High == nil || sliceMax(e) == nil) { if slice3(e) && (e.High == nil || sliceMax(e) == nil) {
check.error(e.Rbrack, "2nd and 3rd index required in 3-index slice") check.error(e.Rbrack, "2nd and 3rd index required in 3-index slice")

View File

@ -21,6 +21,7 @@ var (
b10 = &true /* ERROR "cannot take address" */ b10 = &true /* ERROR "cannot take address" */
b11 = &b0 b11 = &b0
b12 = <-b0 /* ERROR "cannot receive" */ b12 = <-b0 /* ERROR "cannot receive" */
b13 = & & /* ERROR "cannot take address" */ b0
// int // int
i0 = 1 i0 = 1

View File

@ -44,6 +44,7 @@ func indexes() {
_ = a[10:0:10] /* ERROR "invalid slice indices" */ _ = a[10:0:10] /* ERROR "invalid slice indices" */
_ = a[0:10:0] /* ERROR "invalid slice indices" */ _ = a[0:10:0] /* ERROR "invalid slice indices" */
_ = a[10:0:0] /* ERROR "invalid slice indices" */ _ = a[10:0:0] /* ERROR "invalid slice indices" */
_ = &a /* ERROR "cannot take address" */ [:10]
pa := &a pa := &a
_ = pa[9] _ = pa[9]
@ -61,6 +62,7 @@ func indexes() {
_ = pa[10:0:10] /* ERROR "invalid slice indices" */ _ = pa[10:0:10] /* ERROR "invalid slice indices" */
_ = pa[0:10:0] /* ERROR "invalid slice indices" */ _ = pa[0:10:0] /* ERROR "invalid slice indices" */
_ = pa[10:0:0] /* ERROR "invalid slice indices" */ _ = pa[10:0:0] /* ERROR "invalid slice indices" */
_ = &pa /* ERROR "cannot take address" */ [:10]
var b [0]int var b [0]int
_ = b[0 /* ERROR "index .* out of bounds" */ ] _ = b[0 /* ERROR "index .* out of bounds" */ ]
@ -87,6 +89,7 @@ func indexes() {
_ = s[10:0:10] /* ERROR "invalid slice indices" */ _ = s[10:0:10] /* ERROR "invalid slice indices" */
_ = s[0:10:0] /* ERROR "invalid slice indices" */ _ = s[0:10:0] /* ERROR "invalid slice indices" */
_ = s[10:0:0] /* ERROR "invalid slice indices" */ _ = s[10:0:0] /* ERROR "invalid slice indices" */
_ = &s /* ERROR "cannot take address" */ [:10]
var t string var t string
_ = t[- /* ERROR "negative" */ 1] _ = t[- /* ERROR "negative" */ 1]