<div dir="ltr">Agreed. Normally, arc copies the full patch description from Phab, but this time the patch didn't apply cleanly, so I had to copy the commit message by hand and missed a substantial part of it.<br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Aug 8, 2016 at 5:35 PM, David Blaikie <span dir="ltr"><<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><br><div class="gmail_quote"><span class=""><div dir="ltr">On Wed, Aug 3, 2016 at 4:13 PM Alexander Kornienko via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: alexfh<br>
Date: Wed Aug  3 18:06:03 2016<br>
New Revision: 277677<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=277677&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=277677&view=rev</a><br>
Log:<br>
[clang-tidy] Inefficient string operation<br></blockquote><div><br></div></span><div>A more detailed commit message might be nice. The code review included some information that might've been a good start:<br><br>"<span style="font-family:"segoe ui","segoe ui web regular","segoe ui symbol","helvetica neue",helvetica,arial,sans-serif;font-size:13px;line-height:18.85px">This checker is to warn about the performance overhead caused by concatenating strings using the operator+ instead of basic_string's append or operator+=. It is configurable. In strict mode it matches every instance of a supposed inefficient concatenation, in non-strict mode it matches only those which are inside a loop."</span></div><div><div class="h5"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Patch by Bittner Barni!<br>
<br>
Differential revision: <a href="https://reviews.llvm.org/D20196" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D20196</a><br>
<br>
Added:<br>
    clang-tools-extra/trunk/clang-<wbr>tidy/performance/<wbr>InefficientStringConcatenation<wbr>Check.cpp<br>
    clang-tools-extra/trunk/clang-<wbr>tidy/performance/<wbr>InefficientStringConcatenation<wbr>Check.h<br>
    clang-tools-extra/trunk/docs/<wbr>clang-tidy/checks/performance-<wbr>inefficient-string-<wbr>concatenation.rst<br>
    clang-tools-extra/trunk/test/<wbr>clang-tidy/performance-<wbr>inefficient-string-<wbr>concatenation.cpp<br>
Modified:<br>
    clang-tools-extra/trunk/clang-<wbr>tidy/performance/CMakeLists.<wbr>txt<br>
    clang-tools-extra/trunk/clang-<wbr>tidy/performance/<wbr>PerformanceTidyModule.cpp<br>
    clang-tools-extra/trunk/docs/<wbr>ReleaseNotes.rst<br>
    clang-tools-extra/trunk/docs/<wbr>clang-tidy/checks/list.rst<br>
