<div dir="auto"><div dir="auto"><br></div><div dir="auto">I tried on godbolt and your example works with GCC 4.9 and later. <br></div><div dir="auto"><br></div><div dir="auto"><a href="https://godbolt.org/beta/z/MjE4ZT">https://godbolt.org/beta/z/MjE4ZT</a></div><div dir="auto"><br></div><div dir="auto">Something else may have been wrong in addition. </div><div dir="auto"><br></div><div dir="auto">Thanks,</div><div dir="auto"><br></div><div dir="auto">Stephen. </div><div dir="auto"><br></div><br><br><div class="gmail_quote" dir="auto"><div dir="ltr">On Wed, 15 Aug 2018, 12:48 David Green, <<a href="mailto:David.Green@arm.com" target="_blank" rel="noreferrer">David.Green@arm.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Anything before GCC 8 I believe (although I found the error with GCC 4.9). It incorrectly turns code like this:<br>
<br>
void func(const char *);<br>
#define MACRO(X) func(#X)<br>
MACRO(R"(Hello<br>
this is a string)");<br>
<br>
<br>
with -E into:<br>
<br>
func("R\"(Hello<br>
this is a string)\""<br>
 );<br>
<br>
<br>
GCC 8 (and clang) get it right by changing it to:<br>
<br>
func("R\"(Hello\nthis is a string)\"")<br>
<br>
<br>
Dave<br>
<br>
<br>
<br>
From: Stephen Kelly <<a href="mailto:steveire@gmail.com" rel="noreferrer noreferrer" target="_blank">steveire@gmail.com</a>><br>
Sent: 15 August 2018 12:31<br>
To: David Green<br>
Cc: llvm-commits; nd<br>
Subject: Re: r339730 - Fix Stmt::ignoreImplicit<br>
<br>
Great, thanks for that!<br>
<br>
Can you say what version of GCC is affected?<br>
<br>
Thanks,<br>
<br>
Stephen.<br>
<br>
On Wed, 15 Aug 2018, 11:44 David Green, <<a href="mailto:David.Green@arm.com" rel="noreferrer noreferrer" target="_blank">David.Green@arm.com</a><mailto:<a href="mailto:David.Green@arm.com" rel="noreferrer noreferrer" target="_blank">David.Green@arm.com</a>>> wrote:<br>
Hello<br>
<br>
Some version of GCC don't like raw string literals inside macro's.<br>
<br>
I've put up <a href="https://reviews.llvm.org/rL339759" rel="noreferrer noreferrer noreferrer" target="_blank">https://reviews.llvm.org/rL339759</a> as a fix. Let me know if it looks iffy.<br>
<br>
Cheers<br>
Dave<br>
<br>
________________________________________<br>
From: cfe-commits <<a href="mailto:cfe-commits-bounces@lists.llvm.org" rel="noreferrer noreferrer" target="_blank">cfe-commits-bounces@lists.llvm.org</a><mailto:<a href="mailto:cfe-commits-bounces@lists.llvm.org" rel="noreferrer noreferrer" target="_blank">cfe-commits-bounces@lists.llvm.org</a>>> on behalf of Stephen Kelly via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" rel="noreferrer noreferrer" target="_blank">cfe-commits@lists.llvm.org</a><mailto:<a href="mailto:cfe-commits@lists.llvm.org" rel="noreferrer noreferrer" target="_blank">cfe-commits@lists.llvm.org</a>>><br>
Sent: 14 August 2018 22:33:28<br>
To: <a href="mailto:cfe-commits@lists.llvm.org" rel="noreferrer noreferrer" target="_blank">cfe-commits@lists.llvm.org</a><mailto:<a href="mailto:cfe-commits@lists.llvm.org" rel="noreferrer noreferrer" target="_blank">cfe-commits@lists.llvm.org</a>><br>
Subject: r339730 - Fix Stmt::ignoreImplicit<br>
<br>
Author: steveire<br>
Date: Tue Aug 14 14:33:28 2018<br>
New Revision: 339730<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=339730&view=rev" rel="noreferrer noreferrer noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=339730&view=rev</a><br>
Log:<br>
Fix Stmt::ignoreImplicit<br>
<br>
Summary:<br>
A CXXBindTemporaryExpr can appear inside an ImplicitCastExpr, and was<br>
not ignored previously.<br>
<br>
Fixes the case reported in PR37327.<br>
<br>
Reviewers: rsmith, dblaikie, klimek<br>
<br>
Subscribers: cfe-commits<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D50666" rel="noreferrer noreferrer noreferrer" target="_blank">https://reviews.llvm.org/D50666</a><br>
<br>
Modified:<br>
    cfe/trunk/lib/AST/Stmt.cpp<br>
    cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp<br>
