compiler: implement Go 1 unsafe.Pointer conversion rules
authorIan Lance Taylor <ian@gcc.gnu.org>
Mon, 30 Mar 2015 17:32:06 +0000 (17:32 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Mon, 30 Mar 2015 17:32:06 +0000 (17:32 +0000)
Any type whose underlying type is uintptr can be converted
to unsafe.Pointer, and vice versa.

Fixes golang/go#10284.

From-SVN: r221774

gcc/go/gofrontend/types.cc

index 785889fb5c82af4e5f273ff89343e575999bded7..e93c6811d08f169eb04f0ab3ded05eadca69e8be 100644 (file)
@@ -772,16 +772,16 @@ Type::are_convertible(const Type* lhs, const Type* rhs, std::string* reason)
     }
 
   // An unsafe.Pointer type may be converted to any pointer type or to
-  // uintptr, and vice-versa.
+  // a type whose underlying type is uintptr, and vice-versa.
   if (lhs->is_unsafe_pointer_type()
       && (rhs->points_to() != NULL
          || (rhs->integer_type() != NULL
-             && rhs->forwarded() == Type::lookup_integer_type("uintptr"))))
+             && rhs->integer_type() == Type::lookup_integer_type("uintptr")->real_type())))
     return true;
   if (rhs->is_unsafe_pointer_type()
       && (lhs->points_to() != NULL
          || (lhs->integer_type() != NULL
-             && lhs->forwarded() == Type::lookup_integer_type("uintptr"))))
+             && lhs->integer_type() == Type::lookup_integer_type("uintptr")->real_type())))
     return true;
 
   // Give a better error message.