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

Reply via email to