<br>
Modified: cfe/trunk/lib/AST/Stmt.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Stmt.cpp?rev=339730&r1=339729&r2=339730&view=diff" rel="noreferrer noreferrer noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Stmt.cpp?rev=339730&r1=339729&r2=339730&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/AST/Stmt.cpp (original)<br>
+++ cfe/trunk/lib/AST/Stmt.cpp Tue Aug 14 14:33:28 2018<br>
@@ -113,17 +113,23 @@ void Stmt::EnableStatistics() {<br>
 Stmt *Stmt::IgnoreImplicit() {<br>
   Stmt *s = this;<br>
<br>
-  if (auto *ewc = dyn_cast<ExprWithCleanups>(s))<br>
-    s = ewc->getSubExpr();<br>
+  Stmt *lasts = nullptr;<br>
<br>
-  if (auto *mte = dyn_cast<MaterializeTemporaryExpr>(s))<br>
-    s = mte->GetTemporaryExpr();<br>
+  while (s != lasts) {<br>
+    lasts = s;<br>
<br>
-  if (auto *bte = dyn_cast<CXXBindTemporaryExpr>(s))<br>
-    s = bte->getSubExpr();<br>
+    if (auto *ewc = dyn_cast<ExprWithCleanups>(s))<br>
+      s = ewc->getSubExpr();<br>
<br>
-  while (auto *ice = dyn_cast<ImplicitCastExpr>(s))<br>
-    s = ice->getSubExpr();<br>
+    if (auto *mte = dyn_cast<MaterializeTemporaryExpr>(s))<br>
+      s = mte->GetTemporaryExpr();<br>
+<br>
+    if (auto *bte = dyn_cast<CXXBindTemporaryExpr>(s))<br>
+      s = bte->getSubExpr();<br>
+<br>
+    if (auto *ice = dyn_cast<ImplicitCastExpr>(s))<br>
+      s = ice->getSubExpr();<br>
+  }<br>
<br>
   return s;<br>
 }<br>
<br>
Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp?rev=339730&r1=339729&r2=339730&view=diff" rel="noreferrer noreferrer noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp?rev=339730&r1=339729&r2=339730&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp (original)<br>
+++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp Tue Aug 14 14:33:28 2018<br>
@@ -1321,6 +1321,45 @@ TEST(IgnoringImplicit, MatchesImplicit)<br>
                       varDecl(has(ignoringImplicit(cxxConstructExpr())))));<br>
 }<br>
<br>
+TEST(IgnoringImplicit, MatchesNestedImplicit) {<br>
+  EXPECT_TRUE(matches(R"(<br>
+<br>
+struct OtherType;<br>
+<br>
+struct SomeType<br>
+{<br>
+    SomeType() {}<br>
+    SomeType(const OtherType&) {}<br>
+    SomeType& operator=(OtherType const&) { return *this; }<br>
+};<br>
+<br>
+struct OtherType<br>
+{<br>
+    OtherType() {}<br>
+    ~OtherType() {}<br>
+};<br>
+<br>
+OtherType something()<br>
+{<br>
+    return {};<br>
+}<br>
+<br>
+int main()<br>
+{<br>
+    SomeType i = something();<br>
+}<br>
+)"<br>
+  , varDecl(<br>
+      hasName("i"),<br>
+      hasInitializer(exprWithCleanups(has(<br>
+        cxxConstructExpr(has(expr(ignoringImplicit(cxxConstructExpr(<br>
+          has(expr(ignoringImplicit(callExpr())))<br>
+          )))))<br>
+        )))<br>
+      )<br>
+  ));<br>
+}<br>
+<br>
 TEST(IgnoringImplicit, DoesNotMatchIncorrectly) {<br>
   EXPECT_TRUE(<br>
       notMatches("class C {}; C a = C();", varDecl(has(cxxConstructExpr()))));<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" rel="noreferrer noreferrer" target="_blank">cfe-commits@lists.llvm.org</a><mailto:<a href="mailto:cfe-commits@lists.llvm.org" rel="noreferrer noreferrer" target="_blank">cfe-commits@lists.llvm.org</a>><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer noreferrer noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div></div>