[clang-tools-extra] 5cf0606 - [clang] Let PPCallbacks::PragmaWarning() pass specifier as enum instead of string
Nico Weber via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 28 16:49:18 PDT 2021
Author: Nico Weber
Date: 2021-09-28T19:47:27-04:00
New Revision: 5cf0606140974b7560490778725c134eb35f0cc7
URL: https://github.com/llvm/llvm-project/commit/5cf0606140974b7560490778725c134eb35f0cc7
DIFF: https://github.com/llvm/llvm-project/commit/5cf0606140974b7560490778725c134eb35f0cc7.diff
LOG: [clang] Let PPCallbacks::PragmaWarning() pass specifier as enum instead of string
Differential Revision: https://reviews.llvm.org/D110635
Added:
Modified:
clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp
clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h
clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
clang-tools-extra/pp-trace/PPCallbacksTracker.h
clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
clang/include/clang/Lex/PPCallbacks.h
clang/lib/Frontend/PrintPreprocessedOutput.cpp
clang/lib/Lex/Pragma.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp b/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp
index 23765da1b46f5..a75fca13e2e5a 100644
--- a/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp
+++ b/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp
@@ -234,7 +234,8 @@ void ExpandModularHeadersPPCallbacks::PragmaOpenCLExtension(
parseToLocation(NameLoc);
}
void ExpandModularHeadersPPCallbacks::PragmaWarning(SourceLocation Loc,
- StringRef, ArrayRef<int>) {
+ PragmaWarningSpecifier,
+ ArrayRef<int>) {
parseToLocation(Loc);
}
void ExpandModularHeadersPPCallbacks::PragmaWarningPush(SourceLocation Loc,
diff --git a/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h b/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h
index fe1b00b4680a1..6fdc8bd21c6bd 100644
--- a/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h
+++ b/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h
@@ -94,7 +94,8 @@ class ExpandModularHeadersPPCallbacks : public PPCallbacks {
SrcMgr::CharacteristicKind) override;
void PragmaOpenCLExtension(SourceLocation NameLoc, const IdentifierInfo *,
SourceLocation StateLoc, unsigned) override;
- void PragmaWarning(SourceLocation Loc, StringRef, ArrayRef<int>) override;
+ void PragmaWarning(SourceLocation Loc, PragmaWarningSpecifier,
+ ArrayRef<int>) override;
void PragmaWarningPush(SourceLocation Loc, int) override;
void PragmaWarningPop(SourceLocation Loc) override;
void PragmaAssumeNonNullBegin(SourceLocation Loc) override;
diff --git a/clang-tools-extra/pp-trace/PPCallbacksTracker.cpp b/clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
index 8f646f75c5fb6..63faae651998d 100644
--- a/clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
+++ b/clang-tools-extra/pp-trace/PPCallbacksTracker.cpp
@@ -78,6 +78,12 @@ static const char *const PragmaMessageKindStrings[] = {
"PMK_Message", "PMK_Warning", "PMK_Error"
};
+// PragmaWarningSpecifier strings.
+static const char *const PragmaWarningSpecifierStrings[] = {
+ "PWS_Default", "PWS_Disable", "PWS_Error", "PWS_Once", "PWS_Suppress",
+ "PWS_Level1", "PWS_Level2", "PWS_Level3", "PWS_Level4",
+};
+
// ConditionValueKind strings.
static const char *const ConditionValueKindStrings[] = {
"CVK_NotEvaluated", "CVK_False", "CVK_True"
@@ -267,11 +273,11 @@ void PPCallbacksTracker::PragmaOpenCLExtension(SourceLocation NameLoc,
// Callback invoked when a #pragma warning directive is read.
void PPCallbacksTracker::PragmaWarning(SourceLocation Loc,
- llvm::StringRef WarningSpec,
+ PragmaWarningSpecifier WarningSpec,
llvm::ArrayRef<int> Ids) {
beginCallback("PragmaWarning");
appendArgument("Loc", Loc);
- appendArgument("WarningSpec", WarningSpec);
+ appendArgument("WarningSpec", WarningSpec, PragmaWarningSpecifierStrings);
std::string Str;
llvm::raw_string_ostream SS(Str);
diff --git a/clang-tools-extra/pp-trace/PPCallbacksTracker.h b/clang-tools-extra/pp-trace/PPCallbacksTracker.h
index 5bd334ee83f4f..db5d51b003649 100644
--- a/clang-tools-extra/pp-trace/PPCallbacksTracker.h
+++ b/clang-tools-extra/pp-trace/PPCallbacksTracker.h
@@ -121,7 +121,7 @@ class PPCallbacksTracker : public PPCallbacks {
diag::Severity mapping, llvm::StringRef Str) override;
void PragmaOpenCLExtension(SourceLocation NameLoc, const IdentifierInfo *Name,
SourceLocation StateLoc, unsigned State) override;
- void PragmaWarning(SourceLocation Loc, llvm::StringRef WarningSpec,
+ void PragmaWarning(SourceLocation Loc, PragmaWarningSpecifier WarningSpec,
llvm::ArrayRef<int> Ids) override;
void PragmaWarningPush(SourceLocation Loc, int Level) override;
void PragmaWarningPop(SourceLocation Loc) override;
diff --git a/clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp b/clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
index 5df30ad8efc2d..932b0eb93c90e 100644
--- a/clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
+++ b/clang-tools-extra/test/pp-trace/pp-trace-pragma-ms.cpp
@@ -86,15 +86,15 @@
// CHECK-NEXT: Introducer: PIK_HashPragma
// CHECK-NEXT: - Callback: PragmaWarning
// CHECK-NEXT: Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:17:9"
-// CHECK-NEXT: WarningSpec: disable
+// CHECK-NEXT: WarningSpec: PWS_Disable
// CHECK-NEXT: Ids: [1, 2, 3]
// CHECK-NEXT: - Callback: PragmaWarning
// CHECK-NEXT: Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:17:9"
-// CHECK-NEXT: WarningSpec: error
+// CHECK-NEXT: WarningSpec: PWS_Error
// CHECK-NEXT: Ids: [4, 5, 6]
// CHECK-NEXT: - Callback: PragmaWarning
// CHECK-NEXT: Loc: "{{.*}}{{[/\\]}}pp-trace-pragma-ms.cpp:17:9"
-// CHECK-NEXT: WarningSpec: suppress
+// CHECK-NEXT: WarningSpec: PWS_Suppress
// CHECK-NEXT: Ids: [7, 8, 9]
// CHECK-NEXT: - Callback: EndOfMainFile
// CHECK-NEXT: ...
diff --git a/clang/include/clang/Lex/PPCallbacks.h b/clang/include/clang/Lex/PPCallbacks.h
index 47a19207fb51d..76a74f20cc3bc 100644
--- a/clang/include/clang/Lex/PPCallbacks.h
+++ b/clang/include/clang/Lex/PPCallbacks.h
@@ -252,9 +252,20 @@ class PPCallbacks {
}
/// Callback invoked when a \#pragma warning directive is read.
- virtual void PragmaWarning(SourceLocation Loc, StringRef WarningSpec,
- ArrayRef<int> Ids) {
- }
+ enum PragmaWarningSpecifier {
+ PWS_Default,
+ PWS_Disable,
+ PWS_Error,
+ PWS_Once,
+ PWS_Suppress,
+ PWS_Level1,
+ PWS_Level2,
+ PWS_Level3,
+ PWS_Level4,
+ };
+ virtual void PragmaWarning(SourceLocation Loc,
+ PragmaWarningSpecifier WarningSpec,
+ ArrayRef<int> Ids) {}
/// Callback invoked when a \#pragma warning(push) directive is read.
virtual void PragmaWarningPush(SourceLocation Loc, int Level) {
@@ -540,7 +551,7 @@ class PPChainedCallbacks : public PPCallbacks {
Second->PragmaOpenCLExtension(NameLoc, Name, StateLoc, State);
}
- void PragmaWarning(SourceLocation Loc, StringRef WarningSpec,
+ void PragmaWarning(SourceLocation Loc, PragmaWarningSpecifier WarningSpec,
ArrayRef<int> Ids) override {
First->PragmaWarning(Loc, WarningSpec, Ids);
Second->PragmaWarning(Loc, WarningSpec, Ids);
diff --git a/clang/lib/Frontend/PrintPreprocessedOutput.cpp b/clang/lib/Frontend/PrintPreprocessedOutput.cpp
index 3a3b158aafdb7..360fa1448b128 100644
--- a/clang/lib/Frontend/PrintPreprocessedOutput.cpp
+++ b/clang/lib/Frontend/PrintPreprocessedOutput.cpp
@@ -155,7 +155,7 @@ class PrintPPOutputPPCallbacks : public PPCallbacks {
void PragmaDiagnosticPop(SourceLocation Loc, StringRef Namespace) override;
void PragmaDiagnostic(SourceLocation Loc, StringRef Namespace,
diag::Severity Map, StringRef Str) override;
- void PragmaWarning(SourceLocation Loc, StringRef WarningSpec,
+ void PragmaWarning(SourceLocation Loc, PragmaWarningSpecifier WarningSpec,
ArrayRef<int> Ids) override;
void PragmaWarningPush(SourceLocation Loc, int Level) override;
void PragmaWarningPop(SourceLocation Loc) override;
@@ -580,10 +580,24 @@ void PrintPPOutputPPCallbacks::PragmaDiagnostic(SourceLocation Loc,
}
void PrintPPOutputPPCallbacks::PragmaWarning(SourceLocation Loc,
- StringRef WarningSpec,
+ PragmaWarningSpecifier WarningSpec,
ArrayRef<int> Ids) {
MoveToLine(Loc, /*RequireStartOfLine=*/true);
- OS << "#pragma warning(" << WarningSpec << ':';
+
+ OS << "#pragma warning(";
+ switch(WarningSpec) {
+ case PWS_Default: OS << "default"; break;
+ case PWS_Disable: OS << "disable"; break;
+ case PWS_Error: OS << "error"; break;
+ case PWS_Once: OS << "once"; break;
+ case PWS_Suppress: OS << "suppress"; break;
+ case PWS_Level1: OS << '1'; break;
+ case PWS_Level2: OS << '2'; break;
+ case PWS_Level3: OS << '3'; break;
+ case PWS_Level4: OS << '4'; break;
+ }
+ OS << ':';
+
for (ArrayRef<int>::iterator I = Ids.begin(), E = Ids.end(); I != E; ++I)
OS << ' ' << *I;
OS << ')';
diff --git a/clang/lib/Lex/Pragma.cpp b/clang/lib/Lex/Pragma.cpp
index a6cb5895b3bd8..df3080a3824a8 100644
--- a/clang/lib/Lex/Pragma.cpp
+++ b/clang/lib/Lex/Pragma.cpp
@@ -1432,14 +1432,19 @@ struct PragmaWarningHandler : public PragmaHandler {
// Figure out which warning specifier this is.
bool SpecifierValid;
- StringRef Specifier;
- llvm::SmallString<1> SpecifierBuf;
+ PPCallbacks::PragmaWarningSpecifier Specifier;
if (II) {
- Specifier = II->getName();
- SpecifierValid = llvm::StringSwitch<bool>(Specifier)
- .Cases("default", "disable", "error", "once",
- "suppress", true)
- .Default(false);
+ int SpecifierInt = llvm::StringSwitch<int>(II->getName())
+ .Case("default", PPCallbacks::PWS_Default)
+ .Case("disable", PPCallbacks::PWS_Disable)
+ .Case("error", PPCallbacks::PWS_Error)
+ .Case("once", PPCallbacks::PWS_Once)
+ .Case("suppress", PPCallbacks::PWS_Suppress)
+ .Default(-1);
+ if ((SpecifierValid = SpecifierInt != -1))
+ Specifier =
+ static_cast<PPCallbacks::PragmaWarningSpecifier>(SpecifierInt);
+
// If we read a correct specifier, snatch next token (that should be
// ":", checked later).
if (SpecifierValid)
@@ -1447,9 +1452,10 @@ struct PragmaWarningHandler : public PragmaHandler {
} else {
// Token is a numeric constant. It should be either 1, 2, 3 or 4.
uint64_t Value;
- Specifier = PP.getSpelling(Tok, SpecifierBuf);
if (PP.parseSimpleIntegerLiteral(Tok, Value)) {
- SpecifierValid = (Value >= 1) && (Value <= 4);
+ if ((SpecifierValid = (Value >= 1) && (Value <= 4)))
+ Specifier = static_cast<PPCallbacks::PragmaWarningSpecifier>(
+ PPCallbacks::PWS_Level1 + Value - 1);
} else
SpecifierValid = false;
// Next token already snatched by parseSimpleIntegerLiteral.
More information about the cfe-commits
mailing list