]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
compiler: A type conversion of a constant is not always a constant.
authorIan Lance Taylor <ian@gcc.gnu.org>
Thu, 10 Oct 2013 00:04:23 +0000 (00:04 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Thu, 10 Oct 2013 00:04:23 +0000 (00:04 +0000)
From-SVN: r203332

gcc/go/gofrontend/expressions.cc

index 9d59349c866a1e2ecc945c0a982544e82b3a0326..e96ab7606c2e3f651c493fecfccc24edd951604e 100644 (file)
@@ -3055,8 +3055,7 @@ class Type_conversion_expression : public Expression
   do_lower(Gogo*, Named_object*, Statement_inserter*, int);
 
   bool
-  do_is_constant() const
-  { return this->expr_->is_constant(); }
+  do_is_constant() const;
 
   bool
   do_numeric_constant_value(Numeric_constant*) const;
@@ -3198,6 +3197,27 @@ Type_conversion_expression::do_lower(Gogo*, Named_object*,
   return this;
 }
 
+// Return whether a type conversion is a constant.
+
+bool
+Type_conversion_expression::do_is_constant() const
+{
+  if (!this->expr_->is_constant())
+    return false;
+
+  // A conversion to a type that may not be used as a constant is not
+  // a constant.  For example, []byte(nil).
+  Type* type = this->type_;
+  if (type->integer_type() == NULL
+      && type->float_type() == NULL
+      && type->complex_type() == NULL
+      && !type->is_boolean_type()
+      && !type->is_string_type())
+    return false;
+
+  return true;
+}
+
 // Return the constant numeric value if there is one.
 
 bool