Commit 9761988f by Ian Lance Taylor

compiler: track placeholder pointer types for conversion

    
    We recently started walking through the hash table of pointer types to
    finalize them.  Unfortunately it is possible to create a new pointer
    type while finalizing an existing one (test case: test/fixedbugs/issue5291)
    and that breaks the iteration.  So, instead, keep a list of
    placeholder pointer types, and iterate through them while permitting
    the list to be extended as we go.
    
    Reviewed-on: https://go-review.googlesource.com/51771

From-SVN: r250683
parent 97a0928c
27804ec53590e3644e030c9860822139a0cfb03f 2118958321532352c91fd9406f571f8729a791cd
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -1057,6 +1057,8 @@ Type::get_backend_placeholder(Gogo* gogo) ...@@ -1057,6 +1057,8 @@ Type::get_backend_placeholder(Gogo* gogo)
{ {
Location loc = Linemap::unknown_location(); Location loc = Linemap::unknown_location();
bt = gogo->backend()->placeholder_pointer_type("", loc, false); bt = gogo->backend()->placeholder_pointer_type("", loc, false);
Pointer_type* pt = this->convert<Pointer_type, TYPE_POINTER>();
Type::placeholder_pointers.push_back(pt);
} }
break; break;
...@@ -5521,6 +5523,11 @@ Pointer_type::do_import(Import* imp) ...@@ -5521,6 +5523,11 @@ Pointer_type::do_import(Import* imp)
Type::Pointer_type_table Type::pointer_types; Type::Pointer_type_table Type::pointer_types;
// A list of placeholder pointer types. We keep this so we can ensure
// they are finalized.
std::vector<Pointer_type*> Type::placeholder_pointers;
// Make a pointer type. // Make a pointer type.
Pointer_type* Pointer_type*
...@@ -5551,11 +5558,11 @@ Type::make_pointer_type(Type* to_type) ...@@ -5551,11 +5558,11 @@ Type::make_pointer_type(Type* to_type)
void void
Type::finish_pointer_types(Gogo* gogo) Type::finish_pointer_types(Gogo* gogo)
{ {
for (Pointer_type_table::const_iterator i = pointer_types.begin(); // We don't use begin() and end() because it is possible to add new
i != pointer_types.end(); // placeholder pointer types as we finalized existing ones.
++i) for (size_t i = 0; i < Type::placeholder_pointers.size(); i++)
{ {
Pointer_type* pt = i->second; Pointer_type* pt = Type::placeholder_pointers[i];
Type_btypes::iterator tbti = Type::type_btypes.find(pt); Type_btypes::iterator tbti = Type::type_btypes.find(pt);
if (tbti != Type::type_btypes.end() && tbti->second.is_placeholder) if (tbti != Type::type_btypes.end() && tbti->second.is_placeholder)
{ {
......
...@@ -1350,6 +1350,9 @@ class Type ...@@ -1350,6 +1350,9 @@ class Type
static Pointer_type_table pointer_types; static Pointer_type_table pointer_types;
// List of placeholder pointer types.
static std::vector<Pointer_type*> placeholder_pointers;
// The type classification. // The type classification.
Type_classification classification_; Type_classification classification_;
// The backend representation of the type, once it has been // The backend representation of the type, once it has been
......
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