Commit 3b547557 by Ian Lance Taylor

compiler: Verify types of sink variables.

From-SVN: r183482
parent f1d4a790
...@@ -37,6 +37,7 @@ Gogo::Gogo(Backend* backend, Linemap* linemap, int int_type_size, ...@@ -37,6 +37,7 @@ Gogo::Gogo(Backend* backend, Linemap* linemap, int int_type_size,
imported_init_fns_(), imported_init_fns_(),
unique_prefix_(), unique_prefix_(),
unique_prefix_specified_(false), unique_prefix_specified_(false),
verify_types_(),
interface_types_(), interface_types_(),
specific_type_functions_(), specific_type_functions_(),
specific_type_functions_are_written_(false), specific_type_functions_are_written_(false),
...@@ -1282,6 +1283,15 @@ Gogo::traverse(Traverse* traverse) ...@@ -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. // Traversal class used to verify types.
class Verify_types : public Traverse class Verify_types : public Traverse
...@@ -1312,6 +1322,12 @@ Gogo::verify_types() ...@@ -1312,6 +1322,12 @@ Gogo::verify_types()
{ {
Verify_types traverse; Verify_types traverse;
this->traverse(&traverse); this->traverse(&traverse);
for (std::vector<Type*>::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. // Traversal class used to lower parse tree.
......
...@@ -344,6 +344,11 @@ class Gogo ...@@ -344,6 +344,11 @@ class Gogo
Named_object* Named_object*
add_sink(); 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 // Add a named object to the current namespace. This is used for
// import . "package". // import . "package".
void void
...@@ -683,6 +688,8 @@ class Gogo ...@@ -683,6 +688,8 @@ class Gogo
std::string unique_prefix_; std::string unique_prefix_;
// Whether an explicit unique prefix was set by -fgo-prefix. // Whether an explicit unique prefix was set by -fgo-prefix.
bool unique_prefix_specified_; bool unique_prefix_specified_;
// A list of types to verify.
std::vector<Type*> verify_types_;
// A list of interface types defined while parsing. // A list of interface types defined while parsing.
std::vector<Interface_type*> interface_types_; std::vector<Interface_type*> interface_types_;
// Type specific functions to write out. // Type specific functions to write out.
......
...@@ -1911,6 +1911,8 @@ Parse::init_var(const Typed_identifier& tid, Type* type, Expression* init, ...@@ -1911,6 +1911,8 @@ Parse::init_var(const Typed_identifier& tid, Type* type, Expression* init,
return this->gogo_->add_variable(buf, var); return this->gogo_->add_variable(buf, var);
} }
} }
if (type != NULL)
this->gogo_->add_type_to_verify(type);
return this->gogo_->add_sink(); return this->gogo_->add_sink();
} }
......
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