OSDN Git Service

compiler: don't remove floating point conversion of typed constant
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Nov 2012 16:30:56 +0000 (16:30 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Nov 2012 16:30:56 +0000 (16:30 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@193566 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/go/gofrontend/expressions.cc

index 3fa1cd6..e20de21 100644 (file)
@@ -2970,6 +2970,46 @@ Type_conversion_expression::do_lower(Gogo*, Named_object*,
        {
          if (!nc.set_type(type, true, location))
            return Expression::make_error(location);
+
+         // Don't simply convert to or from a float or complex type
+         // with a different size.  That may change the value.
+         Type* vtype = val->type();
+         if (vtype->is_abstract())
+           ;
+         else if (type->float_type() != NULL)
+           {
+             if (vtype->float_type() != NULL)
+               {
+                 if (type->float_type()->bits() != vtype->float_type()->bits())
+                   return this;
+               }
+             else if (vtype->complex_type() != NULL)
+               {
+                 if (type->float_type()->bits() * 2
+                     != vtype->complex_type()->bits())
+                   return this;
+               }
+           }
+         else if (type->complex_type() != NULL)
+           {
+             if (vtype->complex_type() != NULL)
+               {
+                 if (type->complex_type()->bits()
+                     != vtype->complex_type()->bits())
+                   return this;
+               }
+             else if (vtype->float_type() != NULL)
+               {
+                 if (type->complex_type()->bits()
+                     != vtype->float_type()->bits() * 2)
+                   return this;
+               }
+           }
+         else if (vtype->float_type() != NULL)
+           return this;
+         else if (vtype->complex_type() != NULL)
+           return this;
+
          return nc.expression(location);
        }
     }