diff --git a/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp b/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp index 9bfb7e2677533..8f3bc9534f931 100644 --- a/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp +++ b/clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp @@ -320,6 +320,12 @@ bool isQualificationConvertiblePointer(QualType From, QualType To, } // namespace static bool canThrow(const FunctionDecl *Func) { + // consteval specifies that every call to the function must produce a + // compile-time constant, which cannot evaluate a throw expression without + // producing a compilation error. + if (Func->isConsteval()) + return false; + const auto *FunProto = Func->getType()->getAs(); if (!FunProto) return true; diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index f967dfabd1c94..dcfe68e020fc9 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -162,6 +162,10 @@ Changes in existing checks ` check to treat `std::span` as a handle class. +- Improved :doc:`bugprone-exception-escape + ` by fixing false positives + when a consteval function with throw statements. + - Improved :doc:`bugprone-forwarding-reference-overload ` check by fixing a crash when determining if an ``enable_if[_t]`` was found. diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-consteval.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-consteval.cpp new file mode 100644 index 0000000000000..6e4298bba8bf1 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-consteval.cpp @@ -0,0 +1,14 @@ +// RUN: %check_clang_tidy -std=c++20 %s bugprone-exception-escape %t -- \ +// RUN: -- -fexceptions -Wno-everything + +namespace GH104457 { + +consteval int consteval_fn(int a) { + if (a == 0) + throw 1; + return a; +} + +int test() noexcept { return consteval_fn(1); } + +} // namespace GH104457