]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Don't crash when declaring methods on unknown name.
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 21 Dec 2010 20:32:36 +0000 (20:32 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 21 Dec 2010 20:32:36 +0000 (20:32 +0000)
From-SVN: r168131

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

index d5db85c6d19e3819bf51958aa49c253571ee7597..707111688b79686b57878d0bcbf8944ba2078ca6 100644 (file)
@@ -3710,6 +3710,18 @@ Named_object::set_function_value(Function* function)
   this->u_.func_value = function;
 }
 
+// Declare an unknown object as a type declaration.
+
+void
+Named_object::declare_as_type()
+{
+  gcc_assert(this->classification_ == NAMED_OBJECT_UNKNOWN);
+  Unknown_name* unk = this->u_.unknown_value;
+  this->classification_ = NAMED_OBJECT_TYPE_DECLARATION;
+  this->u_.type_declaration = new Type_declaration(unk->location());
+  delete unk;
+}
+
 // Return the location of a named object.
 
 source_location
index 552a64344857316ccea77f93f1d1af4662f5aeda..96729b2e7e20f9b48d09f565d13390ec2ad4c9ca 100644 (file)
@@ -1815,6 +1815,10 @@ class Named_object
   void
   set_function_value(Function*);
 
+  // Declare an unknown name as a type declaration.
+  void
+  declare_as_type();
+
   // Export this object.
   void
   export_named_object(Export*) const;
index fad9206fdf437e91c2781a5a516099409396ffd0..97bde7bd6a5c71991c21405a12e2d19fd507d78b 100644 (file)
@@ -8013,7 +8013,8 @@ Forward_declaration_type::add_method(const std::string& name,
                                     Function* function)
 {
   Named_object* no = this->named_object();
-  gcc_assert(no->is_type_declaration());
+  if (no->is_unknown())
+    no->declare_as_type();
   return no->type_declaration_value()->add_method(name, function);
 }
 
@@ -8026,7 +8027,8 @@ Forward_declaration_type::add_method_declaration(const std::string& name,
                                                 source_location location)
 {
   Named_object* no = this->named_object();
-  gcc_assert(no->is_type_declaration());
+  if (no->is_unknown())
+    no->declare_as_type();
   Type_declaration* td = no->type_declaration_value();
   return td->add_method_declaration(name, type, location);
 }