Home | History | Annotate | Download | only in types
      1 // Copyright 2013 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 // This file implements type-checking of identifiers and type expressions.
      6 
      7 package types
      8 
      9 import (
     10 	"go/ast"
     11 	"go/constant"
     12 	"go/token"
     13 	"sort"
     14 	"strconv"
     15 )
     16 
     17 // ident type-checks identifier e and initializes x with the value or type of e.
     18 // If an error occurred, x.mode is set to invalid.
     19 // For the meaning of def and path, see check.typ, below.
     20 //
     21 func (check *Checker) ident(x *operand, e *ast.Ident, def *Named, path []*TypeName) {
     22 	x.mode = invalid
     23 	x.expr = e
     24 
     25 	scope, obj := check.scope.LookupParent(e.Name, check.pos)
     26 	if obj == nil {
     27 		if e.Name == "_" {
     28 			check.errorf(e.Pos(), "cannot use _ as value or type")
     29 		} else {
     30 			check.errorf(e.Pos(), "undeclared name: %s", e.Name)
     31 		}
     32 		return
     33 	}
     34 	check.recordUse(e, obj)
     35 
     36 	check.objDecl(obj, def, path)
     37 	typ := obj.Type()
     38 	assert(typ != nil)
     39 
     40 	// The object may be dot-imported: If so, remove its package from
     41 	// the map of unused dot imports for the respective file scope.
     42 	// (This code is only needed for dot-imports. Without them,
     43 	// we only have to mark variables, see *Var case below).
     44 	if pkg := obj.Pkg(); pkg != check.pkg && pkg != nil {
     45 		delete(check.unusedDotImports[scope], pkg)
     46 	}
     47 
     48 	// Alias-related code. Keep for now.
     49 	// An alias stands for the original object; use that one instead.
     50 	// TODO(gri) We should be able to factor out the Typ[Invalid] test.
     51 	// if alias, _ := obj.(*Alias); alias != nil {
     52 	// 	obj = original(obj)
     53 	// 	if obj == nil || typ == Typ[Invalid] {
     54 	// 		return
     55 	// 	}
     56 	// 	assert(typ == obj.Type())
     57 	// }
     58 
     59 	switch obj := obj.(type) {
     60 	case *PkgName:
     61 		check.errorf(e.Pos(), "use of package %s not in selector", obj.name)
     62 		return
     63 
     64 	case *Const:
     65 		check.addDeclDep(obj)
     66 		if typ == Typ[Invalid] {
     67 			return
     68 		}
     69 		if obj == universeIota {
     70 			if check.iota == nil {
     71 				check.errorf(e.Pos(), "cannot use iota outside constant declaration")
     72 				return
     73 			}
     74 			x.val = check.iota
     75 		} else {
     76 			x.val = obj.val
     77 		}
     78 		assert(x.val != nil)
     79 		x.mode = constant_
     80 
     81 	case *TypeName:
     82 		x.mode = typexpr
     83 		// check for cycle
     84 		// (it's ok to iterate forward because each named type appears at most once in path)
     85 		for i, prev := range path {
     86 			if prev == obj {
     87 				check.errorf(obj.pos, "illegal cycle in declaration of %s", obj.name)
     88 				// print cycle
     89 				for _, obj := range path[i:] {
     90 					check.errorf(obj.Pos(), "\t%s refers to", obj.Name()) // secondary error, \t indented
     91 				}
     92 				check.errorf(obj.Pos(), "\t%s", obj.Name())
     93 				// maintain x.mode == typexpr despite error
     94 				typ = Typ[Invalid]
     95 				break
     96 			}
     97 		}
     98 
     99 	case *Var:
    100 		if obj.pkg == check.pkg {
    101 			obj.used = true
    102 		}
    103 		check.addDeclDep(obj)
    104 		if typ == Typ[Invalid] {
    105 			return
    106 		}
    107 		x.mode = variable
    108 
    109 	case *Func:
    110 		check.addDeclDep(obj)
    111 		x.mode = value
    112 
    113 	case *Builtin:
    114 		x.id = obj.id
    115 		x.mode = builtin
    116 
    117 	case *Nil:
    118 		x.mode = value
    119 
    120 	default:
    121 		unreachable()
    122 	}
    123 
    124 	x.typ = typ
    125 }
    126 
    127 // typExpr type-checks the type expression e and returns its type, or Typ[Invalid].
    128 // If def != nil, e is the type specification for the named type def, declared
    129 // in a type declaration, and def.underlying will be set to the type of e before
    130 // any components of e are type-checked. Path contains the path of named types
    131 // referring to this type.
    132 //
    133 func (check *Checker) typExpr(e ast.Expr, def *Named, path []*TypeName) (T Type) {
    134 	if trace {
    135 		check.trace(e.Pos(), "%s", e)
    136 		check.indent++
    137 		defer func() {
    138 			check.indent--
    139 			check.trace(e.Pos(), "=> %s", T)
    140 		}()
    141 	}
    142 
    143 	T = check.typExprInternal(e, def, path)
    144 	assert(isTyped(T))
    145 	check.recordTypeAndValue(e, typexpr, T, nil)
    146 
    147 	return
    148 }
    149 
    150 func (check *Checker) typ(e ast.Expr) Type {
    151 	return check.typExpr(e, nil, nil)
    152 }
    153 
    154 // funcType type-checks a function or method type.
    155 func (check *Checker) funcType(sig *Signature, recvPar *ast.FieldList, ftyp *ast.FuncType) {
    156 	scope := NewScope(check.scope, token.NoPos, token.NoPos, "function")
    157 	check.recordScope(ftyp, scope)
    158 
    159 	recvList, _ := check.collectParams(scope, recvPar, false)
    160 	params, variadic := check.collectParams(scope, ftyp.Params, true)
    161 	results, _ := check.collectParams(scope, ftyp.Results, false)
    162 
    163 	if recvPar != nil {
    164 		// recv parameter list present (may be empty)
    165 		// spec: "The receiver is specified via an extra parameter section preceding the
    166 		// method name. That parameter section must declare a single parameter, the receiver."
    167 		var recv *Var
    168 		switch len(recvList) {
    169 		case 0:
    170 			check.error(recvPar.Pos(), "method is missing receiver")
    171 			recv = NewParam(0, nil, "", Typ[Invalid]) // ignore recv below
    172 		default:
    173 			// more than one receiver
    174 			check.error(recvList[len(recvList)-1].Pos(), "method must have exactly one receiver")
    175 			fallthrough // continue with first receiver
    176 		case 1:
    177 			recv = recvList[0]
    178 		}
    179 		// spec: "The receiver type must be of the form T or *T where T is a type name."
    180 		// (ignore invalid types - error was reported before)
    181 		if t, _ := deref(recv.typ); t != Typ[Invalid] {
    182 			var err string
    183 			if T, _ := t.(*Named); T != nil {
    184 				// spec: "The type denoted by T is called the receiver base type; it must not
    185 				// be a pointer or interface type and it must be declared in the same package
    186 				// as the method."
    187 				if T.obj.pkg != check.pkg {
    188 					err = "type not defined in this package"
    189 				} else {
    190 					// TODO(gri) This is not correct if the underlying type is unknown yet.
    191 					switch u := T.underlying.(type) {
    192 					case *Basic:
    193 						// unsafe.Pointer is treated like a regular pointer
    194 						if u.kind == UnsafePointer {
    195 							err = "unsafe.Pointer"
    196 						}
    197 					case *Pointer, *Interface:
    198 						err = "pointer or interface type"
    199 					}
    200 				}
    201 			} else {
    202 				err = "basic or unnamed type"
    203 			}
    204 			if err != "" {
    205 				check.errorf(recv.pos, "invalid receiver %s (%s)", recv.typ, err)
    206 				// ok to continue
    207 			}
    208 		}
    209 		sig.recv = recv
    210 	}
    211 
    212 	sig.scope = scope
    213 	sig.params = NewTuple(params...)
    214 	sig.results = NewTuple(results...)
    215 	sig.variadic = variadic
    216 }
    217 
    218 // typExprInternal drives type checking of types.
    219 // Must only be called by typExpr.
    220 //
    221 func (check *Checker) typExprInternal(e ast.Expr, def *Named, path []*TypeName) Type {
    222 	switch e := e.(type) {
    223 	case *ast.BadExpr:
    224 		// ignore - error reported before
    225 
    226 	case *ast.Ident:
    227 		var x operand
    228 		check.ident(&x, e, def, path)
    229 
    230 		switch x.mode {
    231 		case typexpr:
    232 			typ := x.typ
    233 			def.setUnderlying(typ)
    234 			return typ
    235 		case invalid:
    236 			// ignore - error reported before
    237 		case novalue:
    238 			check.errorf(x.pos(), "%s used as type", &x)
    239 		default:
    240 			check.errorf(x.pos(), "%s is not a type", &x)
    241 		}
    242 
    243 	case *ast.SelectorExpr:
    244 		var x operand
    245 		check.selector(&x, e)
    246 
    247 		switch x.mode {
    248 		case typexpr:
    249 			typ := x.typ
    250 			def.setUnderlying(typ)
    251 			return typ
    252 		case invalid:
    253 			// ignore - error reported before
    254 		case novalue:
    255 			check.errorf(x.pos(), "%s used as type", &x)
    256 		default:
    257 			check.errorf(x.pos(), "%s is not a type", &x)
    258 		}
    259 
    260 	case *ast.ParenExpr:
    261 		return check.typExpr(e.X, def, path)
    262 
    263 	case *ast.ArrayType:
    264 		if e.Len != nil {
    265 			typ := new(Array)
    266 			def.setUnderlying(typ)
    267 			typ.len = check.arrayLength(e.Len)
    268 			typ.elem = check.typExpr(e.Elt, nil, path)
    269 			return typ
    270 
    271 		} else {
    272 			typ := new(Slice)
    273 			def.setUnderlying(typ)
    274 			typ.elem = check.typ(e.Elt)
    275 			return typ
    276 		}
    277 
    278 	case *ast.StructType:
    279 		typ := new(Struct)
    280 		def.setUnderlying(typ)
    281 		check.structType(typ, e, path)
    282 		return typ
    283 
    284 	case *ast.StarExpr:
    285 		typ := new(Pointer)
    286 		def.setUnderlying(typ)
    287 		typ.base = check.typ(e.X)
    288 		return typ
    289 
    290 	case *ast.FuncType:
    291 		typ := new(Signature)
    292 		def.setUnderlying(typ)
    293 		check.funcType(typ, nil, e)
    294 		return typ
    295 
    296 	case *ast.InterfaceType:
    297 		typ := new(Interface)
    298 		def.setUnderlying(typ)
    299 		check.interfaceType(typ, e, def, path)
    300 		return typ
    301 
    302 	case *ast.MapType:
    303 		typ := new(Map)
    304 		def.setUnderlying(typ)
    305 
    306 		typ.key = check.typ(e.Key)
    307 		typ.elem = check.typ(e.Value)
    308 
    309 		// spec: "The comparison operators == and != must be fully defined
    310 		// for operands of the key type; thus the key type must not be a
    311 		// function, map, or slice."
    312 		//
    313 		// Delay this check because it requires fully setup types;
    314 		// it is safe to continue in any case (was issue 6667).
    315 		check.delay(func() {
    316 			if !Comparable(typ.key) {
    317 				check.errorf(e.Key.Pos(), "invalid map key type %s", typ.key)
    318 			}
    319 		})
    320 
    321 		return typ
    322 
    323 	case *ast.ChanType:
    324 		typ := new(Chan)
    325 		def.setUnderlying(typ)
    326 
    327 		dir := SendRecv
    328 		switch e.Dir {
    329 		case ast.SEND | ast.RECV:
    330 			// nothing to do
    331 		case ast.SEND:
    332 			dir = SendOnly
    333 		case ast.RECV:
    334 			dir = RecvOnly
    335 		default:
    336 			check.invalidAST(e.Pos(), "unknown channel direction %d", e.Dir)
    337 			// ok to continue
    338 		}
    339 
    340 		typ.dir = dir
    341 		typ.elem = check.typ(e.Value)
    342 		return typ
    343 
    344 	default:
    345 		check.errorf(e.Pos(), "%s is not a type", e)
    346 	}
    347 
    348 	typ := Typ[Invalid]
    349 	def.setUnderlying(typ)
    350 	return typ
    351 }
    352 
    353 // typeOrNil type-checks the type expression (or nil value) e
    354 // and returns the typ of e, or nil.
    355 // If e is neither a type nor nil, typOrNil returns Typ[Invalid].
    356 //
    357 func (check *Checker) typOrNil(e ast.Expr) Type {
    358 	var x operand
    359 	check.rawExpr(&x, e, nil)
    360 	switch x.mode {
    361 	case invalid:
    362 		// ignore - error reported before
    363 	case novalue:
    364 		check.errorf(x.pos(), "%s used as type", &x)
    365 	case typexpr:
    366 		return x.typ
    367 	case value:
    368 		if x.isNil() {
    369 			return nil
    370 		}
    371 		fallthrough
    372 	default:
    373 		check.errorf(x.pos(), "%s is not a type", &x)
    374 	}
    375 	return Typ[Invalid]
    376 }
    377 
    378 func (check *Checker) arrayLength(e ast.Expr) int64 {
    379 	var x operand
    380 	check.expr(&x, e)
    381 	if x.mode != constant_ {
    382 		if x.mode != invalid {
    383 			check.errorf(x.pos(), "array length %s must be constant", &x)
    384 		}
    385 		return 0
    386 	}
    387 	if isUntyped(x.typ) || isInteger(x.typ) {
    388 		if val := constant.ToInt(x.val); val.Kind() == constant.Int {
    389 			if representableConst(val, check.conf, Typ[Int], nil) {
    390 				if n, ok := constant.Int64Val(val); ok && n >= 0 {
    391 					return n
    392 				}
    393 				check.errorf(x.pos(), "invalid array length %s", &x)
    394 				return 0
    395 			}
    396 		}
    397 	}
    398 	check.errorf(x.pos(), "array length %s must be integer", &x)
    399 	return 0
    400 }
    401 
    402 func (check *Checker) collectParams(scope *Scope, list *ast.FieldList, variadicOk bool) (params []*Var, variadic bool) {
    403 	if list == nil {
    404 		return
    405 	}
    406 
    407 	var named, anonymous bool
    408 	for i, field := range list.List {
    409 		ftype := field.Type
    410 		if t, _ := ftype.(*ast.Ellipsis); t != nil {
    411 			ftype = t.Elt
    412 			if variadicOk && i == len(list.List)-1 {
    413 				variadic = true
    414 			} else {
    415 				check.invalidAST(field.Pos(), "... not permitted")
    416 				// ignore ... and continue
    417 			}
    418 		}
    419 		typ := check.typ(ftype)
    420 		// The parser ensures that f.Tag is nil and we don't
    421 		// care if a constructed AST contains a non-nil tag.
    422 		if len(field.Names) > 0 {
    423 			// named parameter
    424 			for _, name := range field.Names {
    425 				if name.Name == "" {
    426 					check.invalidAST(name.Pos(), "anonymous parameter")
    427 					// ok to continue
    428 				}
    429 				par := NewParam(name.Pos(), check.pkg, name.Name, typ)
    430 				check.declare(scope, name, par, scope.pos)
    431 				params = append(params, par)
    432 			}
    433 			named = true
    434 		} else {
    435 			// anonymous parameter
    436 			par := NewParam(ftype.Pos(), check.pkg, "", typ)
    437 			check.recordImplicit(field, par)
    438 			params = append(params, par)
    439 			anonymous = true
    440 		}
    441 	}
    442 
    443 	if named && anonymous {
    444 		check.invalidAST(list.Pos(), "list contains both named and anonymous parameters")
    445 		// ok to continue
    446 	}
    447 
    448 	// For a variadic function, change the last parameter's type from T to []T.
    449 	if variadic && len(params) > 0 {
    450 		last := params[len(params)-1]
    451 		last.typ = &Slice{elem: last.typ}
    452 	}
    453 
    454 	return
    455 }
    456 
    457 func (check *Checker) declareInSet(oset *objset, pos token.Pos, obj Object) bool {
    458 	if alt := oset.insert(obj); alt != nil {
    459 		check.errorf(pos, "%s redeclared", obj.Name())
    460 		check.reportAltDecl(alt)
    461 		return false
    462 	}
    463 	return true
    464 }
    465 
    466 func (check *Checker) interfaceType(iface *Interface, ityp *ast.InterfaceType, def *Named, path []*TypeName) {
    467 	// empty interface: common case
    468 	if ityp.Methods == nil {
    469 		return
    470 	}
    471 
    472 	// The parser ensures that field tags are nil and we don't
    473 	// care if a constructed AST contains non-nil tags.
    474 
    475 	// use named receiver type if available (for better error messages)
    476 	var recvTyp Type = iface
    477 	if def != nil {
    478 		recvTyp = def
    479 	}
    480 
    481 	// Phase 1: Collect explicitly declared methods, the corresponding
    482 	//          signature (AST) expressions, and the list of embedded
    483 	//          type (AST) expressions. Do not resolve signatures or
    484 	//          embedded types yet to avoid cycles referring to this
    485 	//          interface.
    486 
    487 	var (
    488 		mset       objset
    489 		signatures []ast.Expr // list of corresponding method signatures
    490 		embedded   []ast.Expr // list of embedded types
    491 	)
    492 	for _, f := range ityp.Methods.List {
    493 		if len(f.Names) > 0 {
    494 			// The parser ensures that there's only one method
    495 			// and we don't care if a constructed AST has more.
    496 			name := f.Names[0]
    497 			pos := name.Pos()
    498 			// spec: "As with all method sets, in an interface type,
    499 			// each method must have a unique non-blank name."
    500 			if name.Name == "_" {
    501 				check.errorf(pos, "invalid method name _")
    502 				continue
    503 			}
    504 			// Don't type-check signature yet - use an
    505 			// empty signature now and update it later.
    506 			// Since we know the receiver, set it up now
    507 			// (required to avoid crash in ptrRecv; see
    508 			// e.g. test case for issue 6638).
    509 			// TODO(gri) Consider marking methods signatures
    510 			// as incomplete, for better error messages. See
    511 			// also the T4 and T5 tests in testdata/cycles2.src.
    512 			sig := new(Signature)
    513 			sig.recv = NewVar(pos, check.pkg, "", recvTyp)
    514 			m := NewFunc(pos, check.pkg, name.Name, sig)
    515 			if check.declareInSet(&mset, pos, m) {
    516 				iface.methods = append(iface.methods, m)
    517 				iface.allMethods = append(iface.allMethods, m)
    518 				signatures = append(signatures, f.Type)
    519 				check.recordDef(name, m)
    520 			}
    521 		} else {
    522 			// embedded type
    523 			embedded = append(embedded, f.Type)
    524 		}
    525 	}
    526 
    527 	// Phase 2: Resolve embedded interfaces. Because an interface must not
    528 	//          embed itself (directly or indirectly), each embedded interface
    529 	//          can be fully resolved without depending on any method of this
    530 	//          interface (if there is a cycle or another error, the embedded
    531 	//          type resolves to an invalid type and is ignored).
    532 	//          In particular, the list of methods for each embedded interface
    533 	//          must be complete (it cannot depend on this interface), and so
    534 	//          those methods can be added to the list of all methods of this
    535 	//          interface.
    536 
    537 	for _, e := range embedded {
    538 		pos := e.Pos()
    539 		typ := check.typExpr(e, nil, path)
    540 		// Determine underlying embedded (possibly incomplete) type
    541 		// by following its forward chain.
    542 		named, _ := typ.(*Named)
    543 		under := underlying(named)
    544 		embed, _ := under.(*Interface)
    545 		if embed == nil {
    546 			if typ != Typ[Invalid] {
    547 				check.errorf(pos, "%s is not an interface", typ)
    548 			}
    549 			continue
    550 		}
    551 		iface.embeddeds = append(iface.embeddeds, named)
    552 		// collect embedded methods
    553 		for _, m := range embed.allMethods {
    554 			if check.declareInSet(&mset, pos, m) {
    555 				iface.allMethods = append(iface.allMethods, m)
    556 			}
    557 		}
    558 	}
    559 
    560 	// Phase 3: At this point all methods have been collected for this interface.
    561 	//          It is now safe to type-check the signatures of all explicitly
    562 	//          declared methods, even if they refer to this interface via a cycle
    563 	//          and embed the methods of this interface in a parameter of interface
    564 	//          type.
    565 
    566 	for i, m := range iface.methods {
    567 		expr := signatures[i]
    568 		typ := check.typ(expr)
    569 		sig, _ := typ.(*Signature)
    570 		if sig == nil {
    571 			if typ != Typ[Invalid] {
    572 				check.invalidAST(expr.Pos(), "%s is not a method signature", typ)
    573 			}
    574 			continue // keep method with empty method signature
    575 		}
    576 		// update signature, but keep recv that was set up before
    577 		old := m.typ.(*Signature)
    578 		sig.recv = old.recv
    579 		*old = *sig // update signature (don't replace it!)
    580 	}
    581 
    582 	// TODO(gri) The list of explicit methods is only sorted for now to
    583 	// produce the same Interface as NewInterface. We may be able to
    584 	// claim source order in the future. Revisit.
    585 	sort.Sort(byUniqueMethodName(iface.methods))
    586 
    587 	// TODO(gri) The list of embedded types is only sorted for now to
    588 	// produce the same Interface as NewInterface. We may be able to
    589 	// claim source order in the future. Revisit.
    590 	sort.Sort(byUniqueTypeName(iface.embeddeds))
    591 
    592 	sort.Sort(byUniqueMethodName(iface.allMethods))
    593 }
    594 
    595 // byUniqueTypeName named type lists can be sorted by their unique type names.
    596 type byUniqueTypeName []*Named
    597 
    598 func (a byUniqueTypeName) Len() int           { return len(a) }
    599 func (a byUniqueTypeName) Less(i, j int) bool { return a[i].obj.Id() < a[j].obj.Id() }
    600 func (a byUniqueTypeName) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
    601 
    602 // byUniqueMethodName method lists can be sorted by their unique method names.
    603 type byUniqueMethodName []*Func
    604 
    605 func (a byUniqueMethodName) Len() int           { return len(a) }
    606 func (a byUniqueMethodName) Less(i, j int) bool { return a[i].Id() < a[j].Id() }
    607 func (a byUniqueMethodName) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
    608 
    609 func (check *Checker) tag(t *ast.BasicLit) string {
    610 	if t != nil {
    611 		if t.Kind == token.STRING {
    612 			if val, err := strconv.Unquote(t.Value); err == nil {
    613 				return val
    614 			}
    615 		}
    616 		check.invalidAST(t.Pos(), "incorrect tag syntax: %q", t.Value)
    617 	}
    618 	return ""
    619 }
    620 
    621 func (check *Checker) structType(styp *Struct, e *ast.StructType, path []*TypeName) {
    622 	list := e.Fields
    623 	if list == nil {
    624 		return
    625 	}
    626 
    627 	// struct fields and tags
    628 	var fields []*Var
    629 	var tags []string
    630 
    631 	// for double-declaration checks
    632 	var fset objset
    633 
    634 	// current field typ and tag
    635 	var typ Type
    636 	var tag string
    637 	add := func(field *ast.Field, ident *ast.Ident, anonymous bool, pos token.Pos) {
    638 		if tag != "" && tags == nil {
    639 			tags = make([]string, len(fields))
    640 		}
    641 		if tags != nil {
    642 			tags = append(tags, tag)
    643 		}
    644 
    645 		name := ident.Name
    646 		fld := NewField(pos, check.pkg, name, typ, anonymous)
    647 		// spec: "Within a struct, non-blank field names must be unique."
    648 		if name == "_" || check.declareInSet(&fset, pos, fld) {
    649 			fields = append(fields, fld)
    650 			check.recordDef(ident, fld)
    651 		}
    652 	}
    653 
    654 	for _, f := range list.List {
    655 		typ = check.typExpr(f.Type, nil, path)
    656 		tag = check.tag(f.Tag)
    657 		if len(f.Names) > 0 {
    658 			// named fields
    659 			for _, name := range f.Names {
    660 				add(f, name, false, name.Pos())
    661 			}
    662 		} else {
    663 			// anonymous field
    664 			name := anonymousFieldIdent(f.Type)
    665 			pos := f.Type.Pos()
    666 			t, isPtr := deref(typ)
    667 			switch t := t.(type) {
    668 			case *Basic:
    669 				if t == Typ[Invalid] {
    670 					// error was reported before
    671 					continue
    672 				}
    673 				// unsafe.Pointer is treated like a regular pointer
    674 				if t.kind == UnsafePointer {
    675 					check.errorf(pos, "anonymous field type cannot be unsafe.Pointer")
    676 					continue
    677 				}
    678 				add(f, name, true, pos)
    679 
    680 			case *Named:
    681 				// spec: "An embedded type must be specified as a type name
    682 				// T or as a pointer to a non-interface type name *T, and T
    683 				// itself may not be a pointer type."
    684 				switch u := t.underlying.(type) {
    685 				case *Basic:
    686 					// unsafe.Pointer is treated like a regular pointer
    687 					if u.kind == UnsafePointer {
    688 						check.errorf(pos, "anonymous field type cannot be unsafe.Pointer")
    689 						continue
    690 					}
    691 				case *Pointer:
    692 					check.errorf(pos, "anonymous field type cannot be a pointer")
    693 					continue
    694 				case *Interface:
    695 					if isPtr {
    696 						check.errorf(pos, "anonymous field type cannot be a pointer to an interface")
    697 						continue
    698 					}
    699 				}
    700 				add(f, name, true, pos)
    701 
    702 			default:
    703 				check.invalidAST(pos, "anonymous field type %s must be named", typ)
    704 			}
    705 		}
    706 	}
    707 
    708 	styp.fields = fields
    709 	styp.tags = tags
    710 }
    711 
    712 func anonymousFieldIdent(e ast.Expr) *ast.Ident {
    713 	switch e := e.(type) {
    714 	case *ast.Ident:
    715 		return e
    716 	case *ast.StarExpr:
    717 		return anonymousFieldIdent(e.X)
    718 	case *ast.SelectorExpr:
    719 		return e.Sel
    720 	}
    721 	return nil // invalid anonymous field
    722 }
    723