https://github.com/tgymnich created https://github.com/llvm/llvm-project/pull/204830
Several call sites pass `expr.str()` to parameters of type `const llvm::Twine &`, forcing a throwaway heap std::string that is immediately rewrapped into a Twine. Drop the `.str()` and let Twine accept the StringRef/concatenation directly. Assisted-by: Claude Opus 4.8 >From e267620617cc4a9ce4a706305c91f884ace8e9ba Mon Sep 17 00:00:00 2001 From: Tim Gymnich <[email protected]> Date: Fri, 19 Jun 2026 15:37:36 +0200 Subject: [PATCH] [clang] Avoid premature Twine .str() materialization Several call sites pass `expr.str()` to parameters of type `const llvm::Twine &`, forcing a throwaway heap std::string that is immediately rewrapped into a Twine. Drop the `.str()` and let Twine accept the StringRef/concatenation directly. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> --- clang/lib/Analysis/FlowSensitive/FormulaSerialization.cpp | 5 ++--- clang/lib/CodeGen/CGHLSLRuntime.cpp | 2 +- clang/lib/Driver/Driver.cpp | 4 ++-- clang/lib/Driver/ToolChains/Clang.cpp | 2 +- clang/lib/Format/Format.cpp | 2 +- clang/lib/Frontend/DependencyFile.cpp | 2 +- clang/lib/Parse/ParseOpenMP.cpp | 3 +-- clang/lib/Sema/SemaDecl.cpp | 2 +- clang/lib/StaticAnalyzer/Checkers/Yaml.h | 2 +- 9 files changed, 11 insertions(+), 13 deletions(-) diff --git a/clang/lib/Analysis/FlowSensitive/FormulaSerialization.cpp b/clang/lib/Analysis/FlowSensitive/FormulaSerialization.cpp index 4fe2231b9ff65..5808d6708b44d 100644 --- a/clang/lib/Analysis/FlowSensitive/FormulaSerialization.cpp +++ b/clang/lib/Analysis/FlowSensitive/FormulaSerialization.cpp @@ -203,9 +203,8 @@ parseFormula(llvm::StringRef Str, Arena &A, return F.takeError(); if (!Str.empty()) return llvm::createStringError(llvm::inconvertibleErrorCode(), - ("unexpected suffix of length: " + - llvm::Twine(Str.size() - OriginalSize)) - .str()); + "unexpected suffix of length: " + + llvm::Twine(Str.size() - OriginalSize)); return F; } diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp index 4ecab6ba79553..c2bd3fbdeb770 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -1525,7 +1525,7 @@ static void initializeBuffer(CodeGenModule &CGM, llvm::GlobalVariable *GV, llvm::Function *InitResFunc = llvm::Function::Create( llvm::FunctionType::get(CGM.VoidTy, false), llvm::GlobalValue::InternalLinkage, - ("_init_buffer_" + GV->getName()).str(), CGM.getModule()); + "_init_buffer_" + GV->getName(), CGM.getModule()); InitResFunc->addFnAttr(llvm::Attribute::AlwaysInline); llvm::BasicBlock *EntryBB = diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 8f189ea189408..d153e99d37280 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -6503,7 +6503,7 @@ const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA, StringRef FcValue = C.getArgs().getLastArgValue(options::OPT_dxc_Fc); // TODO: Should we use `MakeCLOutputFilename` here? If so, we can probably // handle this as part of the SLASH_Fa handling below. - return C.addResultFile(C.getArgs().MakeArgString(FcValue.str()), &JA); + return C.addResultFile(C.getArgs().MakeArgString(FcValue), &JA); } if ((JA.getType() == types::TY_Object && @@ -6519,7 +6519,7 @@ const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA, // that is using Fc or just printing disassembly. if (TC.isLastOutputProducingJob(C.getArgs(), JA.getKind()) && !FoValue.empty()) - return C.addResultFile(C.getArgs().MakeArgString(FoValue.str()), &JA); + return C.addResultFile(C.getArgs().MakeArgString(FoValue), &JA); StringRef Name = llvm::sys::path::filename(BaseInput); std::pair<StringRef, StringRef> Split = Name.split('.'); const char *Suffix = types::getTypeTempSuffix(JA.getType(), true); diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index e3288c81d4c95..46b5f3aa5176c 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1943,7 +1943,7 @@ void Clang::AddPPCTargetArgs(const ArgList &Args, if (Arg *A = Args.getLastArg(options::OPT_mtune_EQ)) { CmdArgs.push_back("-tune-cpu"); StringRef CPU = llvm::PPC::getNormalizedPPCTuneCPU(T, A->getValue()); - CmdArgs.push_back(Args.MakeArgString(CPU.str())); + CmdArgs.push_back(Args.MakeArgString(CPU)); } // Select the ABI to use. diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index a29d62c99bb95..51a976783b589 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -4630,7 +4630,7 @@ loadAndParseConfigFile(StringRef ConfigFile, llvm::vfs::FileSystem *FS, llvm::SourceMgr::DiagHandlerTy DiagHandler, bool IsDotHFile) { llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Text = - FS->getBufferForFile(ConfigFile.str()); + FS->getBufferForFile(ConfigFile); if (auto EC = Text.getError()) return EC; if (auto EC = parseConfiguration(*Text.get(), Style, AllowUnknownOptions, diff --git a/clang/lib/Frontend/DependencyFile.cpp b/clang/lib/Frontend/DependencyFile.cpp index d56e17f14e9bc..00f4a54269cfa 100644 --- a/clang/lib/Frontend/DependencyFile.cpp +++ b/clang/lib/Frontend/DependencyFile.cpp @@ -345,7 +345,7 @@ static void PrintFilename(raw_ostream &OS, StringRef Filename, DependencyOutputFormat OutputFormat) { // Convert filename to platform native path llvm::SmallString<256> NativePath; - llvm::sys::path::native(Filename.str(), NativePath); + llvm::sys::path::native(Filename, NativePath); if (OutputFormat == DependencyOutputFormat::NMake) { // Add quotes if needed. These are the characters listed as "special" to diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index 58d6df302d1a7..af52295df2d8b 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -1283,8 +1283,7 @@ void Parser::parseOMPContextSelectorSet( Diag(Tok.getLocation(), diag::warn_omp_declare_variant_expected) << "=" << ("context set name \"" + getOpenMPContextTraitSetName(TISet.Kind) + - "\"") - .str(); + "\""); // Parse '{'. if (Tok.is(tok::l_brace)) { diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index cddcf3a010279..d45c3eb35094f 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -11418,7 +11418,7 @@ static bool CheckMultiVersionValue(Sema &S, const FunctionDecl *FD) { auto BareFeat = StringRef{Feat}.substr(1); if (Feat[0] == '-') { S.Diag(FD->getLocation(), diag::err_bad_multiversion_option) - << Feature << ("no-" + BareFeat).str(); + << Feature << ("no-" + BareFeat); return true; } diff --git a/clang/lib/StaticAnalyzer/Checkers/Yaml.h b/clang/lib/StaticAnalyzer/Checkers/Yaml.h index ec521cbfcdc8e..4bb54e8aa8c12 100644 --- a/clang/lib/StaticAnalyzer/Checkers/Yaml.h +++ b/clang/lib/StaticAnalyzer/Checkers/Yaml.h @@ -37,7 +37,7 @@ std::optional<T> getConfiguration(CheckerManager &Mgr, Checker *Chk, .getFileManager() .getVirtualFileSystem(); llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer = - VFS.getBufferForFile(ConfigFile.str()); + VFS.getBufferForFile(ConfigFile); if (Buffer.getError()) { Mgr.reportInvalidCheckerOptionValue(Chk, Option, _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
