diff options
Diffstat (limited to 'clang/lib/Frontend/VerifyDiagnosticConsumer.cpp')
-rw-r--r-- | clang/lib/Frontend/VerifyDiagnosticConsumer.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp b/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp index ec45e36c713..40992fec3f6 100644 --- a/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp +++ b/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp @@ -356,8 +356,16 @@ static bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM, return true; // Default directive kind. + bool RegexKind = false; const char* KindStr = "string"; + // Next optional token: - + if (PH.Next("-re")) { + PH.Advance(); + RegexKind = true; + KindStr = "regex"; + } + // Next optional token: @ SourceLocation ExpectedLoc; if (!PH.Next("@")) { @@ -475,8 +483,16 @@ static bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM, if (Text.empty()) Text.assign(ContentBegin, ContentEnd); + // Check that regex directives contain at least one regex. + if (RegexKind && Text.find("{{") == StringRef::npos) { + Diags.Report(Pos.getLocWithOffset(ContentBegin-PH.Begin), + diag::err_verify_missing_regex) << Text; + return false; + } + // Construct new directive. - Directive *D = Directive::create(Pos, ExpectedLoc, Text, Min, Max); + Directive *D = Directive::create(RegexKind, Pos, ExpectedLoc, Text, + Min, Max); std::string Error; if (D->isValid(Error)) { DL->push_back(D); @@ -835,10 +851,10 @@ void VerifyDiagnosticConsumer::CheckDiagnostics() { ED.Notes.clear(); } -Directive *Directive::create(SourceLocation DirectiveLoc, +Directive *Directive::create(bool RegexKind, SourceLocation DirectiveLoc, SourceLocation DiagnosticLoc, StringRef Text, unsigned Min, unsigned Max) { - if (Text.find("}}") == StringRef::npos) + if (!RegexKind) return new StandardDirective(DirectiveLoc, DiagnosticLoc, Text, Min, Max); // Parse the directive into a regular expression. |