Index: lld/trunk/ELF/ScriptLexer.h =================================================================== --- lld/trunk/ELF/ScriptLexer.h +++ lld/trunk/ELF/ScriptLexer.h @@ -39,7 +39,6 @@ std::vector Tokens; bool InExpr = false; size_t Pos = 0; - bool Error = false; private: void maybeSplitExpr(); Index: lld/trunk/ELF/ScriptLexer.cpp =================================================================== --- lld/trunk/ELF/ScriptLexer.cpp +++ lld/trunk/ELF/ScriptLexer.cpp @@ -75,9 +75,8 @@ // We don't want to record cascading errors. Keep only the first one. void ScriptLexer::setError(const Twine &Msg) { - if (Error) + if (ErrorCount) return; - Error = true; if (!Pos) { error(getCurrentLocation() + ": " + Msg); @@ -164,7 +163,7 @@ } // An erroneous token is handled as if it were the last token before EOF. -bool ScriptLexer::atEOF() { return Error || Tokens.size() == Pos; } +bool ScriptLexer::atEOF() { return ErrorCount || Tokens.size() == Pos; } // Split a given string as an expression. // This function returns "3", "*" and "5" for "3*5" for example. @@ -207,7 +206,7 @@ // // This function may split the current token into multiple tokens. void ScriptLexer::maybeSplitExpr() { - if (!InExpr || Error || atEOF()) + if (!InExpr || ErrorCount || atEOF()) return; std::vector V = tokenizeExpr(Tokens[Pos]); @@ -220,7 +219,7 @@ StringRef ScriptLexer::next() { maybeSplitExpr(); - if (Error) + if (ErrorCount) return ""; if (atEOF()) { setError("unexpected EOF"); @@ -231,7 +230,7 @@ StringRef ScriptLexer::peek() { StringRef Tok = next(); - if (Error) + if (ErrorCount) return ""; Pos = Pos - 1; return Tok; @@ -260,7 +259,7 @@ void ScriptLexer::skip() { (void)next(); } void ScriptLexer::expect(StringRef Expect) { - if (Error) + if (ErrorCount) return; StringRef Tok = next(); if (Tok != Expect) Index: lld/trunk/ELF/ScriptParser.cpp =================================================================== --- lld/trunk/ELF/ScriptParser.cpp +++ lld/trunk/ELF/ScriptParser.cpp @@ -192,7 +192,7 @@ return; } - while (!atEOF() && !Error && peek() != "}") { + while (!atEOF() && !ErrorCount && peek() != "}") { StringRef VerStr = next(); if (VerStr == "{") { setError("anonymous version definition is used in " @@ -284,7 +284,7 @@ expect("("); bool Orig = Config->AsNeeded; Config->AsNeeded = true; - while (!Error && !consume(")")) + while (!ErrorCount && !consume(")")) addFile(unquote(next())); Config->AsNeeded = Orig; } @@ -300,13 +300,13 @@ void ScriptParser::readExtern() { expect("("); - while (!Error && !consume(")")) + while (!ErrorCount && !consume(")")) Config->Undefined.push_back(next()); } void ScriptParser::readGroup() { expect("("); - while (!Error && !consume(")")) { + while (!ErrorCount && !consume(")")) { if (consume("AS_NEEDED")) readAsNeeded(); else @@ -345,7 +345,7 @@ void ScriptParser::readOutputArch() { // OUTPUT_ARCH is ignored for now. expect("("); - while (!Error && !consume(")")) + while (!ErrorCount && !consume(")")) skip(); } @@ -364,14 +364,14 @@ void ScriptParser::readPhdrs() { expect("{"); - while (!Error && !consume("}")) { + while (!ErrorCount && !consume("}")) { Script->Opt.PhdrsCommands.push_back( {next(), PT_NULL, false, false, UINT_MAX, nullptr}); PhdrsCommand &PhdrCmd = Script->Opt.PhdrsCommands.back(); PhdrCmd.Type = readPhdrType(); - while (!Error && !consume(";")) { + while (!ErrorCount && !consume(";")) { if (consume("FILEHDR")) PhdrCmd.HasFilehdr = true; else if (consume("PHDRS")) @@ -403,7 +403,7 @@ Config->SingleRoRx = true; expect("{"); - while (!Error && !consume("}")) { + while (!ErrorCount && !consume("}")) { StringRef Tok = next(); BaseCommand *Cmd = readProvideOrAssignment(Tok); if (!Cmd) { @@ -428,7 +428,7 @@ StringMatcher ScriptParser::readFilePatterns() { std::vector V; - while (!Error && !consume(")")) + while (!ErrorCount && !consume(")")) V.push_back(next()); return StringMatcher(V); } @@ -460,7 +460,7 @@ // any file but a.o, and section .baz in any file but b.o. std::vector ScriptParser::readInputSectionsList() { std::vector Ret; - while (!Error && peek() != ")") { + while (!ErrorCount && peek() != ")") { StringMatcher ExcludeFilePat; if (consume("EXCLUDE_FILE")) { expect("("); @@ -468,7 +468,7 @@ } std::vector V; - while (!Error && peek() != ")" && peek() != "EXCLUDE_FILE") + while (!ErrorCount && peek() != ")" && peek() != "EXCLUDE_FILE") V.push_back(next()); if (!V.empty()) @@ -495,7 +495,7 @@ auto *Cmd = make(FilePattern); expect("("); - while (!Error && !consume(")")) { + while (!ErrorCount && !consume(")")) { SortSectionPolicy Outer = readSortKind(); SortSectionPolicy Inner = SortSectionPolicy::Default; std::vector V; @@ -625,7 +625,7 @@ Cmd->Constraint = ConstraintKind::ReadWrite; expect("{"); - while (!Error && !consume("}")) { + while (!ErrorCount && !consume("}")) { StringRef Tok = next(); if (Tok == ";") { // Empty commands are allowed. Do nothing here. @@ -769,7 +769,7 @@ // This is a part of the operator-precedence parser. This function // assumes that the remaining token stream starts with an operator. Expr ScriptParser::readExpr1(Expr Lhs, int MinPrec) { - while (!atEOF() && !Error) { + while (!atEOF() && !ErrorCount) { // Read an operator and an expression. if (consume("?")) return readTernary(Lhs); @@ -1033,7 +1033,7 @@ std::vector ScriptParser::readOutputSectionPhdrs() { std::vector Phdrs; - while (!Error && peek().startswith(":")) { + while (!ErrorCount && peek().startswith(":")) { StringRef Tok = next(); Phdrs.push_back((Tok.size() == 1) ? next() : Tok.substr(1)); } @@ -1136,7 +1136,7 @@ std::vector Globals; std::vector *V = &Globals; - while (!Error) { + while (!ErrorCount) { if (consume("}")) break; if (consumeLabel("local")) { @@ -1170,7 +1170,7 @@ expect("{"); std::vector Ret; - while (!Error && peek() != "}") { + while (!ErrorCount && peek() != "}") { StringRef Tok = next(); bool HasWildcard = !Tok.startswith("\"") && hasWildcard(Tok); Ret.push_back({unquote(Tok), IsCXX, HasWildcard}); @@ -1197,7 +1197,7 @@ // MEMORY { name [(attr)] : ORIGIN = origin, LENGTH = len ... } void ScriptParser::readMemory() { expect("{"); - while (!Error && !consume("}")) { + while (!ErrorCount && !consume("}")) { StringRef Name = next(); uint32_t Flags = 0; Index: lld/trunk/test/ELF/version-script-err.s =================================================================== --- lld/trunk/test/ELF/version-script-err.s +++ lld/trunk/test/ELF/version-script-err.s @@ -8,4 +8,3 @@ // RUN: not ld.lld --version-script %terr1.script -shared %t.o -o %t.so 2>&1 | \ // RUN: FileCheck -check-prefix=ERR1 %s // ERR1: {{.*}}:1: unclosed quote -// ERR1-NEXT: {{.*}}: unexpected EOF