aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2012-01-24 17:52:41 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2012-01-24 17:52:41 +0000
commit3b547557aade5a4f4f0d261d508a9b3d32b13a92 (patch)
treec62dada648d5001d36b6ebb4aa7ef7b723271d97 /gcc
parentf1d4a790ec622a2c905b4b1e379731d670450470 (diff)
downloadgcc-3b547557aade5a4f4f0d261d508a9b3d32b13a92.zip
gcc-3b547557aade5a4f4f0d261d508a9b3d32b13a92.tar.gz
gcc-3b547557aade5a4f4f0d261d508a9b3d32b13a92.tar.bz2
compiler: Verify types of sink variables.
From-SVN: r183482
Diffstat (limited to 'gcc')
-rw-r--r--gcc/go/gofrontend/gogo.cc16
-rw-r--r--gcc/go/gofrontend/gogo.h7
-rw-r--r--gcc/go/gofrontend/parse.cc2
3 files changed, 25 insertions, 0 deletions
diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc
index cf16ef6..2fd1219 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<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.
diff --git a/gcc/go/gofrontend/gogo.h b/gcc/go/gofrontend/gogo.h
index e7b06e5..7d77c9f 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<Type*> verify_types_;
// A list of interface types defined while parsing.
std::vector<Interface_type*> interface_types_;
// Type specific functions to write out.
diff --git a/gcc/go/gofrontend/parse.cc b/gcc/go/gofrontend/parse.cc
index c6014d5..2d58185 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();
}