From: Ian Lance Taylor Date: Tue, 17 Jul 2018 17:21:10 +0000 (+0000) Subject: compiler: connect the concrete type and the placeholder for circular types X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4161493a3034388925048bf477bbb9238ff6643e;p=gcc.git compiler: connect the concrete type and the placeholder for circular types Previously, when creating the backend representation of a circular type, we resolve the placeholder to a circular_pointer_type. The backend doesn't know what the concrete type is. This CL changes it to resolve the placeholder to the concrete type instead, so the backend may have better knowledge of the concrete type. Reviewed-on: https://go-review.googlesource.com/123738 From-SVN: r262830 --- diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 3e0b65593cd..f9d37e728e7 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -db991403fc97854201b3f40492f4f6b9d471cabc +d6338c94e5574b63469c740159d064e89c6718bf The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc index 07819e23c8d..fa8c0ad1901 100644 --- a/gcc/go/gofrontend/types.cc +++ b/gcc/go/gofrontend/types.cc @@ -10786,15 +10786,10 @@ Named_type::do_get_backend(Gogo* gogo) // Don't build a circular data structure. GENERIC can't handle // it. if (this->seen_in_get_backend_) - { - this->is_circular_ = true; - return gogo->backend()->circular_pointer_type(bt, true); - } + return gogo->backend()->circular_pointer_type(bt, true); this->seen_in_get_backend_ = true; bt1 = Type::get_named_base_btype(gogo, base); this->seen_in_get_backend_ = false; - if (this->is_circular_) - bt1 = gogo->backend()->circular_pointer_type(bt, true); if (!gogo->backend()->set_placeholder_pointer_type(bt, bt1)) bt = gogo->backend()->error_type(); return bt; @@ -10803,15 +10798,10 @@ Named_type::do_get_backend(Gogo* gogo) // Don't build a circular data structure. GENERIC can't handle // it. if (this->seen_in_get_backend_) - { - this->is_circular_ = true; - return gogo->backend()->circular_pointer_type(bt, false); - } + return gogo->backend()->circular_pointer_type(bt, false); this->seen_in_get_backend_ = true; bt1 = Type::get_named_base_btype(gogo, base); this->seen_in_get_backend_ = false; - if (this->is_circular_) - bt1 = gogo->backend()->circular_pointer_type(bt, false); if (!gogo->backend()->set_placeholder_pointer_type(bt, bt1)) bt = gogo->backend()->error_type(); return bt; diff --git a/gcc/go/gofrontend/types.h b/gcc/go/gofrontend/types.h index 234e0a6abbd..0f85c3a2b9b 100644 --- a/gcc/go/gofrontend/types.h +++ b/gcc/go/gofrontend/types.h @@ -3243,8 +3243,8 @@ class Named_type : public Type interface_method_tables_(NULL), pointer_interface_method_tables_(NULL), location_(location), named_btype_(NULL), dependencies_(), is_alias_(false), is_visible_(true), is_error_(false), in_heap_(true), - is_placeholder_(false), is_converted_(false), is_circular_(false), - is_verified_(false), seen_(false), seen_in_compare_is_identity_(false), + is_placeholder_(false), is_converted_(false), is_verified_(false), + seen_(false), seen_in_compare_is_identity_(false), seen_in_get_backend_(false), seen_alias_(false) { } @@ -3345,12 +3345,6 @@ class Named_type : public Type is_valid() const { return !this->is_error_; } - // Whether this is a circular type: a pointer or function type that - // refers to itself, which is not possible in C. - bool - is_circular() const - { return this->is_circular_; } - // Return the base type for this type. Type* named_base(); @@ -3557,9 +3551,6 @@ class Named_type : public Type // Whether this type has been converted to the backend // representation. Implies that is_placeholder_ is false. bool is_converted_; - // 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_pointer, this flag is used