<div dir="auto">Great, thanks for that!<div dir="auto"><br></div><div dir="auto">Can you say what version of GCC is affected?</div><div dir="auto"><br></div><div dir="auto">Thanks,</div><div dir="auto"><br></div><div dir="auto">Stephen. </div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, 15 Aug 2018, 11:44 David Green, <<a href="mailto:David.Green@arm.com">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">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" 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" target="_blank" rel="noreferrer">cfe-commits-bounces@lists.llvm.org</a>> on behalf of Stephen Kelly via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" rel="noreferrer">cfe-commits@lists.llvm.org</a>><br>
Sent: 14 August 2018 22:33:28<br>
To: <a href="mailto:cfe-commits@lists.llvm.org" target="_blank" rel="noreferrer">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" 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" 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" 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" 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" target="_blank" rel="noreferrer">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>