diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc index cf16ef6ccd6..2fd1219d9db 100644 --- a/gcc/go/gofrontend/gogo.cc +++ b/gcc/go/gofrontend/gogo.cc @@ -37,6 +37,7 @@ Gogo::Gogo(Backend* backend, Linemap* linemap, int int_type_size, imported_init_fns_(), unique_prefix_(), unique_prefix_specified_(false), + verify_types_(), interface_types_(), specific_type_functions_(), specific_type_functions_are_written_(false), @@ -1282,6 +1283,15 @@ Gogo::traverse(Traverse* traverse) } } +// Add a type to verify. This is used for types of sink variables, in +// order to give appropriate error messages. + +void +Gogo::add_type_to_verify(Type* type) +{ + this->verify_types_.push_back(type); +} + // Traversal class used to verify types. class Verify_types : public Traverse @@ -1312,6 +1322,12 @@ Gogo::verify_types() { Verify_types traverse; this->traverse(&traverse); + + for (std::vector::iterator p = this->verify_types_.begin(); + p != this->verify_types_.end(); + ++p) + (*p)->verify(); + this->verify_types_.clear(); } // Traversal class used to lower parse tree. diff --git a/gcc/go/gofrontend/gogo.h b/gcc/go/gofrontend/gogo.h index e7b06e51b22..7d77c9f0828 100644 --- a/gcc/go/gofrontend/gogo.h +++ b/gcc/go/gofrontend/gogo.h @@ -344,6 +344,11 @@ class Gogo Named_object* add_sink(); + // Add a type which needs to be verified. This is used for sink + // types, just to give appropriate error messages. + void + add_type_to_verify(Type* type); + // Add a named object to the current namespace. This is used for // import . "package". void @@ -683,6 +688,8 @@ class Gogo std::string unique_prefix_; // Whether an explicit unique prefix was set by -fgo-prefix. bool unique_prefix_specified_; + // A list of types to verify. + std::vector verify_types_; // A list of interface types defined while parsing. std::vector interface_types_; // Type specific functions to write out. diff --git a/gcc/go/gofrontend/parse.cc b/gcc/go/gofrontend/parse.cc index c6014d560d2..2d58185ebdb 100644 --- a/gcc/go/gofrontend/parse.cc +++ b/gcc/go/gofrontend/parse.cc @@ -1911,6 +1911,8 @@ Parse::init_var(const Typed_identifier& tid, Type* type, Expression* init, return this->gogo_->add_variable(buf, var); } } + if (type != NULL) + this->gogo_->add_type_to_verify(type); return this->gogo_->add_sink(); }