<br>
Modified: clang-tools-extra/trunk/clang-<wbr>tidy/performance/CMakeLists.<wbr>txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/performance/CMakeLists.txt?rev=277677&r1=277676&r2=277677&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/clang-tools-extra/<wbr>trunk/clang-tidy/performance/<wbr>CMakeLists.txt?rev=277677&r1=<wbr>277676&r2=277677&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- clang-tools-extra/trunk/clang-<wbr>tidy/performance/CMakeLists.<wbr>txt (original)<br>
+++ clang-tools-extra/trunk/clang-<wbr>tidy/performance/CMakeLists.<wbr>txt Wed Aug  3 18:06:03 2016<br>
@@ -4,6 +4,7 @@ add_clang_library(<wbr>clangTidyPerformanceMo<br>
   FasterStringFindCheck.cpp<br>
   ForRangeCopyCheck.cpp<br>
   ImplicitCastInLoopCheck.cpp<br>
+  InefficientStringConcatenation<wbr>Check.cpp<br>
   PerformanceTidyModule.cpp<br>
   <wbr>UnnecessaryCopyInitialization.<wbr>cpp<br>
   UnnecessaryValueParamCheck.<wbr>cpp<br>
<br>
Added: clang-tools-extra/trunk/clang-<wbr>tidy/performance/<wbr>InefficientStringConcatenation<wbr>Check.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/performance/InefficientStringConcatenationCheck.cpp?rev=277677&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/clang-tools-extra/<wbr>trunk/clang-tidy/performance/<wbr>InefficientStringConcatenation<wbr>Check.cpp?rev=277677&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- clang-tools-extra/trunk/clang-<wbr>tidy/performance/<wbr>InefficientStringConcatenation<wbr>Check.cpp (added)<br>
+++ clang-tools-extra/trunk/clang-<wbr>tidy/performance/<wbr>InefficientStringConcatenation<wbr>Check.cpp Wed Aug  3 18:06:03 2016<br>
@@ -0,0 +1,86 @@<br>
+//===--- InefficientStringConcatenation<wbr>Check.cpp - clang-tidy--------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+#include "<wbr>InefficientStringConcatenation<wbr>Check.h"<br>
+#include "clang/AST/ASTContext.h"<br>
+#include "clang/ASTMatchers/<wbr>ASTMatchFinder.h"<br>
+<br>
+using namespace clang::ast_matchers;<br>
+<br>
+namespace clang {<br>
+namespace tidy {<br>
+namespace performance {<br>
+<br>
+void InefficientStringConcatenation<wbr>Check::storeOptions(<br>
+    ClangTidyOptions::OptionMap &Opts) {<br>
+  Options.store(Opts, "StrictMode", StrictMode);<br>
+}<br>
+<br>
+<wbr>InefficientStringConcatenation<wbr>Check::<wbr>InefficientStringConcatenation<wbr>Check(<br>
+    StringRef Name, ClangTidyContext *Context)<br>
+    : ClangTidyCheck(Name, Context), StrictMode(Options.get("<wbr>StrictMode", 0)) {}<br>
+<br>
+void InefficientStringConcatenation<wbr>Check::registerMatchers(<br>
+    MatchFinder *Finder) {<br>
+  if (!getLangOpts().CPlusPlus)<br>
+    return;<br>
+<br>
+  const auto BasicStringType =<br>
+      hasType(cxxRecordDecl(hasName(<wbr>"::std::basic_string")));<br>
+<br>
+  const auto BasicStringPlusOperator = cxxOperatorCallExpr(<br>
+      hasOverloadedOperatorName("+")<wbr>,<br>
+      hasAnyArgument(<wbr>ignoringImpCasts(declRefExpr(<wbr>BasicStringType))));<br>
+<br>
+  const auto PlusOperator =<br>
+      cxxOperatorCallExpr(<br>
+          hasOverloadedOperatorName("+")<wbr>,<br>
+          hasAnyArgument(<wbr>ignoringImpCasts(declRefExpr(<wbr>BasicStringType))),<br>
+          hasDescendant(<wbr>BasicStringPlusOperator))<br>
+          .bind("plusOperator");<br>
+<br>
+  const auto AssignOperator = cxxOperatorCallExpr(<br>
+      hasOverloadedOperatorName("=")<wbr>,<br>
+      hasArgument(0, declRefExpr(BasicStringType,<br>
+                                 hasDeclaration(decl().bind("<wbr>lhsStrT")))<br>
+                         .bind("lhsStr")),<br>
+      hasArgument(1, stmt(hasDescendant(<wbr>declRefExpr(<br>
+                         hasDeclaration(decl(<wbr>equalsBoundNode("lhsStrT")))))<wbr>)),<br>
+      hasDescendant(<wbr>BasicStringPlusOperator));<br>
+<br>
+  if (StrictMode) {<br>
+    Finder->addMatcher(<wbr>cxxOperatorCallExpr(anyOf(<wbr>AssignOperator, PlusOperator)),<br>
+                       this);<br>
+  } else {<br>
+    Finder->addMatcher(<br>
+        cxxOperatorCallExpr(anyOf(<wbr>AssignOperator, PlusOperator),<br>
+                            hasAncestor(stmt(anyOf(<wbr>cxxForRangeStmt(),<br>
+                                                   whileStmt(), forStmt())))),<br>
+        this);<br>
+  }<br>
+}<br>
+<br>
+void InefficientStringConcatenation<wbr>Check::check(<br>
+    const MatchFinder::MatchResult &Result) {<br>
+  const auto *LhsStr = Result.Nodes.getNodeAs<<wbr>DeclRefExpr>("lhsStr");<br>
+  const auto *PlusOperator =<br>
+      Result.Nodes.getNodeAs<<wbr>CXXOperatorCallExpr>("<wbr>plusOperator");<br>
+  const auto DiagMsg =<br>
+      "string concatenation results in allocation of unnecessary temporary "<br>
+      "strings; consider using 'operator+=' or 'string::append()' instead";<br>
+<br>
+  if (LhsStr)<br>
+    diag(LhsStr->getExprLoc(), DiagMsg);<br>
+  else if (PlusOperator)<br>
+    diag(PlusOperator->getExprLoc(<wbr>), DiagMsg);<br>
+}<br>
+<br>
+} // namespace performance<br>
+} // namespace tidy<br>
+} // namespace clang<br>
<br>
Added: clang-tools-extra/trunk/clang-<wbr>tidy/performance/<wbr>InefficientStringConcatenation<wbr>Check.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/performance/InefficientStringConcatenationCheck.h?rev=277677&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/clang-tools-extra/<wbr>trunk/clang-tidy/performance/<wbr>InefficientStringConcatenation<wbr>Check.h?rev=277677&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- clang-tools-extra/trunk/clang-<wbr>tidy/performance/<wbr>InefficientStringConcatenation<wbr>Check.h (added)<br>
+++ clang-tools-extra/trunk/clang-<wbr>tidy/performance/<wbr>InefficientStringConcatenation<wbr>Check.h Wed Aug  3 18:06:03 2016<br>
@@ -0,0 +1,41 @@<br>
+//===--- InefficientStringConcatenation<wbr>Check.h - clang-tidy-----------*- C++<br>
+//-*-===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_<wbr>TIDY_PERFORMANCE_<wbr>INEFFICIENTSTRINGCONCATENATION<wbr>_H<br>
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_<wbr>TIDY_PERFORMANCE_<wbr>INEFFICIENTSTRINGCONCATENATION<wbr>_H<br>
+<br>
+#include "../ClangTidy.h"<br>
+<br>
+namespace clang {<br>
+namespace tidy {<br>
+namespace performance {<br>
+<br>
+/// This check is to warn about the performance overhead arising from<br>
+/// concatenating strings, using the operator+, instead of operator+=.<br>
+///<br>
+/// For the user-facing documentation see:<br>
+/// <a href="http://clang.llvm.org/extra/clang-tidy/checks/performance-inefficient-string-concatenation.html" rel="noreferrer" target="_blank">http://clang.llvm.org/extra/<wbr>clang-tidy/checks/performance-<wbr>inefficient-string-<wbr>concatenation.html</a><br>
+class InefficientStringConcatenation<wbr>Check : public ClangTidyCheck {<br>
+public:<br>
+  InefficientStringConcatenation<wbr>Check(StringRef Name,<br>
+                                      ClangTidyContext *Context);<br>
+  void registerMatchers(ast_matchers:<wbr>:MatchFinder *Finder) override;<br>
+  void check(const ast_matchers::MatchFinder::<wbr>MatchResult &Result) override;<br>
+  void storeOptions(ClangTidyOptions:<wbr>:OptionMap &Opts) override;<br>
+<br>
+private:<br>
+  const bool StrictMode;<br>
+};<br>
+<br>
+} // namespace performance<br>
+} // namespace tidy<br>
+} // namespace clang<br>
+<br>
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_<wbr>TIDY_PERFORMANCE_<wbr>INEFFICIENTSTRINGCONCATENATION<wbr>_H<br>
<br>
Modified: clang-tools-extra/trunk/clang-<wbr>tidy/performance/<wbr>PerformanceTidyModule.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/performance/PerformanceTidyModule.cpp?rev=277677&r1=277676&r2=277677&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/clang-tools-extra/<wbr>trunk/clang-tidy/performance/<wbr>PerformanceTidyModule.cpp?rev=<wbr>277677&r1=277676&r2=277677&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- clang-tools-extra/trunk/clang-<wbr>tidy/performance/<wbr>PerformanceTidyModule.cpp (original)<br>
+++ clang-tools-extra/trunk/clang-<wbr>tidy/performance/<wbr>PerformanceTidyModule.cpp Wed Aug  3 18:06:03 2016<br>
@@ -10,6 +10,7 @@<br>
 #include "../ClangTidy.h"<br>
 #include "../ClangTidyModule.h"<br>
 #include "../ClangTidyModuleRegistry.h"<br>
+#include "<wbr>InefficientStringConcatenation<wbr>Check.h"<br>
<br>
 #include "FasterStringFindCheck.h"<br>
 #include "ForRangeCopyCheck.h"<br>
@@ -30,6 +31,8 @@ public:<br>
         "performance-for-range-copy")<wbr>;<br>
     CheckFactories.registerCheck<<wbr>ImplicitCastInLoopCheck>(<br>
         "performance-implicit-cast-<wbr>in-loop");<br>
