This patch to the Go frontend adds some tweaks for importing inline function bodies.
We track whether we've seen an error when importing a function; we will use error tracking to avoid knock-on errors. We stop importing identifiers at a ')'. We provide a way to adjust the indentation level while importing. Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline. Ian
Index: gcc/go/gofrontend/MERGE =================================================================== --- gcc/go/gofrontend/MERGE (revision 266534) +++ gcc/go/gofrontend/MERGE (working copy) @@ -1,4 +1,4 @@ -267d91b41571329e71a88f56df46444b305482da +b013405f2c66596c47cb9be493c798db1087c0f0 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. Index: gcc/go/gofrontend/import.cc =================================================================== --- gcc/go/gofrontend/import.cc (revision 266530) +++ gcc/go/gofrontend/import.cc (working copy) @@ -1225,7 +1225,7 @@ Import::read_identifier() while (true) { c = stream->peek_char(); - if (c == -1 || c == ' ' || c == '\n' || c == ';') + if (c == -1 || c == ' ' || c == '\n' || c == ';' || c == ')') break; ret += c; stream->advance(1); @@ -1450,7 +1450,7 @@ Import_function_body::read_identifier() for (size_t i = start; i < this->body_.length(); i++) { int c = static_cast<unsigned char>(this->body_[i]); - if (c == ' ' || c == '\n' || c == ';') + if (c == ' ' || c == '\n' || c == ';' || c == ')') { this->off_ = i; return this->body_.substr(start, i - start); Index: gcc/go/gofrontend/import.h =================================================================== --- gcc/go/gofrontend/import.h (revision 266530) +++ gcc/go/gofrontend/import.h (working copy) @@ -554,7 +554,7 @@ class Import_function_body : public Impo const std::string& body, size_t off, Block* block, int indent) : gogo_(gogo), imp_(imp), named_object_(named_object), body_(body), - off_(off), block_(block), indent_(indent) + off_(off), block_(block), indent_(indent), saw_error_(false) { } // The IR. @@ -597,6 +597,16 @@ class Import_function_body : public Impo indent() const { return this->indent_; } + // Increment the indentation level. + void + increment_indent() + { ++this->indent_; } + + // Decrement the indentation level. + void + decrement_indent() + { --this->indent_; } + // The name of the function we are parsing. const std::string& name() const; @@ -652,6 +662,16 @@ class Import_function_body : public Impo ifb() { return this; } + // Return whether we have seen an error. + bool + saw_error() const + { return this->saw_error_; } + + // Record that we have seen an error. + void + set_saw_error() + { this->saw_error_ = true; } + private: // The IR. Gogo* gogo_;