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
This commit is contained in:
parent
97a0928c52
commit
9761988fc7
@ -1,4 +1,4 @@
|
||||
27804ec53590e3644e030c9860822139a0cfb03f
|
||||
2118958321532352c91fd9406f571f8729a791cd
|
||||
|
||||
The first line of this file holds the git revision number of the last
|
||||
merge done from the gofrontend repository.
|
||||
|
@ -1057,6 +1057,8 @@ Type::get_backend_placeholder(Gogo* gogo)
|
||||
{
|
||||
Location loc = Linemap::unknown_location();
|
||||
bt = gogo->backend()->placeholder_pointer_type("", loc, false);
|
||||
Pointer_type* pt = this->convert<Pointer_type, TYPE_POINTER>();
|
||||
Type::placeholder_pointers.push_back(pt);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -5521,6 +5523,11 @@ Pointer_type::do_import(Import* imp)
|
||||
|
||||
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.
|
||||
|
||||
Pointer_type*
|
||||
@ -5551,11 +5558,11 @@ Type::make_pointer_type(Type* to_type)
|
||||
void
|
||||
Type::finish_pointer_types(Gogo* gogo)
|
||||
{
|
||||
for (Pointer_type_table::const_iterator i = pointer_types.begin();
|
||||
i != pointer_types.end();
|
||||
++i)
|
||||
// We don't use begin() and end() because it is possible to add new
|
||||
// placeholder pointer types as we finalized existing ones.
|
||||
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);
|
||||
if (tbti != Type::type_btypes.end() && tbti->second.is_placeholder)
|
||||
{
|
||||
|
@ -1350,6 +1350,9 @@ class Type
|
||||
|
||||
static Pointer_type_table pointer_types;
|
||||
|
||||
// List of placeholder pointer types.
|
||||
static std::vector<Pointer_type*> placeholder_pointers;
|
||||
|
||||
// The type classification.
|
||||
Type_classification classification_;
|
||||
// The backend representation of the type, once it has been
|
||||
|
Loading…
x
Reference in New Issue
Block a user