]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
compiler: Verify types of sink variables.
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 24 Jan 2012 17:52:41 +0000 (17:52 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 24 Jan 2012 17:52:41 +0000 (17:52 +0000)
From-SVN: r183482

gcc/go/gofrontend/gogo.cc
gcc/go/gofrontend/gogo.h
gcc/go/gofrontend/parse.cc

index cf16ef6ccd6553cc442da4ae30cac02ba98e241b..2fd1219d9dbe26c4ea245c4bbdbd40de629e6aa2 100644 (file)
@@ -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.
index e7b06e51b22f55f655ad51e2b18c7f11372120f7..7d77c9f0828f3fe40a18ce4eba6412ecfca6f336 100644 (file)
@@ -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.
index c6014d560d21ff34196bfec72de19cd335f8e5de..2d58185ebdb2171ac5daa6a24f7302081da7de80 100644 (file)
@@ -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();
     }