This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Go patch committed: Fix unsafe.Sizeof for named structs
- From: Ian Lance Taylor <iant at google dot com>
- To: gcc-patches at gcc dot gnu dot org, gofrontend-dev at googlegroups dot com
- Date: Wed, 06 Jun 2012 22:49:56 -0700
- Subject: Go patch committed: Fix unsafe.Sizeof for named structs
This patch to the Go frontend fixes an embarrassing and serious bug in
which unsafe.Sizeof returns the wrong value for a named struct that
has fields that are themselves named structs. Bootstrapped and ran Go
testsuite on x86_64-unknown-linux-gnu. Committed to mainline and 4.7
branch.
Ian
diff -r 6db81fd6c2f2 go/types.cc
--- a/go/types.cc Wed Jun 06 17:53:15 2012 -0700
+++ b/go/types.cc Wed Jun 06 22:47:24 2012 -0700
@@ -7863,6 +7863,10 @@
bool
Named_type::do_verify()
{
+ if (this->is_verified_)
+ return true;
+ this->is_verified_ = true;
+
Find_type_use find(this);
Type::traverse(this->type_, &find);
if (find.found())
@@ -7973,6 +7977,11 @@
this->create_placeholder(gogo);
+ // If we are called to turn unsafe.Sizeof into a constant, we may
+ // not have verified the type yet. We have to make sure it is
+ // verified, since that sets the list of dependencies.
+ this->verify();
+
// Convert all the dependencies. If they refer indirectly back to
// this type, they will pick up the intermediate tree we just
// created.
diff -r 6db81fd6c2f2 go/types.h
--- a/go/types.h Wed Jun 06 17:53:15 2012 -0700
+++ b/go/types.h Wed Jun 06 22:47:24 2012 -0700
@@ -2628,8 +2628,9 @@
interface_method_tables_(NULL), pointer_interface_method_tables_(NULL),
location_(location), named_btype_(NULL), dependencies_(),
is_visible_(true), is_error_(false), is_placeholder_(false),
- is_converted_(false), is_circular_(false), seen_(false),
- seen_in_compare_is_identity_(false), seen_in_get_backend_(false)
+ is_converted_(false), is_circular_(false), is_verified_(false),
+ seen_(false), seen_in_compare_is_identity_(false),
+ seen_in_get_backend_(false)
{ }
// Return the associated Named_object. This holds the actual name.
@@ -2908,6 +2909,8 @@
// Whether this is a pointer or function type which refers to the
// type itself.
bool is_circular_;
+ // Whether this type has been verified.
+ bool is_verified_;
// In a recursive operation such as has_hidden_fields, this flag is
// used to prevent infinite recursion when a type refers to itself.
// This is mutable because it is always reset to false when the