Author: Piotr Zegar Date: 2023-12-06T18:59:25Z New Revision: 1e1e11a4d7c57028953a23deae622acab5eee9ff
URL: https://github.com/llvm/llvm-project/commit/1e1e11a4d7c57028953a23deae622acab5eee9ff DIFF: https://github.com/llvm/llvm-project/commit/1e1e11a4d7c57028953a23deae622acab5eee9ff.diff LOG: Revert "[clang-tidy] add modernize-use-std-numbers (#66583)" Compilation issue, to be resolved. This reverts commit 3f73fd774cf8fc2f288767ea077bfa351eb7aa80. Added: Modified: clang-tools-extra/clang-tidy/modernize/CMakeLists.txt clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp clang-tools-extra/docs/ReleaseNotes.rst clang-tools-extra/docs/clang-tidy/checks/list.rst Removed: clang-tools-extra/clang-tidy/modernize/UseStdNumbersCheck.cpp clang-tools-extra/clang-tidy/modernize/UseStdNumbersCheck.h clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-numbers.rst clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-numbers.cpp ################################################################################ diff --git a/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt b/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt index 28ca52f46943a..c40065358d2dc 100644 --- a/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt @@ -39,7 +39,6 @@ add_clang_library(clangTidyModernizeModule UseNullptrCheck.cpp UseOverrideCheck.cpp UseStartsEndsWithCheck.cpp - UseStdNumbersCheck.cpp UseStdPrintCheck.cpp UseTrailingReturnTypeCheck.cpp UseTransparentFunctorsCheck.cpp diff --git a/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp b/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp index 654f4bd0c6ba4..e994ffd2a75c8 100644 --- a/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp @@ -40,7 +40,6 @@ #include "UseNullptrCheck.h" #include "UseOverrideCheck.h" #include "UseStartsEndsWithCheck.h" -#include "UseStdNumbersCheck.h" #include "UseStdPrintCheck.h" #include "UseTrailingReturnTypeCheck.h" #include "UseTransparentFunctorsCheck.h" @@ -70,8 +69,6 @@ class ModernizeModule : public ClangTidyModule { CheckFactories.registerCheck<PassByValueCheck>("modernize-pass-by-value"); CheckFactories.registerCheck<UseStartsEndsWithCheck>( "modernize-use-starts-ends-with"); - CheckFactories.registerCheck<UseStdNumbersCheck>( - "modernize-use-std-numbers"); CheckFactories.registerCheck<UseStdPrintCheck>("modernize-use-std-print"); CheckFactories.registerCheck<RawStringLiteralCheck>( "modernize-raw-string-literal"); diff --git a/clang-tools-extra/clang-tidy/modernize/UseStdNumbersCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseStdNumbersCheck.cpp deleted file mode 100644 index 1f2b034713ecf..0000000000000 --- a/clang-tools-extra/clang-tidy/modernize/UseStdNumbersCheck.cpp +++ /dev/null @@ -1,449 +0,0 @@ -//===--- UseStdNumbersCheck.cpp - clang_tidy ------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX_License_Identifier: Apache_2.0 WITH LLVM_exception -// -//===----------------------------------------------------------------------===// - -#include "UseStdNumbersCheck.h" -#include "../ClangTidyDiagnosticConsumer.h" -#include "clang/AST/ASTContext.h" -#include "clang/AST/Decl.h" -#include "clang/AST/Expr.h" -#include "clang/AST/Stmt.h" -#include "clang/AST/Type.h" -#include "clang/ASTMatchers/ASTMatchFinder.h" -#include "clang/ASTMatchers/ASTMatchers.h" -#include "clang/ASTMatchers/ASTMatchersInternal.h" -#include "clang/ASTMatchers/ASTMatchersMacros.h" -#include "clang/Basic/Diagnostic.h" -#include "clang/Basic/LLVM.h" -#include "clang/Basic/LangOptions.h" -#include "clang/Basic/SourceLocation.h" -#include "clang/Basic/SourceManager.h" -#include "clang/Lex/Lexer.h" -#include "llvm/ADT/ArrayRef.h" -#include "llvm/ADT/STLExtras.h" -#include "llvm/ADT/SmallVector.h" -#include "llvm/ADT/StringRef.h" -#include "llvm/Support/FormatVariadic.h" -#include "llvm/Support/MathExtras.h" -#include <array> -#include <cstdint> -#include <cstdlib> -#include <initializer_list> -#include <string> -#include <tuple> -#include <utility> - -namespace { -using namespace clang::ast_matchers; -using clang::ast_matchers::internal::Matcher; -using llvm::StringRef; - -AST_MATCHER_P2(clang::FloatingLiteral, near, double, Value, double, - DiffThreshold) { - return std::abs(Node.getValueAsApproximateDouble() - Value) < DiffThreshold; -} - -AST_MATCHER_P(clang::QualType, hasCanonicalTypeUnqualified, - Matcher<clang::QualType>, InnerMatcher) { - return !Node.isNull() && - InnerMatcher.matches(Node->getCanonicalTypeUnqualified(), Finder, - Builder); -} - -AST_MATCHER(clang::QualType, isArithmetic) { - return !Node.isNull() && Node->isArithmeticType(); -} -AST_MATCHER(clang::QualType, isFloating) { - return !Node.isNull() && Node->isFloatingType(); -} - -AST_MATCHER_P(clang::Expr, anyOfExhaustive, - llvm::ArrayRef<Matcher<clang::Stmt>>, Exprs) { - bool FoundMatch = false; - for (const auto &InnerMatcher : Exprs) { - clang::ast_matchers::internal::BoundNodesTreeBuilder Result = *Builder; - if (InnerMatcher.matches(Node, Finder, &Result)) { - *Builder = std::move(Result); - FoundMatch = true; - } - } - return FoundMatch; -} - -// Using this struct to store the 'DiffThreshold' config value to create the -// matchers without the need to pass 'DiffThreshold' into every matcher. -// 'DiffThreshold' is needed in the 'near' matcher, which is used for matching -// the literal of every constant and for formulas' subexpressions that look at -// literals. -struct MatchBuilder { - auto - ignoreParenAndArithmeticCasting(const Matcher<clang::Expr> Matcher) const { - return expr(hasType(qualType(isArithmetic())), ignoringParenCasts(Matcher)); - } - - auto ignoreParenAndFloatingCasting(const Matcher<clang::Expr> Matcher) const { - return expr(hasType(qualType(isFloating())), ignoringParenCasts(Matcher)); - } - - auto matchMathCall(const StringRef FunctionName, - const Matcher<clang::Expr> ArgumentMatcher) const { - return expr(ignoreParenAndFloatingCasting( - callExpr(callee(functionDecl(hasName(FunctionName), - hasParameter(0, hasType(isArithmetic())))), - hasArgument(0, ArgumentMatcher)))); - } - - auto matchSqrt(const Matcher<clang::Expr> ArgumentMatcher) const { - return matchMathCall("sqrt", ArgumentMatcher); - } - - // Used for top-level matchers (i.e. the match that replaces Val with its - // constant). - // - // E.g. The matcher of `std::numbers::pi` uses this matcher to look for - // floatLiterals that have the value of pi. - // - // If the match is for a top-level match, we only care about the literal. - auto matchFloatLiteralNear(const StringRef Constant, const double Val) const { - return expr(ignoreParenAndFloatingCasting( - floatLiteral(near(Val, DiffThreshold)).bind(Constant))); - } - - // Used for non-top-level matchers (i.e. matchers that are used as inner - // matchers for top-level matchers). - // - // E.g.: The matcher of `std::numbers::log2e` uses this matcher to check if - // `e` of `log2(e)` is declared constant and initialized with the value for - // eulers number. - // - // Here, we do care about literals and about DeclRefExprs to variable - // declarations that are constant and initialized with `Val`. This allows - // top-level matchers to see through declared constants for their inner - // matches like the `std::numbers::log2e` matcher. - auto matchFloatValueNear(const double Val) const { - const auto Float = floatLiteral(near(Val, DiffThreshold)); - - const auto Dref = declRefExpr( - to(varDecl(hasType(qualType(isConstQualified(), isFloating())), - hasInitializer(ignoreParenAndFloatingCasting(Float))))); - return expr(ignoreParenAndFloatingCasting(anyOf(Float, Dref))); - } - - auto matchValue(const int64_t ValInt) const { - const auto Int = - expr(ignoreParenAndArithmeticCasting(integerLiteral(equals(ValInt)))); - const auto Float = expr(ignoreParenAndFloatingCasting( - matchFloatValueNear(static_cast<double>(ValInt)))); - const auto Dref = declRefExpr(to(varDecl( - hasType(qualType(isConstQualified(), isArithmetic())), - hasInitializer(expr(anyOf(ignoringImplicit(Int), - ignoreParenAndFloatingCasting(Float))))))); - return expr(anyOf(Int, Float, Dref)); - } - - auto match1Div(const Matcher<clang::Expr> Match) const { - return binaryOperator(hasOperatorName("/"), hasLHS(matchValue(1)), - hasRHS(Match)); - } - - auto matchEuler() const { - return expr(anyOf(matchFloatValueNear(llvm::numbers::e), - matchMathCall("exp", matchValue(1)))); - } - auto matchEulerTopLevel() const { - return expr(anyOf(matchFloatLiteralNear("e_literal", llvm::numbers::e), - matchMathCall("exp", matchValue(1)).bind("e_pattern"))) - .bind("e"); - } - - auto matchLog2Euler() const { - return expr( - anyOf( - matchFloatLiteralNear("log2e_literal", llvm::numbers::log2e), - matchMathCall("log2", matchEuler()).bind("log2e_pattern"))) - .bind("log2e"); - } - - auto matchLog10Euler() const { - return expr( - anyOf( - matchFloatLiteralNear("log10e_literal", - llvm::numbers::log10e), - matchMathCall("log10", matchEuler()).bind("log10e_pattern"))) - .bind("log10e"); - } - - auto matchPi() const { return matchFloatValueNear(llvm::numbers::pi); } - auto matchPiTopLevel() const { - return matchFloatLiteralNear("pi_literal", llvm::numbers::pi).bind("pi"); - } - - auto matchEgamma() const { - return matchFloatLiteralNear("egamma_literal", llvm::numbers::egamma) - .bind("egamma"); - } - - auto matchInvPi() const { - return expr(anyOf(matchFloatLiteralNear("inv_pi_literal", - llvm::numbers::inv_pi), - match1Div(matchPi()).bind("inv_pi_pattern"))) - .bind("inv_pi"); - } - - auto matchInvSqrtPi() const { - return expr(anyOf( - matchFloatLiteralNear("inv_sqrtpi_literal", - llvm::numbers::inv_sqrtpi), - match1Div(matchSqrt(matchPi())).bind("inv_sqrtpi_pattern"))) - .bind("inv_sqrtpi"); - } - - auto matchLn2() const { - return expr(anyOf(matchFloatLiteralNear("ln2_literal", llvm::numbers::ln2), - matchMathCall("log", matchValue(2)).bind("ln2_pattern"))) - .bind("ln2"); - } - - auto machterLn10() const { - return expr( - anyOf(matchFloatLiteralNear("ln10_literal", llvm::numbers::ln10), - matchMathCall("log", matchValue(10)).bind("ln10_pattern"))) - .bind("ln10"); - } - - auto matchSqrt2() const { - return expr(anyOf(matchFloatLiteralNear("sqrt2_literal", - llvm::numbers::sqrt2), - matchSqrt(matchValue(2)).bind("sqrt2_pattern"))) - .bind("sqrt2"); - } - - auto matchSqrt3() const { - return expr(anyOf(matchFloatLiteralNear("sqrt3_literal", - llvm::numbers::sqrt3), - matchSqrt(matchValue(3)).bind("sqrt3_pattern"))) - .bind("sqrt3"); - } - - auto matchInvSqrt3() const { - return expr(anyOf(matchFloatLiteralNear("inv_sqrt3_literal", - llvm::numbers::inv_sqrt3), - match1Div(matchSqrt(matchValue(3))) - .bind("inv_sqrt3_pattern"))) - .bind("inv_sqrt3"); - } - - auto matchPhi() const { - const auto PhiFormula = binaryOperator( - hasOperatorName("/"), - hasLHS(binaryOperator( - hasOperatorName("+"), hasEitherOperand(matchValue(1)), - hasEitherOperand(matchMathCall("sqrt", matchValue(5))))), - hasRHS(matchValue(2))); - return expr(anyOf(PhiFormula.bind("phi_pattern"), - matchFloatLiteralNear("phi_literal", llvm::numbers::phi))) - .bind("phi"); - } - - double DiffThreshold; -}; - -std::string getCode(const StringRef Constant, const bool IsFloat, - const bool IsLongDouble) { - if (IsFloat) { - return ("std::numbers::" + Constant + "_v<float>").str(); - } - if (IsLongDouble) { - return ("std::numbers::" + Constant + "_v<long double>").str(); - } - return ("std::numbers::" + Constant).str(); -} - -bool isRangeOfCompleteMacro(const clang::SourceRange &Range, - const clang::SourceManager &SM, - const clang::LangOptions &LO) { - if (!Range.getBegin().isMacroID()) { - return false; - } - if (!clang::Lexer::isAtStartOfMacroExpansion(Range.getBegin(), SM, LO)) { - return false; - } - - if (!Range.getEnd().isMacroID()) { - return false; - } - - if (!clang::Lexer::isAtEndOfMacroExpansion(Range.getEnd(), SM, LO)) { - return false; - } - - return true; -} - -} // namespace - -namespace clang::tidy::modernize { -UseStdNumbersCheck::UseStdNumbersCheck(const StringRef Name, - ClangTidyContext *const Context) - : ClangTidyCheck(Name, Context), - IncludeInserter(Options.getLocalOrGlobal("IncludeStyle", - utils::IncludeSorter::IS_LLVM), - areDiagsSelfContained()), - DiffThresholdString{Options.get("DiffThreshold", "0.001")} { - if (DiffThresholdString.getAsDouble(DiffThreshold)) { - configurationDiag( - "Invalid DiffThreshold config value: '%0', expected a double") - << DiffThresholdString; - DiffThreshold = 0.001; - } -} - -void UseStdNumbersCheck::registerMatchers(MatchFinder *const Finder) { - const auto Matches = MatchBuilder{DiffThreshold}; - static const auto ConstantMatchers = { - Matches.matchLog2Euler(), Matches.matchLog10Euler(), - Matches.matchEulerTopLevel(), Matches.matchEgamma(), - Matches.matchInvSqrtPi(), Matches.matchInvPi(), - Matches.matchPiTopLevel(), Matches.matchLn2(), - Matches.machterLn10(), Matches.matchSqrt2(), - Matches.matchInvSqrt3(), Matches.matchSqrt3(), - Matches.matchPhi(), - }; - - Finder->addMatcher( - expr( - anyOfExhaustive(ConstantMatchers), - unless(hasParent(explicitCastExpr(hasDestinationType(isFloating())))), - hasType(qualType(hasCanonicalTypeUnqualified( - anyOf(qualType(asString("float")).bind("float"), - qualType(asString("double")), - qualType(asString("long double")).bind("long double")))))), - this); -} - -void UseStdNumbersCheck::check(const MatchFinder::MatchResult &Result) { - /* - List of all math constants in the `<numbers>` header - + e - + log2e - + log10e - + pi - + inv_pi - + inv_sqrtpi - + ln2 - + ln10 - + sqrt2 - + sqrt3 - + inv_sqrt3 - + egamma - + phi - */ - - // The ordering determines what constants are looked at first. - // E.g. look at 'inv_sqrt3' before 'sqrt3' to be able to replace the larger - // expression - constexpr auto Constants = std::array<std::pair<StringRef, double>, 13>{ - std::pair{StringRef{"log2e"}, llvm::numbers::log2e}, - std::pair{StringRef{"log10e"}, llvm::numbers::log10e}, - std::pair{StringRef{"e"}, llvm::numbers::e}, - std::pair{StringRef{"egamma"}, llvm::numbers::egamma}, - std::pair{StringRef{"inv_sqrtpi"}, llvm::numbers::inv_sqrtpi}, - std::pair{StringRef{"inv_pi"}, llvm::numbers::inv_pi}, - std::pair{StringRef{"pi"}, llvm::numbers::pi}, - std::pair{StringRef{"ln2"}, llvm::numbers::ln2}, - std::pair{StringRef{"ln10"}, llvm::numbers::ln10}, - std::pair{StringRef{"sqrt2"}, llvm::numbers::sqrt2}, - std::pair{StringRef{"inv_sqrt3"}, llvm::numbers::inv_sqrt3}, - std::pair{StringRef{"sqrt3"}, llvm::numbers::sqrt3}, - std::pair{StringRef{"phi"}, llvm::numbers::phi}, - }; - - auto MatchedLiterals = - llvm::SmallVector<std::tuple<std::string, double, const Expr *>>{}; - - const auto &SM = *Result.SourceManager; - const auto &LO = Result.Context->getLangOpts(); - - const auto IsFloat = Result.Nodes.getNodeAs<QualType>("float") != nullptr; - const auto IsLongDouble = - Result.Nodes.getNodeAs<QualType>("long double") != nullptr; - - for (const auto &[ConstantName, ConstantValue] : Constants) { - const auto *const Match = Result.Nodes.getNodeAs<Expr>(ConstantName); - if (Match == nullptr) { - continue; - } - - const auto Range = Match->getSourceRange(); - - const auto IsMacro = Range.getBegin().isMacroID(); - - // We do not want to emit a diagnostic when we are matching a macro, but the - // match inside of the macro does not cover the whole macro. - if (IsMacro && !isRangeOfCompleteMacro(Range, SM, LO)) { - continue; - } - - if (const auto PatternBindString = (ConstantName + "_pattern").str(); - Result.Nodes.getNodeAs<Expr>(PatternBindString) != nullptr) { - const auto Code = getCode(ConstantName, IsFloat, IsLongDouble); - diag(Range.getBegin(), "prefer '%0' to this %select{formula|macro}1") - << Code << IsMacro << FixItHint::CreateReplacement(Range, Code); - return; - } - - const auto LiteralBindString = (ConstantName + "_literal").str(); - if (const auto *const Literal = - Result.Nodes.getNodeAs<FloatingLiteral>(LiteralBindString)) { - MatchedLiterals.emplace_back( - ConstantName, - std::abs(Literal->getValueAsApproximateDouble() - ConstantValue), - Match); - } - } - - // We may have had no matches with literals, but a match with a pattern that - // was a part of a macro which was therefore skipped. - if (MatchedLiterals.empty()) { - return; - } - - llvm::sort(MatchedLiterals, [](const auto &LHS, const auto &RHS) { - return std::get<1>(LHS) < std::get<1>(RHS); - }); - - const auto &[Constant, Diff, Node] = MatchedLiterals.front(); - - const auto Range = Node->getSourceRange(); - const auto IsMacro = Range.getBegin().isMacroID(); - - // We do not want to emit a diagnostic when we are matching a macro, but the - // match inside of the macro does not cover the whole macro. - if (IsMacro && !isRangeOfCompleteMacro(Range, SM, LO)) { - return; - } - - const auto Code = getCode(Constant, IsFloat, IsLongDouble); - diag(Range.getBegin(), - "prefer '%0' to this %select{literal|macro}1, diff ers by '%2'") - << Code << IsMacro << llvm::formatv("{0:e2}", Diff).str() - << FixItHint::CreateReplacement(Range, Code) - << IncludeInserter.createIncludeInsertion( - Result.SourceManager->getFileID(Range.getBegin()), "<numbers>"); -} - -void UseStdNumbersCheck::registerPPCallbacks( - const SourceManager &SM, Preprocessor *const PP, - Preprocessor *const ModuleExpanderPP) { - IncludeInserter.registerPreprocessor(PP); -} - -void UseStdNumbersCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { - Options.store(Opts, "IncludeStyle", IncludeInserter.getStyle()); - Options.store(Opts, "DiffThreshold", DiffThresholdString); -} -} // namespace clang::tidy::modernize diff --git a/clang-tools-extra/clang-tidy/modernize/UseStdNumbersCheck.h b/clang-tools-extra/clang-tidy/modernize/UseStdNumbersCheck.h deleted file mode 100644 index 05fc5ada14b87..0000000000000 --- a/clang-tools-extra/clang-tidy/modernize/UseStdNumbersCheck.h +++ /dev/null @@ -1,49 +0,0 @@ -//===--- UseStdNumbersCheck.h - clang-tidy ----------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_USESTDNUMBERSCHECK_H -#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_USESTDNUMBERSCHECK_H - -#include "../ClangTidyCheck.h" -#include "../utils/IncludeInserter.h" - -namespace clang::tidy::modernize { - -/// Finds constants and function calls to math functions that can be replaced -/// with c++20's mathematical constants from the ``numbers`` header and -/// offers fix-it hints. -/// Does not match the use of variables with that value, and instead, -/// offers a replacement at the definition of those variables. -/// -/// For the user-facing documentation see: -/// http://clang.llvm.org/extra/clang-tidy/checks/modernize/use-std-numbers.html -class UseStdNumbersCheck : public ClangTidyCheck { -public: - UseStdNumbersCheck(StringRef Name, ClangTidyContext *Context); - - bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { - return LangOpts.CPlusPlus20; - } - void registerMatchers(ast_matchers::MatchFinder *Finder) override; - void check(const ast_matchers::MatchFinder::MatchResult &Result) override; - void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, - Preprocessor *ModuleExpanderPP) override; - void storeOptions(ClangTidyOptions::OptionMap &Opts) override; - std::optional<TraversalKind> getCheckTraversalKind() const override { - return TK_IgnoreUnlessSpelledInSource; - } - -private: - utils::IncludeInserter IncludeInserter; - StringRef DiffThresholdString; - double DiffThreshold; -}; - -} // namespace clang::tidy::modernize - -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_USESTDNUMBERSCHECK_H diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 9262f9bbfe62a..4ff4494cef562 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -193,13 +193,6 @@ New checks replacing with ``starts_with`` when the method exists in the class. Notably, this will work with ``std::string`` and ``std::string_view``. -- New :doc:`modernize-use-std-numbers - <clang-tidy/checks/modernize/use-std-numbers>` check. - - Finds constants and function calls to math functions that can be replaced - with C++20's mathematical constants from the ``numbers`` header and - offers fix-it hints. - - New :doc:`performance-enum-size <clang-tidy/checks/performance/enum-size>` check. diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst index e6c02fe48fbf8..df2d5d15238d6 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -293,7 +293,6 @@ Clang-Tidy Checks :doc:`modernize-use-nullptr <modernize/use-nullptr>`, "Yes" :doc:`modernize-use-override <modernize/use-override>`, "Yes" :doc:`modernize-use-starts-ends-with <modernize/use-starts-ends-with>`, "Yes" - :doc:`modernize-use-std-numbers <modernize/use-std-numbers>`, "Yes" :doc:`modernize-use-std-print <modernize/use-std-print>`, "Yes" :doc:`modernize-use-trailing-return-type <modernize/use-trailing-return-type>`, "Yes" :doc:`modernize-use-transparent-functors <modernize/use-transparent-functors>`, "Yes" diff --git a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-numbers.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-numbers.rst deleted file mode 100644 index 207e9c00e74ba..0000000000000 --- a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-std-numbers.rst +++ /dev/null @@ -1,74 +0,0 @@ -.. title:: clang-tidy - modernize-use-std-numbers - -modernize-use-std-numbers -========================= - -Finds constants and function calls to math functions that can be replaced -with C++20's mathematical constants from the ``numbers`` header and offers -fix-it hints. -Does not match the use of variables with that value, and instead, -offers a replacement for the definition of those variables. -Function calls that match the pattern of how the constant is calculated are -matched and replaced with the ``std::numbers`` constant. -The use of macros gets replaced with the corresponding ``std::numbers`` -constant, instead of changing the macro definition. - -The following list of constants from the ``numbers`` header are supported: - -* ``e`` -* ``log2e`` -* ``log10e`` -* ``pi`` -* ``inv_pi`` -* ``inv_sqrtpi`` -* ``ln2`` -* ``ln10`` -* ``sqrt2`` -* ``sqrt3`` -* ``inv_sqrt3`` -* ``egamma`` -* ``phi`` - -The list currently includes all constants as of C++20. - -The replacements use the type of the matched constant and can remove explicit -casts, i.e., switching between ``std::numbers::e``, -``std::numbers::e_v<float>`` and ``std::numbers::e_v<long double>`` where -appropriate. - -.. code-block:: c++ - - double sqrt(double); - double log2(double); - void sink(auto&&) {} - void floatSink(float); - - #define MY_PI 3.1415926 - - void foo() { - const double Pi = 3.141592653589; // const double Pi = std::numbers::pi - const auto Use = Pi / 2; // no match for Pi - static constexpr double Euler = 2.7182818; // static constexpr double Euler = std::numbers::e; - - log2(exp(1)); // std::numbers::log2e; - log2(Euler); // std::numbers::log2e; - 1 / sqrt(MY_PI); // std::numbers::inv_sqrtpi; - sink(MY_PI); // sink(std::numbers::pi); - floatSink(MY_PI); // floatSink(std::numbers::pi); - floatSink(static_cast<float>(MY_PI)); // floatSink(std::numbers::pi_v<float>); - } - -Options -------- - -.. option:: DiffThreshold - - A floating point value that sets the detection threshold for when literals - match a constant. A literal matches a constant if - ``abs(literal - constant) < DiffThreshold`` evaluates to ``true``. Default - is `0.001`. - -.. option:: IncludeStyle - - A string specifying which include-style is used, `llvm` or `google`. Default - is `llvm`. diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-numbers.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-numbers.cpp deleted file mode 100644 index 6c5762da5e2e8..0000000000000 --- a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-std-numbers.cpp +++ /dev/null @@ -1,493 +0,0 @@ -// RUN: %check_clang_tidy -check-suffix=ALL -std=c++20 %s modernize-use-std-numbers %t -// RUN: %check_clang_tidy -check-suffix=ALL,IMPRECISE -std=c++20 %s modernize-use-std-numbers %t -- -config="{CheckOptions: { modernize-use-std-numbers.DiffThreshold: 0.01 }}" - -// CHECK-FIXES-ALL: #include <numbers> - -namespace bar { - double sqrt(double Arg); - float sqrt(float Arg); - template <typename T> - auto sqrt(T val) { return sqrt(static_cast<double>(val)); } - - static constexpr double e = 2.718281828459045235360287471352662497757247093; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:33: warning: prefer 'std::numbers::e' to this literal, diff ers by '0.00e+00' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr double e = std::numbers::e; -} - -double exp(double Arg); -double log(double Arg); - -double log2(double Arg); -float log2(float Arg); -template <typename T> -auto log2(T val) { return log2(static_cast<double>(val)); } - -double log10(double Arg); - -template<typename T> -void sink(T&&) { } - -void floatSink(float) {} - -#define MY_PI 3.1415926 - -#define INV_SQRT3 1 / bar::sqrt(3) -#define NOT_INV_SQRT3 1 / bar::sqrt(3) + 1 - -using my_double = double; -using my_float = float; - -void foo(){ - static constexpr double Pi = 3.1415926; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:34: warning: prefer 'std::numbers::pi' to this literal, diff ers by '5.36e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr double Pi = std::numbers::pi; - - static constexpr double Euler = 2.7182818; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:37: warning: prefer 'std::numbers::e' to this literal, diff ers by '2.85e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr double Euler = std::numbers::e; - - static constexpr double Phi = 1.6180339; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:35: warning: prefer 'std::numbers::phi' to this literal, diff ers by '8.87e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr double Phi = std::numbers::phi; - - static constexpr double PiCopy = Pi; - static constexpr double PiDefineFromMacro = MY_PI; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:49: warning: prefer 'std::numbers::pi' to this macro, diff ers by '5.36e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr double PiDefineFromMacro = std::numbers::pi; - - static constexpr double Pi2 = 3.14; - // CHECK-MESSAGES-IMPRECISE: :[[@LINE-1]]:35: warning: prefer 'std::numbers::pi' to this literal, diff ers by '1.59e-03' [modernize-use-std-numbers] - // CHECK-FIXES-IMPRECISE: static constexpr double Pi2 = std::numbers::pi; - static constexpr double Euler2 = 2.71; - // CHECK-MESSAGES-IMPRECISE: :[[@LINE-1]]:38: warning: prefer 'std::numbers::e' to this literal, diff ers by '8.28e-03' [modernize-use-std-numbers] - // CHECK-FIXES-IMPRECISE: static constexpr double Euler2 = std::numbers::e; - static constexpr double Phi2 = 1.61; - // CHECK-MESSAGES-IMPRECISE: :[[@LINE-1]]:36: warning: prefer 'std::numbers::phi' to this literal, diff ers by '8.03e-03' [modernize-use-std-numbers] - // CHECK-FIXES-IMPRECISE: static constexpr double Phi2 = std::numbers::phi; - - static constexpr double Pi3 = 3.1415926L; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:35: warning: prefer 'std::numbers::pi_v<long double>' to this literal, diff ers by '5.36e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr double Pi3 = std::numbers::pi_v<long double>; - - static constexpr double Euler3 = 2.7182818L; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:38: warning: prefer 'std::numbers::e_v<long double>' to this literal, diff ers by '2.85e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr double Euler3 = std::numbers::e_v<long double>; - - static constexpr double Phi3 = 1.6180339L; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:36: warning: prefer 'std::numbers::phi_v<long double>' to this literal, diff ers by '8.87e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr double Phi3 = std::numbers::phi_v<long double>; - - static constexpr long double Pi4 = 3.1415926L; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:40: warning: prefer 'std::numbers::pi_v<long double>' to this literal, diff ers by '5.36e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr long double Pi4 = std::numbers::pi_v<long double>; - - static constexpr long double Euler4 = 2.7182818L; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:43: warning: prefer 'std::numbers::e_v<long double>' to this literal, diff ers by '2.85e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr long double Euler4 = std::numbers::e_v<long double>; - - static constexpr long double Phi4 = 1.6180339L; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:41: warning: prefer 'std::numbers::phi_v<long double>' to this literal, diff ers by '8.87e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr long double Phi4 = std::numbers::phi_v<long double>; - - static constexpr my_double Euler5 = 2.7182818; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:41: warning: prefer 'std::numbers::e' to this literal, diff ers by '2.85e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr my_double Euler5 = std::numbers::e; - - static constexpr my_float Euler6 = 2.7182818; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:40: warning: prefer 'std::numbers::e' to this literal, diff ers by '2.85e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr my_float Euler6 = std::numbers::e; - - static constexpr int NotEuler7 = 2.7182818; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:38: warning: prefer 'std::numbers::e' to this literal, diff ers by '2.85e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr int NotEuler7 = std::numbers::e; - - static constexpr double InvPi = 1.0 / Pi; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:37: warning: prefer 'std::numbers::inv_pi' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr double InvPi = std::numbers::inv_pi; - - static constexpr my_float Actually2MyFloat = 2; - bar::sqrt(Actually2MyFloat); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2_v<float>' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::sqrt2_v<float>; - - sink(MY_PI); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::pi' to this macro, diff ers by '5.36e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: sink(std::numbers::pi); - - auto X = 42.0; - auto Y = X * 3.14; - // CHECK-MESSAGES-IMPRECISE: :[[@LINE-1]]:18: warning: prefer 'std::numbers::pi' to this literal, diff ers by '1.59e-03' [modernize-use-std-numbers] - // CHECK-FIXES-IMPRECISE: auto Y = X * std::numbers::pi; - - constexpr static auto One = 1; - constexpr static auto Two = 2; - - bar::sqrt(2); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::sqrt2; - - bar::sqrt(Two); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::sqrt2; - - bar::sqrt(2.0); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::sqrt2; - - auto Not2 = 2; - Not2 = 42; - bar::sqrt(Not2); - - const auto Actually2 = 2; - bar::sqrt(Actually2); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::sqrt2; - - exp(1); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::e; - - exp(One); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::e; - - exp(1.00000000000001); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::e; - - log2(exp(1)); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log2e' to this formula [modernize-use-std-numbers] - // CHECK-MESSAGES-ALL: :[[@LINE-2]]:10: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::log2e; - - log2(Euler); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log2e' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::log2e; - - log2(bar::e); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log2e' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::log2e; - - log2(Euler5); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log2e' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::log2e; - - log2(Euler6); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log2e_v<float>' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::log2e_v<float>; - - log2(NotEuler7); - - auto log2e = 1.4426950; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:18: warning: prefer 'std::numbers::log2e' to this literal, diff ers by '4.09e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: auto log2e = std::numbers::log2e; - - floatSink(log2(Euler)); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:15: warning: prefer 'std::numbers::log2e' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: floatSink(std::numbers::log2e); - - floatSink(static_cast<float>(log2(Euler))); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:15: warning: prefer 'std::numbers::log2e_v<float>' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: floatSink(std::numbers::log2e_v<float>); - - floatSink(1.4426950); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:15: warning: prefer 'std::numbers::log2e' to this literal, diff ers by '4.09e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: floatSink(std::numbers::log2e); - - floatSink(static_cast<float>(1.4426950)); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:15: warning: prefer 'std::numbers::log2e_v<float>' to this literal, diff ers by '4.09e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: floatSink(std::numbers::log2e_v<float>); - - floatSink(log2(static_cast<float>(Euler))); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:15: warning: prefer 'std::numbers::log2e_v<float>' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: floatSink(std::numbers::log2e_v<float>); - - floatSink(static_cast<float>(log2(static_cast<float>(Euler)))); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:15: warning: prefer 'std::numbers::log2e_v<float>' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: floatSink(std::numbers::log2e_v<float>); - - floatSink(static_cast<float>(log2(static_cast<int>(Euler)))); - - floatSink(static_cast<int>(log2(static_cast<float>(Euler)))); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:32: warning: prefer 'std::numbers::log2e_v<float>' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: floatSink(static_cast<int>(std::numbers::log2e_v<float>)); - - floatSink(1.4426950F); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:15: warning: prefer 'std::numbers::log2e_v<float>' to this literal, diff ers by '1.93e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: floatSink(std::numbers::log2e_v<float>); - - floatSink(static_cast<double>(1.4426950F)); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:15: warning: prefer 'std::numbers::log2e' to this literal, diff ers by '1.93e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: floatSink(std::numbers::log2e); - - floatSink(static_cast<int>(1.4426950F)); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:32: warning: prefer 'std::numbers::log2e_v<float>' to this literal, diff ers by '1.93e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: floatSink(static_cast<int>(std::numbers::log2e_v<float>)); - - log10(exp(1)); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log10e' to this formula [modernize-use-std-numbers] - // CHECK-MESSAGES-ALL: :[[@LINE-2]]:11: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::log10e; - - log10(Euler); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log10e' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::log10e; - - log10(bar::e); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log10e' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::log10e; - - auto log10e = .434294; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:19: warning: prefer 'std::numbers::log10e' to this literal, diff ers by '4.82e-07' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: auto log10e = std::numbers::log10e; - - auto egamma = 0.5772156 * 42; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:19: warning: prefer 'std::numbers::egamma' to this literal, diff ers by '6.49e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: auto egamma = std::numbers::egamma * 42; - - sink(InvPi); - - sink(1 / Pi); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::inv_pi' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: sink(std::numbers::inv_pi); - - sink(1 / bar::sqrt(Pi)); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::inv_sqrtpi' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: sink(std::numbers::inv_sqrtpi); - - sink(1 / bar::sqrt(MY_PI)); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::inv_sqrtpi' to this formula [modernize-use-std-numbers] - // CHECK-MESSAGES-ALL: :[[@LINE-2]]:24: warning: prefer 'std::numbers::pi' to this macro, diff ers by '5.36e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: sink(std::numbers::inv_sqrtpi); - - log(2); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::ln2' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::ln2; - - log(10); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::ln10' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::ln10; - - bar::sqrt(2); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::sqrt2; - - sink(1 / bar::sqrt(3)); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::inv_sqrt3' to this formula [modernize-use-std-numbers] - // CHECK-MESSAGES-ALL: :[[@LINE-2]]:14: warning: prefer 'std::numbers::sqrt3' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: sink(std::numbers::inv_sqrt3); - - sink(INV_SQRT3); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::inv_sqrt3' to this macro [modernize-use-std-numbers] - // CHECK-FIXES-ALL: sink(std::numbers::inv_sqrt3); - - sink(NOT_INV_SQRT3); - - const auto inv_sqrt3f = .577350269F; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:29: warning: prefer 'std::numbers::inv_sqrt3_v<float>' to this literal, diff ers by '1.04e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: const auto inv_sqrt3f = std::numbers::inv_sqrt3_v<float>; - - bar::sqrt(3); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt3' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::sqrt3; - - auto somePhi = 1.6180339; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:20: warning: prefer 'std::numbers::phi' to this literal, diff ers by '8.87e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: auto somePhi = std::numbers::phi; - - sink(Phi); - - sink((42 + bar::sqrt(5)) / 2); - - sink((1 + bar::sqrt(5)) / 2); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::phi' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: sink(std::numbers::phi); - - sink((bar::sqrt(5.0F) + 1) / 2); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::phi_v<float>' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: sink(std::numbers::phi_v<float>); -} - - - -template <typename T> -void baz(){ - static constexpr T Pi = 3.1415926; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:29: warning: prefer 'std::numbers::pi' to this literal, diff ers by '5.36e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr T Pi = std::numbers::pi; - - static constexpr T Euler = 2.7182818; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:32: warning: prefer 'std::numbers::e' to this literal, diff ers by '2.85e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr T Euler = std::numbers::e; - - static constexpr T Phi = 1.6180339; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:30: warning: prefer 'std::numbers::phi' to this literal, diff ers by '8.87e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr T Phi = std::numbers::phi; - - static constexpr T PiCopy = Pi; - static constexpr T PiDefineFromMacro = MY_PI; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:44: warning: prefer 'std::numbers::pi' to this macro, diff ers by '5.36e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr T PiDefineFromMacro = std::numbers::pi; - - static constexpr T Pi2 = 3.14; - // CHECK-MESSAGES-IMPRECISE: :[[@LINE-1]]:30: warning: prefer 'std::numbers::pi' to this literal, diff ers by '1.59e-03' [modernize-use-std-numbers] - // CHECK-FIXES-IMPRECISE: static constexpr T Pi2 = std::numbers::pi; - static constexpr T Euler2 = 2.71; - // CHECK-MESSAGES-IMPRECISE: :[[@LINE-1]]:33: warning: prefer 'std::numbers::e' to this literal, diff ers by '8.28e-03' [modernize-use-std-numbers] - // CHECK-FIXES-IMPRECISE: static constexpr T Euler2 = std::numbers::e; - static constexpr T Phi2 = 1.61; - // CHECK-MESSAGES-IMPRECISE: :[[@LINE-1]]:31: warning: prefer 'std::numbers::phi' to this literal, diff ers by '8.03e-03' [modernize-use-std-numbers] - // CHECK-FIXES-IMPRECISE: static constexpr T Phi2 = std::numbers::phi; - - static constexpr T Pi3 = 3.1415926L; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:30: warning: prefer 'std::numbers::pi_v<long double>' to this literal, diff ers by '5.36e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr T Pi3 = std::numbers::pi_v<long double>; - - static constexpr T Euler3 = 2.7182818L; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:33: warning: prefer 'std::numbers::e_v<long double>' to this literal, diff ers by '2.85e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr T Euler3 = std::numbers::e_v<long double>; - - static constexpr T Phi3 = 1.6180339L; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:31: warning: prefer 'std::numbers::phi_v<long double>' to this literal, diff ers by '8.87e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: static constexpr T Phi3 = std::numbers::phi_v<long double>; - - static constexpr my_float Actually2MyFloat = 2; - bar::sqrt(Actually2MyFloat); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2_v<float>' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::sqrt2_v<float>; - - constexpr static T One = 1; - constexpr static T Two = 2; - - bar::sqrt(2); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::sqrt2; - - bar::sqrt(Two); - - bar::sqrt(2.0); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::sqrt2; - - T Not2 = 2; - Not2 = 42; - bar::sqrt(Not2); - - const T Actually2 = 2; - bar::sqrt(Actually2); - - exp(1); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::e; - - exp(One); - - exp(1.00000000000001); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::e; - - log2(exp(1)); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log2e' to this formula [modernize-use-std-numbers] - // CHECK-MESSAGES-ALL: :[[@LINE-2]]:10: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::log2e; - - log2(Euler); - - log2(bar::e); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log2e' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::log2e; - - T log2e = 1.4426950; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:15: warning: prefer 'std::numbers::log2e' to this literal, diff ers by '4.09e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: T log2e = std::numbers::log2e; - - log10(exp(1)); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log10e' to this formula [modernize-use-std-numbers] - // CHECK-MESSAGES-ALL: :[[@LINE-2]]:11: warning: prefer 'std::numbers::e' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::log10e; - - log10(Euler); - - log10(bar::e); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::log10e' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::log10e; - - T log10e = .434294; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:16: warning: prefer 'std::numbers::log10e' to this literal, diff ers by '4.82e-07' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: T log10e = std::numbers::log10e; - - T egamma = 0.5772156 * 42; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:16: warning: prefer 'std::numbers::egamma' to this literal, diff ers by '6.49e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: T egamma = std::numbers::egamma * 42; - - sink(1 / Pi); - - sink(1 / bar::sqrt(Pi)); - - sink(1 / bar::sqrt(MY_PI)); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::inv_sqrtpi' to this formula [modernize-use-std-numbers] - // CHECK-MESSAGES-ALL: :[[@LINE-2]]:24: warning: prefer 'std::numbers::pi' to this macro, diff ers by '5.36e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: sink(std::numbers::inv_sqrtpi); - - - log(2); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::ln2' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::ln2; - - log(10); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::ln10' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::ln10; - - bar::sqrt(2); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt2' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::sqrt2; - - sink(1 / bar::sqrt(3)); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::inv_sqrt3' to this formula [modernize-use-std-numbers] - // CHECK-MESSAGES-ALL: :[[@LINE-2]]:14: warning: prefer 'std::numbers::sqrt3' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: sink(std::numbers::inv_sqrt3); - - bar::sqrt(3); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:5: warning: prefer 'std::numbers::sqrt3' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: std::numbers::sqrt3; - - T phi = 1.6180339; - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:13: warning: prefer 'std::numbers::phi' to this literal, diff ers by '8.87e-08' [modernize-use-std-numbers] - // CHECK-FIXES-ALL: T phi = std::numbers::phi; - - sink((42 + bar::sqrt(5)) / 2); - - sink((1 + bar::sqrt(5)) / 2); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::phi' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: sink(std::numbers::phi); - - sink((bar::sqrt(5.0F) + 1) / 2); - // CHECK-MESSAGES-ALL: :[[@LINE-1]]:10: warning: prefer 'std::numbers::phi_v<float>' to this formula [modernize-use-std-numbers] - // CHECK-FIXES-ALL: sink(std::numbers::phi_v<float>); -} - -template <typename T> -void foobar(){ - const T Two = 2; - bar::sqrt(Two); -} -void use_templates() { - foobar<float>(); - foobar<double>(); - - baz<float>(); - baz<double>(); -} - -#define BIG_MARCO \ - struct InvSqrt3 { \ - template <typename T> static T get() { return 1 / bar::sqrt(3); } \ - } - -BIG_MARCO; - -void use_BIG_MACRO() { -InvSqrt3 f{}; -f.get<float>(); -f.get<double>(); -} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits