compiler: Don't record interface types with blank type names.
authorIan Lance Taylor <ian@gcc.gnu.org>
Thu, 16 Oct 2014 19:28:51 +0000 (19:28 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Thu, 16 Oct 2014 19:28:51 +0000 (19:28 +0000)
Fixes issue 8079.

From-SVN: r216343

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

index b24de608596e878e6de93333fbfb1be3822b260a..09369e020f64b0f8b540b0dc52de1007a0d873ac 100644 (file)
@@ -245,7 +245,7 @@ Parse::type()
           || token->is_op(OPERATOR_CHANOP))
     return this->channel_type();
   else if (token->is_keyword(KEYWORD_INTERFACE))
-    return this->interface_type();
+    return this->interface_type(true);
   else if (token->is_keyword(KEYWORD_FUNC))
     {
       Location location = token->location();
@@ -1179,7 +1179,7 @@ Parse::block()
 // MethodSpecList     = MethodSpec { ";" MethodSpec } [ ";" ] .
 
 Type*
-Parse::interface_type()
+Parse::interface_type(bool record)
 {
   go_assert(this->peek_token()->is_keyword(KEYWORD_INTERFACE));
   Location location = this->location();
@@ -1227,7 +1227,8 @@ Parse::interface_type()
     }
 
   Interface_type* ret = Type::make_interface_type(methods, location);
-  this->gogo_->record_interface_type(ret);
+  if (record)
+    this->gogo_->record_interface_type(ret);
   return ret;
 }
 
@@ -1526,7 +1527,13 @@ Parse::type_spec(void*)
     }
 
   Type* type;
-  if (!this->peek_token()->is_op(OPERATOR_SEMICOLON))
+  if (name == "_" && this->peek_token()->is_keyword(KEYWORD_INTERFACE))
+    {
+      // We call Parse::interface_type explicity here because we do not want
+      // to record an interface with a blank type name.
+      type = this->interface_type(false);
+    }
+  else if (!this->peek_token()->is_op(OPERATOR_SEMICOLON))
     type = this->type();
   else
     {
index 86698a1535292d63be06361562df1695b57572a1..3749645ebb3dbc433fdcfd9d87d2e7de11c05826 100644 (file)
@@ -182,7 +182,7 @@ class Parse
   void parameter_decl(bool, Typed_identifier_list*, bool*, bool*, bool*);
   bool result(Typed_identifier_list**);
   Location block();
-  Type* interface_type();
+  Type* interface_type(bool record);
   void method_spec(Typed_identifier_list*);
   void declaration();
   bool declaration_may_start_here();