+    CheckFactories.registerCheck<<wbr>InefficientStringConcatenation<wbr>Check>(<br>
+        "performance-inefficient-<wbr>string-concatenation");<br>
     CheckFactories.registerCheck<<wbr>UnnecessaryCopyInitialization><wbr>(<br>
         "performance-unnecessary-<wbr>copy-initialization");<br>
     CheckFactories.registerCheck<<wbr>UnnecessaryValueParamCheck>(<br>
<br>
Modified: clang-tools-extra/trunk/docs/<wbr>ReleaseNotes.rst<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/ReleaseNotes.rst?rev=277677&r1=277676&r2=277677&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/clang-tools-extra/<wbr>trunk/docs/ReleaseNotes.rst?<wbr>rev=277677&r1=277676&r2=<wbr>277677&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- clang-tools-extra/trunk/docs/<wbr>ReleaseNotes.rst (original)<br>
+++ clang-tools-extra/trunk/docs/<wbr>ReleaseNotes.rst Wed Aug  3 18:06:03 2016<br>
@@ -69,6 +69,13 @@ Improvements to clang-tidy<br>
<br>
   Flags classes where some, but not all, special member functions are user-defined.<br>
<br>
+- New `performance-inefficient-<wbr>string-concatenation<br>
+  <<a href="http://clang.llvm.org/extra/clang-tidy/checks/performance-inefficient-string-concatenation.html" rel="noreferrer" target="_blank">http://clang.llvm.org/extra/<wbr>clang-tidy/checks/performance-<wbr>inefficient-string-<wbr>concatenation.html</a>>`_ check<br>
+<br>
+  This check warns about the performance overhead arising from concatenating<br>
+  strings using the ``operator+``, instead of ``operator+=``.<br>
+<br>
+<br>
 Improvements to include-fixer<br>
 -----------------------------<br>
<br>
<br>
Modified: clang-tools-extra/trunk/docs/<wbr>clang-tidy/checks/list.rst<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst?rev=277677&r1=277676&r2=277677&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/clang-tools-extra/<wbr>trunk/docs/clang-tidy/checks/<wbr>list.rst?rev=277677&r1=277676&<wbr>r2=277677&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- clang-tools-extra/trunk/docs/<wbr>clang-tidy/checks/list.rst (original)<br>
+++ clang-tools-extra/trunk/docs/<wbr>clang-tidy/checks/list.rst Wed Aug  3 18:06:03 2016<br>
@@ -114,6 +114,7 @@ Clang-Tidy Checks<br>
    performance-faster-string-find<br>
    performance-for-range-copy<br>
    performance-implicit-cast-in-<wbr>loop<br>
+   performance-inefficient-<wbr>string-concatenation<br>
    performance-unnecessary-copy-<wbr>initialization<br>
    performance-unnecessary-value-<wbr>param<br>
    readability-avoid-const-<wbr>params-in-decls<br>
<br>
Added: clang-tools-extra/trunk/docs/<wbr>clang-tidy/checks/performance-<wbr>inefficient-string-<wbr>concatenation.rst<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/performance-inefficient-string-concatenation.rst?rev=277677&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/clang-tools-extra/<wbr>trunk/docs/clang-tidy/checks/<wbr>performance-inefficient-<wbr>string-concatenation.rst?rev=<wbr>277677&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- clang-tools-extra/trunk/docs/<wbr>clang-tidy/checks/performance-<wbr>inefficient-string-<wbr>concatenation.rst (added)<br>
+++ clang-tools-extra/trunk/docs/<wbr>clang-tidy/checks/performance-<wbr>inefficient-string-<wbr>concatenation.rst Wed Aug  3 18:06:03 2016<br>
@@ -0,0 +1,49 @@<br>
+.. title:: clang-tidy - performance-inefficient-<wbr>string-concatenation<br>
+<br>
+performance-inefficient-<wbr>string-concatenation<br>
+=============================<wbr>===============<br>
+<br>
+This check warns about the performance overhead arising from concatenating strings using the ``operator+``, for instance:<br>
+<br>
+.. code:: c++<br>
+<br>
+    std::string a("Foo"), b("Bar");<br>
+    a = a + b;<br>
+<br>
+Instead of this structure you should use ``operator+=`` or ``std::string``'s (``std::basic_string``) class member function ``append()``. For instance:<br>
+<br>
+.. code:: c++<br>
+<br>
+   std::string a("Foo"), b("Baz");<br>
+   for (int i = 0; i < 20000; ++i) {<br>
+       a = a + "Bar" + b;<br>
+   }<br>
+<br>
+Could be rewritten in a greatly more efficient way like:<br>
+<br>
+.. code:: c++<br>
+<br>
+   std::string a("Foo"), b("Baz");<br>
+   for (int i = 0; i < 20000; ++i) {<br>
+       a.append("Bar").append(b);<br>
+   }<br>
+<br>
+And this can be rewritten too:<br>
+<br>
+.. code:: c++<br>
+<br>
+   void f(const std::string&) {}<br>
+   std::string a("Foo"), b("Baz");<br>
+   void g() {<br>
+       f(a + "Bar" + b);<br>
+   }<br>
+<br>
+In a slightly more efficient way like:<br>
+<br>
+.. code:: c++<br>
+<br>
+   void f(const std::string&) {}<br>
+   std::string a("Foo"), b("Baz");<br>
+   void g() {<br>
+       f(std::string(a).append("Bar"<wbr>).append(b));<br>
+   }<br>
<br>
Added: clang-tools-extra/trunk/test/<wbr>clang-tidy/performance-<wbr>inefficient-string-<wbr>concatenation.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/performance-inefficient-string-concatenation.cpp?rev=277677&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/clang-tools-extra/<wbr>trunk/test/clang-tidy/<wbr>performance-inefficient-<wbr>string-concatenation.cpp?rev=<wbr>277677&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- clang-tools-extra/trunk/test/<wbr>clang-tidy/performance-<wbr>inefficient-string-<wbr>concatenation.cpp (added)<br>
+++ clang-tools-extra/trunk/test/<wbr>clang-tidy/performance-<wbr>inefficient-string-<wbr>concatenation.cpp Wed Aug  3 18:06:03 2016<br>
@@ -0,0 +1,44 @@<br>
+// RUN: %check_clang_tidy %s performance-inefficient-<wbr>string-concatenation %t<br>
+<br>
+namespace std {<br>
+template <typename T><br>
+class basic_string {<br>
+public:<br>
+  basic_string() {}<br>
+  ~basic_string() {}<br>
+  basic_string<T> *operator+=(const basic_string<T> &) {}<br>
+  friend basic_string<T> operator+(const basic_string<T> &, const basic_string<T> &) {}<br>
+};<br>
+typedef basic_string<char> string;<br>
+typedef basic_string<wchar_t> wstring;<br>
+}<br>
+<br>
+void f(std::string) {}<br>
+std::string g(std::string) {}<br>
+<br>
+int main() {<br>
+  std::string mystr1, mystr2;<br>
+  std::wstring mywstr1, mywstr2;<br>
+<br>
+  for (int i = 0; i < 10; ++i) {<br>
+    f(mystr1 + mystr2 + mystr1);<br>
+    // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: string concatenation results in allocation of unnecessary temporary strings; consider using 'operator+=' or 'string::append()' instead<br>
+    mystr1 = mystr1 + mystr2;<br>
+    // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: string concatenation<br>
+    mystr1 = mystr2 + mystr2 + mystr2;<br>
+    // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: string concatenation<br>
+    mystr1 = mystr2 + mystr1;<br>
+    // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: string concatenation<br>
+    mywstr1 = mywstr2 + mywstr1;<br>
+    // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: string concatenation<br>
+    mywstr1 = mywstr2 + mywstr2 + mywstr2;<br>
+    // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: string concatenation<br>
+<br>
+    mywstr1 = mywstr2 + mywstr2;<br>
+    mystr1 = mystr2 + mystr2;<br>
+    mystr1 += mystr2;<br>
+    f(mystr2 + mystr1);<br>
+    mystr1 = g(mystr1);<br>
+  }<br>
+  return 0;<br>
+}<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div></div></div></div>
</blockquote></div><br></div></div>