From ccc0b66d6971b64175b4e99c6d5baaa2830c4208 Mon Sep 17 00:00:00 2001 From: Youngsuk Kim Date: Fri, 5 Jul 2024 06:39:33 -0500 Subject: [PATCH] [clang] Avoid 'raw_string_ostream::str' (NFC) Since `raw_string_ostream` doesn't own the string buffer, it is desirable (in terms of memory safety) for users to directly reference the string buffer rather than use `raw_string_ostream::str()`. Work towards TODO item to remove `raw_string_ostream::str()`. p.s. also remove some unneeded/dead code. --- clang/lib/AST/JSONNodeDumper.cpp | 14 +++++++------- clang/lib/Driver/ToolChains/Darwin.cpp | 6 +++--- clang/lib/Frontend/Rewrite/RewriteModernObjC.cpp | 7 +++---- clang/lib/Sema/SemaCodeComplete.cpp | 7 ++----- 4 files changed, 15 insertions(+), 19 deletions(-) diff --git a/clang/lib/AST/JSONNodeDumper.cpp b/clang/lib/AST/JSONNodeDumper.cpp index 3bbb3a905e9b91..339477dc65f0f7 100644 --- a/clang/lib/AST/JSONNodeDumper.cpp +++ b/clang/lib/AST/JSONNodeDumper.cpp @@ -237,7 +237,7 @@ void JSONNodeDumper::Visit(const APValue &Value, QualType Ty) { std::string Str; llvm::raw_string_ostream OS(Str); Value.printPretty(OS, Ctx, Ty); - JOS.attribute("value", OS.str()); + JOS.attribute("value", Str); } void JSONNodeDumper::Visit(const ConceptReference *CR) { @@ -802,7 +802,7 @@ void JSONNodeDumper::VisitTemplateSpecializationType( std::string Str; llvm::raw_string_ostream OS(Str); TST->getTemplateName().print(OS, PrintPolicy); - JOS.attribute("templateName", OS.str()); + JOS.attribute("templateName", Str); } void JSONNodeDumper::VisitInjectedClassNameType( @@ -824,7 +824,7 @@ void JSONNodeDumper::VisitElaboratedType(const ElaboratedType *ET) { std::string Str; llvm::raw_string_ostream OS(Str); NNS->print(OS, PrintPolicy, /*ResolveTemplateArgs*/ true); - JOS.attribute("qualifier", OS.str()); + JOS.attribute("qualifier", Str); } if (const TagDecl *TD = ET->getOwnedTagDecl()) JOS.attribute("ownedTagDecl", createBareDeclRef(TD)); @@ -1246,7 +1246,7 @@ void JSONNodeDumper::VisitObjCMessageExpr(const ObjCMessageExpr *OME) { llvm::raw_string_ostream OS(Str); OME->getSelector().print(OS); - JOS.attribute("selector", OS.str()); + JOS.attribute("selector", Str); switch (OME->getReceiverKind()) { case ObjCMessageExpr::Instance: @@ -1277,7 +1277,7 @@ void JSONNodeDumper::VisitObjCBoxedExpr(const ObjCBoxedExpr *OBE) { llvm::raw_string_ostream OS(Str); MD->getSelector().print(OS); - JOS.attribute("selector", OS.str()); + JOS.attribute("selector", Str); } } @@ -1286,7 +1286,7 @@ void JSONNodeDumper::VisitObjCSelectorExpr(const ObjCSelectorExpr *OSE) { llvm::raw_string_ostream OS(Str); OSE->getSelector().print(OS); - JOS.attribute("selector", OS.str()); + JOS.attribute("selector", Str); } void JSONNodeDumper::VisitObjCProtocolExpr(const ObjCProtocolExpr *OPE) { @@ -1634,7 +1634,7 @@ void JSONNodeDumper::VisitStringLiteral(const StringLiteral *SL) { std::string Buffer; llvm::raw_string_ostream SS(Buffer); SL->outputString(SS); - JOS.attribute("value", SS.str()); + JOS.attribute("value", Buffer); } void JSONNodeDumper::VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *BLE) { JOS.attribute("value", BLE->getValue()); diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index 64ab328a6d25f6..f354b0974d5f27 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -3029,7 +3029,7 @@ void Darwin::addClangCC1ASTargetOptions( std::string Arg; llvm::raw_string_ostream OS(Arg); OS << "-target-sdk-version=" << V; - CC1ASArgs.push_back(Args.MakeArgString(OS.str())); + CC1ASArgs.push_back(Args.MakeArgString(Arg)); }; if (isTargetMacCatalyst()) { @@ -3052,7 +3052,7 @@ void Darwin::addClangCC1ASTargetOptions( std::string Arg; llvm::raw_string_ostream OS(Arg); OS << "-darwin-target-variant-sdk-version=" << SDKInfo->getVersion(); - CC1ASArgs.push_back(Args.MakeArgString(OS.str())); + CC1ASArgs.push_back(Args.MakeArgString(Arg)); } else if (const auto *MacOStoMacCatalystMapping = SDKInfo->getVersionMapping( DarwinSDKInfo::OSEnvPair::macOStoMacCatalystPair())) { @@ -3063,7 +3063,7 @@ void Darwin::addClangCC1ASTargetOptions( std::string Arg; llvm::raw_string_ostream OS(Arg); OS << "-darwin-target-variant-sdk-version=" << *SDKVersion; - CC1ASArgs.push_back(Args.MakeArgString(OS.str())); + CC1ASArgs.push_back(Args.MakeArgString(Arg)); } } } diff --git a/clang/lib/Frontend/Rewrite/RewriteModernObjC.cpp b/clang/lib/Frontend/Rewrite/RewriteModernObjC.cpp index 764cdc6f07cf68..3849e4040b53a1 100644 --- a/clang/lib/Frontend/Rewrite/RewriteModernObjC.cpp +++ b/clang/lib/Frontend/Rewrite/RewriteModernObjC.cpp @@ -273,10 +273,9 @@ namespace { std::string SStr; llvm::raw_string_ostream S(SStr); New->printPretty(S, nullptr, PrintingPolicy(LangOpts)); - const std::string &Str = S.str(); // If replacement succeeded or warning disabled return with no warning. - if (!Rewrite.ReplaceText(SrcRange.getBegin(), Size, Str)) { + if (!Rewrite.ReplaceText(SrcRange.getBegin(), Size, SStr)) { ReplacedNodes[Old] = New; return; } @@ -2581,7 +2580,7 @@ Stmt *RewriteModernObjC::RewriteObjCStringLiteral(ObjCStringLiteral *Exp) { std::string prettyBufS; llvm::raw_string_ostream prettyBuf(prettyBufS); Exp->getString()->printPretty(prettyBuf, nullptr, PrintingPolicy(LangOpts)); - Preamble += prettyBuf.str(); + Preamble += prettyBufS; Preamble += ","; Preamble += utostr(Exp->getString()->getByteLength()) + "};\n"; @@ -4414,7 +4413,7 @@ void RewriteModernObjC::SynthesizeBlockLiterals(SourceLocation FunLocStart, llvm::raw_string_ostream constructorExprBuf(SStr); GlobalConstructionExp->printPretty(constructorExprBuf, nullptr, PrintingPolicy(LangOpts)); - globalBuf += constructorExprBuf.str(); + globalBuf += SStr; globalBuf += ";\n"; InsertText(FunLocStart, globalBuf); GlobalConstructionExp = nullptr; diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index cd1c5f9391ccd4..7ea760ce579386 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -2117,8 +2117,6 @@ static void AddOverrideResults(ResultBuilder &Results, // Generates a new CodeCompletionResult by taking this function and // converting it into an override declaration with only one chunk in the // final CodeCompletionString as a TypedTextChunk. - std::string OverrideSignature; - llvm::raw_string_ostream OS(OverrideSignature); CodeCompletionResult CCR(Method, 0); PrintingPolicy Policy = getCompletionPrintingPolicy(S.getASTContext(), S.getPreprocessor()); @@ -3186,7 +3184,6 @@ static void AddTemplateParameterChunks( else if (const auto *TC = TTP->getTypeConstraint()) { llvm::raw_string_ostream OS(PlaceholderStr); TC->print(OS, Policy); - OS.flush(); } else PlaceholderStr = "class"; @@ -4025,7 +4022,7 @@ CodeCompleteConsumer::OverloadCandidate::CreateSignatureString( std::string Name; llvm::raw_string_ostream OS(Name); FDecl->getDeclName().print(OS, Policy); - Result.AddTextChunk(Result.getAllocator().CopyString(OS.str())); + Result.AddTextChunk(Result.getAllocator().CopyString(Name)); } else { // Function without a declaration. Just give the return type. Result.AddResultTypeChunk(Result.getAllocator().CopyString( @@ -4343,7 +4340,7 @@ static void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext, std::string Str; llvm::raw_string_ostream OS(Str); NNS->print(OS, Policy); - Builder.AddTextChunk(Results.getAllocator().CopyString(OS.str())); + Builder.AddTextChunk(Results.getAllocator().CopyString(Str)); } } else if (!InContext->Equals(Overridden->getDeclContext())) continue;