The Go language permits converting any type whose underlying type is uintptr to unsafe.Pointer. The Go frontend did not implement this correctly. This is http://golang.org/issue/10284. This patch from Minux fixes the problem. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline.
A test case is being added to the main Go repository (http://golang.org/cl/8240) and will be copied into the gccgo testsuite in due course. Ian
diff -r d902a931d05b go/types.cc --- a/go/types.cc Mon Mar 30 10:26:47 2015 -0700 +++ b/go/types.cc Mon Mar 30 10:30:14 2015 -0700 @@ -772,16 +772,16 @@ } // 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.