diff options
| author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-12-21 20:32:36 +0000 |
|---|---|---|
| committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-12-21 20:32:36 +0000 |
| commit | 18eaa95ff6dc4cfe068f387aa47e281d4b9bea4b (patch) | |
| tree | 850a1fe9c02d7e1a9f9a52675986e611fc981368 | |
| parent | 720b870991d91af2f9d4c048d2a749dda6a35492 (diff) | |
| download | ppe42-gcc-18eaa95ff6dc4cfe068f387aa47e281d4b9bea4b.tar.gz ppe42-gcc-18eaa95ff6dc4cfe068f387aa47e281d4b9bea4b.zip | |
Don't crash when declaring methods on unknown name.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@168131 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/go/gofrontend/gogo.cc | 12 | ||||
| -rw-r--r-- | gcc/go/gofrontend/gogo.h | 4 | ||||
| -rw-r--r-- | gcc/go/gofrontend/types.cc | 6 |
3 files changed, 20 insertions, 2 deletions
diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc index d5db85c6d19..707111688b7 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 552a6434485..96729b2e7e2 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 fad9206fdf4..97bde7bd6a5 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); } |

