code: func (a *compiler) compileArrayLen(b *block, expr ast.Expr) (int64, bool) {
  	lenExpr := a.compileExpr(b, true, expr)
  	if lenExpr == nil {
  		return 0, false
  	}
  
  	// XXX(Spec) Are ideal floats with no fractional part okay?
  	if lenExpr.t.isIdeal() {
  		lenExpr = lenExpr.convertTo(IntType)
  		if lenExpr == nil {
  			return 0, false
  		}
  	}
  
  	if !lenExpr.t.isInteger() {
  		a.diagAt(expr.Pos(), "array size must be an integer")
  		return 0, false
  	}
  
  	switch lenExpr.t.lit().(type) {
  	case *intType:
  		return lenExpr.asInt()(nil), true
  	case *uintType:
  		return int64(lenExpr.asUint()(nil)), true
  	}
  	log.Panicf("unexpected integer type %T", lenExpr.t)
  	return 0, false
  }
docs: // TODO(austin) This is a hack to eliminate a circular dependency
  // between type.go and expr.go