mirror of
https://gcc.gnu.org/git/gcc.git
synced 2025-01-22 20:36:20 +08:00
compiler: Verify types of sink variables.
From-SVN: r183482
This commit is contained in:
parent
f1d4a790ec
commit
3b547557aa
@ -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<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.
|
||||
|
@ -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<Type*> verify_types_;
|
||||
// A list of interface types defined while parsing.
|
||||
std::vector<Interface_type*> interface_types_;
|
||||
// Type specific functions to write out.
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user