aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema
diff options
context:
space:
mode:
authorNikolas Klauser <nikolasklauser@berlin.de>2024-09-13 11:34:20 +0200
committerGitHub <noreply@github.com>2024-09-13 11:34:20 +0200
commite7f782e7481cea23ef452a75607d3d61f5bd0d22 (patch)
treeaa5db347b90552d84849992a01bf8cbe32e1bd20 /clang/lib/Sema
parentfbf0a8015389bccab80bba00be49955079913152 (diff)
downloadllvm-e7f782e7481cea23ef452a75607d3d61f5bd0d22.zip
llvm-e7f782e7481cea23ef452a75607d3d61f5bd0d22.tar.gz
llvm-e7f782e7481cea23ef452a75607d3d61f5bd0d22.tar.bz2
Reapply "[clang] Extend diagnose_if to accept more detailed warning information (#70976)" (#108453)
This reverts commit e0cd11eba526234ca14a0b91f5598ca3363b6aca. Update the use of `getWarningOptionForDiag` in flang to use the DiagnosticIDs.
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r--clang/lib/Sema/Sema.cpp5
-rw-r--r--clang/lib/Sema/SemaCUDA.cpp4
-rw-r--r--clang/lib/Sema/SemaDeclAttr.cpp26
-rw-r--r--clang/lib/Sema/SemaOverload.cpp32
-rw-r--r--clang/lib/Sema/SemaTemplateInstantiateDecl.cpp3
5 files changed, 55 insertions, 15 deletions
diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp
index 46ddd36..d567de7 100644
--- a/clang/lib/Sema/Sema.cpp
+++ b/clang/lib/Sema/Sema.cpp
@@ -1683,7 +1683,7 @@ void Sema::EmitCurrentDiagnostic(unsigned DiagID) {
// that is different from the last template instantiation where
// we emitted an error, print a template instantiation
// backtrace.
- if (!DiagnosticIDs::isBuiltinNote(DiagID))
+ if (!Diags.getDiagnosticIDs()->isNote(DiagID))
PrintContextStack();
}
@@ -1697,7 +1697,8 @@ bool Sema::hasUncompilableErrorOccurred() const {
if (Loc == DeviceDeferredDiags.end())
return false;
for (auto PDAt : Loc->second) {
- if (DiagnosticIDs::isDefaultMappingAsError(PDAt.second.getDiagID()))
+ if (Diags.getDiagnosticIDs()->isDefaultMappingAsError(
+ PDAt.second.getDiagID()))
return true;
}
return false;
diff --git a/clang/lib/Sema/SemaCUDA.cpp b/clang/lib/Sema/SemaCUDA.cpp
index ec37c0d..fbb3de4 100644
--- a/clang/lib/Sema/SemaCUDA.cpp
+++ b/clang/lib/Sema/SemaCUDA.cpp
@@ -835,7 +835,7 @@ SemaBase::SemaDiagnosticBuilder SemaCUDA::DiagIfDeviceCode(SourceLocation Loc,
if (!getLangOpts().CUDAIsDevice)
return SemaDiagnosticBuilder::K_Nop;
if (SemaRef.IsLastErrorImmediate &&
- getDiagnostics().getDiagnosticIDs()->isBuiltinNote(DiagID))
+ getDiagnostics().getDiagnosticIDs()->isNote(DiagID))
return SemaDiagnosticBuilder::K_Immediate;
return (SemaRef.getEmissionStatus(CurFunContext) ==
Sema::FunctionEmissionStatus::Emitted)
@@ -866,7 +866,7 @@ Sema::SemaDiagnosticBuilder SemaCUDA::DiagIfHostCode(SourceLocation Loc,
if (getLangOpts().CUDAIsDevice)
return SemaDiagnosticBuilder::K_Nop;
if (SemaRef.IsLastErrorImmediate &&
- getDiagnostics().getDiagnosticIDs()->isBuiltinNote(DiagID))
+ getDiagnostics().getDiagnosticIDs()->isNote(DiagID))
return SemaDiagnosticBuilder::K_Immediate;
return (SemaRef.getEmissionStatus(CurFunContext) ==
Sema::FunctionEmissionStatus::Emitted)
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index 72d82b4..fb2c2fb 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -852,22 +852,38 @@ static void handleDiagnoseIfAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
if (!checkFunctionConditionAttr(S, D, AL, Cond, Msg))
return;
- StringRef DiagTypeStr;
- if (!S.checkStringLiteralArgumentAttr(AL, 2, DiagTypeStr))
+ StringRef DefaultSevStr;
+ if (!S.checkStringLiteralArgumentAttr(AL, 2, DefaultSevStr))
return;
- DiagnoseIfAttr::DiagnosticType DiagType;
- if (!DiagnoseIfAttr::ConvertStrToDiagnosticType(DiagTypeStr, DiagType)) {
+ DiagnoseIfAttr::DefaultSeverity DefaultSev;
+ if (!DiagnoseIfAttr::ConvertStrToDefaultSeverity(DefaultSevStr, DefaultSev)) {
S.Diag(AL.getArgAsExpr(2)->getBeginLoc(),
diag::err_diagnose_if_invalid_diagnostic_type);
return;
}
+ StringRef WarningGroup;
+ SmallVector<StringRef, 2> Options;
+ if (AL.getNumArgs() > 3) {
+ if (!S.checkStringLiteralArgumentAttr(AL, 3, WarningGroup))
+ return;
+ if (WarningGroup.empty() ||
+ !S.getDiagnostics().getDiagnosticIDs()->getGroupForWarningOption(
+ WarningGroup)) {
+ S.Diag(AL.getArgAsExpr(3)->getBeginLoc(),
+ diag::err_diagnose_if_unknown_warning)
+ << WarningGroup;
+ return;
+ }
+ }
+
bool ArgDependent = false;
if (const auto *FD = dyn_cast<FunctionDecl>(D))
ArgDependent = ArgumentDependenceChecker(FD).referencesArgs(Cond);
D->addAttr(::new (S.Context) DiagnoseIfAttr(
- S.Context, AL, Cond, Msg, DiagType, ArgDependent, cast<NamedDecl>(D)));
+ S.Context, AL, Cond, Msg, DefaultSev, WarningGroup, ArgDependent,
+ cast<NamedDecl>(D)));
}
static void handleNoBuiltinAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index a155bb2..d3e009a 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -7307,8 +7307,10 @@ static bool diagnoseDiagnoseIfAttrsWith(Sema &S, const NamedDecl *ND,
return false;
auto WarningBegin = std::stable_partition(
- Attrs.begin(), Attrs.end(),
- [](const DiagnoseIfAttr *DIA) { return DIA->isError(); });
+ Attrs.begin(), Attrs.end(), [](const DiagnoseIfAttr *DIA) {
+ return DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_error &&
+ DIA->getWarningGroup().empty();
+ });
// Note that diagnose_if attributes are late-parsed, so they appear in the
// correct order (unlike enable_if attributes).
@@ -7322,11 +7324,31 @@ static bool diagnoseDiagnoseIfAttrsWith(Sema &S, const NamedDecl *ND,
return true;
}
+ auto ToSeverity = [](DiagnoseIfAttr::DefaultSeverity Sev) {
+ switch (Sev) {
+ case DiagnoseIfAttr::DS_warning:
+ return diag::Severity::Warning;
+ case DiagnoseIfAttr::DS_error:
+ return diag::Severity::Error;
+ }
+ };
+
for (const auto *DIA : llvm::make_range(WarningBegin, Attrs.end()))
if (IsSuccessful(DIA)) {
- S.Diag(Loc, diag::warn_diagnose_if_succeeded) << DIA->getMessage();
- S.Diag(DIA->getLocation(), diag::note_from_diagnose_if)
- << DIA->getParent() << DIA->getCond()->getSourceRange();
+ if (DIA->getWarningGroup().empty() &&
+ DIA->getDefaultSeverity() == DiagnoseIfAttr::DS_warning) {
+ S.Diag(Loc, diag::warn_diagnose_if_succeeded) << DIA->getMessage();
+ S.Diag(DIA->getLocation(), diag::note_from_diagnose_if)
+ << DIA->getParent() << DIA->getCond()->getSourceRange();
+ } else {
+ auto DiagGroup = S.Diags.getDiagnosticIDs()->getGroupForWarningOption(
+ DIA->getWarningGroup());
+ assert(DiagGroup);
+ auto DiagID = S.Diags.getDiagnosticIDs()->getCustomDiagID(
+ {ToSeverity(DIA->getDefaultSeverity()), "%0",
+ DiagnosticIDs::CLASS_WARNING, false, false, *DiagGroup});
+ S.Diag(Loc, DiagID) << DIA->getMessage();
+ }
}
return false;
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
index bb311e3..e97a7d7 100644
--- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -284,7 +284,8 @@ static void instantiateDependentDiagnoseIfAttr(
if (Cond)
New->addAttr(new (S.getASTContext()) DiagnoseIfAttr(
S.getASTContext(), *DIA, Cond, DIA->getMessage(),
- DIA->getDiagnosticType(), DIA->getArgDependent(), New));
+ DIA->getDefaultSeverity(), DIA->getWarningGroup(),
+ DIA->getArgDependent(), New));
}
// Constructs and adds to New a new instance of CUDALaunchBoundsAttr using