aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2010-12-21 20:32:36 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2010-12-21 20:32:36 +0000
commit059e2a26f5819715bba3ccfe620ccf8677b8dd44 (patch)
tree850a1fe9c02d7e1a9f9a52675986e611fc981368
parent7a8de70f017e5bd24cde94466686eb7a5a437097 (diff)
downloadgcc-059e2a26f5819715bba3ccfe620ccf8677b8dd44.zip
gcc-059e2a26f5819715bba3ccfe620ccf8677b8dd44.tar.gz
gcc-059e2a26f5819715bba3ccfe620ccf8677b8dd44.tar.bz2
Don't crash when declaring methods on unknown name.
From-SVN: r168131
-rw-r--r--gcc/go/gofrontend/gogo.cc12
-rw-r--r--gcc/go/gofrontend/gogo.h4
-rw-r--r--gcc/go/gofrontend/types.cc6
3 files changed, 20 insertions, 2 deletions
diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc
index d5db85c..7071116 100644
--- a/gcc/go/gofrontend/gogo.cc
+++ b/gcc/go/gofrontend/gogo.cc
@@ -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
diff --git a/gcc/go/gofrontend/gogo.h b/gcc/go/gofrontend/gogo.h
index 552a643..96729b2 100644
--- a/gcc/go/gofrontend/gogo.h
+++ b/gcc/go/gofrontend/gogo.h
@@ -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;
diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc
index fad9206..97bde7b 100644
--- a/gcc/go/gofrontend/types.cc
+++ b/gcc/go/gofrontend/types.cc
@@ -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);
}