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)