diff options
author | Amr Hesham <amr96@programmer.net> | 2025-01-20 22:21:48 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-01-20 22:21:48 +0100 |
commit | e5992b686bb06dd53a4ff1e9586fa350d3ff43b5 (patch) | |
tree | c9146691b4ddb6b1e647958106db1524af1172b3 /clang/lib/Sema/SemaChecking.cpp | |
parent | 28ae363ec03e565eaa70393027da70f389e6ca43 (diff) | |
download | llvm-e5992b686bb06dd53a4ff1e9586fa350d3ff43b5.zip llvm-e5992b686bb06dd53a4ff1e9586fa350d3ff43b5.tar.gz llvm-e5992b686bb06dd53a4ff1e9586fa350d3ff43b5.tar.bz2 |
[Clang] Fix warning for non std functions with name `infinity` (#123417)
Fix reporting diagnostic for non std functions that has the name
`infinity`
Fixes: #123231
Diffstat (limited to 'clang/lib/Sema/SemaChecking.cpp')
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 47 |
1 files changed, 32 insertions, 15 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 881907a..c41164a 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -8454,26 +8454,43 @@ static bool IsInfOrNanFunction(StringRef calleeName, MathCheck Check) { llvm_unreachable("unknown MathCheck"); } +static bool IsInfinityFunction(const FunctionDecl *FDecl) { + if (FDecl->getName() != "infinity") + return false; + + if (const CXXMethodDecl *MDecl = dyn_cast<CXXMethodDecl>(FDecl)) { + const CXXRecordDecl *RDecl = MDecl->getParent(); + if (RDecl->getName() != "numeric_limits") + return false; + + if (const NamespaceDecl *NSDecl = + dyn_cast<NamespaceDecl>(RDecl->getDeclContext())) + return NSDecl->isStdNamespace(); + } + + return false; +} + void Sema::CheckInfNaNFunction(const CallExpr *Call, const FunctionDecl *FDecl) { + if (!FDecl->getIdentifier()) + return; + FPOptions FPO = Call->getFPFeaturesInEffect(getLangOpts()); - bool HasIdentifier = FDecl->getIdentifier() != nullptr; - bool IsNaNOrIsUnordered = - IsStdFunction(FDecl, "isnan") || IsStdFunction(FDecl, "isunordered"); - bool IsSpecialNaN = - HasIdentifier && IsInfOrNanFunction(FDecl->getName(), MathCheck::NaN); - if ((IsNaNOrIsUnordered || IsSpecialNaN) && FPO.getNoHonorNaNs()) { + if (FPO.getNoHonorNaNs() && + (IsStdFunction(FDecl, "isnan") || IsStdFunction(FDecl, "isunordered") || + IsInfOrNanFunction(FDecl->getName(), MathCheck::NaN))) { Diag(Call->getBeginLoc(), diag::warn_fp_nan_inf_when_disabled) << 1 << 0 << Call->getSourceRange(); - } else { - bool IsInfOrIsFinite = - IsStdFunction(FDecl, "isinf") || IsStdFunction(FDecl, "isfinite"); - bool IsInfinityOrIsSpecialInf = - HasIdentifier && ((FDecl->getName() == "infinity") || - IsInfOrNanFunction(FDecl->getName(), MathCheck::Inf)); - if ((IsInfOrIsFinite || IsInfinityOrIsSpecialInf) && FPO.getNoHonorInfs()) - Diag(Call->getBeginLoc(), diag::warn_fp_nan_inf_when_disabled) - << 0 << 0 << Call->getSourceRange(); + return; + } + + if (FPO.getNoHonorInfs() && + (IsStdFunction(FDecl, "isinf") || IsStdFunction(FDecl, "isfinite") || + IsInfinityFunction(FDecl) || + IsInfOrNanFunction(FDecl->getName(), MathCheck::Inf))) { + Diag(Call->getBeginLoc(), diag::warn_fp_nan_inf_when_disabled) + << 0 << 0 << Call->getSourceRange(); } } |