code: func (a *compiler) checkAssign(pos token.Pos, rs []*expr, errOp, errPosName string) (*assignCompiler, bool) {
  	c := &assignCompiler{
  		compiler:   a,
  		pos:        pos,
  		rs:         rs,
  		errOp:      errOp,
  		errPosName: errPosName,
  	}
  
  	// Is this an unpack?
  	if len(rs) == 1 && rs[0] != nil {
  		if rmt, isUnpack := rs[0].t.(*MultiType); isUnpack {
  			c.rmt = rmt
  			c.isUnpack = true
  			return c, true
  		}
  	}
  
  	// Create MultiType for RHS and check that all RHS expressions
  	// are single-valued.
  	rts := make([]Type, len(rs))
  	ok := true
  	for i, r := range rs {
  		if r == nil {
  			ok = false
  			continue
  		}
  
  		if _, isMT := r.t.(*MultiType); isMT {
  			r.diag("multi-valued expression not allowed in %s", errOp)
  			ok = false
  			continue
  		}
  
  		rts[i] = r.t
  	}
  
  	c.rmt = NewMultiType(rts)
  	return c, ok
  }
docs: // Type check the RHS of an assignment, returning a new assignCompiler
  // and indicating if the type check succeeded.  This always returns an
  // assignCompiler with rmt set, but if type checking fails, slots in
  // the MultiType may be nil.  If rs contains nil's, type checking will
  // fail and these expressions given a nil type.