diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2012-11-16 16:30:35 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2012-11-16 16:30:35 +0000 |
commit | ce1a1562859498a73f74bcc3f008e6a1357ba13a (patch) | |
tree | 192a7c4a81fe514460415c427977d664b165da0e /gcc/go | |
parent | d761f9e62fb5d44123878f66e61ee2e9e4b6ae88 (diff) | |
download | gcc-ce1a1562859498a73f74bcc3f008e6a1357ba13a.zip gcc-ce1a1562859498a73f74bcc3f008e6a1357ba13a.tar.gz gcc-ce1a1562859498a73f74bcc3f008e6a1357ba13a.tar.bz2 |
compiler: don't remove floating point conversion of typed constant
From-SVN: r193565
Diffstat (limited to 'gcc/go')
-rw-r--r-- | gcc/go/gofrontend/expressions.cc | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 8fe6146..9d3b8f5 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -2962,6 +2962,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); } } |