]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
compiler: Avoid knockon errors for invalid uses of _.
authorIan Lance Taylor <ian@gcc.gnu.org>
Sat, 28 Sep 2013 20:23:43 +0000 (20:23 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Sat, 28 Sep 2013 20:23:43 +0000 (20:23 +0000)
From-SVN: r203006

gcc/go/gofrontend/gogo-tree.cc
gcc/go/gofrontend/gogo.cc
gcc/go/gofrontend/gogo.h
gcc/go/gofrontend/parse.cc
gcc/go/gofrontend/types.cc

index 7813cc1882273ab816dd266f06a499fc216110d3..a95f290150956aa0c085bcf5756c9391900db746 100644 (file)
@@ -1061,6 +1061,12 @@ Named_object::get_tree(Gogo* gogo, Named_object* function)
   if (this->tree_ != NULL_TREE)
     return this->tree_;
 
+  if (Gogo::is_erroneous_name(this->name_))
+    {
+      this->tree_ = error_mark_node;
+      return error_mark_node;
+    }
+
   tree name;
   if (this->classification_ == NAMED_OBJECT_TYPE)
     name = NULL_TREE;
index 17cbb6b9b49eaed30387481b2602eb403e4b83f0..9f918cb81c7bc25eed0ea34a6d52b21a70dbba59 100644 (file)
@@ -1192,6 +1192,27 @@ Gogo::record_interface_type(Interface_type* itype)
   this->interface_types_.push_back(itype);
 }
 
+// Return an erroneous name that indicates that an error has already
+// been reported.
+
+std::string
+Gogo::erroneous_name()
+{
+  static int erroneous_count;
+  char name[50];
+  snprintf(name, sizeof name, "$erroneous%d", erroneous_count);
+  ++erroneous_count;
+  return name;
+}
+
+// Return whether a name is an erroneous name.
+
+bool
+Gogo::is_erroneous_name(const std::string& name)
+{
+  return name.compare(0, 10, "$erroneous") == 0;
+}
+
 // Return a name for a thunk object.
 
 std::string
index 6a87f2d562ccc8650e7c2b914e4269e0de168c13..23968d4a1919fb826b1a36e9e443a2fcc8c5efb8 100644 (file)
@@ -387,6 +387,16 @@ class Gogo
   void
   mark_locals_used();
 
+  // Return a name to use for an error case.  This should only be used
+  // after reporting an error, and is used to avoid useless knockon
+  // errors.
+  static std::string
+  erroneous_name();
+
+  // Return whether the name indicates an error.
+  static bool
+  is_erroneous_name(const std::string&);
+
   // Return a name to use for a thunk function.  A thunk function is
   // one we create during the compilation, for a go statement or a
   // defer statement or a method expression.
index befe4bc7d836462e0871aaa6ec110306e74b6fa3..e68f1753f8784e8775d6fe0aff04df23d7329914 100644 (file)
@@ -213,7 +213,7 @@ Parse::qualified_ident(std::string* pname, Named_object** ppackage)
   if (name == "_")
     {
       error_at(this->location(), "invalid use of %<_%>");
-      name = "blank";
+      name = Gogo::erroneous_name();
     }
 
   if (package->name() == this->gogo_->package_name())
@@ -3104,7 +3104,7 @@ Parse::selector(Expression* left, bool* is_type_switch)
       if (token->identifier() == "_")
        {
          error_at(this->location(), "invalid use of %<_%>");
-         name = this->gogo_->pack_hidden_name("blank", false);
+         name = Gogo::erroneous_name();
        }
       this->advance_token();
       return Expression::make_selector(left, name, location);
@@ -4929,7 +4929,7 @@ Parse::send_or_recv_stmt(bool* is_send, Expression** channel, Expression** val,
            {
              error_at(recv_var_loc,
                       "no new variables on left side of %<:=%>");
-             recv_var = "blank";
+             recv_var = Gogo::erroneous_name();
            }
          *is_send = false;
          *varname = gogo->pack_hidden_name(recv_var, is_rv_exported);
@@ -4965,7 +4965,7 @@ Parse::send_or_recv_stmt(bool* is_send, Expression** channel, Expression** val,
                    {
                      error_at(recv_var_loc,
                               "no new variables on left side of %<:=%>");
-                     recv_var = "blank";
+                     recv_var = Gogo::erroneous_name();
                    }
                  *is_send = false;
                  if (recv_var != "_")
@@ -5502,7 +5502,7 @@ Parse::package_clause()
          if (name == "_")
            {
              error_at(this->location(), "invalid package name _");
-             name = "blank";
+             name = Gogo::erroneous_name();
            }
          this->advance_token();
        }
index 32f827dd316a4a4a1ecb30af3878509a4650fc93..a4a60706b7afbcc2304b5cba573360f4e2c11c24 100644 (file)
@@ -9269,7 +9269,11 @@ Type::bind_field_or_method(Gogo* gogo, const Type* type, Expression* expr,
     }
   else
     {
-      if (!ambig1.empty())
+      if (Gogo::is_erroneous_name(name))
+       {
+         // An error was already reported.
+       }
+      else if (!ambig1.empty())
        error_at(location, "%qs is ambiguous via %qs and %qs",
                 Gogo::message_name(name).c_str(), ambig1.c_str(),
                 ambig2.c_str());