Commit c59a4d0f by Ian Lance Taylor

compiler: Fix unsafe.Sizeof for named structs with named struct fields.

From-SVN: r188295
parent cba0366c
...@@ -7863,6 +7863,10 @@ Find_type_use::type(Type* type) ...@@ -7863,6 +7863,10 @@ Find_type_use::type(Type* type)
bool bool
Named_type::do_verify() Named_type::do_verify()
{ {
if (this->is_verified_)
return true;
this->is_verified_ = true;
Find_type_use find(this); Find_type_use find(this);
Type::traverse(this->type_, &find); Type::traverse(this->type_, &find);
if (find.found()) if (find.found())
...@@ -7973,6 +7977,11 @@ Named_type::convert(Gogo* gogo) ...@@ -7973,6 +7977,11 @@ Named_type::convert(Gogo* gogo)
this->create_placeholder(gogo); 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 // Convert all the dependencies. If they refer indirectly back to
// this type, they will pick up the intermediate tree we just // this type, they will pick up the intermediate tree we just
// created. // created.
......
...@@ -2628,8 +2628,9 @@ class Named_type : public Type ...@@ -2628,8 +2628,9 @@ class Named_type : public Type
interface_method_tables_(NULL), pointer_interface_method_tables_(NULL), interface_method_tables_(NULL), pointer_interface_method_tables_(NULL),
location_(location), named_btype_(NULL), dependencies_(), location_(location), named_btype_(NULL), dependencies_(),
is_visible_(true), is_error_(false), is_placeholder_(false), is_visible_(true), is_error_(false), is_placeholder_(false),
is_converted_(false), is_circular_(false), seen_(false), is_converted_(false), is_circular_(false), is_verified_(false),
seen_in_compare_is_identity_(false), seen_in_get_backend_(false) seen_(false), seen_in_compare_is_identity_(false),
seen_in_get_backend_(false)
{ } { }
// Return the associated Named_object. This holds the actual name. // Return the associated Named_object. This holds the actual name.
...@@ -2908,6 +2909,8 @@ class Named_type : public Type ...@@ -2908,6 +2909,8 @@ class Named_type : public Type
// Whether this is a pointer or function type which refers to the // Whether this is a pointer or function type which refers to the
// type itself. // type itself.
bool is_circular_; bool is_circular_;
// Whether this type has been verified.
bool is_verified_;
// In a recursive operation such as has_hidden_fields, this flag is // In a recursive operation such as has_hidden_fields, this flag is
// used to prevent infinite recursion when a type refers to itself. // used to prevent infinite recursion when a type refers to itself.
// This is mutable because it is always reset to false when the // This is mutable because it is always reset to false when the
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment