From 9ff8e87ca4b39257ea64ba6b0505261432f92a63 Mon Sep 17 00:00:00 2001 From: Mehdi Amini Date: Fri, 7 Oct 2016 08:25:42 +0000 Subject: [PATCH] Revert "Revert "Add a static_assert to enforce that parameters to llvm::format() are not totally unsafe"" This reverts commit r283510 and reapply r283509, with updates to clang-tools-extra as well. llvm-svn: 283525 --- .../clang-tidy/readability/IdentifierNamingCheck.cpp | 4 ++-- llvm/include/llvm/Support/Format.h | 14 +++++++++++++- llvm/lib/Target/PowerPC/PPCVSXSwapRemoval.cpp | 3 ++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp index 183e578..7c49df9 100644 --- a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp @@ -777,7 +777,7 @@ void IdentifierNamingCheck::check(const MatchFinder::MatchResult &Result) { DEBUG(llvm::dbgs() << Decl->getLocStart().printToString(*Result.SourceManager) << llvm::format(": unable to split words for %s '%s'\n", - KindName.c_str(), Name)); + KindName.c_str(), Name.str().c_str())); } } else { NamingCheckFailure &Failure = NamingCheckFailures[NamingCheckId( @@ -811,7 +811,7 @@ void IdentifierNamingCheck::checkMacro(SourceManager &SourceMgr, DEBUG( llvm::dbgs() << MacroNameTok.getLocation().printToString(SourceMgr) << llvm::format(": unable to split words for %s '%s'\n", - KindName.c_str(), Name)); + KindName.c_str(), Name.str().c_str())); } } else { NamingCheckId ID(MI->getDefinitionLoc(), Name); diff --git a/llvm/include/llvm/Support/Format.h b/llvm/include/llvm/Support/Format.h index d5c301c..026488c 100644 --- a/llvm/include/llvm/Support/Format.h +++ b/llvm/include/llvm/Support/Format.h @@ -75,6 +75,16 @@ public: /// printed, this synthesizes the string into a temporary buffer provided and /// returns whether or not it is big enough. +// Helper to validate that format() parameters are scalars or pointers. +template struct validate_format_parameters; +template +struct validate_format_parameters { + static_assert(std::is_scalar::value, + "format can't be used with non fundamental / non pointer type"); + validate_format_parameters() { validate_format_parameters(); } +}; +template <> struct validate_format_parameters<> {}; + template class format_object final : public format_object_base { std::tuple Vals; @@ -91,7 +101,9 @@ class format_object final : public format_object_base { public: format_object(const char *fmt, const Ts &... vals) - : format_object_base(fmt), Vals(vals...) {} + : format_object_base(fmt), Vals(vals...) { + validate_format_parameters(); + } int snprint(char *Buffer, unsigned BufferSize) const override { return snprint_tuple(Buffer, BufferSize, index_sequence_for()); diff --git a/llvm/lib/Target/PowerPC/PPCVSXSwapRemoval.cpp b/llvm/lib/Target/PowerPC/PPCVSXSwapRemoval.cpp index d53c8e3..8197285b 100644 --- a/llvm/lib/Target/PowerPC/PPCVSXSwapRemoval.cpp +++ b/llvm/lib/Target/PowerPC/PPCVSXSwapRemoval.cpp @@ -962,7 +962,8 @@ void PPCVSXSwapRemoval::dumpSwapVector() { DEBUG(dbgs() << format("%6d", ID)); DEBUG(dbgs() << format("%6d", EC->getLeaderValue(ID))); DEBUG(dbgs() << format(" BB#%3d", MI->getParent()->getNumber())); - DEBUG(dbgs() << format(" %14s ", TII->getName(MI->getOpcode()))); + DEBUG(dbgs() << format(" %14s ", + TII->getName(MI->getOpcode()).str().c_str())); if (SwapVector[EntryIdx].IsLoad) DEBUG(dbgs() << "load "); -- 2.7.4