MATCH Expression::implicitConvTo(Type *t) { #if 0 printf("Expression::implicitConvTo(this=%s, type=%s, t=%s)\n", toChars(), type->toChars(), t->toChars()); #endif //static int nest; if (++nest == 10) halt(); if (t == Type::terror) return MATCHnomatch; if (!type) { error("%s is not an expression", toChars()); type = Type::terror; } if (t->ty == Tbit && isBit()) return MATCHconvert; Expression *e = optimize(WANTvalue | WANTflags); if (e != this) { //printf("optimzed to %s\n", e->toChars()); return e->implicitConvTo(t); } MATCH match = type->implicitConvTo(t); if (match) return match; #if 0 Type *tb = t->toBasetype(); if (tb->ty == Tdelegate) { TypeDelegate *td = (TypeDelegate *)tb; TypeFunction *tf = (TypeFunction *)td->nextOf(); if (!tf->varargs && !(tf->arguments && tf->arguments->dim) ) { match = type->implicitConvTo(tf->nextOf()); if (match) return match; if (tf->nextOf()->toBasetype()->ty == Tvoid) return MATCHconvert; } } #endif return MATCHnomatch; }
Expression *Expression::castTo(Scope *sc, Type *t) { //printf("Expression::castTo(this=%s, t=%s)\n", toChars(), t->toChars()); #if 0 printf("Expression::castTo(this=%s, type=%s, t=%s)\n", toChars(), type->toChars(), t->toChars()); #endif if (type == t) return this; Expression *e = this; Type *tb = t->toBasetype(); Type *typeb = type->toBasetype(); if (tb != typeb) { // Do (type *) cast of (type [dim]) if (tb->ty == Tpointer && typeb->ty == Tsarray ) { //printf("Converting [dim] to *\n"); if (typeb->size(loc) == 0) e = new NullExp(loc); else e = new AddrExp(loc, e); } #if 0 else if (tb->ty == Tdelegate && type->ty != Tdelegate) { TypeDelegate *td = (TypeDelegate *)tb; TypeFunction *tf = (TypeFunction *)td->nextOf(); return toDelegate(sc, tf->nextOf()); } #endif else { e = new CastExp(loc, e, tb); } } else { e = e->copy(); // because of COW for assignment to e->type } assert(e != this); e->type = t; //printf("Returning: %s\n", e->toChars()); return e; }