Mercurial > projects > dang
diff sema/TypeCheck.d @ 126:c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
author | Anders Johnsen <skabet@gmail.com> |
---|---|
date | Tue, 27 May 2008 10:32:31 +0200 |
parents | 3a0cd42de9cc |
children | 57b0b4464a0b |
line wrap: on
line diff
--- a/sema/TypeCheck.d Sun May 25 21:13:56 2008 +0200 +++ b/sema/TypeCheck.d Tue May 27 10:32:31 2008 +0200 @@ -19,36 +19,67 @@ { super.visitBinaryExp(exp); - if(exp.left.type.byteSize > exp.right.type.byteSize) + if(!(exp.left.type is exp.right.type)) { - if(!exp.right.type.hasImplicitConversionTo(exp.left.type)) + if (!exp.right.type.hasImplicitConversionTo(exp.left.type) && + !exp.left.type.hasImplicitConversionTo(exp.right.type)) messages.report(InvalidImplicitCast, exp.loc) .arg(exp.right.type.toString) .arg(exp.left.type.toString); - - auto castExp = new CastExp( - SLoc.Invalid, - new Identifier(exp.left.type.name), - exp.right); - castExp.env = exp.env; - exp.right = castExp; - } + else + { + CastExp castExp; + if(exp.left.type.isReal && exp.right.type.isReal) + if(exp.left.type.byteSize > exp.right.type.byteSize) + castExp = new CastExp( + SLoc.Invalid, + new Identifier(exp.left.type.name), + exp.right); + else + castExp = new CastExp( + SLoc.Invalid, + new Identifier(exp.right.type.name), + exp.left); + else if(exp.left.type.isReal || exp.right.type.isReal) + if(exp.left.type.isReal) + castExp = new CastExp( + SLoc.Invalid, + new Identifier(exp.left.type.name), + exp.right); + else + castExp = new CastExp( + SLoc.Invalid, + new Identifier(exp.right.type.name), + exp.left); + else + if(exp.left.type.byteSize > exp.right.type.byteSize) + castExp = new CastExp( + SLoc.Invalid, + new Identifier(exp.left.type.name), + exp.right); + else if(exp.left.type.byteSize > exp.right.type.byteSize) + castExp = new CastExp( + SLoc.Invalid, + new Identifier(exp.right.type.name), + exp.left); + else + castExp = new CastExp( + SLoc.Invalid, + new Identifier(exp.left.type.name), + exp.right); - if(exp.left.type.byteSize < exp.right.type.byteSize) - { - if(!exp.left.type.hasImplicitConversionTo(exp.right.type)) - messages.report(InvalidImplicitCast, exp.loc) - .arg(exp.right.type.toString) - .arg(exp.left.type.toString); - auto castExp = new CastExp( - SLoc.Invalid, - new Identifier(exp.right.type.name), - exp.left); - castExp.env = exp.env; - exp.left = castExp; + if(castExp) + { + castExp.env = exp.env; + if(castExp.exp == exp.right) + exp.right = castExp; + else + exp.left = castExp; + + } + } } - } override void visitCallExp(CallExp exp)