This is the gofrontend version of https://golang.org/cl/259297.
This is required now because that change is in the 1.15.3 release.
This requires changing the go/internal/gccgoimporter package, to skip
the new annotation. This change will need to be ported to the gc and
x/tools repos.
For golang/go#41761
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/265258
-4c1e7a083bdea02759cd5d2054038fb8a4a55ec8
+957591b8a054b692d92203a2420851689875f9c5
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
this->write_string(nt->named_object()->name());
this->write_c_string("\" ");
this->write_string(nt->named_object()->name());
this->write_c_string("\" ");
+ if (!nt->in_heap())
+ this->write_c_string("notinheap ");
+
if (nt->is_alias())
this->write_c_string("= ");
}
if (nt->is_alias())
this->write_c_string("= ");
}
this->require_c_string(" ");
}
this->require_c_string(" ");
}
+ bool in_heap = true;
+ if (this->match_c_string("notinheap"))
+ {
+ this->require_c_string("notinheap ");
+ in_heap = false;
+ }
+
bool is_alias = false;
if (this->match_c_string("= "))
{
bool is_alias = false;
if (this->match_c_string("= "))
{
// declaration of a type defined in some other file.
Type* type;
if (this->match_c_string(">") || this->match_c_string("\n"))
// declaration of a type defined in some other file.
Type* type;
if (this->match_c_string(">") || this->match_c_string("\n"))
- type = this->types_[index];
+ {
+ type = this->types_[index];
+ if (!in_heap)
+ go_error_at(this->location_,
+ ("import error at %d for type index %d: "
+ "forward declaration marked notinheap"),
+ this->pos(), index);
+ }
else
{
if (no->is_type_declaration())
else
{
if (no->is_type_declaration())
// This type has not yet been imported.
ntype->clear_is_visible();
// This type has not yet been imported.
ntype->clear_is_visible();
+ if (!in_heap)
+ ntype->set_not_in_heap();
if (is_alias)
ntype->set_is_alias();
if (is_alias)
ntype->set_is_alias();
// Return whether this struct type is permitted to be in the heap.
bool
// Return whether this struct type is permitted to be in the heap.
bool
-Struct_type::do_in_heap()
+Struct_type::do_in_heap() const
{
const Struct_field_list* fields = this->fields_;
if (fields == NULL)
{
const Struct_field_list* fields = this->fields_;
if (fields == NULL)
// Whether the type is permitted in the heap.
bool
// Whether the type is permitted in the heap.
bool
{ return this->do_in_heap(); }
// Return a hash code for this type for the method hash table.
{ return this->do_in_heap(); }
// Return a hash code for this type for the method hash table.
{ return false; }
virtual bool
{ return false; }
virtual bool
{ return true; }
virtual unsigned int
{ return true; }
virtual unsigned int
do_hash_might_panic();
bool
do_hash_might_panic();
bool
unsigned int
do_hash_for_method(Gogo*, int) const;
unsigned int
do_hash_for_method(Gogo*, int) const;
{ return this->length_ != NULL && this->element_type_->hash_might_panic(); }
bool
{ return this->length_ != NULL && this->element_type_->hash_might_panic(); }
bool
{ return this->length_ == NULL || this->element_type_->in_heap(); }
unsigned int
{ return this->length_ == NULL || this->element_type_->in_heap(); }
unsigned int
do_needs_key_update();
bool
do_needs_key_update();
bool
{ return this->in_heap_ && this->type_->in_heap(); }
unsigned int
{ return this->in_heap_ && this->type_->in_heap(); }
unsigned int
{ return this->real_type()->needs_key_update(); }
bool
{ return this->real_type()->needs_key_update(); }
bool
{ return this->real_type()->in_heap(); }
unsigned int
{ return this->real_type()->in_heap(); }
unsigned int
p.errorf("%v has nil type", obj)
}
p.errorf("%v has nil type", obj)
}
+ if p.tok == scanner.Ident && p.lit == "notinheap" {
+ p.next()
+ // The go/types package has no way of recording that
+ // this type is marked notinheap. Presumably no user
+ // of this package actually cares.
+ }
+
// type alias
if p.tok == '=' {
p.next()
// type alias
if p.tok == '=' {
p.next()