Index: clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.cpp +++ clang-tools-extra/clang-tidy/readability/MagicNumbersCheck.cpp @@ -112,10 +112,21 @@ return llvm::any_of( Result.Context->getParents(ExprResult), [&Result](const DynTypedNode &Parent) { - return isUsedToInitializeAConstant(Result, Parent) || - // Ignore this instance, because this match reports the location - // where the template is defined, not where it is instantiated. - Parent.get(); + if (isUsedToInitializeAConstant(Result, Parent)) + return true; + + // Ignore this instance, because this match reports the location + // where the template is defined, not where it is instantiated. + if (Parent.get()) + return true; + + // Don't warn on string user defined literals: + // std::string s = "Hello World"s; + if (const auto *UDL = Parent.get()) + if (UDL->getLiteralOperatorKind() == UserDefinedLiteral::LOK_String) + return true; + + return false; }); } Index: clang-tools-extra/test/clang-tidy/readability-magic-numbers-userliteral.cpp =================================================================== --- /dev/null +++ clang-tools-extra/test/clang-tidy/readability-magic-numbers-userliteral.cpp @@ -0,0 +1,16 @@ +// RUN: %check_clang_tidy -std=c++14-or-later %s readability-magic-numbers %t -- + +namespace std { + class string {}; + using size_t = decltype(sizeof(int)); + string operator ""s(const char *, std::size_t); + int operator "" s(unsigned long long); +} + +void UserDefinedLiteral() { + using std::operator ""s; + "Hello World"s; + const int i = 3600s; + int j = 3600s; + // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: 3600s is a magic number; consider replacing it with a named constant [readability-magic-numbers] +}