OSDN Git Service

compiler: Avoid crashes on erroneous input.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Feb 2012 14:33:45 +0000 (14:33 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Feb 2012 14:33:45 +0000 (14:33 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@184274 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 2605ffe..d314045 100644 (file)
@@ -126,7 +126,9 @@ class Backend
 
   // Fill in a placeholder pointer type as a pointer.  This takes a
   // type returned by placeholder_pointer_type and arranges for it to
-  // point to to_type.  Returns true on success, false on failure.
+  // point to the type that TO_TYPE points to (that is, PLACEHOLDER
+  // becomes the same type as TO_TYPE).  Returns true on success,
+  // false on failure.
   virtual bool
   set_placeholder_pointer_type(Btype* placeholder, Btype* to_type) = 0;
 
index fafd04f..a1b03ac 100644 (file)
@@ -4180,6 +4180,11 @@ Variable::get_backend_variable(Gogo* gogo, Named_object* function,
                                            package != NULL,
                                            Gogo::is_hidden_name(name),
                                            this->location_);
+         else if (function == NULL)
+           {
+             go_assert(saw_errors());
+             bvar = backend->error_variable();
+           }
          else
            {
              tree fndecl = function->func_value()->get_decl();
index 41bf491..1a35e54 100644 (file)
@@ -3595,7 +3595,7 @@ Pointer_type::do_hash_for_method(Gogo* gogo) const
   return this->to_type_->hash_for_method(gogo) << 4;
 }
 
-// The tree for a pointer type.
+// Get the backend representation for a pointer type.
 
 Btype*
 Pointer_type::do_get_backend(Gogo* gogo)
@@ -5345,6 +5345,7 @@ Array_type::do_get_backend(Gogo* gogo)
 }
 
 // Return the backend representation of the element type.
+
 Btype*
 Array_type::get_backend_element(Gogo* gogo)
 {
@@ -7567,6 +7568,11 @@ Find_type_use::type(Type* type)
          this->find_type_->add_dependency(type->named_type());
          break;
 
+       case Type::TYPE_NAMED:
+       case Type::TYPE_FORWARD:
+         go_assert(saw_errors());
+         break;
+
        case Type::TYPE_VOID:
        case Type::TYPE_SINK:
        case Type::TYPE_FUNCTION:
@@ -7575,8 +7581,6 @@ Find_type_use::type(Type* type)
        case Type::TYPE_MAP:
        case Type::TYPE_CHANNEL:
        case Type::TYPE_INTERFACE:
-       case Type::TYPE_NAMED:
-       case Type::TYPE_FORWARD:
        default:
          go_unreachable();
        }